@tomaszjarosz/react-visualizers 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +11096 -4225
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +192 -0
- package/dist/index.js +11096 -4225
- package/dist/index.js.map +1 -1
- package/dist/react-visualizers.css +3190 -0
- package/package.json +13 -13
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/code-xml.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/copy.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/history.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/keyboard.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pause.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pen.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/play.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/share-2.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shield.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/shuffle.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/skip-back.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/skip-forward.js","../node_modules/.pnpm/lucide-react@0.468.0_react@18.3.1/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-colors 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 <div className=\"mt-1 pt-1 border-t border-gray-700 min-h-[36px]\">\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 {variables && Object.keys(variables).length > 0 ? (\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 ) : (\n <span className=\"text-[9px] text-gray-600\">—</span>\n )}\n </div>\n </div>\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 {/* Binary Search Invariant - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-green-50 to-emerald-50 rounded-xl border-2 border-green-200\">\n <div className=\"text-sm font-bold text-green-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🎯</span> Binary Search Invariant\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-green-200\">\n <div className=\"text-center text-green-700 font-bold mb-2\">\n target ∈ arr[left..right]\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n If target exists, it must be within current search bounds\n </div>\n </div>\n {/* Search space info */}\n {left <= right && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-green-200\">\n <div className=\"flex justify-between items-center text-xs\">\n <div>\n <span className=\"font-semibold text-green-700\">Search space:</span>{' '}\n <span className=\"font-mono\">[{left}..{right}]</span> = <span className=\"font-bold text-green-600\">{right - left + 1}</span> elements\n </div>\n <div className=\"text-gray-500\">\n {currentStep > 0 && (\n <span>\n Eliminated: <span className=\"font-bold text-red-500\">{Math.round((1 - (right - left + 1) / array.length) * 100)}%</span>\n </span>\n )}\n </div>\n </div>\n {mid >= 0 && (\n <div className=\"mt-2 text-xs text-center text-gray-600\">\n mid = ⌊({left} + {right}) / 2⌋ = <span className=\"font-bold text-purple-600\">{mid}</span>\n </div>\n )}\n </div>\n )}\n {found === true && (\n <div className=\"mt-3 p-2 bg-green-100 rounded-lg border border-green-300 text-center\">\n <span className=\"text-green-800 font-bold\">✓ Found in {currentStep} steps (log₂{array.length} ≈ {Math.ceil(Math.log2(array.length))} max)</span>\n </div>\n )}\n {found === false && (\n <div className=\"mt-3 p-2 bg-red-100 rounded-lg border border-red-300 text-center\">\n <span className=\"text-red-800 font-bold\">✗ Not found - search space exhausted</span>\n </div>\n )}\n </div>\n\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-colors 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-colors 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 CodePanel,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n ALGORITHM_CODE,\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 showControls?: boolean;\n showCode?: boolean;\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 showControls = true,\n showCode = true,\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-colors 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 {/* Code Panels */}\n {showCode && (\n <div className=\"px-4 py-3 border-t border-gray-200\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-indigo-600 mb-2\">{ALGORITHM_NAMES[algorithm1]}</div>\n <CodePanel code={ALGORITHM_CODE[algorithm1]} activeLine={-1} />\n </div>\n <div>\n <div className=\"text-xs font-medium text-purple-600 mb-2\">{ALGORITHM_NAMES[algorithm2]}</div>\n <CodePanel code={ALGORITHM_CODE[algorithm2]} activeLine={-1} />\n </div>\n </div>\n </div>\n )}\n\n {/* Controls */}\n {showControls && (\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 )}\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={500} className=\"flex-1 min-w-0\">\n {/* Distance Array - PROMINENT */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-orange-50 to-amber-50 rounded-xl border-2 border-orange-200\">\n <div className=\"text-sm font-semibold text-orange-800 mb-3\">\n Distance Array (shortest paths from node 0)\n </div>\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {distances.map((dist, idx) => {\n const isSource = idx === 0;\n const isCurrent = idx === current;\n const isVisited = visited.includes(idx);\n\n return (\n <div\n key={idx}\n className={`flex flex-col items-center p-2 rounded-lg border-2 min-w-[60px] transition-colors ${\n isCurrent\n ? 'bg-yellow-100 border-yellow-400 ring-2 ring-yellow-300'\n : isVisited\n ? 'bg-green-100 border-green-400'\n : 'bg-white border-gray-300'\n }`}\n >\n <div className={`text-xs font-medium ${\n isCurrent ? 'text-yellow-800' : isVisited ? 'text-green-800' : 'text-gray-500'\n }`}>\n Node {idx}\n {isSource && <span className=\"ml-1\">(src)</span>}\n </div>\n <div className={`text-xl font-bold font-mono ${\n isCurrent ? 'text-yellow-900' : isVisited ? 'text-green-900' : 'text-gray-700'\n }`}>\n {dist === Infinity ? '∞' : dist}\n </div>\n {isCurrent && <div className=\"text-xs text-yellow-700 font-bold\">← PROCESSING</div>}\n {isVisited && !isCurrent && <div className=\"text-xs text-green-600\">✓ Final</div>}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Relaxation Explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg border border-blue-200\">\n <div className=\"text-sm font-semibold text-blue-800 mb-2\">\n Relaxation Formula\n </div>\n <div className=\"font-mono text-sm text-center\">\n if dist[u] + weight(u,v) < dist[v] → <span className=\"text-green-600 font-bold\">update dist[v]</span>\n </div>\n </div>\n\n {/* Priority Queue - More visible */}\n <div className=\"mb-4 p-3 bg-orange-50 rounded-lg border border-orange-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-semibold text-orange-800\">Priority Queue (min-heap)</span>\n <span className=\"text-xs text-orange-600\">(node:distance)</span>\n </div>\n <div className=\"flex flex-wrap gap-2\">\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-3 py-1.5 rounded-lg font-mono text-sm font-medium ${\n index === 0\n ? 'bg-orange-200 text-orange-900 ring-2 ring-orange-400'\n : 'bg-white text-orange-800 border border-orange-300'\n }`}\n >\n {item.node}:{item.dist}\n {index === 0 && <span className=\"ml-1 text-xs\">← MIN</span>}\n </span>\n ))\n ) : (\n <span className=\"text-sm text-gray-400 italic\">empty</span>\n )}\n </div>\n </div>\n\n {/* Graph SVG */}\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-colors 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 {/* 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={450} className=\"flex-1 min-w-0\">\n {/* DP Recurrence Formula - Prominent */}\n <div className=\"mb-6 p-4 bg-gradient-to-r from-teal-50 to-cyan-50 rounded-xl border-2 border-teal-200\">\n <div className=\"text-sm font-semibold text-teal-800 mb-3\">\n DP Recurrence Formula\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-teal-200\">\n <div className=\"text-gray-600 mb-2\">\n dp[i][w] = max(\n <span className=\"text-yellow-600 font-bold\"> skip</span>,\n <span className=\"text-green-600 font-bold\"> take</span>\n )\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-xs mt-3\">\n <div className=\"bg-yellow-50 p-2 rounded border border-yellow-200\">\n <span className=\"text-yellow-700 font-bold\">skip</span>\n <span className=\"text-gray-600\"> = dp[i-1][w]</span>\n <div className=\"text-gray-500 mt-1\">Don't take item i</div>\n </div>\n <div className=\"bg-green-50 p-2 rounded border border-green-200\">\n <span className=\"text-green-700 font-bold\">take</span>\n <span className=\"text-gray-600\"> = dp[i-1][w-weight] + value</span>\n <div className=\"text-gray-500 mt-1\">Take item i</div>\n </div>\n </div>\n </div>\n\n {/* Current Calculation */}\n {currentI > 0 && currentW > 0 && (\n <div className=\"mt-4 p-3 bg-white rounded-lg border-2 border-purple-300\">\n <div className=\"text-sm font-semibold text-purple-800 mb-2\">\n Current: dp[{currentI}][{currentW}]\n </div>\n <div className=\"flex items-center gap-4 text-sm\">\n <div className=\"text-gray-600\">\n Item {currentI}: <span className=\"font-mono\">w={items[currentI-1]?.weight}, v={items[currentI-1]?.value}</span>\n </div>\n {decision && (\n <div className={`px-3 py-1 rounded-full font-bold ${\n decision === 'take'\n ? 'bg-green-100 text-green-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}>\n {decision === 'take' ? '✓ TAKE' : '✗ SKIP'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex gap-6\">\n {/* Items List */}\n <div className=\"w-40\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Items (i = item index):\n </div>\n <div className=\"space-y-1\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className={`px-2 py-1.5 rounded text-xs transition-colors ${\n idx + 1 === currentI\n ? 'bg-purple-200 text-purple-900 font-bold ring-2 ring-purple-400'\n : idx + 1 < currentI\n ? 'bg-blue-50 text-blue-600'\n : 'bg-gray-100 text-gray-500'\n }`}\n >\n <span className=\"font-mono\">i={idx + 1}</span>: w={item.weight}, v={item.value}\n {idx + 1 === currentI && <span className=\"ml-1\">← CURRENT</span>}\n </div>\n ))}\n </div>\n <div className=\"mt-3 text-sm p-2 bg-gray-100 rounded\">\n <span className=\"font-medium text-gray-700\">Max Capacity:</span>{' '}\n <span className=\"text-gray-900 font-mono\">{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 (w = current capacity):\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 {/* DFS vs BFS - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-indigo-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔍</span> DFS vs BFS\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className={`p-2 rounded-lg border ${algorithm === 'dfs' ? 'bg-purple-100 border-purple-300' : 'bg-gray-100 border-gray-300'}`}>\n <div className=\"font-bold text-purple-700\">Depth-First (DFS)</div>\n <div className=\"text-purple-600\">Uses: Stack</div>\n <div className=\"text-[10px] text-purple-500\">Go deep before wide</div>\n </div>\n <div className={`p-2 rounded-lg border ${algorithm === 'bfs' ? 'bg-indigo-100 border-indigo-300' : 'bg-gray-100 border-gray-300'}`}>\n <div className=\"font-bold text-indigo-700\">Breadth-First (BFS)</div>\n <div className=\"text-indigo-600\">Uses: Queue</div>\n <div className=\"text-[10px] text-indigo-500\">Level by level</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n Both O(V+E) time • DFS for paths/cycles • BFS for shortest path (unweighted)\n </div>\n </div>\n\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-colors 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 {/* Hash Function - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-indigo-50 to-purple-50 rounded-xl border-2 border-indigo-200\">\n <div className=\"text-sm font-bold text-indigo-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">#️⃣</span> Hash Function\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-indigo-200\">\n <div className=\"text-center text-indigo-700 font-bold mb-2\">\n index = hashCode(key) % capacity\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n Same key → same index (deterministic) • Different keys may collide → chaining\n </div>\n </div>\n {/* Current hash calculation */}\n {stepData.hash !== undefined && stepData.key && (\n <div className=\"mt-3 p-3 bg-white rounded-lg border border-indigo-200\">\n <div className=\"text-xs text-center\">\n <div className=\"font-mono mb-1\">\n hashCode(<span className=\"text-indigo-600 font-bold\">"{stepData.key}"</span>) = <span className=\"text-purple-600 font-bold\">{stepData.hash}</span>\n </div>\n <div className=\"font-mono\">\n <span className=\"text-purple-600\">{stepData.hash}</span> % <span className=\"text-gray-600\">{BUCKET_COUNT}</span> = <span className=\"text-indigo-600 font-bold text-lg\">{stepData.bucketIndex}</span>\n </div>\n <div className=\"mt-2 text-indigo-600 text-lg\">↓ bucket[{stepData.bucketIndex}]</div>\n </div>\n </div>\n )}\n </div>\n\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\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 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={400} className=\"flex-1 min-w-0\">\n {/* Keys to insert */}\n <div className=\"mb-6\">\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-3 py-1.5 text-sm font-medium rounded-lg border-2 transition-colors ${\n isInserted\n ? 'bg-green-100 text-green-700 border-green-400'\n : k === key\n ? 'bg-yellow-100 text-yellow-700 border-yellow-400 ring-2 ring-yellow-300'\n : 'bg-gray-50 text-gray-600 border-gray-300'\n }`}\n >\n {k}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Hash Calculation - Prominent */}\n <div className=\"mb-6 p-4 bg-gradient-to-r from-violet-50 to-purple-50 rounded-xl border-2 border-violet-200 min-h-[80px]\">\n <div className=\"text-sm font-semibold text-violet-800 mb-2\">\n Hash Calculation\n </div>\n {operation === 'insert' && key ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-gray-800\">\n hash(<span className=\"text-violet-600 font-bold\">"{key}"</span>) % {buckets.length} = <span className=\"text-violet-600 font-bold text-xl\">{bucketIndex}</span>\n </div>\n <div className=\"text-violet-600 text-2xl animate-bounce\">↓</div>\n </div>\n ) : operation === 'collision' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-red-700\">\n Collision at bucket <span className=\"font-bold\">[{bucketIndex}]</span>! Adding to chain...\n </div>\n <div className=\"text-red-500 text-2xl\">⚠️</div>\n </div>\n ) : operation === 'placed' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-green-700\">\n <span className=\"font-bold\">"{key}"</span> placed in bucket <span className=\"font-bold\">[{bucketIndex}]</span>\n </div>\n <div className=\"text-green-500 text-2xl\">✓</div>\n </div>\n ) : operation === 'rehash' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-orange-700\">\n Rehashing: expanding table...\n </div>\n <div className=\"text-orange-500 text-2xl\">🔄</div>\n </div>\n ) : (\n <div className=\"text-gray-400 text-center\">\n Click Play to start visualization\n </div>\n )}\n </div>\n\n {/* Hash Table Buckets - Horizontal Row */}\n <div className=\"mb-6\">\n <div className=\"text-sm font-medium text-gray-700 mb-3\">\n Hash Table ({buckets.length} buckets):\n </div>\n <div className=\"overflow-x-auto pb-2\">\n <div className=\"flex gap-1\" style={{ minWidth: 'max-content' }}>\n {buckets.map((bucket, idx) => (\n <div\n key={idx}\n className=\"flex flex-col items-center\"\n style={{ minWidth: '70px' }}\n >\n {/* Bucket Index */}\n <div\n className={`w-full text-center py-1 px-2 rounded-t-lg font-mono text-sm font-bold transition-colors ${\n idx === bucketIndex\n ? operation === 'collision'\n ? 'bg-red-500 text-white'\n : operation === 'placed'\n ? 'bg-green-500 text-white'\n : 'bg-yellow-400 text-yellow-900'\n : 'bg-gray-200 text-gray-600'\n }`}\n >\n [{idx}]\n </div>\n {/* Bucket Content - Vertical Chain */}\n <div\n className={`w-full border-2 rounded-b-lg min-h-[100px] p-1 transition-colors ${\n idx === bucketIndex\n ? operation === 'collision'\n ? 'border-red-400 bg-red-50'\n : operation === 'placed'\n ? 'border-green-400 bg-green-50'\n : 'border-yellow-400 bg-yellow-50'\n : 'border-gray-300 bg-gray-50'\n }`}\n >\n <div className=\"flex flex-col gap-1\">\n {bucket.length === 0 ? (\n <span className=\"text-xs text-gray-400 italic text-center py-2\">\n empty\n </span>\n ) : (\n bucket.map((bucketKey, keyIdx) => (\n <div\n key={keyIdx}\n className={`px-2 py-1 text-xs font-medium rounded border text-center transition-colors ${\n bucketKey === key &&\n (operation === 'placed' || operation === 'insert')\n ? 'bg-yellow-200 text-yellow-900 border-yellow-400'\n : 'bg-blue-100 text-blue-800 border-blue-300'\n }`}\n >\n {bucketKey}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\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 vs ArrayList - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-blue-50 to-indigo-50 rounded-xl border-2 border-blue-200\">\n <div className=\"text-sm font-bold text-blue-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔗</span> LinkedList vs ArrayList\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-xs\">\n <div className=\"bg-white p-2 rounded-lg border border-blue-200 text-center\">\n <div className=\"font-semibold text-gray-700 mb-1\">Operation</div>\n </div>\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-semibold text-blue-700 mb-1\">LinkedList</div>\n </div>\n <div className=\"bg-orange-100 p-2 rounded-lg border border-orange-300 text-center\">\n <div className=\"font-semibold text-orange-700 mb-1\">ArrayList</div>\n </div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">add/remove (ends)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)*</div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">add/remove (middle)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)**</div>\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300 text-center font-bold text-red-700\">O(n)</div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">get(index)</div>\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300 text-center font-bold text-red-700\">O(n)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)</div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-500 text-center\">\n * amortized | ** if you have the node reference\n </div>\n </div>\n\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-colors ${\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 - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-orange-50 to-amber-50 rounded-xl border-2 border-orange-200\">\n <div className=\"text-sm font-bold text-orange-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔗</span> LinkedHashMap = HashMap + LinkedList\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div className=\"bg-white p-3 rounded-lg border border-orange-200\">\n <div className=\"text-xs font-semibold text-gray-700 mb-1\">\n 🗂️ Hash Table\n </div>\n <div className=\"text-[10px] text-gray-500\">\n O(1) get/put • Same as HashMap\n </div>\n </div>\n <div className=\"bg-white p-3 rounded-lg border border-orange-200\">\n <div className=\"text-xs font-semibold text-gray-700 mb-1\">\n 🔗 Doubly Linked List\n </div>\n <div className=\"text-[10px] text-gray-500\">\n {accessOrder ? 'Access order (LRU cache)' : 'Insertion order'} • O(1) reorder\n </div>\n </div>\n </div>\n {stepData.operation === 'access' && (\n <div className=\"mt-3 p-2 bg-orange-100 rounded-lg border border-orange-300\">\n <div className=\"text-xs text-center text-orange-800\">\n <span className=\"font-bold\">LRU Update:</span> Entry "{stepData.key}" moved to end of list (most recently used)\n </div>\n </div>\n )}\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 - Prominent */}\n <div className=\"mb-4 p-3 bg-gradient-to-r from-orange-100 to-amber-100 rounded-xl border-2 border-orange-300\">\n <div className=\"text-sm font-semibold text-orange-800 mb-2 flex items-center gap-2\">\n <span>🔗</span> {accessOrder ? 'Access Order (LRU: oldest → newest)' : 'Insertion Order'}\n </div>\n <div className=\"bg-white rounded-lg p-3 border border-orange-200\">\n <div className=\"flex flex-wrap items-center gap-1\">\n {linkedOrder.length > 0 ? (\n <>\n <div className=\"px-2 py-1 bg-gray-100 text-[10px] text-gray-600 rounded font-semibold\">HEAD</div>\n <span className=\"text-orange-400 font-bold\">→</span>\n {linkedOrder.map((key, idx) => (\n <React.Fragment key={key}>\n {idx > 0 && (\n <span className=\"text-orange-400 font-bold\">⇄</span>\n )}\n <div\n className={`px-3 py-1 text-xs font-bold rounded-full transition-colors ${getLinkedNodeStyle(key)}`}\n >\n {key}\n </div>\n </React.Fragment>\n ))}\n <span className=\"text-orange-400 font-bold\">→</span>\n <div className=\"px-2 py-1 bg-gray-100 text-[10px] text-gray-600 rounded font-semibold\">TAIL</div>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">HEAD → TAIL (empty)</span>\n )}\n </div>\n {linkedOrder.length > 0 && (\n <div className=\"mt-2 pt-2 border-t border-orange-200 text-[10px] text-gray-500 text-center\">\n Doubly linked: each entry has prev/next pointers\n </div>\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 oldArray?: (number | null)[]; // For resize: show before state\n size: number;\n capacity: number;\n oldCapacity?: number; // For resize\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 const oldArray = [...array];\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 oldArray,\n size,\n capacity,\n oldCapacity,\n description: `Resize! Array full (${oldCapacity}/${oldCapacity}). Create new array with capacity ${capacity}, copy ${size} 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, oldArray, oldCapacity, operation } =\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={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Resize Comparison - Show when resize happens */}\n {operation === 'resize' && oldArray && (\n <div className=\"mb-4 p-4 bg-gradient-to-r from-red-50 to-orange-50 rounded-xl border-2 border-red-200\">\n <div className=\"text-sm font-bold text-red-700 mb-3 flex items-center gap-2\">\n <span className=\"text-xl\">⚠️</span> RESIZE OPERATION (O(n) cost!)\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* Old Array */}\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">\n OLD Array (capacity: {oldCapacity}) - FULL!\n </div>\n <div className=\"bg-white rounded-lg p-2 border border-red-200\">\n <div className=\"flex gap-1 flex-wrap\">\n {oldArray.map((val, idx) => (\n <div\n key={idx}\n className=\"w-10 h-10 flex items-center justify-center rounded border-2 text-sm font-medium bg-red-100 border-red-300 text-red-800\"\n >\n {val !== null ? val : ''}\n </div>\n ))}\n </div>\n </div>\n </div>\n {/* Arrow */}\n <div className=\"hidden md:flex items-center justify-center absolute left-1/2 -translate-x-1/2\">\n <div className=\"text-2xl text-orange-500\">→</div>\n </div>\n {/* New Array */}\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">\n NEW Array (capacity: {capacity}) - 2x bigger\n </div>\n <div className=\"bg-white rounded-lg p-2 border border-green-200\">\n <div className=\"flex gap-1 flex-wrap\">\n {array.map((val, idx) => (\n <div\n key={idx}\n className={`w-10 h-10 flex items-center justify-center rounded border-2 text-sm font-medium ${\n idx < size\n ? 'bg-green-100 border-green-300 text-green-800'\n : 'bg-gray-100 border-gray-200 text-gray-300'\n }`}\n >\n {val !== null ? val : ''}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-xs text-red-600 text-center\">\n All {size} elements copied to new array → This is why add() is O(1) <strong>amortized</strong>, not O(1)\n </div>\n </div>\n )}\n\n {/* Array Visualization (normal view) */}\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-colors ${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-colors 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 {/* BST Property - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-emerald-50 to-teal-50 rounded-xl border-2 border-emerald-200\">\n <div className=\"text-sm font-bold text-emerald-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🌳</span> Binary Search Tree Property\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-emerald-200\">\n <div className=\"text-center text-emerald-700 font-bold text-base mb-2\">\n left < <span className=\"text-gray-800\">node</span> < right\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n All values in left subtree are smaller • All values in right subtree are larger\n </div>\n </div>\n {/* Current comparison */}\n {currentStepData.operation === 'add' && currentStepData.value !== undefined && currentNode !== undefined && currentNode !== currentStepData.value && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-emerald-200\">\n <div className=\"text-xs text-center\">\n <span className=\"font-semibold text-emerald-700\">Comparing:</span>{' '}\n <span className=\"font-mono\">\n {currentStepData.value} {currentStepData.value < currentNode ? '<' : '>'} {currentNode}\n </span>\n {' → '}\n <span className={`font-bold ${currentStepData.value < currentNode ? 'text-blue-600' : 'text-orange-600'}`}>\n Go {currentStepData.value < currentNode ? 'LEFT' : 'RIGHT'}\n </span>\n </div>\n </div>\n )}\n {currentStepData.operation === 'contains' && currentStepData.value !== undefined && currentNode !== undefined && !found && path.length > 0 && path[path.length - 1] !== currentStepData.value && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-emerald-200\">\n <div className=\"text-xs text-center\">\n <span className=\"font-semibold text-emerald-700\">Comparing:</span>{' '}\n <span className=\"font-mono\">\n {currentStepData.value} {currentStepData.value < currentNode ? '<' : '>'} {currentNode}\n </span>\n {' → '}\n <span className={`font-bold ${currentStepData.value < currentNode ? 'text-blue-600' : 'text-orange-600'}`}>\n Go {currentStepData.value < currentNode ? 'LEFT' : 'RIGHT'}\n </span>\n </div>\n </div>\n )}\n {found === true && (\n <div className=\"mt-3 p-2 bg-green-100 rounded-lg border border-green-300\">\n <div className=\"text-xs text-center text-green-800 font-bold\">\n ✓ Found! {currentStepData.value} == {currentNode}\n </div>\n </div>\n )}\n {found === false && (\n <div className=\"mt-3 p-2 bg-red-100 rounded-lg border border-red-300\">\n <div className=\"text-xs text-center text-red-800 font-bold\">\n ✗ Not found! Reached null (no more children to check)\n </div>\n </div>\n )}\n </div>\n\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-colors 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 {/* Why EnumSet? Memory Comparison - PROMINENT */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-green-50 to-lime-50 rounded-xl border-2 border-green-200\">\n <div className=\"text-sm font-bold text-green-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">💡</span> Why EnumSet? Memory Efficiency!\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n {/* EnumSet */}\n <div className=\"bg-white p-3 rounded-lg border-2 border-green-300\">\n <div className=\"text-sm font-bold text-green-700 mb-2\">EnumSet</div>\n <div className=\"text-2xl font-bold text-green-600 mb-1\">8 bytes</div>\n <div className=\"text-xs text-gray-600\">\n 1 long for up to 64 enum values\n </div>\n <div className=\"mt-2 text-xs text-green-600\">\n ✓ Single CPU instruction per operation\n </div>\n </div>\n {/* HashSet */}\n <div className=\"bg-white p-3 rounded-lg border-2 border-gray-300\">\n <div className=\"text-sm font-bold text-gray-500 mb-2\">HashSet</div>\n <div className=\"text-2xl font-bold text-gray-500 mb-1\">~280 bytes</div>\n <div className=\"text-xs text-gray-500\">\n For 7 enum values (~40 bytes each)\n </div>\n <div className=\"mt-2 text-xs text-gray-500\">\n Hash computation + object overhead\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-center\">\n <span className=\"inline-block px-3 py-1 bg-green-100 text-green-800 rounded-full text-sm font-bold\">\n 35x smaller memory footprint!\n </span>\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 siftPath?: number[]; // Path from current index to root (siftUp) or to leaf (siftDown)\n currentIndex?: number; // Current position being processed\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-purple-200', label: 'Sift Path', border: '#a78bfa' },\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 // Calculate path to root for this index\n const getPathToRoot = (index: number): number[] => {\n const path: number[] = [index];\n let i = index;\n while (i > 0) {\n i = Math.floor((i - 1) / 2);\n path.push(i);\n }\n return path;\n };\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 siftPath: getPathToRoot(idx),\n currentIndex: 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 siftPath: getPathToRoot(idx),\n currentIndex: idx,\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 siftPath: getPathToRoot(parentIdx),\n currentIndex: 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 siftPath: getPathToRoot(idx),\n currentIndex: 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 // Calculate path from index to deepest reachable leaf\n const getPathToLeaf = (heapSize: number, startIdx: number): number[] => {\n const path: number[] = [startIdx];\n let i = startIdx;\n while (2 * i + 1 < heapSize) {\n // Follow smaller child path\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (right < heapSize) {\n path.push(left, right);\n } else {\n path.push(left);\n }\n i = left; // Just trace left path for visualization\n }\n return path;\n };\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 siftPath: getPathToLeaf(heap.length, 0),\n currentIndex: 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 currentIndex: 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 siftPath: [idx, leftIdx < heap.length ? leftIdx : -1, rightIdx < heap.length ? rightIdx : -1].filter(i => i >= 0),\n currentIndex: idx,\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 currentIndex: 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, siftPath, currentIndex } =\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 (siftPath?.includes(idx) && idx !== currentIndex) {\n return 'fill-purple-200 stroke-purple-400'; // Sift path highlight\n }\n if (idx === 0) {\n return 'fill-purple-100 stroke-purple-300';\n }\n return 'fill-white stroke-gray-300';\n };\n\n // Check if an edge is on the sift path\n const isEdgeOnPath = (parentIdx: number, childIdx: number): boolean => {\n if (!siftPath || siftPath.length < 2) return false;\n for (let i = 0; i < siftPath.length - 1; i++) {\n const a = siftPath[i];\n const b = siftPath[i + 1];\n if ((a === parentIdx && b === childIdx) || (a === childIdx && b === parentIdx)) {\n return true;\n }\n }\n return false;\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 Property Formula - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🏔️</span> Min-Heap Property\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-purple-200\">\n <div className=\"text-center text-purple-700 font-bold mb-2\">\n heap[parent] ≤ heap[children]\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 text-xs text-gray-600\">\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">parent(i)</span> = ⌊(i-1)/2⌋\n </div>\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">left(i)</span> = 2i + 1\n </div>\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">right(i)</span> = 2i + 2\n </div>\n </div>\n </div>\n {/* Current Index Calculation */}\n {currentIndex !== undefined && currentIndex >= 0 && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-purple-200\">\n <div className=\"text-xs text-gray-600 text-center\">\n <span className=\"font-semibold text-purple-700\">Current: i = {currentIndex}</span>\n {currentIndex > 0 && (\n <span className=\"mx-2\">→ parent({currentIndex}) = ⌊({currentIndex}-1)/2⌋ = <span className=\"text-purple-600 font-bold\">{Math.floor((currentIndex - 1) / 2)}</span></span>\n )}\n {2 * currentIndex + 1 < heap.length && (\n <span className=\"mx-2\">→ left({currentIndex}) = <span className=\"text-purple-600 font-bold\">{2 * currentIndex + 1}</span></span>\n )}\n </div>\n </div>\n )}\n </div>\n\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 const isOnPath = isEdgeOnPath(parentIdx, idx);\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' : isOnPath ? '#c4b5fd' : '#d1d5db'}\n strokeWidth={isHighlighted ? 3 : isOnPath ? 2 : 1}\n strokeDasharray={isOnPath && !isHighlighted ? '4,2' : undefined}\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-colors`}\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 {/* ConcurrentHashMap vs synchronized - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-red-50 to-orange-50 rounded-xl border-2 border-red-200\">\n <div className=\"text-sm font-bold text-red-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">⚡</span> Why ConcurrentHashMap?\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300\">\n <div className=\"font-bold text-red-700\">synchronized HashMap</div>\n <div className=\"text-red-600\">❌ Single lock for entire map</div>\n <div className=\"text-[10px] text-red-500\">All threads wait for one lock</div>\n </div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300\">\n <div className=\"font-bold text-green-700\">ConcurrentHashMap</div>\n <div className=\"text-green-600\">✓ Segment-level locking</div>\n <div className=\"text-[10px] text-green-500\">Threads work in parallel on different segments</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n get() never blocks • put() only locks one segment • Much better concurrency!\n </div>\n </div>\n\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 Pattern - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-cyan-50 to-blue-50 rounded-xl border-2 border-cyan-200\">\n <div className=\"text-sm font-bold text-cyan-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔄</span> Producer-Consumer Pattern\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-xs\">\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center\">\n <div className=\"font-bold text-green-700\">Producers</div>\n <div className=\"text-green-600\">put() → queue</div>\n <div className=\"text-[10px] text-green-500\">Block if FULL</div>\n </div>\n <div className=\"bg-gray-100 p-2 rounded-lg border border-gray-300 text-center\">\n <div className=\"font-bold text-gray-700\">BlockingQueue</div>\n <div className=\"text-gray-600\">Thread-safe buffer</div>\n <div className=\"text-[10px] text-gray-500\">Capacity: {capacity}</div>\n </div>\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Consumers</div>\n <div className=\"text-blue-600\">take() ← queue</div>\n <div className=\"text-[10px] text-blue-500\">Block if EMPTY</div>\n </div>\n </div>\n </div>\n\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-colors ${\n activeThread === p\n ? 'bg-green-500 text-white'\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-colors ${\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-colors ${\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-colors ${\n activeThread === c\n ? 'bg-blue-500 text-white'\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-colors ${\n isNew && idx === highlightIndex\n ? 'bg-green-500 border-green-600 text-white'\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 {/* Copy-on-Write Pattern - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-lime-50 to-green-50 rounded-xl border-2 border-lime-200\">\n <div className=\"text-sm font-bold text-lime-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">📋</span> Copy-on-Write Pattern\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Read (get)</div>\n <div className=\"text-2xl text-blue-600\">O(1)</div>\n <div className=\"text-[10px] text-blue-500\">No lock, no copy</div>\n </div>\n <div className=\"bg-orange-100 p-2 rounded-lg border border-orange-300 text-center\">\n <div className=\"font-bold text-orange-700\">Write (add/set)</div>\n <div className=\"text-2xl text-orange-600\">O(n)</div>\n <div className=\"text-[10px] text-orange-500\">Full array copy</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n Best for: Read-heavy, rarely-modified collections • Iterators never throw ConcurrentModificationException\n </div>\n </div>\n\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-colors ${\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-[width] 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-colors 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 {/* Generational Hypothesis - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🧬</span> Generational Hypothesis\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-purple-200\">\n <div className=\"text-center text-purple-700 font-bold mb-2\">\n "Most objects die young"\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n ~95% of objects become garbage before first GC • Optimize for the common case\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs\">\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Young Gen</div>\n <div className=\"text-blue-600\">Fast copy collection</div>\n <div className=\"text-[10px] text-blue-500\">Minor GC (frequent)</div>\n </div>\n <div className=\"bg-amber-100 p-2 rounded-lg border border-amber-300 text-center\">\n <div className=\"font-bold text-amber-700\">Old Gen</div>\n <div className=\"text-amber-600\">Mark-sweep collection</div>\n <div className=\"text-[10px] text-amber-500\">Major GC (rare, slow)</div>\n </div>\n </div>\n </div>\n\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":["forwardRef","createElement","jsxs","jsx","Code2","ACCENT_COLORS","useState","useCallback","Edit2","useRef","useEffect","ALGORITHM_NAMES","ALGORITHM_COMPLEXITIES","ALGORITHM_CODE","LEGEND_ITEMS","Fragment","generateBubbleSortSteps","generateSelectionSortSteps","generateInsertionSortSteps","generateQuickSortSteps","generateMergeSortSteps","STEP_GENERATORS","generateRandomArray","useMemo","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.cjs","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-left.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/circle-check-big.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/circle-x.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/lightbulb.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/trophy.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/useInterviewMode.ts","../src/shared/InterviewModePanel.tsx","../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/HashMapInterviewVisualizer.tsx","../src/visualizers/ListComparisonVisualizer.tsx","../src/visualizers/TreeSetInterviewVisualizer.tsx","../src/visualizers/SortingInterviewVisualizer.tsx","../src/visualizers/GraphInterviewVisualizer.tsx","../src/visualizers/BloomFilterInterviewVisualizer.tsx","../src/visualizers/BTreeInterviewVisualizer.tsx","../src/visualizers/DijkstraInterviewVisualizer.tsx","../src/visualizers/DPInterviewVisualizer.tsx","../src/visualizers/ConsistentHashingInterviewVisualizer.tsx","../src/visualizers/RaftInterviewVisualizer.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/BloomFilterVisualizer.tsx","../src/visualizers/BTreeVisualizer.tsx","../src/visualizers/ConsistentHashingVisualizer.tsx","../src/visualizers/RaftVisualizer.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 ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.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 CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.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 CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.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 Lightbulb = createLucideIcon(\"Lightbulb\", [\n [\n \"path\",\n {\n d: \"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\n key: \"1gvzjb\"\n }\n ],\n [\"path\", { d: \"M9 18h6\", key: \"x1upvd\" }],\n [\"path\", { d: \"M10 22h4\", key: \"ceow96\" }]\n]);\n\nexport { Lightbulb as default };\n//# sourceMappingURL=lightbulb.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 Trophy = createLucideIcon(\"Trophy\", [\n [\"path\", { d: \"M6 9H4.5a2.5 2.5 0 0 1 0-5H6\", key: \"17hqa7\" }],\n [\"path\", { d: \"M18 9h1.5a2.5 2.5 0 0 0 0-5H18\", key: \"lmptdp\" }],\n [\"path\", { d: \"M4 22h16\", key: \"57wxv0\" }],\n [\"path\", { d: \"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22\", key: \"1nw9bq\" }],\n [\"path\", { d: \"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22\", key: \"1np0yb\" }],\n [\"path\", { d: \"M18 2H6v7a6 6 0 0 0 12 0V2Z\", key: \"u46fv3\" }]\n]);\n\nexport { Trophy as default };\n//# sourceMappingURL=trophy.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-colors 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 <div className=\"mt-1 pt-1 border-t border-gray-700 min-h-[36px]\">\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 {variables && Object.keys(variables).length > 0 ? (\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 ) : (\n <span className=\"text-[9px] text-gray-600\">—</span>\n )}\n </div>\n </div>\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","import { useState, useCallback, useMemo } from 'react';\n\nexport interface InterviewQuestion {\n id: string;\n question: string;\n options: string[];\n correctAnswer: number; // index of correct option\n explanation: string;\n hint?: string;\n difficulty: 'easy' | 'medium' | 'hard';\n topic: string;\n relatedStep?: number; // Step in visualizer to show for this question\n}\n\nexport interface InterviewResult {\n questionId: string;\n selectedAnswer: number | null;\n isCorrect: boolean;\n timeSpent: number; // in seconds\n usedHint: boolean;\n}\n\nexport interface InterviewSession {\n questions: InterviewQuestion[];\n results: InterviewResult[];\n currentQuestionIndex: number;\n isComplete: boolean;\n startTime: number;\n totalTime: number;\n}\n\nexport interface UseInterviewModeOptions {\n questions: InterviewQuestion[];\n timeLimit?: number; // in seconds, 0 = no limit\n shuffleQuestions?: boolean;\n onComplete?: (session: InterviewSession) => void;\n}\n\nexport interface UseInterviewModeReturn {\n // State\n session: InterviewSession;\n currentQuestion: InterviewQuestion | null;\n isComplete: boolean;\n score: { correct: number; total: number; percentage: number };\n timeRemaining: number | null;\n\n // Actions\n selectAnswer: (answerIndex: number) => void;\n nextQuestion: () => void;\n previousQuestion: () => void;\n useHint: () => void;\n restartSession: () => void;\n\n // Current question state\n selectedAnswer: number | null;\n showExplanation: boolean;\n showHint: boolean;\n isAnswered: boolean;\n}\n\nfunction shuffleArray<T>(array: T[]): T[] {\n const shuffled = [...array];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n return shuffled;\n}\n\nexport function useInterviewMode(options: UseInterviewModeOptions): UseInterviewModeReturn {\n const { questions, timeLimit = 0, shuffleQuestions = false, onComplete } = options;\n\n const initialQuestions = useMemo(() => {\n return shuffleQuestions ? shuffleArray(questions) : questions;\n }, [questions, shuffleQuestions]);\n\n const [session, setSession] = useState<InterviewSession>(() => ({\n questions: initialQuestions,\n results: [],\n currentQuestionIndex: 0,\n isComplete: false,\n startTime: Date.now(),\n totalTime: 0,\n }));\n\n const [questionStartTime, setQuestionStartTime] = useState(Date.now());\n const [showHint, setShowHint] = useState(false);\n const [showExplanation, setShowExplanation] = useState(false);\n const [selectedAnswer, setSelectedAnswer] = useState<number | null>(null);\n\n const currentQuestion = session.questions[session.currentQuestionIndex] || null;\n\n const currentResult = session.results.find(\n (r) => r.questionId === currentQuestion?.id\n );\n\n const isAnswered = currentResult !== undefined;\n\n const score = useMemo(() => {\n const correct = session.results.filter((r) => r.isCorrect).length;\n const total = session.results.length;\n const percentage = total > 0 ? Math.round((correct / total) * 100) : 0;\n return { correct, total, percentage };\n }, [session.results]);\n\n const selectAnswer = useCallback((answerIndex: number) => {\n if (!currentQuestion || isAnswered) return;\n\n const timeSpent = Math.round((Date.now() - questionStartTime) / 1000);\n const isCorrect = answerIndex === currentQuestion.correctAnswer;\n\n const result: InterviewResult = {\n questionId: currentQuestion.id,\n selectedAnswer: answerIndex,\n isCorrect,\n timeSpent,\n usedHint: showHint,\n };\n\n setSelectedAnswer(answerIndex);\n setShowExplanation(true);\n\n setSession((prev) => {\n const newResults = [...prev.results, result];\n const isComplete = newResults.length === prev.questions.length;\n\n if (isComplete && onComplete) {\n const finalSession = {\n ...prev,\n results: newResults,\n isComplete: true,\n totalTime: Math.round((Date.now() - prev.startTime) / 1000),\n };\n setTimeout(() => onComplete(finalSession), 0);\n }\n\n return {\n ...prev,\n results: newResults,\n isComplete,\n totalTime: Math.round((Date.now() - prev.startTime) / 1000),\n };\n });\n }, [currentQuestion, isAnswered, questionStartTime, showHint, onComplete]);\n\n const nextQuestion = useCallback(() => {\n if (session.currentQuestionIndex >= session.questions.length - 1) return;\n\n setSession((prev) => ({\n ...prev,\n currentQuestionIndex: prev.currentQuestionIndex + 1,\n }));\n setQuestionStartTime(Date.now());\n setShowHint(false);\n setShowExplanation(false);\n setSelectedAnswer(null);\n }, [session.currentQuestionIndex, session.questions.length]);\n\n const previousQuestion = useCallback(() => {\n if (session.currentQuestionIndex <= 0) return;\n\n setSession((prev) => ({\n ...prev,\n currentQuestionIndex: prev.currentQuestionIndex - 1,\n }));\n\n // Restore state for previous question\n const prevQuestion = session.questions[session.currentQuestionIndex - 1];\n const prevResult = session.results.find((r) => r.questionId === prevQuestion?.id);\n\n setSelectedAnswer(prevResult?.selectedAnswer ?? null);\n setShowExplanation(prevResult !== undefined);\n setShowHint(prevResult?.usedHint ?? false);\n }, [session.currentQuestionIndex, session.questions, session.results]);\n\n const useHint = useCallback(() => {\n setShowHint(true);\n }, []);\n\n const restartSession = useCallback(() => {\n const newQuestions = shuffleQuestions ? shuffleArray(questions) : questions;\n\n setSession({\n questions: newQuestions,\n results: [],\n currentQuestionIndex: 0,\n isComplete: false,\n startTime: Date.now(),\n totalTime: 0,\n });\n setQuestionStartTime(Date.now());\n setShowHint(false);\n setShowExplanation(false);\n setSelectedAnswer(null);\n }, [questions, shuffleQuestions]);\n\n // Restore state when navigating to already-answered question\n const effectiveSelectedAnswer = currentResult?.selectedAnswer ?? selectedAnswer;\n const effectiveShowExplanation = currentResult !== undefined ? true : showExplanation;\n\n return {\n session,\n currentQuestion,\n isComplete: session.isComplete,\n score,\n timeRemaining: timeLimit > 0 ? Math.max(0, timeLimit - session.totalTime) : null,\n selectAnswer,\n nextQuestion,\n previousQuestion,\n useHint,\n restartSession,\n selectedAnswer: effectiveSelectedAnswer,\n showExplanation: effectiveShowExplanation,\n showHint,\n isAnswered,\n };\n}\n\nexport default useInterviewMode;\n","import React from 'react';\nimport { CheckCircle, XCircle, Lightbulb, ChevronLeft, ChevronRight, RotateCcw, Trophy } from 'lucide-react';\nimport type { InterviewQuestion, InterviewSession } from './useInterviewMode';\n\ninterface InterviewModePanelProps {\n currentQuestion: InterviewQuestion | null;\n currentQuestionIndex: number;\n totalQuestions: number;\n selectedAnswer: number | null;\n showExplanation: boolean;\n showHint: boolean;\n isAnswered: boolean;\n isComplete: boolean;\n score: { correct: number; total: number; percentage: number };\n onSelectAnswer: (index: number) => void;\n onNextQuestion: () => void;\n onPreviousQuestion: () => void;\n onUseHint: () => void;\n onRestart: () => void;\n accentColor?: 'indigo' | 'green' | 'purple' | 'orange' | 'blue' | 'cyan';\n}\n\nconst DIFFICULTY_COLORS = {\n easy: 'bg-green-100 text-green-700',\n medium: 'bg-yellow-100 text-yellow-700',\n hard: 'bg-red-100 text-red-700',\n};\n\nconst ACCENT_COLORS = {\n indigo: {\n button: 'bg-indigo-500 hover:bg-indigo-600',\n buttonOutline: 'border-indigo-500 text-indigo-600 hover:bg-indigo-50',\n progress: 'bg-indigo-500',\n ring: 'ring-indigo-500',\n },\n green: {\n button: 'bg-green-500 hover:bg-green-600',\n buttonOutline: 'border-green-500 text-green-600 hover:bg-green-50',\n progress: 'bg-green-500',\n ring: 'ring-green-500',\n },\n purple: {\n button: 'bg-purple-500 hover:bg-purple-600',\n buttonOutline: 'border-purple-500 text-purple-600 hover:bg-purple-50',\n progress: 'bg-purple-500',\n ring: 'ring-purple-500',\n },\n orange: {\n button: 'bg-orange-500 hover:bg-orange-600',\n buttonOutline: 'border-orange-500 text-orange-600 hover:bg-orange-50',\n progress: 'bg-orange-500',\n ring: 'ring-orange-500',\n },\n blue: {\n button: 'bg-blue-500 hover:bg-blue-600',\n buttonOutline: 'border-blue-500 text-blue-600 hover:bg-blue-50',\n progress: 'bg-blue-500',\n ring: 'ring-blue-500',\n },\n cyan: {\n button: 'bg-cyan-500 hover:bg-cyan-600',\n buttonOutline: 'border-cyan-500 text-cyan-600 hover:bg-cyan-50',\n progress: 'bg-cyan-500',\n ring: 'ring-cyan-500',\n },\n};\n\nexport const InterviewModePanel: React.FC<InterviewModePanelProps> = ({\n currentQuestion,\n currentQuestionIndex,\n totalQuestions,\n selectedAnswer,\n showExplanation,\n showHint,\n isAnswered,\n isComplete,\n score,\n onSelectAnswer,\n onNextQuestion,\n onPreviousQuestion,\n onUseHint,\n onRestart,\n accentColor = 'indigo',\n}) => {\n const colors = ACCENT_COLORS[accentColor];\n\n // Completion screen\n if (isComplete) {\n return (\n <div className=\"p-6 bg-gradient-to-br from-gray-50 to-white rounded-xl border border-gray-200\">\n <div className=\"text-center\">\n <Trophy className=\"w-16 h-16 mx-auto mb-4 text-yellow-500\" />\n <h3 className=\"text-2xl font-bold text-gray-900 mb-2\">Interview Complete!</h3>\n\n <div className=\"mb-6\">\n <div className=\"text-5xl font-bold text-gray-900 mb-1\">\n {score.percentage}%\n </div>\n <div className=\"text-gray-500\">\n {score.correct} / {score.total} correct\n </div>\n </div>\n\n {/* Score interpretation */}\n <div className={`\n inline-block px-4 py-2 rounded-full text-sm font-medium mb-6\n ${score.percentage >= 80 ? 'bg-green-100 text-green-700' : ''}\n ${score.percentage >= 60 && score.percentage < 80 ? 'bg-yellow-100 text-yellow-700' : ''}\n ${score.percentage < 60 ? 'bg-red-100 text-red-700' : ''}\n `}>\n {score.percentage >= 80 && '🎉 Excellent! Ready for interviews!'}\n {score.percentage >= 60 && score.percentage < 80 && '👍 Good job! Keep practicing!'}\n {score.percentage < 60 && '📚 Review the concepts and try again!'}\n </div>\n\n <button\n onClick={onRestart}\n className={`\n flex items-center gap-2 mx-auto px-6 py-3 rounded-lg\n text-white font-medium transition-colors\n ${colors.button}\n `}\n >\n <RotateCcw className=\"w-5 h-5\" />\n Try Again\n </button>\n </div>\n </div>\n );\n }\n\n if (!currentQuestion) {\n return (\n <div className=\"p-6 bg-gray-50 rounded-xl border border-gray-200 text-center text-gray-500\">\n No questions available\n </div>\n );\n }\n\n return (\n <div className=\"bg-white rounded-xl border border-gray-200 overflow-hidden\">\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-gray-50 to-gray-100 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm font-medium text-gray-600\">\n Question {currentQuestionIndex + 1} / {totalQuestions}\n </span>\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${DIFFICULTY_COLORS[currentQuestion.difficulty]}`}>\n {currentQuestion.difficulty}\n </span>\n <span className=\"px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-600\">\n {currentQuestion.topic}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-500\">\n Score: {score.correct}/{score.total}\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div className=\"mt-2 h-1.5 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className={`h-full transition-all duration-300 ${colors.progress}`}\n style={{ width: `${((currentQuestionIndex + 1) / totalQuestions) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Question */}\n <div className=\"p-4\">\n <h4 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {currentQuestion.question}\n </h4>\n\n {/* Options */}\n <div className=\"space-y-2 mb-4\">\n {currentQuestion.options.map((option, index) => {\n const isSelected = selectedAnswer === index;\n const isCorrect = index === currentQuestion.correctAnswer;\n const showResult = showExplanation;\n\n let optionStyle = 'border-gray-200 hover:border-gray-300 hover:bg-gray-50';\n\n if (showResult) {\n if (isCorrect) {\n optionStyle = 'border-green-500 bg-green-50';\n } else if (isSelected && !isCorrect) {\n optionStyle = 'border-red-500 bg-red-50';\n }\n } else if (isSelected) {\n optionStyle = `border-2 ${colors.ring} bg-gray-50`;\n }\n\n return (\n <button\n key={index}\n onClick={() => !isAnswered && onSelectAnswer(index)}\n disabled={isAnswered}\n className={`\n w-full p-3 rounded-lg border-2 text-left transition-all\n flex items-center gap-3\n ${optionStyle}\n ${isAnswered ? 'cursor-default' : 'cursor-pointer'}\n `}\n >\n <span className={`\n w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold\n ${showResult && isCorrect ? 'bg-green-500 text-white' : ''}\n ${showResult && isSelected && !isCorrect ? 'bg-red-500 text-white' : ''}\n ${!showResult ? 'bg-gray-200 text-gray-600' : ''}\n `}>\n {showResult && isCorrect && <CheckCircle className=\"w-4 h-4\" />}\n {showResult && isSelected && !isCorrect && <XCircle className=\"w-4 h-4\" />}\n {!showResult && String.fromCharCode(65 + index)}\n </span>\n <span className={`flex-1 ${showResult && isCorrect ? 'font-medium text-green-700' : ''}`}>\n {option}\n </span>\n </button>\n );\n })}\n </div>\n\n {/* Hint */}\n {currentQuestion.hint && !showExplanation && (\n <div className=\"mb-4\">\n {showHint ? (\n <div className=\"p-3 bg-yellow-50 rounded-lg border border-yellow-200\">\n <div className=\"flex items-start gap-2\">\n <Lightbulb className=\"w-5 h-5 text-yellow-600 flex-shrink-0 mt-0.5\" />\n <div>\n <div className=\"text-xs font-medium text-yellow-800 mb-1\">Hint</div>\n <div className=\"text-sm text-yellow-700\">{currentQuestion.hint}</div>\n </div>\n </div>\n </div>\n ) : (\n <button\n onClick={onUseHint}\n className=\"flex items-center gap-2 text-sm text-yellow-600 hover:text-yellow-700\"\n >\n <Lightbulb className=\"w-4 h-4\" />\n Show hint\n </button>\n )}\n </div>\n )}\n\n {/* Explanation */}\n {showExplanation && (\n <div className={`\n p-3 rounded-lg border mb-4\n ${selectedAnswer === currentQuestion.correctAnswer\n ? 'bg-green-50 border-green-200'\n : 'bg-red-50 border-red-200'\n }\n `}>\n <div className=\"flex items-start gap-2\">\n {selectedAnswer === currentQuestion.correctAnswer ? (\n <CheckCircle className=\"w-5 h-5 text-green-600 flex-shrink-0 mt-0.5\" />\n ) : (\n <XCircle className=\"w-5 h-5 text-red-600 flex-shrink-0 mt-0.5\" />\n )}\n <div>\n <div className={`text-sm font-medium mb-1 ${\n selectedAnswer === currentQuestion.correctAnswer ? 'text-green-800' : 'text-red-800'\n }`}>\n {selectedAnswer === currentQuestion.correctAnswer ? 'Correct!' : 'Incorrect'}\n </div>\n <div className={`text-sm ${\n selectedAnswer === currentQuestion.correctAnswer ? 'text-green-700' : 'text-red-700'\n }`}>\n {currentQuestion.explanation}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Navigation */}\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200 flex items-center justify-between\">\n <button\n onClick={onPreviousQuestion}\n disabled={currentQuestionIndex === 0}\n className={`\n flex items-center gap-1 px-3 py-2 rounded-lg text-sm font-medium\n transition-colors\n ${currentQuestionIndex === 0\n ? 'text-gray-300 cursor-not-allowed'\n : 'text-gray-600 hover:bg-gray-200'\n }\n `}\n >\n <ChevronLeft className=\"w-4 h-4\" />\n Previous\n </button>\n\n <button\n onClick={onNextQuestion}\n disabled={currentQuestionIndex === totalQuestions - 1}\n className={`\n flex items-center gap-1 px-4 py-2 rounded-lg text-sm font-medium\n transition-colors text-white\n ${currentQuestionIndex === totalQuestions - 1\n ? 'bg-gray-300 cursor-not-allowed'\n : colors.button\n }\n `}\n >\n {currentQuestionIndex === totalQuestions - 1 ? 'Finish' : 'Next'}\n <ChevronRight className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n );\n};\n\nexport default InterviewModePanel;\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 {/* Binary Search Invariant - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-green-50 to-emerald-50 rounded-xl border-2 border-green-200\">\n <div className=\"text-sm font-bold text-green-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🎯</span> Binary Search Invariant\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-green-200\">\n <div className=\"text-center text-green-700 font-bold mb-2\">\n target ∈ arr[left..right]\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n If target exists, it must be within current search bounds\n </div>\n </div>\n {/* Search space info */}\n {left <= right && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-green-200\">\n <div className=\"flex justify-between items-center text-xs\">\n <div>\n <span className=\"font-semibold text-green-700\">Search space:</span>{' '}\n <span className=\"font-mono\">[{left}..{right}]</span> = <span className=\"font-bold text-green-600\">{right - left + 1}</span> elements\n </div>\n <div className=\"text-gray-500\">\n {currentStep > 0 && (\n <span>\n Eliminated: <span className=\"font-bold text-red-500\">{Math.round((1 - (right - left + 1) / array.length) * 100)}%</span>\n </span>\n )}\n </div>\n </div>\n {mid >= 0 && (\n <div className=\"mt-2 text-xs text-center text-gray-600\">\n mid = ⌊({left} + {right}) / 2⌋ = <span className=\"font-bold text-purple-600\">{mid}</span>\n </div>\n )}\n </div>\n )}\n {found === true && (\n <div className=\"mt-3 p-2 bg-green-100 rounded-lg border border-green-300 text-center\">\n <span className=\"text-green-800 font-bold\">✓ Found in {currentStep} steps (log₂{array.length} ≈ {Math.ceil(Math.log2(array.length))} max)</span>\n </div>\n )}\n {found === false && (\n <div className=\"mt-3 p-2 bg-red-100 rounded-lg border border-red-300 text-center\">\n <span className=\"text-red-800 font-bold\">✗ Not found - search space exhausted</span>\n </div>\n )}\n </div>\n\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-colors 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-colors 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 CodePanel,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n ALGORITHM_CODE,\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 showControls?: boolean;\n showCode?: boolean;\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 showControls = true,\n showCode = true,\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-colors 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 {/* Code Panels */}\n {showCode && (\n <div className=\"px-4 py-3 border-t border-gray-200\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-indigo-600 mb-2\">{ALGORITHM_NAMES[algorithm1]}</div>\n <CodePanel code={ALGORITHM_CODE[algorithm1]} activeLine={-1} />\n </div>\n <div>\n <div className=\"text-xs font-medium text-purple-600 mb-2\">{ALGORITHM_NAMES[algorithm2]}</div>\n <CodePanel code={ALGORITHM_CODE[algorithm2]} activeLine={-1} />\n </div>\n </div>\n </div>\n )}\n\n {/* Controls */}\n {showControls && (\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 )}\n </div>\n );\n};\n\nexport const SortingComparisonVisualizer = React.memo(SortingComparisonVisualizerComponent);\nexport default SortingComparisonVisualizer;\n","import React, { useState, useMemo } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n useVisualizerPlayback,\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 [graph] = useState(() => generateGraph());\n\n const generateSteps = useMemo(\n () => () => generateDijkstraSteps(graph.nodes, graph.adjacencyList, 0),\n [graph]\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<DijkstraStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n current: -1,\n visited: [] as number[],\n distances: [] as number[],\n priorityQueue: [] as { node: number; dist: number }[],\n previous: [] as (number | null)[],\n description: '',\n codeLine: -1,\n variables: undefined,\n };\n const { current, visited, distances, priorityQueue, description } = stepData;\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 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={500} className=\"flex-1 min-w-0\">\n {/* Distance Array - PROMINENT */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-orange-50 to-amber-50 rounded-xl border-2 border-orange-200\">\n <div className=\"text-sm font-semibold text-orange-800 mb-3\">\n Distance Array (shortest paths from node 0)\n </div>\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {distances.map((dist, idx) => {\n const isSource = idx === 0;\n const isCurrent = idx === current;\n const isVisited = visited.includes(idx);\n\n return (\n <div\n key={idx}\n className={`flex flex-col items-center p-2 rounded-lg border-2 min-w-[60px] transition-colors ${\n isCurrent\n ? 'bg-yellow-100 border-yellow-400 ring-2 ring-yellow-300'\n : isVisited\n ? 'bg-green-100 border-green-400'\n : 'bg-white border-gray-300'\n }`}\n >\n <div className={`text-xs font-medium ${\n isCurrent ? 'text-yellow-800' : isVisited ? 'text-green-800' : 'text-gray-500'\n }`}>\n Node {idx}\n {isSource && <span className=\"ml-1\">(src)</span>}\n </div>\n <div className={`text-xl font-bold font-mono ${\n isCurrent ? 'text-yellow-900' : isVisited ? 'text-green-900' : 'text-gray-700'\n }`}>\n {dist === Infinity ? '∞' : dist}\n </div>\n {isCurrent && <div className=\"text-xs text-yellow-700 font-bold\">← PROCESSING</div>}\n {isVisited && !isCurrent && <div className=\"text-xs text-green-600\">✓ Final</div>}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Relaxation Explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg border border-blue-200\">\n <div className=\"text-sm font-semibold text-blue-800 mb-2\">\n Relaxation Formula\n </div>\n <div className=\"font-mono text-sm text-center\">\n if dist[u] + weight(u,v) < dist[v] → <span className=\"text-green-600 font-bold\">update dist[v]</span>\n </div>\n </div>\n\n {/* Priority Queue - More visible */}\n <div className=\"mb-4 p-3 bg-orange-50 rounded-lg border border-orange-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-semibold text-orange-800\">Priority Queue (min-heap)</span>\n <span className=\"text-xs text-orange-600\">(node:distance)</span>\n </div>\n <div className=\"flex flex-wrap gap-2\">\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-3 py-1.5 rounded-lg font-mono text-sm font-medium ${\n index === 0\n ? 'bg-orange-200 text-orange-900 ring-2 ring-orange-400'\n : 'bg-white text-orange-800 border border-orange-300'\n }`}\n >\n {item.node}:{item.dist}\n {index === 0 && <span className=\"ml-1 text-xs\">← MIN</span>}\n </span>\n ))\n ) : (\n <span className=\"text-sm text-gray-400 italic\">empty</span>\n )}\n </div>\n </div>\n\n {/* Graph SVG */}\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-colors 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 {/* Status */}\n <div className=\"mt-3\">\n <StatusPanel\n description={description}\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={stepData.codeLine ?? -1}\n variables={stepData.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, useMemo } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n useVisualizerPlayback,\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\n const generateSteps = useMemo(\n () => () => generateKnapsackSteps(items, capacity),\n [items, capacity]\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<DPStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n i: -1,\n w: -1,\n table: [] as number[][],\n decision: null as 'skip' | 'take' | null,\n description: '',\n codeLine: -1,\n variables: undefined,\n };\n const { i: currentI, w: currentW, table, decision, description } = stepData;\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 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={450} className=\"flex-1 min-w-0\">\n {/* DP Recurrence Formula - Prominent */}\n <div className=\"mb-6 p-4 bg-gradient-to-r from-teal-50 to-cyan-50 rounded-xl border-2 border-teal-200\">\n <div className=\"text-sm font-semibold text-teal-800 mb-3\">\n DP Recurrence Formula\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-teal-200\">\n <div className=\"text-gray-600 mb-2\">\n dp[i][w] = max(\n <span className=\"text-yellow-600 font-bold\"> skip</span>,\n <span className=\"text-green-600 font-bold\"> take</span>\n )\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-xs mt-3\">\n <div className=\"bg-yellow-50 p-2 rounded border border-yellow-200\">\n <span className=\"text-yellow-700 font-bold\">skip</span>\n <span className=\"text-gray-600\"> = dp[i-1][w]</span>\n <div className=\"text-gray-500 mt-1\">Don't take item i</div>\n </div>\n <div className=\"bg-green-50 p-2 rounded border border-green-200\">\n <span className=\"text-green-700 font-bold\">take</span>\n <span className=\"text-gray-600\"> = dp[i-1][w-weight] + value</span>\n <div className=\"text-gray-500 mt-1\">Take item i</div>\n </div>\n </div>\n </div>\n\n {/* Current Calculation */}\n {currentI > 0 && currentW > 0 && (\n <div className=\"mt-4 p-3 bg-white rounded-lg border-2 border-purple-300\">\n <div className=\"text-sm font-semibold text-purple-800 mb-2\">\n Current: dp[{currentI}][{currentW}]\n </div>\n <div className=\"flex items-center gap-4 text-sm\">\n <div className=\"text-gray-600\">\n Item {currentI}: <span className=\"font-mono\">w={items[currentI-1]?.weight}, v={items[currentI-1]?.value}</span>\n </div>\n {decision && (\n <div className={`px-3 py-1 rounded-full font-bold ${\n decision === 'take'\n ? 'bg-green-100 text-green-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}>\n {decision === 'take' ? '✓ TAKE' : '✗ SKIP'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex gap-6\">\n {/* Items List */}\n <div className=\"w-40\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Items (i = item index):\n </div>\n <div className=\"space-y-1\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className={`px-2 py-1.5 rounded text-xs transition-colors ${\n idx + 1 === currentI\n ? 'bg-purple-200 text-purple-900 font-bold ring-2 ring-purple-400'\n : idx + 1 < currentI\n ? 'bg-blue-50 text-blue-600'\n : 'bg-gray-100 text-gray-500'\n }`}\n >\n <span className=\"font-mono\">i={idx + 1}</span>: w={item.weight}, v={item.value}\n {idx + 1 === currentI && <span className=\"ml-1\">← CURRENT</span>}\n </div>\n ))}\n </div>\n <div className=\"mt-3 text-sm p-2 bg-gray-100 rounded\">\n <span className=\"font-medium text-gray-700\">Max Capacity:</span>{' '}\n <span className=\"text-gray-900 font-mono\">{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 (w = current capacity):\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={description}\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={stepData.codeLine ?? -1}\n variables={stepData.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 {/* DFS vs BFS - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-indigo-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔍</span> DFS vs BFS\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className={`p-2 rounded-lg border ${algorithm === 'dfs' ? 'bg-purple-100 border-purple-300' : 'bg-gray-100 border-gray-300'}`}>\n <div className=\"font-bold text-purple-700\">Depth-First (DFS)</div>\n <div className=\"text-purple-600\">Uses: Stack</div>\n <div className=\"text-[10px] text-purple-500\">Go deep before wide</div>\n </div>\n <div className={`p-2 rounded-lg border ${algorithm === 'bfs' ? 'bg-indigo-100 border-indigo-300' : 'bg-gray-100 border-gray-300'}`}>\n <div className=\"font-bold text-indigo-700\">Breadth-First (BFS)</div>\n <div className=\"text-indigo-600\">Uses: Queue</div>\n <div className=\"text-[10px] text-indigo-500\">Level by level</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n Both O(V+E) time • DFS for paths/cycles • BFS for shortest path (unweighted)\n </div>\n </div>\n\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-colors 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 {/* Hash Function - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-indigo-50 to-purple-50 rounded-xl border-2 border-indigo-200\">\n <div className=\"text-sm font-bold text-indigo-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">#️⃣</span> Hash Function\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-indigo-200\">\n <div className=\"text-center text-indigo-700 font-bold mb-2\">\n index = hashCode(key) % capacity\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n Same key → same index (deterministic) • Different keys may collide → chaining\n </div>\n </div>\n {/* Current hash calculation */}\n {stepData.hash !== undefined && stepData.key && (\n <div className=\"mt-3 p-3 bg-white rounded-lg border border-indigo-200\">\n <div className=\"text-xs text-center\">\n <div className=\"font-mono mb-1\">\n hashCode(<span className=\"text-indigo-600 font-bold\">"{stepData.key}"</span>) = <span className=\"text-purple-600 font-bold\">{stepData.hash}</span>\n </div>\n <div className=\"font-mono\">\n <span className=\"text-purple-600\">{stepData.hash}</span> % <span className=\"text-gray-600\">{BUCKET_COUNT}</span> = <span className=\"text-indigo-600 font-bold text-lg\">{stepData.bucketIndex}</span>\n </div>\n <div className=\"mt-2 text-indigo-600 text-lg\">↓ bucket[{stepData.bucketIndex}]</div>\n </div>\n </div>\n )}\n </div>\n\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\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, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\n// Reuse types from HashMapVisualizer\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 highlightBucket?: number;\n highlightEntry?: { bucket: number; index: number };\n found?: boolean;\n}\n\ninterface HashMapInterviewVisualizerProps {\n showControls?: 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: 'get', key: 'Bob' },\n { op: 'put', key: 'Alice', value: 26 },\n { op: 'get', key: 'Frank' },\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\n// Interview questions about HashMap\nconst HASHMAP_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'hm-1',\n question: 'What is the average time complexity for get() and put() operations in HashMap?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)'],\n correctAnswer: 0,\n explanation: 'HashMap provides O(1) average time complexity for both get() and put() operations due to direct array access via hash codes. However, worst case is O(n) when all keys hash to the same bucket.',\n hint: 'Think about how hash codes allow direct array indexing.',\n difficulty: 'easy',\n topic: 'Time Complexity',\n relatedStep: 1,\n },\n {\n id: 'hm-2',\n question: 'What happens when two different keys have the same hash code in HashMap?',\n options: [\n 'One key overwrites the other',\n 'An exception is thrown',\n 'They are stored in the same bucket (collision)',\n 'The second key is rejected',\n ],\n correctAnswer: 2,\n explanation: 'When two keys have the same hash code (collision), HashMap stores both entries in the same bucket using a linked list (or tree for Java 8+). This is called chaining.',\n hint: 'HashMap uses chaining to handle this situation.',\n difficulty: 'easy',\n topic: 'Collision Handling',\n relatedStep: 5,\n },\n {\n id: 'hm-3',\n question: 'In Java 8+, what happens when a bucket has more than 8 entries?',\n options: [\n 'The HashMap is automatically resized',\n 'The bucket converts from LinkedList to Red-Black Tree',\n 'New entries are rejected',\n 'The oldest entry is removed',\n ],\n correctAnswer: 1,\n explanation: 'Java 8 introduced treeification: when a bucket exceeds 8 entries (TREEIFY_THRESHOLD), the linked list is converted to a Red-Black Tree, improving worst-case from O(n) to O(log n).',\n difficulty: 'medium',\n topic: 'Java Implementation',\n },\n {\n id: 'hm-4',\n question: 'What is the default load factor in Java HashMap?',\n options: ['0.5', '0.75', '1.0', '0.25'],\n correctAnswer: 1,\n explanation: 'The default load factor is 0.75, which provides a good balance between space and time efficiency. When size > capacity * loadFactor, the HashMap resizes (doubles capacity).',\n hint: 'It\\'s a balance between space and time efficiency.',\n difficulty: 'medium',\n topic: 'Load Factor',\n },\n {\n id: 'hm-5',\n question: 'Why should you override both equals() and hashCode() when using custom objects as HashMap keys?',\n options: [\n 'To improve performance',\n 'To ensure proper key matching and bucket location',\n 'It\\'s optional and just a best practice',\n 'To prevent memory leaks',\n ],\n correctAnswer: 1,\n explanation: 'hashCode() determines the bucket, and equals() is used to find the exact key within that bucket. If only equals() is overridden, two equal objects might be placed in different buckets. If only hashCode() is overridden, equals() comparisons won\\'t work correctly.',\n difficulty: 'medium',\n topic: 'Contract',\n },\n {\n id: 'hm-6',\n question: 'What is the worst-case time complexity for HashMap operations?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n²)'],\n correctAnswer: 2,\n explanation: 'In the worst case (all keys hash to the same bucket), operations degrade to O(n) as we must traverse the entire chain. With Java 8+ treeification, this improves to O(log n) for buckets with >8 entries.',\n hint: 'Consider what happens when all keys collide.',\n difficulty: 'easy',\n topic: 'Time Complexity',\n },\n {\n id: 'hm-7',\n question: 'How does HashMap calculate the bucket index from a hash code?',\n options: [\n 'hash % capacity',\n 'hash & (capacity - 1)',\n 'hash / capacity',\n 'hash ^ capacity',\n ],\n correctAnswer: 1,\n explanation: 'HashMap uses bitwise AND with (capacity - 1) instead of modulo because capacity is always a power of 2. This is faster than modulo: hash & (n-1) is equivalent to hash % n when n is a power of 2.',\n difficulty: 'hard',\n topic: 'Implementation',\n },\n {\n id: 'hm-8',\n question: 'Is HashMap thread-safe?',\n options: [\n 'Yes, always',\n 'No, use ConcurrentHashMap for thread safety',\n 'Only for read operations',\n 'Only when load factor < 0.5',\n ],\n correctAnswer: 1,\n explanation: 'HashMap is NOT thread-safe. For concurrent access, use ConcurrentHashMap (preferred) or Collections.synchronizedMap(). Using HashMap with multiple threads can cause infinite loops during resize!',\n difficulty: 'easy',\n topic: 'Thread Safety',\n },\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 steps.push({\n operation: 'init',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Initialize HashMap with ${BUCKET_COUNT} buckets`,\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 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}): hash=${hash}, bucket=${index}`,\n highlightBucket: index,\n });\n\n const existingIndex = buckets[index].entries.findIndex((e) => e.key === key);\n\n if (existingIndex >= 0) {\n buckets[index].entries[existingIndex].value = value ?? 0;\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: `Update \"${key}\" to ${value}`,\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingIndex },\n });\n } else {\n buckets[index].entries.push({ key, value: value ?? 0, hash });\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 \"${key}\"=${value} to bucket ${index}`,\n highlightBucket: index,\n highlightEntry: { bucket: index, index: buckets[index].entries.length - 1 },\n });\n }\n } else {\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}\"): hash=${hash}, bucket=${index}`,\n highlightBucket: index,\n });\n\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}\" = ${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}\" not found`,\n highlightBucket: index,\n found: false,\n });\n }\n }\n }\n\n steps.push({\n operation: 'done',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Done! HashMap contains ${buckets.reduce((sum, b) => sum + b.entries.length, 0)} entries`,\n });\n\n return steps;\n}\n\nconst HashMapInterviewVisualizerComponent: React.FC<HashMapInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'hashmap-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'hm-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateHashMapSteps, []);\n\n const playback = useVisualizerPlayback<HashMapStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: HASHMAP_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: HashMapStep = playback.currentStepData || {\n operation: 'init',\n key: '',\n buckets: [],\n description: '',\n };\n\n const { buckets, highlightBucket, highlightEntry, description, found } = stepData;\n\n const getBucketStyle = (index: number): string => {\n if (index === highlightBucket) {\n if (stepData.operation === 'get') {\n return found ? 'border-green-400 bg-green-50' : '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 (highlightEntry?.bucket === bucketIdx && highlightEntry?.index === entryIdx) {\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 handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.currentStep]);\n\n // Jump to related step when question changes\n const handleQuestionStep = useCallback((relatedStep?: number) => {\n if (relatedStep !== undefined && relatedStep < playback.steps.length) {\n // Would need to add setCurrentStep to playback hook\n }\n }, [playback.steps.length]);\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 with mode toggle */}\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</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-indigo-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n 📊 Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-indigo-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n 🎤 Interview\n </button>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"indigo\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={350} className=\"flex-1\">\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 <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 && <div className=\"w-0.5 h-2 bg-gray-300\" />}\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 {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n stepData.operation === 'get' && found === false\n ? 'error'\n : stepData.operation === 'get' && found === true\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel (conditionally shown) */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"indigo\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"indigo\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const HashMapInterviewVisualizer = React.memo(HashMapInterviewVisualizerComponent);\nexport default HashMapInterviewVisualizer;\n","import React, { useMemo, useCallback, useState } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ntype Operation = 'get' | 'addFirst' | 'addLast' | 'addMiddle' | 'removeFirst' | 'removeLast' | 'removeMiddle';\n\ninterface ListStep {\n operation: Operation | 'init' | 'done';\n arrayList: {\n elements: number[];\n highlightIndex?: number;\n shiftIndices?: number[];\n accessCount: number;\n description: string;\n };\n linkedList: {\n elements: number[];\n highlightIndex?: number;\n traverseIndices?: number[];\n accessCount: number;\n description: string;\n };\n description: string;\n phase: 'start' | 'process' | 'complete';\n}\n\ninterface ListComparisonVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst INITIAL_DATA = [10, 20, 30, 40, 50];\n\nconst OPERATIONS: Array<{ op: Operation; index?: number; value?: number }> = [\n { op: 'get', index: 2 },\n { op: 'addLast', value: 60 },\n { op: 'addFirst', value: 5 },\n { op: 'addMiddle', index: 3, value: 25 },\n { op: 'removeFirst' },\n { op: 'removeLast' },\n { op: 'removeMiddle', index: 2 },\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'ArrayList' },\n { color: 'bg-green-500', label: 'LinkedList' },\n { color: 'bg-yellow-400', label: 'Current element' },\n { color: 'bg-red-400', label: 'Shifting/Traversing' },\n { color: 'bg-purple-400', label: 'Result' },\n];\n\nfunction generateListComparisonSteps(): ListStep[] {\n const steps: ListStep[] = [];\n let arrayList = [...INITIAL_DATA];\n let linkedList = [...INITIAL_DATA];\n\n // Initial state\n steps.push({\n operation: 'init',\n arrayList: {\n elements: [...arrayList],\n accessCount: 0,\n description: 'Contiguous memory block',\n },\n linkedList: {\n elements: [...linkedList],\n accessCount: 0,\n description: 'Linked nodes in memory',\n },\n description: `Initialize both lists with [${INITIAL_DATA.join(', ')}]`,\n phase: 'complete',\n });\n\n for (const { op, index, value } of OPERATIONS) {\n switch (op) {\n case 'get': {\n const idx = index!;\n // ArrayList: Direct access O(1)\n steps.push({\n operation: 'get',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: idx,\n accessCount: 1,\n description: `Direct access: array[${idx}] = ${arrayList[idx]}`,\n },\n linkedList: {\n elements: [...linkedList],\n traverseIndices: Array.from({ length: idx + 1 }, (_, i) => i),\n accessCount: idx + 1,\n description: `Traverse ${idx + 1} nodes to reach index ${idx}`,\n },\n description: `get(${idx}): ArrayList O(1) vs LinkedList O(n)`,\n phase: 'complete',\n });\n break;\n }\n\n case 'addFirst': {\n const val = value!;\n // ArrayList: Shift all elements O(n)\n steps.push({\n operation: 'addFirst',\n arrayList: {\n elements: [...arrayList],\n shiftIndices: arrayList.map((_, i) => i),\n accessCount: arrayList.length,\n description: `Shift ${arrayList.length} elements right`,\n },\n linkedList: {\n elements: [...linkedList],\n highlightIndex: 0,\n accessCount: 1,\n description: 'Update head pointer only',\n },\n description: `addFirst(${val}): ArrayList O(n) vs LinkedList O(1)`,\n phase: 'process',\n });\n\n arrayList = [val, ...arrayList];\n linkedList = [val, ...linkedList];\n\n steps.push({\n operation: 'addFirst',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: 0,\n accessCount: arrayList.length - 1,\n description: `Inserted ${val} at index 0`,\n },\n linkedList: {\n elements: [...linkedList],\n highlightIndex: 0,\n accessCount: 1,\n description: `New head: ${val}`,\n },\n description: `addFirst(${val}) complete`,\n phase: 'complete',\n });\n break;\n }\n\n case 'addLast': {\n const val = value!;\n // ArrayList: Amortized O(1)\n steps.push({\n operation: 'addLast',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: arrayList.length,\n accessCount: 1,\n description: 'Direct append (amortized O(1))',\n },\n linkedList: {\n elements: [...linkedList],\n traverseIndices: linkedList.map((_, i) => i),\n accessCount: linkedList.length,\n description: `Traverse to tail (${linkedList.length} nodes)`,\n },\n description: `addLast(${val}): ArrayList O(1)* vs LinkedList O(n)`,\n phase: 'process',\n });\n\n arrayList = [...arrayList, val];\n linkedList = [...linkedList, val];\n\n steps.push({\n operation: 'addLast',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: arrayList.length - 1,\n accessCount: 1,\n description: `Appended ${val}`,\n },\n linkedList: {\n elements: [...linkedList],\n highlightIndex: linkedList.length - 1,\n accessCount: linkedList.length - 1,\n description: `New tail: ${val}`,\n },\n description: `addLast(${val}) complete`,\n phase: 'complete',\n });\n break;\n }\n\n case 'addMiddle': {\n const idx = index!;\n const val = value!;\n // ArrayList: Shift elements O(n)\n const shiftCount = arrayList.length - idx;\n\n steps.push({\n operation: 'addMiddle',\n arrayList: {\n elements: [...arrayList],\n shiftIndices: arrayList.slice(idx).map((_, i) => idx + i),\n accessCount: shiftCount,\n description: `Shift ${shiftCount} elements right`,\n },\n linkedList: {\n elements: [...linkedList],\n traverseIndices: Array.from({ length: idx }, (_, i) => i),\n accessCount: idx,\n description: `Traverse ${idx} nodes, then O(1) insert`,\n },\n description: `add(${idx}, ${val}): ArrayList O(n) vs LinkedList O(n)`,\n phase: 'process',\n });\n\n arrayList = [...arrayList.slice(0, idx), val, ...arrayList.slice(idx)];\n linkedList = [...linkedList.slice(0, idx), val, ...linkedList.slice(idx)];\n\n steps.push({\n operation: 'addMiddle',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: idx,\n accessCount: shiftCount,\n description: `Inserted ${val} at index ${idx}`,\n },\n linkedList: {\n elements: [...linkedList],\n highlightIndex: idx,\n accessCount: idx + 1,\n description: `Inserted ${val} after traversal`,\n },\n description: `add(${idx}, ${val}) complete`,\n phase: 'complete',\n });\n break;\n }\n\n case 'removeFirst': {\n const removed = arrayList[0];\n // ArrayList: Shift all O(n)\n steps.push({\n operation: 'removeFirst',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: 0,\n shiftIndices: arrayList.slice(1).map((_, i) => i + 1),\n accessCount: arrayList.length - 1,\n description: `Remove and shift ${arrayList.length - 1} elements left`,\n },\n linkedList: {\n elements: [...linkedList],\n highlightIndex: 0,\n accessCount: 1,\n description: 'Update head pointer only',\n },\n description: `removeFirst(): ArrayList O(n) vs LinkedList O(1)`,\n phase: 'process',\n });\n\n arrayList = arrayList.slice(1);\n linkedList = linkedList.slice(1);\n\n steps.push({\n operation: 'removeFirst',\n arrayList: {\n elements: [...arrayList],\n accessCount: arrayList.length,\n description: `Removed ${removed}, shifted elements`,\n },\n linkedList: {\n elements: [...linkedList],\n accessCount: 1,\n description: `Removed ${removed}, new head`,\n },\n description: `removeFirst() = ${removed} complete`,\n phase: 'complete',\n });\n break;\n }\n\n case 'removeLast': {\n const removed = arrayList[arrayList.length - 1];\n // ArrayList: O(1)\n steps.push({\n operation: 'removeLast',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: arrayList.length - 1,\n accessCount: 1,\n description: 'Direct removal O(1)',\n },\n linkedList: {\n elements: [...linkedList],\n traverseIndices: linkedList.map((_, i) => i),\n accessCount: linkedList.length,\n description: `Traverse to find tail's predecessor`,\n },\n description: `removeLast(): ArrayList O(1) vs LinkedList O(n)`,\n phase: 'process',\n });\n\n arrayList = arrayList.slice(0, -1);\n linkedList = linkedList.slice(0, -1);\n\n steps.push({\n operation: 'removeLast',\n arrayList: {\n elements: [...arrayList],\n accessCount: 1,\n description: `Removed ${removed}`,\n },\n linkedList: {\n elements: [...linkedList],\n accessCount: linkedList.length + 1,\n description: `Removed ${removed} after traversal`,\n },\n description: `removeLast() = ${removed} complete`,\n phase: 'complete',\n });\n break;\n }\n\n case 'removeMiddle': {\n const idx = index!;\n const removed = arrayList[idx];\n const shiftCount = arrayList.length - idx - 1;\n\n steps.push({\n operation: 'removeMiddle',\n arrayList: {\n elements: [...arrayList],\n highlightIndex: idx,\n shiftIndices: arrayList.slice(idx + 1).map((_, i) => idx + 1 + i),\n accessCount: shiftCount,\n description: `Shift ${shiftCount} elements left`,\n },\n linkedList: {\n elements: [...linkedList],\n traverseIndices: Array.from({ length: idx }, (_, i) => i),\n highlightIndex: idx,\n accessCount: idx + 1,\n description: `Traverse ${idx} nodes, then O(1) remove`,\n },\n description: `remove(${idx}): ArrayList O(n) vs LinkedList O(n)`,\n phase: 'process',\n });\n\n arrayList = [...arrayList.slice(0, idx), ...arrayList.slice(idx + 1)];\n linkedList = [...linkedList.slice(0, idx), ...linkedList.slice(idx + 1)];\n\n steps.push({\n operation: 'removeMiddle',\n arrayList: {\n elements: [...arrayList],\n accessCount: shiftCount,\n description: `Removed ${removed}, shifted elements`,\n },\n linkedList: {\n elements: [...linkedList],\n accessCount: idx + 1,\n description: `Removed ${removed} after traversal`,\n },\n description: `remove(${idx}) = ${removed} complete`,\n phase: 'complete',\n });\n break;\n }\n }\n }\n\n // Final summary\n steps.push({\n operation: 'done',\n arrayList: {\n elements: [...arrayList],\n accessCount: 0,\n description: `Final: [${arrayList.join(', ')}]`,\n },\n linkedList: {\n elements: [...linkedList],\n accessCount: 0,\n description: `Final: [${linkedList.join(', ')}]`,\n },\n description: '✓ Comparison complete! ArrayList wins for random access, LinkedList wins for front operations.',\n phase: 'complete',\n });\n\n return steps;\n}\n\nconst ListComparisonVisualizerComponent: React.FC<ListComparisonVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'list-comparison-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'listcmp', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateListComparisonSteps, []);\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<ListStep>({\n generateSteps,\n });\n\n const stepData: ListStep = currentStepData || {\n operation: 'init',\n arrayList: { elements: [], accessCount: 0, description: '' },\n linkedList: { elements: [], accessCount: 0, description: '' },\n description: '',\n phase: 'complete',\n };\n\n const { arrayList, linkedList, description } = stepData;\n\n const getStatusVariant = () => {\n if (stepData.operation === 'done') return 'success' as const;\n if (stepData.phase === 'process') 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 const renderArrayList = () => (\n <div className=\"p-3 bg-blue-50 rounded-lg border-2 border-blue-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"font-bold text-blue-800 text-sm\">ArrayList</div>\n <div className=\"text-xs text-blue-600\">\n Accesses: {arrayList.accessCount}\n </div>\n </div>\n\n {/* Array visualization - contiguous blocks */}\n <div className=\"flex gap-0.5 mb-2 overflow-x-auto\">\n {arrayList.elements.map((el, idx) => {\n const isHighlighted = arrayList.highlightIndex === idx;\n const isShifting = arrayList.shiftIndices?.includes(idx);\n\n return (\n <div\n key={idx}\n className={`\n w-10 h-10 flex items-center justify-center text-sm font-mono font-bold\n border-2 transition-all\n ${isHighlighted ? 'bg-yellow-400 border-yellow-500' : ''}\n ${isShifting ? 'bg-red-300 border-red-400' : ''}\n ${!isHighlighted && !isShifting ? 'bg-blue-200 border-blue-300' : ''}\n `}\n >\n {el}\n </div>\n );\n })}\n {arrayList.elements.length === 0 && (\n <div className=\"text-gray-400 text-sm\">empty</div>\n )}\n </div>\n\n <div className=\"text-xs text-gray-600\">{arrayList.description}</div>\n </div>\n );\n\n const renderLinkedList = () => (\n <div className=\"p-3 bg-green-50 rounded-lg border-2 border-green-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"font-bold text-green-800 text-sm\">LinkedList</div>\n <div className=\"text-xs text-green-600\">\n Accesses: {linkedList.accessCount}\n </div>\n </div>\n\n {/* Linked list visualization - nodes with arrows */}\n <div className=\"flex items-center gap-1 mb-2 overflow-x-auto\">\n {linkedList.elements.map((el, idx) => {\n const isHighlighted = linkedList.highlightIndex === idx;\n const isTraversing = linkedList.traverseIndices?.includes(idx);\n\n return (\n <React.Fragment key={idx}>\n <div\n className={`\n w-10 h-10 flex items-center justify-center text-sm font-mono font-bold\n rounded-lg border-2 transition-all\n ${isHighlighted ? 'bg-yellow-400 border-yellow-500' : ''}\n ${isTraversing && !isHighlighted ? 'bg-red-300 border-red-400' : ''}\n ${!isHighlighted && !isTraversing ? 'bg-green-200 border-green-300' : ''}\n `}\n >\n {el}\n </div>\n {idx < linkedList.elements.length - 1 && (\n <span className=\"text-gray-400 text-xs\">→</span>\n )}\n </React.Fragment>\n );\n })}\n {linkedList.elements.length === 0 && (\n <div className=\"text-gray-400 text-sm\">empty</div>\n )}\n </div>\n\n <div className=\"text-xs text-gray-600\">{linkedList.description}</div>\n </div>\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-blue-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\">ArrayList vs LinkedList</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 Comparison\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"blue\" />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <VisualizationArea minHeight={400}>\n {/* Complexity Comparison */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg border border-gray-200\">\n <div className=\"text-sm font-bold text-gray-800 mb-2\">Time Complexity Comparison</div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-gray-100\">\n <th className=\"px-2 py-1 text-left\">Operation</th>\n <th className=\"px-2 py-1 text-center text-blue-700\">ArrayList</th>\n <th className=\"px-2 py-1 text-center text-green-700\">LinkedList</th>\n <th className=\"px-2 py-1 text-center\">Winner</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td className=\"px-2 py-1\">get(i)</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(1)</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center\">🔵</td>\n </tr>\n <tr className=\"bg-gray-50\">\n <td className=\"px-2 py-1\">addFirst()</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(1)</td>\n <td className=\"px-2 py-1 text-center\">🟢</td>\n </tr>\n <tr>\n <td className=\"px-2 py-1\">addLast()</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(1)*</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(1)**</td>\n <td className=\"px-2 py-1 text-center\">≈</td>\n </tr>\n <tr className=\"bg-gray-50\">\n <td className=\"px-2 py-1\">add(i, e)</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center\">≈</td>\n </tr>\n <tr>\n <td className=\"px-2 py-1\">removeFirst()</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(1)</td>\n <td className=\"px-2 py-1 text-center\">🟢</td>\n </tr>\n <tr className=\"bg-gray-50\">\n <td className=\"px-2 py-1\">removeLast()</td>\n <td className=\"px-2 py-1 text-center font-mono text-blue-700\">O(1)</td>\n <td className=\"px-2 py-1 text-center font-mono text-green-700\">O(n)</td>\n <td className=\"px-2 py-1 text-center\">🔵</td>\n </tr>\n </tbody>\n </table>\n <div className=\"text-[10px] text-gray-500 mt-1\">\n * amortized | ** Java's LinkedList has tail pointer\n </div>\n </div>\n </div>\n\n {/* Side by side visualization */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n {renderArrayList()}\n {renderLinkedList()}\n </div>\n\n {/* When to use */}\n <div className=\"grid grid-cols-2 gap-3 mb-4\">\n <div className=\"p-2 bg-blue-50 rounded-lg border border-blue-200\">\n <div className=\"text-xs font-bold text-blue-800 mb-1\">Use ArrayList when:</div>\n <ul className=\"text-[10px] text-blue-700 space-y-0.5\">\n <li>• Random access needed</li>\n <li>• Mostly appending</li>\n <li>• Memory efficiency matters</li>\n <li>• Cache performance important</li>\n </ul>\n </div>\n <div className=\"p-2 bg-green-50 rounded-lg border border-green-200\">\n <div className=\"text-xs font-bold text-green-800 mb-1\">Use LinkedList when:</div>\n <ul className=\"text-[10px] text-green-700 space-y-0.5\">\n <li>• Frequent insert/remove at front</li>\n <li>• Queue/Deque operations</li>\n <li>• Iterator-based modifications</li>\n <li>• Size changes frequently</li>\n </ul>\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 </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 ListComparisonVisualizer = React.memo(ListComparisonVisualizerComponent);\nexport default ListComparisonVisualizer;\n","import React, { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface TreeNode {\n value: number;\n left: TreeNode | null;\n right: TreeNode | null;\n}\n\ninterface TreeSetStep {\n operation: 'add' | 'contains' | 'init' | 'done';\n value?: number;\n tree: TreeNode | null;\n path: number[];\n description: string;\n found?: boolean;\n currentNode?: number;\n}\n\ninterface TreeSetInterviewVisualizerProps {\n showControls?: 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];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-yellow-100', label: 'Path', border: '#facc15' },\n { color: 'bg-green-500', label: 'Current/Found' },\n { color: 'bg-red-500', label: 'Not found' },\n];\n\n// Interview questions about TreeSet/BST\nconst TREESET_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'ts-1',\n question: 'What is the average time complexity for search, insert, and delete in a balanced BST?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)'],\n correctAnswer: 1,\n explanation: 'In a balanced BST, each comparison eliminates half the remaining nodes, giving O(log n) for search, insert, and delete operations. This assumes the tree remains balanced.',\n hint: 'Think about how many levels you need to traverse in a balanced tree.',\n difficulty: 'easy',\n topic: 'Time Complexity',\n },\n {\n id: 'ts-2',\n question: 'What is the worst-case time complexity for BST operations?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n²)'],\n correctAnswer: 2,\n explanation: 'In the worst case (degenerate tree - essentially a linked list), all operations degrade to O(n). This happens when elements are inserted in sorted order into an unbalanced BST.',\n hint: 'Consider what happens if you insert [1, 2, 3, 4, 5] in order.',\n difficulty: 'easy',\n topic: 'Time Complexity',\n },\n {\n id: 'ts-3',\n question: 'What is the BST property that must always be maintained?',\n options: [\n 'Left child < Parent < Right child',\n 'Parent < Left child < Right child',\n 'All nodes must have two children',\n 'Tree height must be log(n)',\n ],\n correctAnswer: 0,\n explanation: 'The BST property states that for every node: all values in the left subtree are smaller, and all values in the right subtree are larger. This enables efficient binary search.',\n difficulty: 'easy',\n topic: 'BST Property',\n },\n {\n id: 'ts-4',\n question: 'What tree traversal visits nodes in sorted order in a BST?',\n options: ['Pre-order', 'In-order', 'Post-order', 'Level-order'],\n correctAnswer: 1,\n explanation: 'In-order traversal (Left → Root → Right) visits BST nodes in ascending sorted order. This is because all left subtree values are smaller and all right subtree values are larger.',\n hint: 'Think about the BST property: left < node < right.',\n difficulty: 'easy',\n topic: 'Traversal',\n },\n {\n id: 'ts-5',\n question: 'What is a Red-Black Tree used for in Java\\'s TreeSet?',\n options: [\n 'To store color metadata',\n 'To guarantee O(log n) operations by self-balancing',\n 'To enable faster iteration',\n 'To reduce memory usage',\n ],\n correctAnswer: 1,\n explanation: 'Red-Black Trees are self-balancing BSTs that guarantee O(log n) height. Java\\'s TreeSet and TreeMap use Red-Black Trees to ensure operations never degrade to O(n).',\n difficulty: 'medium',\n topic: 'Implementation',\n },\n {\n id: 'ts-6',\n question: 'How do you delete a node with two children from a BST?',\n options: [\n 'Simply remove the node',\n 'Replace with in-order successor or predecessor, then delete that node',\n 'Remove both children first',\n 'It\\'s not possible without rebuilding the tree',\n ],\n correctAnswer: 1,\n explanation: 'To delete a node with two children: find its in-order successor (smallest in right subtree) or predecessor (largest in left subtree), copy that value to the node, then delete the successor/predecessor (which has at most one child).',\n hint: 'You need to maintain the BST property after deletion.',\n difficulty: 'medium',\n topic: 'Deletion',\n },\n {\n id: 'ts-7',\n question: 'What is the space complexity of a BST with n nodes?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)'],\n correctAnswer: 2,\n explanation: 'A BST with n nodes requires O(n) space to store all nodes. Additionally, recursive operations use O(h) stack space where h is the height (O(log n) balanced, O(n) worst case).',\n difficulty: 'easy',\n topic: 'Space Complexity',\n },\n {\n id: 'ts-8',\n question: 'Why would you choose TreeSet over HashSet in Java?',\n options: [\n 'TreeSet has O(1) operations',\n 'TreeSet maintains elements in sorted order',\n 'TreeSet uses less memory',\n 'TreeSet is thread-safe',\n ],\n correctAnswer: 1,\n explanation: 'TreeSet maintains elements in sorted order (natural ordering or custom Comparator). Use it when you need sorted iteration, range queries (subSet, headSet, tailSet), or to find first/last elements. HashSet is faster O(1) but unordered.',\n difficulty: 'medium',\n topic: 'Use Cases',\n },\n {\n id: 'ts-9',\n question: 'What is the height of a perfectly balanced BST with n nodes?',\n options: ['n', 'n/2', 'log₂(n)', '2^n'],\n correctAnswer: 2,\n explanation: 'A perfectly balanced BST has height log₂(n) because each level doubles the number of nodes. With n nodes, you need log₂(n) levels to store them all while maintaining balance.',\n hint: 'How many nodes can each level hold?',\n difficulty: 'medium',\n topic: 'Tree Height',\n },\n {\n id: 'ts-10',\n question: 'Which self-balancing BST is typically used in database indexes?',\n options: ['AVL Tree', 'Red-Black Tree', 'B-Tree', 'Splay Tree'],\n correctAnswer: 2,\n explanation: 'B-Trees (and B+ Trees) are used in database indexes because they\\'re optimized for disk I/O. They have high branching factor, minimizing tree height and disk reads. AVL and Red-Black are binary (2 children max).',\n difficulty: 'hard',\n topic: 'Applications',\n },\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: 'Initialize empty TreeSet (Binary Search Tree)',\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'add') {\n const path = tree ? findPath(tree, value) : [];\n\n if (tree) {\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: path,\n description: `add(${value}): Searching... Path: ${path.join(' → ')}`,\n currentNode: path[path.length - 1],\n });\n }\n\n tree = insertNode(tree, value);\n const newPath = findPath(tree, value);\n\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: newPath,\n description: `add(${value}): Inserted!`,\n currentNode: value,\n });\n } else {\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: found\n ? `contains(${value}): Found!`\n : `contains(${value}): Not found!`,\n found,\n currentNode: found ? value : path[path.length - 1],\n });\n }\n }\n\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`,\n });\n\n return steps;\n}\n\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 TreeSetInterviewVisualizerComponent: React.FC<TreeSetInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'treeset-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'ts-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\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 interview = useInterviewMode({\n questions: TREESET_QUESTIONS,\n shuffleQuestions: true,\n });\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 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 const positions = new Map<number, { x: number; y: number }>();\n if (tree) {\n calculatePositions(tree, 0, 0, 300, positions);\n }\n\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 fillColor = 'white';\n let strokeColor = '#d1d5db';\n\n if (isCurrent) {\n if (currentStepData.operation === 'contains' && found === false) {\n fillColor = '#ef4444';\n strokeColor = '#dc2626';\n } else {\n fillColor = '#22c55e';\n strokeColor = '#16a34a';\n }\n } else if (isInPath) {\n fillColor = '#fef3c7';\n strokeColor = '#facc15';\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 {leftPos && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={leftPos.x}\n y2={leftPos.y}\n stroke={node.left && path.includes(node.left.value) ? '#facc15' : '#d1d5db'}\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={node.right && path.includes(node.right.value) ? '#facc15' : '#d1d5db'}\n strokeWidth=\"2\"\n />\n )}\n <g transform={`translate(${pos.x}, ${pos.y})`}>\n <circle r=\"18\" fill={fillColor} stroke={strokeColor} strokeWidth=\"2\" />\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 {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 with mode toggle */}\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\">TreeSet / BST</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-emerald-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-emerald-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"green\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={350} className=\"flex-1\">\n {/* BST Property */}\n <div className=\"mb-4 p-3 bg-emerald-50 rounded-lg border border-emerald-200\">\n <div className=\"text-sm font-medium text-emerald-800 text-center\">\n BST Property: <code className=\"bg-white px-2 py-0.5 rounded\">left < node < right</code>\n </div>\n </div>\n\n {/* Tree Visualization */}\n <div className=\"mb-4\">\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\">Path:</span>{' '}\n {path.map((v, idx) => (\n <React.Fragment key={idx}>\n {idx > 0 && ' → '}\n <span\n className={`px-1.5 py-0.5 rounded font-mono ${\n v === currentNode\n ? found === false\n ? 'bg-red-100 text-red-700'\n : 'bg-green-100 text-green-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}\n >\n {v}\n </span>\n </React.Fragment>\n ))}\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 === 'done' || found === true\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"green\"\n />\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 TreeSetInterviewVisualizer = React.memo(TreeSetInterviewVisualizerComponent);\nexport default TreeSetInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface SortingStep {\n array: number[];\n comparing?: [number, number];\n swapping?: [number, number];\n sorted?: number[];\n pivot?: number;\n description: string;\n}\n\ninterface SortingInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst INITIAL_ARRAY = [64, 34, 25, 12, 22, 11, 90];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-yellow-400', label: 'Comparing' },\n { color: 'bg-red-400', label: 'Swapping' },\n { color: 'bg-green-400', label: 'Sorted' },\n { color: 'bg-purple-400', label: 'Pivot' },\n];\n\n// Interview questions about sorting algorithms\nconst SORTING_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'sort-1',\n question: 'What is the time complexity of QuickSort in the average case?',\n options: ['O(n)', 'O(n log n)', 'O(n²)', 'O(log n)'],\n correctAnswer: 1,\n explanation: 'QuickSort has O(n log n) average time complexity. It partitions the array and recursively sorts each partition. The partitioning takes O(n) and occurs O(log n) times on average.',\n hint: 'Think about how the array is divided in each recursive call.',\n difficulty: 'easy',\n topic: 'QuickSort',\n },\n {\n id: 'sort-2',\n question: 'What is the worst-case time complexity of QuickSort?',\n options: ['O(n)', 'O(n log n)', 'O(n²)', 'O(2^n)'],\n correctAnswer: 2,\n explanation: 'QuickSort degrades to O(n²) when the pivot selection is poor (e.g., always picking smallest/largest element). This happens with already sorted arrays if using first/last element as pivot.',\n hint: 'Consider what happens with a sorted array and bad pivot choice.',\n difficulty: 'easy',\n topic: 'QuickSort',\n },\n {\n id: 'sort-3',\n question: 'Which sorting algorithm is stable?',\n options: ['QuickSort', 'HeapSort', 'MergeSort', 'Selection Sort'],\n correctAnswer: 2,\n explanation: 'MergeSort is stable - it preserves the relative order of equal elements. QuickSort and HeapSort are typically not stable. Selection Sort can be implemented stably but usually isn\\'t.',\n hint: 'Stable means equal elements keep their original relative order.',\n difficulty: 'medium',\n topic: 'Stability',\n },\n {\n id: 'sort-4',\n question: 'What is the space complexity of MergeSort?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)'],\n correctAnswer: 2,\n explanation: 'MergeSort requires O(n) auxiliary space for merging. While the recursion depth is O(log n), the merge operation needs a temporary array of size n.',\n hint: 'Think about where merged elements are stored.',\n difficulty: 'medium',\n topic: 'MergeSort',\n },\n {\n id: 'sort-5',\n question: 'Which sorting algorithm is best for nearly sorted data?',\n options: ['QuickSort', 'Insertion Sort', 'Selection Sort', 'HeapSort'],\n correctAnswer: 1,\n explanation: 'Insertion Sort is O(n) for nearly sorted data because elements only need to move a few positions. QuickSort can degrade to O(n²) on sorted data with bad pivot selection.',\n difficulty: 'medium',\n topic: 'Best Case',\n },\n {\n id: 'sort-6',\n question: 'What is the time complexity of Counting Sort?',\n options: ['O(n log n)', 'O(n + k)', 'O(n²)', 'O(k log k)'],\n correctAnswer: 1,\n explanation: 'Counting Sort runs in O(n + k) where n is the number of elements and k is the range of input values. It\\'s efficient when k is O(n), but impractical for large ranges.',\n hint: 'It\\'s not comparison-based, so it can beat O(n log n).',\n difficulty: 'hard',\n topic: 'Non-comparison Sorts',\n },\n {\n id: 'sort-7',\n question: 'Why is HeapSort preferred over QuickSort in some systems?',\n options: [\n 'HeapSort is faster on average',\n 'HeapSort has guaranteed O(n log n) worst case',\n 'HeapSort uses less memory',\n 'HeapSort is stable',\n ],\n correctAnswer: 1,\n explanation: 'HeapSort guarantees O(n log n) in all cases, unlike QuickSort which can degrade to O(n²). HeapSort also sorts in-place with O(1) extra space. However, QuickSort is often faster in practice due to better cache performance.',\n difficulty: 'medium',\n topic: 'HeapSort',\n },\n {\n id: 'sort-8',\n question: 'What is the lower bound for comparison-based sorting?',\n options: ['O(n)', 'O(n log n)', 'O(n²)', 'O(log n)'],\n correctAnswer: 1,\n explanation: 'Any comparison-based sorting algorithm must make at least Ω(n log n) comparisons in the worst case. This is proven using decision tree analysis - there are n! possible permutations requiring log(n!) = Θ(n log n) comparisons to distinguish.',\n hint: 'Think about how many comparisons are needed to distinguish n! permutations.',\n difficulty: 'hard',\n topic: 'Theory',\n },\n {\n id: 'sort-9',\n question: 'Which algorithm does Java\\'s Arrays.sort() use for primitive arrays?',\n options: ['MergeSort', 'QuickSort', 'Dual-Pivot QuickSort', 'TimSort'],\n correctAnswer: 2,\n explanation: 'Java uses Dual-Pivot QuickSort for primitives (since Java 7). For objects, it uses TimSort (a hybrid of MergeSort and Insertion Sort) to guarantee stability and good performance on partially sorted data.',\n difficulty: 'hard',\n topic: 'Implementation',\n },\n {\n id: 'sort-10',\n question: 'What makes TimSort efficient for real-world data?',\n options: [\n 'It uses O(1) extra space',\n 'It exploits existing order in the data (runs)',\n 'It has O(n) worst case',\n 'It uses parallel processing',\n ],\n correctAnswer: 1,\n explanation: 'TimSort identifies and exploits \"runs\" (already sorted subsequences) in the data. Real-world data often has some order, so TimSort\\'s adaptive approach outperforms pure MergeSort or QuickSort.',\n difficulty: 'hard',\n topic: 'TimSort',\n },\n];\n\nfunction generateQuickSortSteps(initialArray: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const arr = [...initialArray];\n const sorted = new Set<number>();\n\n steps.push({\n array: [...arr],\n description: 'Initial array - starting QuickSort',\n });\n\n function quickSort(low: number, high: number): void {\n if (low < high) {\n const pivotIndex = partition(low, high);\n quickSort(low, pivotIndex - 1);\n quickSort(pivotIndex + 1, high);\n } else if (low === high) {\n sorted.add(low);\n steps.push({\n array: [...arr],\n sorted: Array.from(sorted),\n description: `Element at index ${low} is in final position`,\n });\n }\n }\n\n function partition(low: number, high: number): number {\n const pivot = arr[high];\n steps.push({\n array: [...arr],\n pivot: high,\n sorted: Array.from(sorted),\n description: `Pivot selected: ${pivot} at index ${high}`,\n });\n\n let i = low - 1;\n\n for (let j = low; j < high; j++) {\n steps.push({\n array: [...arr],\n comparing: [j, high],\n pivot: high,\n sorted: Array.from(sorted),\n description: `Comparing ${arr[j]} with pivot ${pivot}`,\n });\n\n if (arr[j] <= pivot) {\n i++;\n if (i !== j) {\n [arr[i], arr[j]] = [arr[j], arr[i]];\n steps.push({\n array: [...arr],\n swapping: [i, j],\n pivot: high,\n sorted: Array.from(sorted),\n description: `Swapping ${arr[j]} and ${arr[i]}`,\n });\n }\n }\n }\n\n if (i + 1 !== high) {\n [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];\n steps.push({\n array: [...arr],\n swapping: [i + 1, high],\n sorted: Array.from(sorted),\n description: `Placing pivot ${pivot} in final position ${i + 1}`,\n });\n }\n\n sorted.add(i + 1);\n steps.push({\n array: [...arr],\n sorted: Array.from(sorted),\n description: `Pivot ${pivot} is now in its final sorted position`,\n });\n\n return i + 1;\n }\n\n quickSort(0, arr.length - 1);\n\n // Mark all as sorted at the end\n steps.push({\n array: [...arr],\n sorted: arr.map((_, i) => i),\n description: 'Array is now sorted!',\n });\n\n return steps;\n}\n\nconst SortingInterviewVisualizerComponent: React.FC<SortingInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'sorting-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'sort-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => () => generateQuickSortSteps(INITIAL_ARRAY), []);\n\n const playback = useVisualizerPlayback<SortingStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: SORTING_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: SortingStep = playback.currentStepData || {\n array: INITIAL_ARRAY,\n description: '',\n };\n\n const { array, comparing, swapping, sorted, pivot, description } = stepData;\n\n const maxValue = Math.max(...array);\n\n const getBarColor = (index: number): string => {\n if (swapping?.includes(index)) return 'bg-red-400';\n if (comparing?.includes(index)) return 'bg-yellow-400';\n if (index === pivot) return 'bg-purple-400';\n if (sorted?.includes(index)) return 'bg-green-400';\n return 'bg-blue-400';\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.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 with mode toggle */}\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\">QuickSort</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n O(n log n) avg\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"orange\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={300} className=\"flex-1\">\n {/* Bar Chart */}\n <div className=\"mb-4\">\n <div className=\"flex items-end justify-center gap-2 h-48 px-4\">\n {array.map((value, index) => (\n <div key={index} className=\"flex flex-col items-center\">\n <div\n className={`w-10 transition-all duration-200 rounded-t ${getBarColor(index)}`}\n style={{ height: `${(value / maxValue) * 160}px` }}\n />\n <div className=\"text-xs mt-1 font-mono\">{value}</div>\n <div className=\"text-[10px] text-gray-400\">[{index}]</div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Current Operation Info */}\n {pivot !== undefined && (\n <div className=\"mb-4 p-3 bg-purple-50 rounded-lg border border-purple-200\">\n <div className=\"text-sm text-purple-800\">\n <span className=\"font-medium\">Pivot:</span> {array[pivot]} at index {pivot}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n sorted?.length === array.length\n ? 'success'\n : swapping\n ? 'warning'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"orange\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const SortingInterviewVisualizer = React.memo(SortingInterviewVisualizerComponent);\nexport default SortingInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface GraphNode {\n id: string;\n x: number;\n y: number;\n}\n\ninterface GraphEdge {\n from: string;\n to: string;\n}\n\ninterface GraphStep {\n visited: string[];\n current: string | null;\n queue?: string[];\n stack?: string[];\n description: string;\n algorithm: 'bfs' | 'dfs';\n}\n\ninterface GraphInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\n// Graph structure\nconst NODES: GraphNode[] = [\n { id: 'A', x: 150, y: 30 },\n { id: 'B', x: 60, y: 100 },\n { id: 'C', x: 240, y: 100 },\n { id: 'D', x: 30, y: 180 },\n { id: 'E', x: 120, y: 180 },\n { id: 'F', x: 210, y: 180 },\n { id: 'G', x: 280, y: 180 },\n];\n\nconst EDGES: GraphEdge[] = [\n { from: 'A', to: 'B' },\n { from: 'A', to: 'C' },\n { from: 'B', to: 'D' },\n { from: 'B', to: 'E' },\n { from: 'C', to: 'F' },\n { from: 'C', to: 'G' },\n { from: 'E', to: 'F' },\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Current' },\n { color: 'bg-green-400', label: 'Visited' },\n { color: 'bg-yellow-100', label: 'In Queue/Stack', border: '#facc15' },\n];\n\n// Interview questions about Graph traversal\nconst GRAPH_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'graph-1',\n question: 'What data structure does BFS use?',\n options: ['Stack', 'Queue', 'Heap', 'Array'],\n correctAnswer: 1,\n explanation: 'BFS uses a Queue (FIFO) to process nodes level by level. Nodes are added to the back and removed from the front, ensuring we visit all nodes at distance k before distance k+1.',\n hint: 'BFS explores nodes level by level - which structure gives FIFO ordering?',\n difficulty: 'easy',\n topic: 'BFS',\n },\n {\n id: 'graph-2',\n question: 'What data structure does DFS use (iterative version)?',\n options: ['Queue', 'Stack', 'Heap', 'Hash Map'],\n correctAnswer: 1,\n explanation: 'DFS uses a Stack (LIFO) or recursion (which uses the call stack). This ensures we go as deep as possible before backtracking.',\n hint: 'DFS goes deep first - which structure gives LIFO ordering?',\n difficulty: 'easy',\n topic: 'DFS',\n },\n {\n id: 'graph-3',\n question: 'What is the time complexity of BFS/DFS on a graph with V vertices and E edges?',\n options: ['O(V)', 'O(E)', 'O(V + E)', 'O(V × E)'],\n correctAnswer: 2,\n explanation: 'Both BFS and DFS visit each vertex once O(V) and examine each edge once O(E), giving O(V + E) total time complexity.',\n difficulty: 'easy',\n topic: 'Complexity',\n },\n {\n id: 'graph-4',\n question: 'Which algorithm is best for finding the shortest path in an unweighted graph?',\n options: ['DFS', 'BFS', 'Dijkstra', 'Bellman-Ford'],\n correctAnswer: 1,\n explanation: 'BFS finds the shortest path in unweighted graphs because it explores nodes level by level. The first time it reaches a node is via the shortest path (fewest edges).',\n hint: 'Think about which algorithm explores by distance from source.',\n difficulty: 'medium',\n topic: 'Shortest Path',\n },\n {\n id: 'graph-5',\n question: 'Which traversal is typically used for topological sorting?',\n options: ['BFS only', 'DFS only', 'Either BFS or DFS', 'Neither'],\n correctAnswer: 2,\n explanation: 'Both can be used! DFS-based: add to result in reverse post-order. BFS-based (Kahn\\'s algorithm): repeatedly remove nodes with no incoming edges. Both achieve topological ordering.',\n difficulty: 'medium',\n topic: 'Topological Sort',\n },\n {\n id: 'graph-6',\n question: 'What is the space complexity of BFS?',\n options: ['O(1)', 'O(log V)', 'O(V)', 'O(V + E)'],\n correctAnswer: 2,\n explanation: 'BFS requires O(V) space in the worst case for the queue (e.g., complete binary tree where an entire level can be V/2 nodes) plus O(V) for the visited set.',\n hint: 'Consider a complete binary tree - how many nodes at the deepest level?',\n difficulty: 'medium',\n topic: 'Space Complexity',\n },\n {\n id: 'graph-7',\n question: 'How do you detect a cycle in an undirected graph?',\n options: [\n 'Check if any node is visited twice during BFS/DFS',\n 'If we visit an already-visited node that\\'s not the parent',\n 'Count edges - if edges >= vertices, there\\'s a cycle',\n 'Use Dijkstra\\'s algorithm',\n ],\n correctAnswer: 1,\n explanation: 'During DFS/BFS, if we encounter a visited node that isn\\'t the immediate parent, there\\'s a cycle. Simply checking \"visited twice\" would incorrectly flag parent-child as a cycle.',\n difficulty: 'medium',\n topic: 'Cycle Detection',\n },\n {\n id: 'graph-8',\n question: 'Which traversal is better for finding connected components?',\n options: [\n 'BFS is significantly better',\n 'DFS is significantly better',\n 'Both work equally well',\n 'Neither can find connected components',\n ],\n correctAnswer: 2,\n explanation: 'Both BFS and DFS work equally well for finding connected components. Start from any unvisited node, run BFS/DFS to visit all reachable nodes (one component), repeat for remaining unvisited nodes.',\n difficulty: 'easy',\n topic: 'Connected Components',\n },\n {\n id: 'graph-9',\n question: 'What is the space complexity of recursive DFS?',\n options: ['O(1)', 'O(log V)', 'O(V)', 'O(E)'],\n correctAnswer: 2,\n explanation: 'Recursive DFS uses O(V) space for the call stack in the worst case (e.g., a linear chain graph). Plus O(V) for the visited set. This is why iterative DFS with explicit stack is sometimes preferred.',\n hint: 'Consider the recursion depth on a very deep graph.',\n difficulty: 'medium',\n topic: 'Space Complexity',\n },\n {\n id: 'graph-10',\n question: 'In which scenario would DFS outperform BFS?',\n options: [\n 'Finding shortest path',\n 'Finding any path to a deep node in a sparse graph',\n 'Level-order traversal',\n 'Finding minimum spanning tree',\n ],\n correctAnswer: 1,\n explanation: 'DFS can find a deep node faster in sparse graphs by going deep immediately, while BFS must explore all shallow nodes first. However, the path found by DFS isn\\'t necessarily shortest.',\n difficulty: 'hard',\n topic: 'Use Cases',\n },\n];\n\nfunction buildAdjacencyList(edges: GraphEdge[]): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const node of NODES) {\n adj.set(node.id, []);\n }\n for (const edge of edges) {\n adj.get(edge.from)?.push(edge.to);\n adj.get(edge.to)?.push(edge.from);\n }\n return adj;\n}\n\nfunction generateBFSSteps(): GraphStep[] {\n const steps: GraphStep[] = [];\n const adj = buildAdjacencyList(EDGES);\n const visited = new Set<string>();\n const queue: string[] = ['A'];\n visited.add('A');\n\n steps.push({\n visited: [],\n current: null,\n queue: ['A'],\n description: 'BFS: Start at node A, add to queue',\n algorithm: 'bfs',\n });\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n steps.push({\n visited: Array.from(visited),\n current,\n queue: [...queue],\n description: `BFS: Dequeue ${current}, visit it`,\n algorithm: 'bfs',\n });\n\n const neighbors = adj.get(current) || [];\n for (const neighbor of neighbors.sort()) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n\n steps.push({\n visited: Array.from(visited),\n current,\n queue: [...queue],\n description: `BFS: Add neighbor ${neighbor} to queue`,\n algorithm: 'bfs',\n });\n }\n }\n }\n\n steps.push({\n visited: Array.from(visited),\n current: null,\n queue: [],\n description: 'BFS complete! All reachable nodes visited.',\n algorithm: 'bfs',\n });\n\n return steps;\n}\n\nfunction generateDFSSteps(): GraphStep[] {\n const steps: GraphStep[] = [];\n const adj = buildAdjacencyList(EDGES);\n const visited = new Set<string>();\n const stack: string[] = ['A'];\n\n steps.push({\n visited: [],\n current: null,\n stack: ['A'],\n description: 'DFS: Start at node A, push to stack',\n algorithm: 'dfs',\n });\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n\n if (visited.has(current)) continue;\n visited.add(current);\n\n steps.push({\n visited: Array.from(visited),\n current,\n stack: [...stack],\n description: `DFS: Pop ${current}, visit it`,\n algorithm: 'dfs',\n });\n\n const neighbors = adj.get(current) || [];\n for (const neighbor of neighbors.sort().reverse()) {\n if (!visited.has(neighbor)) {\n stack.push(neighbor);\n\n steps.push({\n visited: Array.from(visited),\n current,\n stack: [...stack],\n description: `DFS: Push neighbor ${neighbor} to stack`,\n algorithm: 'dfs',\n });\n }\n }\n }\n\n steps.push({\n visited: Array.from(visited),\n current: null,\n stack: [],\n description: 'DFS complete! All reachable nodes visited.',\n algorithm: 'dfs',\n });\n\n return steps;\n}\n\nconst GraphInterviewVisualizerComponent: React.FC<GraphInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'graph-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'graph-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n const [algorithm, setAlgorithm] = useState<'bfs' | 'dfs'>('bfs');\n\n const generateSteps = useMemo(\n () => () => (algorithm === 'bfs' ? generateBFSSteps() : generateDFSSteps()),\n [algorithm]\n );\n\n const playback = useVisualizerPlayback<GraphStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: GRAPH_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: GraphStep = playback.currentStepData || {\n visited: [],\n current: null,\n description: '',\n algorithm: 'bfs',\n };\n\n const { visited, current, queue, stack, description } = stepData;\n\n const getNodeColor = (nodeId: string): string => {\n if (nodeId === current) return 'fill-blue-500';\n if (visited.includes(nodeId)) return 'fill-green-400';\n if (queue?.includes(nodeId) || stack?.includes(nodeId)) return 'fill-yellow-200';\n return 'fill-gray-200';\n };\n\n const getNodeStroke = (nodeId: string): string => {\n if (nodeId === current) return 'stroke-blue-600';\n if (visited.includes(nodeId)) return 'stroke-green-500';\n if (queue?.includes(nodeId) || stack?.includes(nodeId)) return 'stroke-yellow-500';\n return 'stroke-gray-400';\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.currentStep]);\n\n const handleAlgorithmChange = useCallback((newAlgo: 'bfs' | 'dfs') => {\n setAlgorithm(newAlgo);\n playback.handleReset();\n }, [playback]);\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 with mode toggle */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-blue-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\">Graph Traversal</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-blue-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-blue-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"blue\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={350} className=\"flex-1\">\n {/* Algorithm Toggle */}\n <div className=\"mb-4 flex justify-center gap-2\">\n <button\n onClick={() => handleAlgorithmChange('bfs')}\n className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors ${\n algorithm === 'bfs'\n ? 'bg-blue-500 text-white'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\n }`}\n >\n BFS (Queue)\n </button>\n <button\n onClick={() => handleAlgorithmChange('dfs')}\n className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors ${\n algorithm === 'dfs'\n ? 'bg-blue-500 text-white'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\n }`}\n >\n DFS (Stack)\n </button>\n </div>\n\n {/* Graph Visualization */}\n <div className=\"mb-4\">\n <svg width=\"310\" height=\"220\" className=\"mx-auto\">\n {/* Edges */}\n {EDGES.map((edge, idx) => {\n const from = NODES.find((n) => n.id === edge.from)!;\n const to = NODES.find((n) => n.id === edge.to)!;\n return (\n <line\n key={idx}\n x1={from.x}\n y1={from.y}\n x2={to.x}\n y2={to.y}\n stroke=\"#d1d5db\"\n strokeWidth=\"2\"\n />\n );\n })}\n\n {/* Nodes */}\n {NODES.map((node) => (\n <g key={node.id} transform={`translate(${node.x}, ${node.y})`}>\n <circle\n r=\"20\"\n className={`${getNodeColor(node.id)} ${getNodeStroke(node.id)} transition-colors`}\n strokeWidth=\"3\"\n />\n <text\n textAnchor=\"middle\"\n dy=\"5\"\n className=\"text-sm font-bold\"\n fill={node.id === current || visited.includes(node.id) ? 'white' : '#374151'}\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Data Structure Display */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-sm\">\n <span className=\"font-medium text-gray-700\">\n {algorithm === 'bfs' ? 'Queue' : 'Stack'}:\n </span>{' '}\n <span className=\"font-mono text-blue-600\">\n [{(algorithm === 'bfs' ? queue : stack)?.join(', ') || ''}]\n </span>\n </div>\n <div className=\"text-sm mt-1\">\n <span className=\"font-medium text-gray-700\">Visited:</span>{' '}\n <span className=\"font-mono text-green-600\">\n [{visited.join(', ')}]\n </span>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n visited.length === NODES.length\n ? 'success'\n : current\n ? 'default'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"blue\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"blue\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const GraphInterviewVisualizer = React.memo(GraphInterviewVisualizerComponent);\nexport default GraphInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface BloomFilterStep {\n operation: 'init' | 'add' | 'query' | 'done';\n element?: string;\n bitArray: boolean[];\n highlightBits?: number[];\n description: string;\n result?: 'probably_yes' | 'definitely_no';\n}\n\ninterface BloomFilterInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst BIT_ARRAY_SIZE = 16;\nconst K_HASH_FUNCTIONS = 3;\n\nconst OPERATIONS: Array<{ op: 'add' | 'query'; element: string }> = [\n { op: 'add', element: 'apple' },\n { op: 'add', element: 'banana' },\n { op: 'add', element: 'cherry' },\n { op: 'query', element: 'apple' },\n { op: 'query', element: 'grape' },\n { op: 'query', element: 'banana' },\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-200', label: 'Bit = 0' },\n { color: 'bg-purple-500', label: 'Bit = 1' },\n { color: 'bg-pink-400', label: 'Current hash position' },\n];\n\n// Interview questions about Bloom Filter\nconst BLOOM_FILTER_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'bf-1',\n question: 'What type of data structure is a Bloom Filter?',\n options: [\n 'Exact set membership',\n 'Probabilistic set membership',\n 'Key-value store',\n 'Sorted collection',\n ],\n correctAnswer: 1,\n explanation: 'Bloom Filter is a probabilistic data structure that can tell you \"definitely not in set\" or \"possibly in set\". It trades exactness for space efficiency.',\n hint: 'It can have false positives but never false negatives.',\n difficulty: 'easy',\n topic: 'Basics',\n },\n {\n id: 'bf-2',\n question: 'Which of these is possible in a standard Bloom Filter?',\n options: ['False negative', 'False positive', 'Both', 'Neither'],\n correctAnswer: 1,\n explanation: 'Bloom Filters can have false positives (saying \"maybe yes\" when element was never added) but NEVER false negatives. If it says \"no\", the element was definitely not added.',\n hint: 'Think about what happens when multiple elements set the same bits.',\n difficulty: 'easy',\n topic: 'False Positives',\n },\n {\n id: 'bf-3',\n question: 'What is the time complexity of add() and contains() in a Bloom Filter?',\n options: ['O(1)', 'O(k) where k = number of hash functions', 'O(n)', 'O(log n)'],\n correctAnswer: 1,\n explanation: 'Both operations are O(k) where k is the number of hash functions. We compute k hashes and check/set k bits. Since k is typically small and constant, this is effectively O(1).',\n difficulty: 'easy',\n topic: 'Complexity',\n },\n {\n id: 'bf-4',\n question: 'Why does a Bloom Filter use multiple hash functions?',\n options: [\n 'To make it faster',\n 'To reduce false positive rate',\n 'To enable deletion',\n 'To store more data',\n ],\n correctAnswer: 1,\n explanation: 'Multiple hash functions reduce false positives. For a false positive, ALL k bits must be set by other elements. With more hash functions, this becomes less likely (though using too many increases false positives again).',\n hint: 'More bits to check = harder to get a false positive.',\n difficulty: 'medium',\n topic: 'Hash Functions',\n },\n {\n id: 'bf-5',\n question: 'Can you delete elements from a standard Bloom Filter?',\n options: [\n 'Yes, by setting bits back to 0',\n 'No, because bits may be shared by multiple elements',\n 'Yes, using a special delete operation',\n 'Only if the element was added recently',\n ],\n correctAnswer: 1,\n explanation: 'Standard Bloom Filters don\\'t support deletion because multiple elements may share the same bits. Clearing a bit could cause false negatives for other elements. Counting Bloom Filters solve this with counters instead of bits.',\n difficulty: 'medium',\n topic: 'Deletion',\n },\n {\n id: 'bf-6',\n question: 'What happens to the false positive rate as you add more elements?',\n options: ['Decreases', 'Increases', 'Stays constant', 'Becomes zero'],\n correctAnswer: 1,\n explanation: 'As more elements are added, more bits get set to 1. This increases the probability that a non-existent element\\'s hash positions are all 1, causing a false positive.',\n hint: 'More 1s in the bit array = higher chance of collision.',\n difficulty: 'easy',\n topic: 'False Positive Rate',\n },\n {\n id: 'bf-7',\n question: 'What is the optimal number of hash functions for a Bloom Filter?',\n options: [\n '1',\n 'k = (m/n) × ln(2)',\n 'As many as possible',\n 'Equal to the bit array size',\n ],\n correctAnswer: 1,\n explanation: 'The optimal k is (m/n) × ln(2) ≈ 0.693 × (m/n), where m is bit array size and n is expected elements. This minimizes the false positive rate for given m and n.',\n difficulty: 'hard',\n topic: 'Optimization',\n },\n {\n id: 'bf-8',\n question: 'Which is a common use case for Bloom Filters?',\n options: [\n 'Storing user passwords',\n 'Database query optimization to avoid disk reads',\n 'Sorting large datasets',\n 'Encrypting sensitive data',\n ],\n correctAnswer: 1,\n explanation: 'Bloom Filters are used to avoid expensive operations. In databases, they can quickly determine if a key definitely doesn\\'t exist, avoiding unnecessary disk reads. Also used in caches, spell checkers, and network routers.',\n difficulty: 'medium',\n topic: 'Use Cases',\n },\n {\n id: 'bf-9',\n question: 'How much space does a Bloom Filter use compared to storing actual elements?',\n options: [\n 'More space than storing elements',\n 'About the same',\n 'Significantly less space',\n 'Depends on element size',\n ],\n correctAnswer: 2,\n explanation: 'Bloom Filters use a fixed number of bits regardless of element size. For 1% false positive rate, you need only ~10 bits per element (~1.2 bytes). Storing actual strings would require much more.',\n difficulty: 'medium',\n topic: 'Space Efficiency',\n },\n {\n id: 'bf-10',\n question: 'What is a Counting Bloom Filter?',\n options: [\n 'A Bloom Filter that counts elements',\n 'A variant using counters instead of bits to support deletion',\n 'A Bloom Filter with count of false positives',\n 'A Bloom Filter that uses counting sort',\n ],\n correctAnswer: 1,\n explanation: 'Counting Bloom Filter uses counters (typically 4-bit) instead of single bits. On add, counters increment. On delete, counters decrement. This enables deletion at the cost of ~4× more space.',\n difficulty: 'hard',\n topic: 'Variants',\n },\n];\n\nfunction simpleHash(str: string, seed: number): number {\n let hash = seed;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash % BIT_ARRAY_SIZE;\n}\n\nfunction getHashPositions(element: string): number[] {\n const positions: number[] = [];\n for (let i = 0; i < K_HASH_FUNCTIONS; i++) {\n positions.push(simpleHash(element, i * 31 + 7));\n }\n return positions;\n}\n\nfunction generateBloomFilterSteps(): BloomFilterStep[] {\n const steps: BloomFilterStep[] = [];\n const bitArray = new Array(BIT_ARRAY_SIZE).fill(false);\n\n steps.push({\n operation: 'init',\n bitArray: [...bitArray],\n description: `Initialize Bloom Filter: ${BIT_ARRAY_SIZE} bits, ${K_HASH_FUNCTIONS} hash functions`,\n });\n\n for (const { op, element } of OPERATIONS) {\n const positions = getHashPositions(element);\n\n if (op === 'add') {\n steps.push({\n operation: 'add',\n element,\n bitArray: [...bitArray],\n highlightBits: positions,\n description: `add(\"${element}\"): Hash positions = [${positions.join(', ')}]`,\n });\n\n for (const pos of positions) {\n bitArray[pos] = true;\n }\n\n steps.push({\n operation: 'add',\n element,\n bitArray: [...bitArray],\n highlightBits: positions,\n description: `add(\"${element}\"): Set bits at positions [${positions.join(', ')}]`,\n });\n } else {\n const allBitsSet = positions.every((pos) => bitArray[pos]);\n\n steps.push({\n operation: 'query',\n element,\n bitArray: [...bitArray],\n highlightBits: positions,\n description: `contains(\"${element}\"): Check positions [${positions.join(', ')}]`,\n result: allBitsSet ? 'probably_yes' : 'definitely_no',\n });\n\n steps.push({\n operation: 'query',\n element,\n bitArray: [...bitArray],\n highlightBits: positions,\n description: allBitsSet\n ? `contains(\"${element}\"): All bits are 1 → Probably YES`\n : `contains(\"${element}\"): Some bits are 0 → Definitely NO`,\n result: allBitsSet ? 'probably_yes' : 'definitely_no',\n });\n }\n }\n\n steps.push({\n operation: 'done',\n bitArray: [...bitArray],\n description: `Done! ${bitArray.filter(Boolean).length}/${BIT_ARRAY_SIZE} bits set`,\n });\n\n return steps;\n}\n\nconst BloomFilterInterviewVisualizerComponent: React.FC<BloomFilterInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'bloomfilter-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'bf-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateBloomFilterSteps, []);\n\n const playback = useVisualizerPlayback<BloomFilterStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: BLOOM_FILTER_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: BloomFilterStep = playback.currentStepData || {\n operation: 'init',\n bitArray: new Array(BIT_ARRAY_SIZE).fill(false),\n description: '',\n };\n\n const { bitArray, highlightBits, description, result } = stepData;\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.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 with mode toggle */}\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\">Bloom Filter</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-purple-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-purple-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Probabilistic\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"purple\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={300} className=\"flex-1\">\n {/* Key Property */}\n <div className=\"mb-4 p-3 bg-purple-50 rounded-lg border border-purple-200\">\n <div className=\"text-sm text-purple-800 text-center\">\n <span className=\"font-medium\">Key Property:</span> No false negatives!\n <br />\n <span className=\"text-xs\">If it says \"no\" → definitely not in set</span>\n </div>\n </div>\n\n {/* Bit Array Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Bit Array ({BIT_ARRAY_SIZE} bits, {K_HASH_FUNCTIONS} hash functions)\n </div>\n <div className=\"flex flex-wrap gap-1 justify-center\">\n {bitArray.map((bit, idx) => {\n const isHighlighted = highlightBits?.includes(idx);\n return (\n <div\n key={idx}\n className={`w-10 h-10 flex items-center justify-center rounded-lg text-xs font-mono transition-all ${\n isHighlighted\n ? 'bg-pink-400 text-white ring-2 ring-pink-500 scale-110'\n : bit\n ? 'bg-purple-500 text-white'\n : 'bg-gray-200 text-gray-600'\n }`}\n >\n <div className=\"text-center\">\n <div className=\"text-[10px] opacity-70\">{idx}</div>\n <div>{bit ? '1' : '0'}</div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Result Display */}\n {result && (\n <div\n className={`mb-4 p-3 rounded-lg border ${\n result === 'probably_yes'\n ? 'bg-yellow-50 border-yellow-200'\n : 'bg-green-50 border-green-200'\n }`}\n >\n <div\n className={`text-sm font-medium text-center ${\n result === 'probably_yes' ? 'text-yellow-800' : 'text-green-800'\n }`}\n >\n {result === 'probably_yes'\n ? '⚠️ Probably in set (could be false positive)'\n : '✓ Definitely NOT in set'}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n result === 'definitely_no'\n ? 'success'\n : result === 'probably_yes'\n ? 'warning'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"purple\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BloomFilterInterviewVisualizer = React.memo(BloomFilterInterviewVisualizerComponent);\nexport default BloomFilterInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface BTreeNode {\n keys: number[];\n children: BTreeNode[];\n isLeaf: boolean;\n}\n\ninterface BTreeStep {\n operation: 'init' | 'insert' | 'search' | 'split' | 'done';\n value?: number;\n tree: BTreeNode | null;\n highlightNode?: number[];\n highlightKey?: number;\n description: string;\n found?: boolean;\n}\n\ninterface BTreeInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst ORDER = 3; // Max 2 keys per node (ORDER - 1)\n\nconst OPERATIONS: Array<{ op: 'insert' | 'search'; value: number }> = [\n { op: 'insert', value: 10 },\n { op: 'insert', value: 20 },\n { op: 'insert', value: 5 },\n { op: 'insert', value: 15 },\n { op: 'insert', value: 25 },\n { op: 'search', value: 15 },\n { op: 'search', value: 12 },\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-400', label: 'Current node' },\n { color: 'bg-yellow-100', label: 'Search path', border: '#facc15' },\n { color: 'bg-blue-400', label: 'Found/Inserted' },\n];\n\n// Interview questions about B-Tree\nconst BTREE_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'bt-1',\n question: 'Why are B-Trees commonly used in database indexes?',\n options: [\n 'They use less memory than hash tables',\n 'They minimize disk I/O by having high branching factor',\n 'They are easier to implement',\n 'They support only point queries',\n ],\n correctAnswer: 1,\n explanation: 'B-Trees are optimized for disk I/O. With high branching factor (hundreds of children per node), tree height stays small (2-4 levels for millions of records), minimizing expensive disk reads.',\n hint: 'Think about what makes disk operations expensive.',\n difficulty: 'medium',\n topic: 'Use Cases',\n },\n {\n id: 'bt-2',\n question: 'What is the time complexity of search, insert, and delete in a B-Tree?',\n options: ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)'],\n correctAnswer: 1,\n explanation: 'All operations are O(log n) because tree height is O(log n) with base equal to the branching factor. Even with billions of records, a B-Tree with order 100 has only ~5 levels.',\n difficulty: 'easy',\n topic: 'Complexity',\n },\n {\n id: 'bt-3',\n question: 'What happens when a B-Tree node becomes full during insertion?',\n options: [\n 'The insertion fails',\n 'The node splits into two, and middle key moves up',\n 'Elements are shifted to sibling nodes',\n 'The tree is rebuilt',\n ],\n correctAnswer: 1,\n explanation: 'When a node overflows (has ORDER keys), it splits: the middle key moves to the parent, and the node divides into two nodes with the remaining keys. This may propagate up to the root.',\n hint: 'The tree grows from the root, not the leaves.',\n difficulty: 'medium',\n topic: 'Insertion',\n },\n {\n id: 'bt-4',\n question: 'What is the minimum fill factor for non-root nodes in a B-Tree?',\n options: ['Empty is allowed', '25%', '50%', '100%'],\n correctAnswer: 2,\n explanation: 'Non-root nodes must be at least half full (⌈m/2⌉ - 1 keys minimum, where m is order). This ensures efficient space utilization and bounds tree height. Only root can have fewer keys.',\n difficulty: 'medium',\n topic: 'Properties',\n },\n {\n id: 'bt-5',\n question: 'What is the difference between B-Tree and B+ Tree?',\n options: [\n 'B+ Tree is faster',\n 'B+ Tree stores data only in leaves and has linked leaves',\n 'B-Tree has more levels',\n 'They are identical',\n ],\n correctAnswer: 1,\n explanation: 'In B+ Tree: (1) all data is stored in leaves (internal nodes only have keys), (2) leaves are linked for efficient range queries. Most databases use B+ Trees for these advantages.',\n difficulty: 'hard',\n topic: 'Variants',\n },\n {\n id: 'bt-6',\n question: 'How does a B-Tree guarantee balance?',\n options: [\n 'By using rotations like AVL',\n 'By always splitting/merging to keep nodes within bounds',\n 'By rebuilding periodically',\n 'It doesn\\'t guarantee balance',\n ],\n correctAnswer: 1,\n explanation: 'B-Trees stay balanced by: (1) growing upward from root on overflow (splits), (2) merging/redistributing on underflow. All leaves are always at the same depth.',\n difficulty: 'medium',\n topic: 'Balance',\n },\n {\n id: 'bt-7',\n question: 'What is the typical order (branching factor) for B-Trees in database systems?',\n options: ['2-3', '10-20', '100-1000', '10000+'],\n correctAnswer: 2,\n explanation: 'Database B-Trees typically have order 100-1000, chosen so each node fits in a disk block (4KB-16KB). This maximizes fanout while keeping node reads efficient.',\n hint: 'Think about disk block sizes.',\n difficulty: 'hard',\n topic: 'Implementation',\n },\n {\n id: 'bt-8',\n question: 'Why is B-Tree preferred over binary search tree for databases?',\n options: [\n 'BST is not balanced',\n 'B-Tree has fewer levels, reducing disk I/O',\n 'BST cannot store strings',\n 'B-Tree uses less memory',\n ],\n correctAnswer: 1,\n explanation: 'With order 100, a B-Tree storing 1M records has only 3 levels (log₁₀₀(1M) ≈ 3). A balanced BST would need 20 levels (log₂(1M) ≈ 20). Each level = one disk read.',\n difficulty: 'medium',\n topic: 'Comparison',\n },\n {\n id: 'bt-9',\n question: 'What is the height of a B-Tree with n keys and order m?',\n options: ['O(n)', 'O(log n)', 'O(logₘ n)', 'O(m)'],\n correctAnswer: 2,\n explanation: 'Height is O(logₘ n) where m is the order (branching factor). The logarithm base m makes B-Trees very shallow - crucial for minimizing disk I/O.',\n difficulty: 'medium',\n topic: 'Height',\n },\n {\n id: 'bt-10',\n question: 'Which property is NOT true for B-Trees?',\n options: [\n 'All leaves are at the same depth',\n 'Each node can have at most m children',\n 'Data is always stored in sorted order',\n 'Root must always be a leaf node',\n ],\n correctAnswer: 3,\n explanation: 'Root is a leaf only when the tree has one node. As elements are inserted and the root splits, it becomes an internal node with children. All other properties are always true.',\n difficulty: 'easy',\n topic: 'Properties',\n },\n];\n\nfunction cloneBTree(node: BTreeNode | null): BTreeNode | null {\n if (!node) return null;\n return {\n keys: [...node.keys],\n children: node.children.map((c) => cloneBTree(c)!),\n isLeaf: node.isLeaf,\n };\n}\n\nfunction generateBTreeSteps(): BTreeStep[] {\n const steps: BTreeStep[] = [];\n let root: BTreeNode | null = null;\n\n steps.push({\n operation: 'init',\n tree: null,\n description: `Initialize B-Tree of order ${ORDER} (max ${ORDER - 1} keys per node)`,\n });\n\n function insert(node: BTreeNode | null, key: number): { node: BTreeNode; promoted?: number; newChild?: BTreeNode } {\n if (!node) {\n return { node: { keys: [key], children: [], isLeaf: true } };\n }\n\n if (node.isLeaf) {\n // Insert into leaf\n const insertIdx = node.keys.findIndex((k) => key < k);\n if (insertIdx === -1) {\n node.keys.push(key);\n } else {\n node.keys.splice(insertIdx, 0, key);\n }\n\n // Check for split\n if (node.keys.length >= ORDER) {\n const midIdx = Math.floor(node.keys.length / 2);\n const promoted = node.keys[midIdx];\n const rightNode: BTreeNode = {\n keys: node.keys.slice(midIdx + 1),\n children: [],\n isLeaf: true,\n };\n node.keys = node.keys.slice(0, midIdx);\n return { node, promoted, newChild: rightNode };\n }\n\n return { node };\n }\n\n // Find child to recurse into\n let childIdx = node.keys.findIndex((k) => key < k);\n if (childIdx === -1) childIdx = node.keys.length;\n\n const result = insert(node.children[childIdx], key);\n node.children[childIdx] = result.node;\n\n if (result.promoted !== undefined && result.newChild) {\n // Handle promotion from child split\n node.keys.splice(childIdx, 0, result.promoted);\n node.children.splice(childIdx + 1, 0, result.newChild);\n\n // Check if this node needs to split\n if (node.keys.length >= ORDER) {\n const midIdx = Math.floor(node.keys.length / 2);\n const promoted = node.keys[midIdx];\n const rightNode: BTreeNode = {\n keys: node.keys.slice(midIdx + 1),\n children: node.children.slice(midIdx + 1),\n isLeaf: false,\n };\n node.keys = node.keys.slice(0, midIdx);\n node.children = node.children.slice(0, midIdx + 1);\n return { node, promoted, newChild: rightNode };\n }\n }\n\n return { node };\n }\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'insert') {\n steps.push({\n operation: 'insert',\n value,\n tree: cloneBTree(root),\n highlightKey: value,\n description: `insert(${value}): Finding position...`,\n });\n\n const result = insert(root, value);\n\n if (result.promoted !== undefined && result.newChild) {\n // Root split\n root = {\n keys: [result.promoted],\n children: [result.node, result.newChild],\n isLeaf: false,\n };\n steps.push({\n operation: 'split',\n value,\n tree: cloneBTree(root),\n highlightKey: result.promoted,\n description: `insert(${value}): Root split! ${result.promoted} promoted to new root`,\n });\n } else {\n root = result.node;\n steps.push({\n operation: 'insert',\n value,\n tree: cloneBTree(root),\n highlightKey: value,\n description: `insert(${value}): Inserted successfully`,\n });\n }\n } else {\n // Search\n let current = root;\n const path: number[] = [];\n let found = false;\n\n while (current) {\n const idx = current.keys.findIndex((k) => value <= k);\n if (idx !== -1 && current.keys[idx] === value) {\n found = true;\n break;\n }\n if (current.isLeaf) break;\n\n const childIdx = idx === -1 ? current.keys.length : idx;\n path.push(childIdx);\n current = current.children[childIdx];\n }\n\n steps.push({\n operation: 'search',\n value,\n tree: cloneBTree(root),\n highlightKey: value,\n highlightNode: path,\n description: found\n ? `search(${value}): Found!`\n : `search(${value}): Not found`,\n found,\n });\n }\n }\n\n function countKeys(node: BTreeNode | null): number {\n if (!node) return 0;\n return node.keys.length + node.children.reduce((sum, c) => sum + countKeys(c), 0);\n }\n\n steps.push({\n operation: 'done',\n tree: cloneBTree(root),\n description: `Done! B-Tree contains ${countKeys(root)} keys`,\n });\n\n return steps;\n}\n\nconst BTreeInterviewVisualizerComponent: React.FC<BTreeInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'btree-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'bt-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateBTreeSteps, []);\n\n const playback = useVisualizerPlayback<BTreeStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: BTREE_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: BTreeStep = playback.currentStepData || {\n operation: 'init',\n tree: null,\n description: '',\n };\n\n const { tree, highlightKey, description, found } = stepData;\n\n // Simple tree rendering\n const renderNode = (node: BTreeNode, x: number, y: number, width: number): React.ReactNode => {\n const nodeWidth = Math.max(60, node.keys.length * 30);\n const isHighlighted = node.keys.includes(highlightKey || -1);\n\n return (\n <g key={`${x}-${y}-${node.keys.join(',')}`}>\n {/* Node box */}\n <rect\n x={x - nodeWidth / 2}\n y={y}\n width={nodeWidth}\n height={30}\n rx={4}\n className={`transition-colors ${\n isHighlighted\n ? found === false\n ? 'fill-red-100 stroke-red-400'\n : 'fill-green-100 stroke-green-400'\n : 'fill-white stroke-gray-300'\n }`}\n strokeWidth={2}\n />\n\n {/* Keys */}\n {node.keys.map((key, idx) => (\n <text\n key={idx}\n x={x - nodeWidth / 2 + 15 + idx * 30}\n y={y + 20}\n className={`text-xs font-mono ${\n key === highlightKey ? 'fill-green-700 font-bold' : 'fill-gray-700'\n }`}\n >\n {key}\n </text>\n ))}\n\n {/* Children */}\n {!node.isLeaf &&\n node.children.map((child, idx) => {\n const childX = x - width / 2 + (width / (node.children.length + 1)) * (idx + 1);\n const childY = y + 60;\n return (\n <g key={idx}>\n <line\n x1={x}\n y1={y + 30}\n x2={childX}\n y2={childY}\n stroke=\"#d1d5db\"\n strokeWidth={2}\n />\n {renderNode(child, childX, childY, width / node.children.length)}\n </g>\n );\n })}\n </g>\n );\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.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 with mode toggle */}\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\">B-Tree</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-green-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-green-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Order {ORDER}\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"green\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={300} className=\"flex-1\">\n {/* B-Tree Property */}\n <div className=\"mb-4 p-3 bg-green-50 rounded-lg border border-green-200\">\n <div className=\"text-sm text-green-800 text-center\">\n <span className=\"font-medium\">B-Tree Order {ORDER}:</span> Max {ORDER - 1} keys, min{' '}\n {Math.ceil(ORDER / 2) - 1} keys per node\n </div>\n </div>\n\n {/* Tree Visualization */}\n <div className=\"mb-4\">\n <div className=\"bg-gray-50 rounded-lg p-2 overflow-x-auto\">\n {tree ? (\n <svg width=\"400\" height=\"200\" className=\"mx-auto\">\n {renderNode(tree, 200, 20, 350)}\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 {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n stepData.operation === 'search' && found === false\n ? 'error'\n : stepData.operation === 'done' || found === true\n ? 'success'\n : stepData.operation === 'split'\n ? 'warning'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"green\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"green\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BTreeInterviewVisualizer = React.memo(BTreeInterviewVisualizerComponent);\nexport default BTreeInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\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}\n\ninterface DijkstraInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Unvisited', border: '#60a5fa' },\n { color: 'bg-yellow-400', label: 'Current' },\n { color: 'bg-green-400', label: 'Visited' },\n];\n\n// Interview questions about Dijkstra's algorithm\nconst DIJKSTRA_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'dij-1',\n question: 'What is the time complexity of Dijkstra\\'s algorithm with a binary heap?',\n options: ['O(V²)', 'O(V + E)', 'O((V + E) log V)', 'O(V × E)'],\n correctAnswer: 2,\n explanation: 'With a binary heap, each vertex is extracted once O(V log V) and each edge may cause a decrease-key O(E log V), giving O((V + E) log V) total.',\n hint: 'Consider the heap operations: extract-min and decrease-key.',\n difficulty: 'medium',\n topic: 'Time Complexity',\n },\n {\n id: 'dij-2',\n question: 'What data structure is typically used in Dijkstra\\'s algorithm to get the minimum distance vertex?',\n options: ['Stack', 'Queue', 'Priority Queue (Min-Heap)', 'Hash Table'],\n correctAnswer: 2,\n explanation: 'A priority queue (min-heap) efficiently finds the unvisited vertex with minimum distance. Without it, finding the minimum takes O(V) per iteration, giving O(V²) total.',\n difficulty: 'easy',\n topic: 'Data Structures',\n },\n {\n id: 'dij-3',\n question: 'Can Dijkstra\\'s algorithm handle negative edge weights?',\n options: [\n 'Yes, always',\n 'No, it can give incorrect results',\n 'Yes, but only for directed graphs',\n 'Yes, but requires modification',\n ],\n correctAnswer: 1,\n explanation: 'Dijkstra assumes once a vertex is visited, its distance is final. Negative edges can provide shorter paths through already-visited vertices, breaking this assumption. Use Bellman-Ford for negative weights.',\n hint: 'Think about what happens when a visited node could be reached via a shorter negative-weight path.',\n difficulty: 'medium',\n topic: 'Limitations',\n },\n {\n id: 'dij-4',\n question: 'What is the \"relaxation\" step in Dijkstra\\'s algorithm?',\n options: [\n 'Removing a vertex from the priority queue',\n 'Updating distance if a shorter path is found',\n 'Marking a vertex as visited',\n 'Adding edges to the graph',\n ],\n correctAnswer: 1,\n explanation: 'Relaxation checks if going through the current vertex provides a shorter path to a neighbor: if dist[u] + weight(u,v) < dist[v], update dist[v]. This is the core operation.',\n difficulty: 'easy',\n topic: 'Core Concept',\n },\n {\n id: 'dij-5',\n question: 'What is the space complexity of Dijkstra\\'s algorithm?',\n options: ['O(1)', 'O(V)', 'O(E)', 'O(V + E)'],\n correctAnswer: 1,\n explanation: 'Dijkstra requires O(V) space for the distance array, visited array, and priority queue (which holds at most V vertices). The graph representation itself is separate (O(V + E) for adjacency list).',\n difficulty: 'easy',\n topic: 'Space Complexity',\n },\n {\n id: 'dij-6',\n question: 'Which algorithm should you use instead of Dijkstra for graphs with negative edges?',\n options: ['BFS', 'DFS', 'Bellman-Ford', 'Prim\\'s'],\n correctAnswer: 2,\n explanation: 'Bellman-Ford handles negative edge weights and can detect negative cycles. It runs in O(V × E) which is slower than Dijkstra but works correctly with negative weights.',\n difficulty: 'medium',\n topic: 'Alternatives',\n },\n {\n id: 'dij-7',\n question: 'In Dijkstra\\'s algorithm, when is a vertex\\'s shortest distance finalized?',\n options: [\n 'When it\\'s added to the priority queue',\n 'When it\\'s extracted from the priority queue',\n 'When all its neighbors are processed',\n 'At the end of the algorithm',\n ],\n correctAnswer: 1,\n explanation: 'When a vertex is extracted from the min-heap, we\\'ve found the shortest path to it. Any remaining paths would have to go through vertices with equal or greater distance, so they can\\'t be shorter.',\n hint: 'The min-heap property guarantees something important here.',\n difficulty: 'medium',\n topic: 'Algorithm Invariant',\n },\n {\n id: 'dij-8',\n question: 'How can you reconstruct the actual shortest path (not just distance)?',\n options: [\n 'It\\'s not possible with Dijkstra',\n 'Store the previous vertex for each vertex',\n 'Run the algorithm backwards',\n 'Store all visited edges',\n ],\n correctAnswer: 1,\n explanation: 'Maintain a \"previous\" array: when relaxing dist[v], set prev[v] = u. To get the path to any vertex, backtrack from destination to source using prev pointers.',\n difficulty: 'easy',\n topic: 'Path Reconstruction',\n },\n {\n id: 'dij-9',\n question: 'What is the time complexity of Dijkstra with a simple array instead of a heap?',\n options: ['O(V log V)', 'O(V²)', 'O(V + E)', 'O(E log V)'],\n correctAnswer: 1,\n explanation: 'Without a heap, finding the minimum distance vertex requires scanning all V vertices, done V times = O(V²). This is actually better than heap-based O((V+E)log V) for dense graphs where E ≈ V².',\n difficulty: 'medium',\n topic: 'Implementation Variants',\n },\n {\n id: 'dij-10',\n question: 'Which of these is a valid application of Dijkstra\\'s algorithm?',\n options: [\n 'Finding minimum spanning tree',\n 'Finding shortest path in unweighted graph',\n 'GPS navigation systems',\n 'Detecting cycles in a graph',\n ],\n correctAnswer: 2,\n explanation: 'GPS/map navigation uses Dijkstra (or A*) to find shortest/fastest routes. For unweighted graphs, BFS is simpler and equally effective. MST uses Prim\\'s or Kruskal\\'s. Cycle detection uses DFS.',\n difficulty: 'easy',\n topic: 'Applications',\n },\n];\n\n// Graph structure\nconst NODES: Node[] = [\n { id: 0, x: 60, y: 150 },\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 },\n];\n\nconst 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\nfunction buildAdjacencyList(): Map<number, { to: number; weight: number }[]> {\n const adj = new Map<number, { to: number; weight: number }[]>();\n NODES.forEach((node) => adj.set(node.id, []));\n EDGES.forEach(({ from, to, weight }) => {\n adj.get(from)?.push({ to, weight });\n });\n return adj;\n}\n\nfunction generateDijkstraSteps(): DijkstraStep[] {\n const steps: DijkstraStep[] = [];\n const adj = buildAdjacencyList();\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[0] = 0;\n pq.push({ node: 0, dist: 0 });\n\n steps.push({\n current: -1,\n distances: [...distances],\n visited: [],\n previous: [...previous],\n priorityQueue: [...pq],\n description: 'Initialize: dist[0] = 0, all others = ∞',\n });\n\n while (pq.length > 0) {\n pq.sort((a, b) => a.dist - b.dist);\n const { node: current, dist: currentDist } = pq.shift()!;\n\n if (visited.includes(current)) continue;\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 node ${current} (dist=${currentDist}) from PQ`,\n });\n\n const neighbors = adj.get(current) || [];\n for (const { to, weight } of neighbors) {\n if (visited.includes(to)) continue;\n\n const newDist = distances[current] + weight;\n if (newDist < 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 ${current}→${to}: dist[${to}] = ${newDist}`,\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 distances: [${distances.join(', ')}]`,\n });\n\n return steps;\n}\n\nconst DijkstraInterviewVisualizerComponent: React.FC<DijkstraInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'dijkstra-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'dij-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateDijkstraSteps, []);\n\n const playback = useVisualizerPlayback<DijkstraStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: DIJKSTRA_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: DijkstraStep = playback.currentStepData || {\n current: -1,\n distances: Array(NODES.length).fill(Infinity),\n visited: [],\n previous: [],\n priorityQueue: [],\n description: '',\n };\n\n const { current, distances, visited, priorityQueue, description } = stepData;\n\n const getNodeColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-400';\n if (visited.includes(nodeId)) return 'fill-green-400';\n return 'fill-blue-100';\n };\n\n const getNodeStroke = (nodeId: number): string => {\n if (nodeId === current) return 'stroke-yellow-600';\n if (visited.includes(nodeId)) return 'stroke-green-600';\n return 'stroke-blue-400';\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.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\">Dijkstra's Algorithm</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n O((V+E) log V)\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"orange\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={400} className=\"flex-1\">\n {/* Distance Array */}\n <div className=\"mb-4 p-3 bg-orange-50 rounded-lg border border-orange-200\">\n <div className=\"text-sm font-medium text-orange-800 mb-2\">\n Distance Array (from node 0)\n </div>\n <div className=\"flex flex-wrap gap-2 justify-center\">\n {distances.map((dist, idx) => (\n <div\n key={idx}\n className={`flex flex-col items-center p-2 rounded-lg border-2 min-w-[50px] ${\n idx === current\n ? 'bg-yellow-100 border-yellow-400'\n : visited.includes(idx)\n ? 'bg-green-100 border-green-400'\n : 'bg-white border-gray-200'\n }`}\n >\n <div className=\"text-xs text-gray-500\">Node {idx}</div>\n <div className=\"text-lg font-bold font-mono\">\n {dist === Infinity ? '∞' : dist}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Priority Queue */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Priority Queue: [{priorityQueue.sort((a, b) => a.dist - b.dist).map(p => `${p.node}:${p.dist}`).join(', ') || 'empty'}]\n </div>\n </div>\n\n {/* Graph */}\n <div className=\"mb-4\">\n <svg viewBox=\"0 0 420 300\" className=\"w-full h-52\">\n {/* Edges */}\n {EDGES.map((edge, idx) => {\n const from = NODES[edge.from];\n const to = NODES[edge.to];\n const midX = (from.x + to.x) / 2;\n const midY = (from.y + to.y) / 2;\n return (\n <g key={idx}>\n <line\n x1={from.x}\n y1={from.y}\n x2={to.x}\n y2={to.y}\n stroke=\"#9ca3af\"\n strokeWidth=\"2\"\n markerEnd=\"url(#arrow)\"\n />\n <circle cx={midX} cy={midY} r=\"10\" fill=\"white\" stroke=\"#d1d5db\" />\n <text x={midX} y={midY + 4} textAnchor=\"middle\" className=\"text-xs font-bold fill-gray-600\">\n {edge.weight}\n </text>\n </g>\n );\n })}\n\n {/* Arrow marker */}\n <defs>\n <marker id=\"arrow\" markerWidth=\"10\" markerHeight=\"7\" refX=\"28\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#9ca3af\" />\n </marker>\n </defs>\n\n {/* Nodes */}\n {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)} ${getNodeStroke(node.id)} stroke-2`}\n />\n <text\n x={node.x}\n y={node.y + 5}\n textAnchor=\"middle\"\n className=\"text-sm font-bold fill-gray-700\"\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={visited.length === NODES.length ? 'success' : 'default'}\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"orange\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DijkstraInterviewVisualizer = React.memo(DijkstraInterviewVisualizerComponent);\nexport default DijkstraInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface Item {\n weight: number;\n value: number;\n}\n\ninterface DPStep {\n i: number;\n w: number;\n table: number[][];\n decision: 'skip' | 'take' | null;\n description: string;\n}\n\ninterface DPInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\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\n// Interview questions about Dynamic Programming\nconst DP_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'dp-1',\n question: 'What are the two key properties required for a problem to be solvable using dynamic programming?',\n options: [\n 'Linearity and recursion',\n 'Optimal substructure and overlapping subproblems',\n 'Divide and conquer structure',\n 'Greedy choice property',\n ],\n correctAnswer: 1,\n explanation: 'DP requires: (1) Optimal substructure - optimal solution contains optimal solutions to subproblems, (2) Overlapping subproblems - same subproblems are solved multiple times, making memoization valuable.',\n difficulty: 'medium',\n topic: 'Core Concepts',\n },\n {\n id: 'dp-2',\n question: 'What is the time complexity of the 0/1 Knapsack problem using dynamic programming?',\n options: ['O(n)', 'O(n × W)', 'O(n²)', 'O(2ⁿ)'],\n correctAnswer: 1,\n explanation: 'The DP solution builds a table of n items × W capacity. Each cell is computed in O(1), giving O(n × W) total. This is pseudopolynomial - polynomial in the numeric value of W, not its size in bits.',\n hint: 'Think about the dimensions of the DP table.',\n difficulty: 'medium',\n topic: 'Time Complexity',\n },\n {\n id: 'dp-3',\n question: 'What is the difference between top-down and bottom-up dynamic programming?',\n options: [\n 'Top-down is faster than bottom-up',\n 'Top-down uses recursion with memoization, bottom-up uses iteration',\n 'Bottom-up cannot handle all DP problems',\n 'Top-down requires more space',\n ],\n correctAnswer: 1,\n explanation: 'Top-down (memoization): recursive approach that stores results of solved subproblems. Bottom-up (tabulation): iteratively fills a table from smaller subproblems to larger ones. Both have same time complexity.',\n difficulty: 'easy',\n topic: 'Approaches',\n },\n {\n id: 'dp-4',\n question: 'In the 0/1 Knapsack DP recurrence, what does dp[i][w] represent?',\n options: [\n 'The weight of item i',\n 'Maximum value using first i items with capacity w',\n 'Number of items selected',\n 'The total weight used',\n ],\n correctAnswer: 1,\n explanation: 'dp[i][w] = maximum value achievable using items 1 to i with knapsack capacity w. The recurrence is: dp[i][w] = max(dp[i-1][w], dp[i-1][w-weight[i]] + value[i]) if weight[i] <= w.',\n difficulty: 'easy',\n topic: 'DP State',\n },\n {\n id: 'dp-5',\n question: 'How can you reduce the space complexity of 0/1 Knapsack from O(n×W) to O(W)?',\n options: [\n 'Use a hash map instead of array',\n 'Use only one row, iterating backwards through capacity',\n 'Store only non-zero values',\n 'It cannot be reduced',\n ],\n correctAnswer: 1,\n explanation: 'Since dp[i][w] only depends on dp[i-1][...], we only need the previous row. By iterating capacity backwards (W to 0), we can use a single 1D array without overwriting needed values.',\n hint: 'Why iterate backwards? Think about which values each cell depends on.',\n difficulty: 'hard',\n topic: 'Space Optimization',\n },\n {\n id: 'dp-6',\n question: 'What distinguishes 0/1 Knapsack from Unbounded Knapsack?',\n options: [\n 'Unbounded Knapsack has negative weights',\n 'In 0/1, each item can be used at most once; in Unbounded, unlimited times',\n '0/1 Knapsack is NP-hard, Unbounded is not',\n 'They have different time complexities',\n ],\n correctAnswer: 1,\n explanation: '0/1 Knapsack: each item can be taken 0 or 1 times. Unbounded Knapsack: items can be taken any number of times. The DP recurrence changes: unbounded uses dp[i][w-weight[i]] instead of dp[i-1][w-weight[i]].',\n difficulty: 'medium',\n topic: 'Problem Variants',\n },\n {\n id: 'dp-7',\n question: 'What is the time complexity of the Longest Common Subsequence (LCS) problem?',\n options: ['O(m + n)', 'O(m × n)', 'O(2^(m+n))', 'O(m × n × min(m,n))'],\n correctAnswer: 1,\n explanation: 'LCS builds a 2D table of size m × n (lengths of two strings). Each cell is computed in O(1), giving O(m × n) total. Space can be optimized to O(min(m,n)).',\n difficulty: 'medium',\n topic: 'Classic Problems',\n },\n {\n id: 'dp-8',\n question: 'Which of these is NOT typically solved with dynamic programming?',\n options: [\n 'Fibonacci sequence',\n 'Minimum path sum in a grid',\n 'Binary search',\n 'Edit distance between strings',\n ],\n correctAnswer: 2,\n explanation: 'Binary search is a divide-and-conquer algorithm - subproblems don\\'t overlap. Fibonacci, grid paths, and edit distance all have overlapping subproblems and optimal substructure, making DP ideal.',\n difficulty: 'easy',\n topic: 'Problem Identification',\n },\n {\n id: 'dp-9',\n question: 'In DP, what is \"state\" and why is it important?',\n options: [\n 'The current value being computed',\n 'Variables that uniquely define a subproblem',\n 'The final answer',\n 'The base case',\n ],\n correctAnswer: 1,\n explanation: 'State = minimal set of variables that uniquely identify a subproblem. For Knapsack: (item index, remaining capacity). Choosing the right state is crucial - too few = incorrect, too many = inefficient.',\n hint: 'What information do you need to solve \"the rest\" of the problem?',\n difficulty: 'medium',\n topic: 'DP Design',\n },\n {\n id: 'dp-10',\n question: 'What makes the 0/1 Knapsack problem NP-complete despite having a polynomial-time DP solution?',\n options: [\n 'The recursion is exponential',\n 'W is measured in value, not bit size (pseudopolynomial)',\n 'Not all instances can be solved',\n 'The DP solution is not polynomial',\n ],\n correctAnswer: 1,\n explanation: 'O(nW) is pseudopolynomial - polynomial in W\\'s value, not its size. If W = 2^k (k bits), the algorithm is O(n × 2^k), exponential in input size. True polynomial would be O(n × k).',\n difficulty: 'hard',\n topic: 'Complexity Theory',\n },\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\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 × ${capacity + 1} cols`,\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 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}) > capacity ${w}, skip → ${dp[i][w]}`,\n });\n } else {\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: `Take item ${i}: ${takeValue} > skip ${skipValue} → ${takeValue}`,\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: `Skip item ${i}: ${skipValue} ≥ take ${takeValue} → ${skipValue}`,\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]}`,\n });\n\n return steps;\n}\n\nconst DPInterviewVisualizerComponent: React.FC<DPInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'dp-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'dp-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n const [items] = useState<Item[]>(DEFAULT_ITEMS);\n const [capacity] = useState(DEFAULT_CAPACITY);\n\n const generateSteps = useMemo(\n () => () => generateKnapsackSteps(items, capacity),\n [items, capacity]\n );\n\n const playback = useVisualizerPlayback<DPStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: DP_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: DPStep = playback.currentStepData || {\n i: -1,\n w: -1,\n table: Array(items.length + 1).fill(null).map(() => Array(capacity + 1).fill(0)),\n decision: null,\n description: '',\n };\n\n const { i: currentI, w: currentW, table, decision, description } = stepData;\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 handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.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-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\">0/1 Knapsack (DP)</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-teal-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-teal-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n O(n×W)\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"cyan\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={400} className=\"flex-1\">\n {/* DP Recurrence */}\n <div className=\"mb-4 p-3 bg-teal-50 rounded-lg border border-teal-200\">\n <div className=\"text-sm font-medium text-teal-800 mb-2\">DP Recurrence</div>\n <div className=\"font-mono text-xs text-gray-700\">\n dp[i][w] = max(<span className=\"text-yellow-600\">skip</span>, <span className=\"text-green-600\">take</span>)\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2 text-[10px]\">\n <div className=\"bg-yellow-50 p-1.5 rounded\">\n <span className=\"text-yellow-700 font-bold\">skip</span> = dp[i-1][w]\n </div>\n <div className=\"bg-green-50 p-1.5 rounded\">\n <span className=\"text-green-700 font-bold\">take</span> = dp[i-1][w-wt] + val\n </div>\n </div>\n </div>\n\n {/* Items */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">Items:</div>\n <div className=\"flex flex-wrap gap-2\">\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-200 text-purple-900 font-bold ring-2 ring-purple-400'\n : idx + 1 < currentI\n ? 'bg-blue-50 text-blue-600'\n : 'bg-gray-100 text-gray-500'\n }`}\n >\n i={idx + 1}: w={item.weight}, v={item.value}\n </div>\n ))}\n <div className=\"px-2 py-1 bg-gray-200 rounded text-xs font-medium\">\n Capacity: {capacity}\n </div>\n </div>\n </div>\n\n {/* DP Table */}\n <div className=\"mb-4 overflow-x-auto\">\n <table className=\"text-xs border-collapse mx-auto\">\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 className={`p-1 text-center ${i === currentI ? 'text-purple-700 font-bold' : 'text-gray-500'}`}>\n {i}\n </td>\n {row.map((cell, w) => (\n <td key={w} className={`p-1 text-center rounded ${getCellStyle(i, w)}`}>\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Current Decision */}\n {currentI > 0 && currentW > 0 && decision && (\n <div className=\"mb-4 text-center\">\n <span className={`px-3 py-1 rounded-full font-bold text-sm ${\n decision === 'take'\n ? 'bg-green-100 text-green-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}>\n {decision === 'take' ? '✓ TAKE' : '✗ SKIP'}\n </span>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n decision === 'take'\n ? 'success'\n : decision === 'skip'\n ? 'warning'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"cyan\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DPInterviewVisualizer = React.memo(DPInterviewVisualizerComponent);\nexport default DPInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ninterface VirtualNode {\n id: string;\n serverId: string;\n position: number;\n virtualIndex: number;\n}\n\ninterface DataKey {\n key: string;\n position: number;\n assignedServer?: string;\n}\n\ninterface ConsistentHashingStep {\n operation: 'init' | 'addServer' | 'addKey' | 'removeServer' | 'done';\n servers: string[];\n virtualNodes: VirtualNode[];\n dataKeys: DataKey[];\n description: string;\n highlightServer?: string;\n highlightKey?: string;\n movingKeys?: string[];\n}\n\ninterface ConsistentHashingInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Server A' },\n { color: 'bg-green-500', label: 'Server B' },\n { color: 'bg-purple-500', label: 'Server C' },\n { color: 'bg-yellow-400', label: 'Data key' },\n { color: 'bg-red-400', label: 'Moving' },\n];\n\n// Interview questions about Consistent Hashing\nconst CONSISTENT_HASHING_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'ch-1',\n question: 'What problem does consistent hashing solve compared to regular modular hashing?',\n options: [\n 'It provides faster lookup times',\n 'It minimizes key redistribution when nodes are added/removed',\n 'It uses less memory',\n 'It provides better hash distribution',\n ],\n correctAnswer: 1,\n explanation: 'With regular hash (key % N), adding/removing a server requires remapping almost all keys. Consistent hashing only remaps K/N keys on average (K=total keys, N=servers), providing minimal disruption.',\n difficulty: 'medium',\n topic: 'Core Concept',\n },\n {\n id: 'ch-2',\n question: 'What is the purpose of virtual nodes in consistent hashing?',\n options: [\n 'To reduce memory usage',\n 'To improve hash function quality',\n 'To achieve better load distribution across servers',\n 'To speed up key lookup',\n ],\n correctAnswer: 2,\n explanation: 'Without virtual nodes, servers may handle uneven portions of the ring. Virtual nodes place multiple points per server on the ring, improving load distribution and reducing variance.',\n hint: 'Think about what happens when servers are placed randomly on a ring.',\n difficulty: 'medium',\n topic: 'Virtual Nodes',\n },\n {\n id: 'ch-3',\n question: 'How is a key assigned to a server in consistent hashing?',\n options: [\n 'Using modulo of hash value',\n 'Random assignment',\n 'Walk clockwise on ring to find first server',\n 'Binary search through sorted servers',\n ],\n correctAnswer: 2,\n explanation: 'Hash the key to a position on the ring, then walk clockwise until you find the first server (or virtual node). That server owns the key. This can be implemented efficiently with a sorted data structure.',\n difficulty: 'easy',\n topic: 'Key Assignment',\n },\n {\n id: 'ch-4',\n question: 'When a server is removed, which keys need to be redistributed?',\n options: [\n 'All keys in the system',\n 'Only keys that were on the removed server',\n 'Keys on adjacent servers',\n 'A random subset of keys',\n ],\n correctAnswer: 1,\n explanation: 'Only keys assigned to the removed server need to move - they go to the next server clockwise on the ring. Keys on other servers are unaffected, minimizing data movement.',\n difficulty: 'easy',\n topic: 'Node Removal',\n },\n {\n id: 'ch-5',\n question: 'What is the time complexity of finding the server for a key in consistent hashing?',\n options: ['O(1)', 'O(log N)', 'O(N)', 'O(K)'],\n correctAnswer: 1,\n explanation: 'Using a balanced tree or sorted array for the ring positions, finding the next server clockwise is O(log N) where N is total virtual nodes. Some implementations use O(1) with a hash table for approximate positions.',\n difficulty: 'medium',\n topic: 'Time Complexity',\n },\n {\n id: 'ch-6',\n question: 'What happens when a new server is added to a consistent hashing ring?',\n options: [\n 'All keys are redistributed evenly',\n 'Keys between the new server and its predecessor move to it',\n 'No keys are moved',\n 'Half of all keys are redistributed',\n ],\n correctAnswer: 1,\n explanation: 'The new server takes over keys from the range between itself and the previous server on the ring. Only K/(N+1) keys move on average, where K is total keys and N is current server count.',\n difficulty: 'medium',\n topic: 'Node Addition',\n },\n {\n id: 'ch-7',\n question: 'Which of these is NOT a common use case for consistent hashing?',\n options: [\n 'Distributed caching (Memcached, Redis)',\n 'Database sharding',\n 'Sorting algorithms',\n 'CDN content distribution',\n ],\n correctAnswer: 2,\n explanation: 'Consistent hashing is used in distributed systems: caching (Memcached, Redis Cluster), databases (Cassandra, DynamoDB), load balancing, and CDNs. Sorting is unrelated to distributed key mapping.',\n difficulty: 'easy',\n topic: 'Applications',\n },\n {\n id: 'ch-8',\n question: 'How many virtual nodes per server is typically used in practice?',\n options: [\n '1-2 (minimal overhead)',\n '10-100 (balance of distribution and memory)',\n '1000+ (maximum distribution)',\n 'Equal to number of keys',\n ],\n correctAnswer: 1,\n explanation: 'Typically 100-200 virtual nodes per server provides good distribution without excessive memory overhead. More virtual nodes = better balance but more memory and slightly slower lookups.',\n hint: 'Consider the trade-off between distribution quality and memory usage.',\n difficulty: 'hard',\n topic: 'Implementation',\n },\n {\n id: 'ch-9',\n question: 'What data structure is typically used to implement the consistent hashing ring?',\n options: [\n 'Array',\n 'Hash table',\n 'Balanced binary search tree or sorted list',\n 'Linked list',\n ],\n correctAnswer: 2,\n explanation: 'A balanced BST (like Red-Black or AVL tree) or sorted list allows O(log N) lookup for the next server position. TreeMap in Java or std::map in C++ are common choices.',\n difficulty: 'medium',\n topic: 'Data Structures',\n },\n {\n id: 'ch-10',\n question: 'What is \"jump consistent hash\" and how does it differ from ring-based consistent hashing?',\n options: [\n 'It uses multiple hash rings',\n 'It maps keys to buckets using a mathematical formula, no ring needed',\n 'It allows faster additions',\n 'It uses more memory for better distribution',\n ],\n correctAnswer: 1,\n explanation: 'Jump consistent hash uses a clever algorithm to map keys to N buckets using only the key and bucket count. It\\'s O(1) memory but doesn\\'t support arbitrary node names or weighted nodes like ring-based hashing.',\n difficulty: 'hard',\n topic: 'Alternatives',\n },\n];\n\nconst VIRTUAL_NODES_PER_SERVER = 3;\n\nconst SERVER_COLORS: Record<string, string> = {\n 'Server-A': 'bg-blue-500',\n 'Server-B': 'bg-green-500',\n 'Server-C': 'bg-purple-500',\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 % 360;\n}\n\nfunction findServer(position: number, virtualNodes: VirtualNode[]): string | undefined {\n if (virtualNodes.length === 0) return undefined;\n const sorted = [...virtualNodes].sort((a, b) => a.position - b.position);\n for (const node of sorted) {\n if (node.position >= position) return node.serverId;\n }\n return sorted[0].serverId;\n}\n\nfunction generateConsistentHashingSteps(): ConsistentHashingStep[] {\n const steps: ConsistentHashingStep[] = [];\n const servers: string[] = [];\n const virtualNodes: VirtualNode[] = [];\n const dataKeys: DataKey[] = [];\n\n steps.push({\n operation: 'init',\n servers: [],\n virtualNodes: [],\n dataKeys: [],\n description: `Initialize consistent hashing ring`,\n });\n\n // Add servers\n for (const server of ['Server-A', 'Server-B', 'Server-C']) {\n servers.push(server);\n for (let i = 0; i < VIRTUAL_NODES_PER_SERVER; i++) {\n const nodeId = `${server}#${i}`;\n virtualNodes.push({\n id: nodeId,\n serverId: server,\n position: simpleHash(nodeId),\n virtualIndex: i,\n });\n }\n steps.push({\n operation: 'addServer',\n servers: [...servers],\n virtualNodes: virtualNodes.map(v => ({ ...v })),\n dataKeys: dataKeys.map(d => ({ ...d })),\n description: `Add ${server} with ${VIRTUAL_NODES_PER_SERVER} virtual nodes`,\n highlightServer: server,\n });\n }\n\n // Add keys\n for (const key of ['user:1001', 'session:abc', 'cache:page1']) {\n const position = simpleHash(key);\n const assignedServer = findServer(position, virtualNodes);\n dataKeys.push({ key, position, assignedServer });\n steps.push({\n operation: 'addKey',\n servers: [...servers],\n virtualNodes: virtualNodes.map(v => ({ ...v })),\n dataKeys: dataKeys.map(d => ({ ...d })),\n description: `Key \"${key}\" → ${assignedServer} (hash: ${position}°)`,\n highlightKey: key,\n });\n }\n\n // Remove server B\n const removedServer = 'Server-B';\n const keysOnRemovedServer = dataKeys.filter(k => k.assignedServer === removedServer);\n\n const remainingVirtualNodes = virtualNodes.filter(n => n.serverId !== removedServer);\n const remainingServers = servers.filter(s => s !== removedServer);\n\n steps.push({\n operation: 'removeServer',\n servers: remainingServers,\n virtualNodes: remainingVirtualNodes.map(v => ({ ...v })),\n dataKeys: dataKeys.map(d => ({ ...d })),\n description: `Remove ${removedServer} - ${keysOnRemovedServer.length} keys move`,\n highlightServer: removedServer,\n movingKeys: keysOnRemovedServer.map(k => k.key),\n });\n\n // Reassign keys\n for (const key of dataKeys) {\n key.assignedServer = findServer(key.position, remainingVirtualNodes);\n }\n\n steps.push({\n operation: 'done',\n servers: remainingServers,\n virtualNodes: remainingVirtualNodes.map(v => ({ ...v })),\n dataKeys: dataKeys.map(d => ({ ...d })),\n description: `✓ Done! Minimal disruption: only ${keysOnRemovedServer.length} keys moved`,\n });\n\n return steps;\n}\n\nconst ConsistentHashingInterviewVisualizerComponent: React.FC<ConsistentHashingInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'consistent-hashing-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'ch-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateConsistentHashingSteps, []);\n\n const playback = useVisualizerPlayback<ConsistentHashingStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: CONSISTENT_HASHING_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: ConsistentHashingStep = playback.currentStepData || {\n operation: 'init',\n servers: [],\n virtualNodes: [],\n dataKeys: [],\n description: '',\n };\n\n const { servers, virtualNodes, dataKeys, description, highlightServer, highlightKey, movingKeys } = stepData;\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.currentStep]);\n\n // Ring visualization\n const RING_RADIUS = 100;\n const CENTER = { x: 120, y: 120 };\n\n const getPositionOnRing = (degrees: number) => {\n const radians = ((degrees - 90) * Math.PI) / 180;\n return {\n x: CENTER.x + RING_RADIUS * Math.cos(radians),\n y: CENTER.y + RING_RADIUS * Math.sin(radians),\n };\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-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\">Consistent Hashing</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-cyan-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-cyan-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n Distributed Systems\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"cyan\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={400} className=\"flex-1\">\n {/* Key Concept */}\n <div className=\"mb-4 p-3 bg-cyan-50 rounded-lg border border-cyan-200\">\n <div className=\"text-sm font-medium text-cyan-800 mb-1\">Key Insight</div>\n <div className=\"text-xs text-gray-700\">\n Regular hashing (key % N) remaps ~100% of keys when N changes.\n Consistent hashing only remaps ~K/N keys (minimal disruption).\n </div>\n </div>\n\n {/* Hash Ring */}\n <div className=\"mb-4 flex justify-center\">\n <svg width=\"240\" height=\"240\" className=\"overflow-visible\">\n {/* Ring */}\n <circle\n cx={CENTER.x}\n cy={CENTER.y}\n r={RING_RADIUS}\n fill=\"none\"\n stroke=\"#e5e7eb\"\n strokeWidth=\"2\"\n />\n\n {/* Virtual nodes */}\n {virtualNodes.map((node) => {\n const pos = getPositionOnRing(node.position);\n const isHighlighted = highlightServer === node.serverId;\n const fillColor = SERVER_COLORS[node.serverId]\n ?.replace('bg-', '')\n .replace('blue-500', '#3b82f6')\n .replace('green-500', '#22c55e')\n .replace('purple-500', '#a855f7') || '#6b7280';\n\n return (\n <circle\n key={node.id}\n cx={pos.x}\n cy={pos.y}\n r={isHighlighted ? 9 : 7}\n fill={fillColor}\n stroke={isHighlighted ? '#fbbf24' : 'white'}\n strokeWidth={isHighlighted ? 3 : 2}\n />\n );\n })}\n\n {/* Data keys */}\n {dataKeys.map((key) => {\n const pos = getPositionOnRing(key.position);\n const isHighlighted = highlightKey === key.key;\n const isMoving = movingKeys?.includes(key.key);\n\n return (\n <rect\n key={key.key}\n x={pos.x - 4}\n y={pos.y - 4}\n width={8}\n height={8}\n fill={isMoving ? '#ef4444' : '#fbbf24'}\n stroke={isHighlighted ? '#000' : 'white'}\n strokeWidth={isHighlighted ? 2 : 1}\n transform={`rotate(45 ${pos.x} ${pos.y})`}\n />\n );\n })}\n\n {/* Center label */}\n <text x={CENTER.x} y={CENTER.y} textAnchor=\"middle\" dominantBaseline=\"middle\" className=\"text-[9px] fill-gray-500\">\n Hash Ring\n </text>\n </svg>\n </div>\n\n {/* Server Legend */}\n <div className=\"mb-4 flex flex-wrap gap-2 justify-center\">\n {servers.map((server) => (\n <div\n key={server}\n className={`flex items-center gap-1 px-2 py-1 rounded border ${\n highlightServer === server ? 'border-yellow-400 bg-yellow-50' : 'border-gray-200'\n }`}\n >\n <div className={`w-2 h-2 rounded-full ${SERVER_COLORS[server]}`} />\n <span className=\"text-xs\">{server}</span>\n <span className=\"text-[10px] text-gray-500\">\n ({dataKeys.filter((k) => k.assignedServer === server).length})\n </span>\n </div>\n ))}\n </div>\n\n {/* Keys Table */}\n {dataKeys.length > 0 && (\n <div className=\"mb-4 overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-gray-100\">\n <th className=\"px-2 py-1 text-left\">Key</th>\n <th className=\"px-2 py-1 text-left\">Hash</th>\n <th className=\"px-2 py-1 text-left\">Server</th>\n </tr>\n </thead>\n <tbody>\n {dataKeys.map((key) => (\n <tr\n key={key.key}\n className={`${highlightKey === key.key ? 'bg-yellow-100' : ''} ${movingKeys?.includes(key.key) ? 'bg-red-100' : ''}`}\n >\n <td className=\"px-2 py-1 font-mono\">{key.key}</td>\n <td className=\"px-2 py-1\">{key.position}°</td>\n <td className=\"px-2 py-1\">\n <span className={`px-1.5 py-0.5 rounded text-white text-[10px] ${SERVER_COLORS[key.assignedServer || ''] || 'bg-gray-400'}`}>\n {key.assignedServer || 'none'}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={stepData.operation === 'done' ? 'success' : stepData.operation === 'removeServer' ? 'warning' : 'default'}\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"cyan\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ConsistentHashingInterviewVisualizer = React.memo(ConsistentHashingInterviewVisualizerComponent);\nexport default ConsistentHashingInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport {\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\nimport { InterviewModePanel } from '../shared/InterviewModePanel';\nimport { useInterviewMode, type InterviewQuestion } from '../shared/useInterviewMode';\n\ntype NodeState = 'follower' | 'candidate' | 'leader';\n\ninterface LogEntry {\n term: number;\n command: string;\n committed: boolean;\n}\n\ninterface RaftNode {\n id: string;\n state: NodeState;\n term: number;\n votedFor: string | null;\n log: LogEntry[];\n commitIndex: number;\n}\n\ninterface RaftStep {\n operation: 'init' | 'timeout' | 'vote' | 'becomeLeader' | 'heartbeat' | 'replicate' | 'commit' | 'done';\n nodes: RaftNode[];\n description: string;\n highlightNode?: string;\n highlightEdge?: { from: string; to: string; type: 'vote' | 'heartbeat' };\n messageType?: string;\n}\n\ninterface RaftInterviewVisualizerProps {\n showControls?: boolean;\n className?: string;\n}\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-400', label: 'Follower' },\n { color: 'bg-yellow-500', label: 'Candidate' },\n { color: 'bg-green-500', label: 'Leader' },\n { color: 'bg-blue-400', label: 'Vote' },\n { color: 'bg-purple-400', label: 'Heartbeat' },\n];\n\n// Interview questions about Raft Consensus\nconst RAFT_QUESTIONS: InterviewQuestion[] = [\n {\n id: 'raft-1',\n question: 'What are the three states a Raft node can be in?',\n options: [\n 'Primary, Secondary, Arbiter',\n 'Master, Slave, Observer',\n 'Follower, Candidate, Leader',\n 'Active, Passive, Standby',\n ],\n correctAnswer: 2,\n explanation: 'Raft nodes transition between: Follower (passive, responds to leaders/candidates), Candidate (during elections), and Leader (handles all client requests, replicates to followers).',\n difficulty: 'easy',\n topic: 'Node States',\n },\n {\n id: 'raft-2',\n question: 'How does a Raft leader election begin?',\n options: [\n 'Administrator manually promotes a node',\n 'Follower\\'s election timeout expires without heartbeat',\n 'Nodes vote periodically',\n 'Leader announces retirement',\n ],\n correctAnswer: 1,\n explanation: 'When a follower doesn\\'t receive heartbeat from leader within election timeout (randomized 150-300ms typically), it becomes a candidate, increments term, votes for itself, and requests votes from others.',\n hint: 'What happens when a follower loses contact with the leader?',\n difficulty: 'medium',\n topic: 'Leader Election',\n },\n {\n id: 'raft-3',\n question: 'How many votes does a candidate need to become leader?',\n options: [\n 'All nodes must vote yes',\n 'Majority (more than half) of all nodes',\n 'At least one other node',\n 'Two-thirds of all nodes',\n ],\n correctAnswer: 1,\n explanation: 'A candidate needs votes from a majority (N/2 + 1) of nodes including itself. This ensures at most one leader per term, as two majorities always overlap.',\n difficulty: 'easy',\n topic: 'Quorum',\n },\n {\n id: 'raft-4',\n question: 'What is the purpose of terms in Raft?',\n options: [\n 'To limit leader tenure',\n 'To act as a logical clock and detect stale information',\n 'To count the number of log entries',\n 'To measure network latency',\n ],\n correctAnswer: 1,\n explanation: 'Terms serve as a logical clock. Each term has at most one leader. Nodes reject messages with older terms and update their term when seeing higher ones. This helps detect stale leaders/messages.',\n difficulty: 'medium',\n topic: 'Terms',\n },\n {\n id: 'raft-5',\n question: 'When is a log entry considered \"committed\" in Raft?',\n options: [\n 'When the leader writes it to its log',\n 'When the leader receives acknowledgment from all followers',\n 'When a majority of nodes have the entry in their logs',\n 'After a fixed time period',\n ],\n correctAnswer: 2,\n explanation: 'An entry is committed when replicated to a majority of nodes. Once committed, it\\'s guaranteed to eventually appear in all nodes\\' logs. The leader then applies it to its state machine and notifies followers.',\n difficulty: 'medium',\n topic: 'Log Replication',\n },\n {\n id: 'raft-6',\n question: 'What happens if a follower\\'s log diverges from the leader\\'s?',\n options: [\n 'The follower is removed from the cluster',\n 'A new election is triggered',\n 'Leader overwrites follower\\'s conflicting entries',\n 'Both logs are merged',\n ],\n correctAnswer: 2,\n explanation: 'The leader finds the latest matching log entry, then overwrites all follower entries after that point with its own. AppendEntries includes prevLogIndex and prevLogTerm for consistency checking.',\n hint: 'The leader\\'s log is authoritative.',\n difficulty: 'hard',\n topic: 'Log Consistency',\n },\n {\n id: 'raft-7',\n question: 'Why are election timeouts randomized in Raft?',\n options: [\n 'For security against attacks',\n 'To reduce likelihood of split votes',\n 'To minimize network traffic',\n 'To save energy',\n ],\n correctAnswer: 1,\n explanation: 'Randomized timeouts (e.g., 150-300ms) reduce the chance that multiple nodes become candidates simultaneously, causing split votes and repeated elections. One node typically times out first and wins.',\n difficulty: 'medium',\n topic: 'Election Optimization',\n },\n {\n id: 'raft-8',\n question: 'What safety guarantee does Raft provide about committed entries?',\n options: [\n 'They can be removed by new leaders',\n 'They are replicated to all nodes within 1 second',\n 'They will never be overwritten or lost',\n 'They are encrypted',\n ],\n correctAnswer: 2,\n explanation: 'Once committed, an entry is permanent. Future leaders are guaranteed to have it (election restriction requires candidates have all committed entries). This is Raft\\'s State Machine Safety property.',\n difficulty: 'medium',\n topic: 'Safety Guarantees',\n },\n {\n id: 'raft-9',\n question: 'How does Raft ensure a new leader has all committed entries?',\n options: [\n 'It syncs with all nodes after election',\n 'Candidates only win if their log is at least as up-to-date as voters\\'',\n 'Committed entries are stored in a separate database',\n 'There is no such guarantee',\n ],\n correctAnswer: 1,\n explanation: 'Nodes only vote for candidates with logs at least as up-to-date as their own (higher term or same term with longer log). Since committed entries exist on a majority, and any majority overlaps with voters, winners have all committed entries.',\n difficulty: 'hard',\n topic: 'Election Restriction',\n },\n {\n id: 'raft-10',\n question: 'What is the main advantage of Raft over Paxos?',\n options: [\n 'Higher throughput',\n 'Lower latency',\n 'Understandability and ease of implementation',\n 'Better fault tolerance',\n ],\n correctAnswer: 2,\n explanation: 'Raft was designed explicitly for understandability. It separates leader election, log replication, and safety into independent components. The authors showed students learned Raft more easily than Paxos.',\n difficulty: 'easy',\n topic: 'Design Philosophy',\n },\n];\n\nconst NODE_IDS = ['N1', 'N2', 'N3', 'N4', 'N5'];\n\nconst STATE_COLORS: Record<NodeState, string> = {\n follower: 'bg-gray-400',\n candidate: 'bg-yellow-500',\n leader: 'bg-green-500',\n};\n\nfunction cloneNodes(nodes: RaftNode[]): RaftNode[] {\n return nodes.map((n) => ({\n ...n,\n log: n.log.map((e) => ({ ...e })),\n }));\n}\n\nfunction generateRaftSteps(): RaftStep[] {\n const steps: RaftStep[] = [];\n\n let nodes: RaftNode[] = NODE_IDS.map((id) => ({\n id,\n state: 'follower',\n term: 0,\n votedFor: null,\n log: [],\n commitIndex: -1,\n }));\n\n steps.push({\n operation: 'init',\n nodes: cloneNodes(nodes),\n description: `Initialize ${NODE_IDS.length} nodes as followers (term 0)`,\n });\n\n // N1 times out\n const candidateId = 'N1';\n const candidateNode = nodes.find((n) => n.id === candidateId)!;\n candidateNode.state = 'candidate';\n candidateNode.term = 1;\n candidateNode.votedFor = candidateId;\n\n steps.push({\n operation: 'timeout',\n nodes: cloneNodes(nodes),\n description: `${candidateId} timeout! Becomes candidate, term=1`,\n highlightNode: candidateId,\n });\n\n // Voting\n let votes = 1;\n for (const node of nodes) {\n if (node.id !== candidateId && node.state === 'follower') {\n node.term = 1;\n node.votedFor = candidateId;\n votes++;\n\n steps.push({\n operation: 'vote',\n nodes: cloneNodes(nodes),\n description: `${node.id} votes for ${candidateId} (${votes}/${NODE_IDS.length})`,\n highlightNode: node.id,\n highlightEdge: { from: node.id, to: candidateId, type: 'vote' },\n });\n\n if (votes > NODE_IDS.length / 2 && candidateNode.state === 'candidate') {\n candidateNode.state = 'leader';\n steps.push({\n operation: 'becomeLeader',\n nodes: cloneNodes(nodes),\n description: `${candidateId} wins election! (${votes} votes)`,\n highlightNode: candidateId,\n });\n break;\n }\n }\n }\n\n // Heartbeat\n steps.push({\n operation: 'heartbeat',\n nodes: cloneNodes(nodes),\n description: `Leader ${candidateId} sends heartbeats`,\n highlightNode: candidateId,\n messageType: 'Heartbeat',\n });\n\n // Log replication\n const leader = nodes.find((n) => n.state === 'leader')!;\n const command = 'SET x=5';\n leader.log.push({ term: 1, command, committed: false });\n\n steps.push({\n operation: 'replicate',\n nodes: cloneNodes(nodes),\n description: `Client request: \"${command}\"`,\n highlightNode: leader.id,\n });\n\n let acks = 1;\n for (const node of nodes) {\n if (node.id !== leader.id) {\n node.log.push({ term: 1, command, committed: false });\n acks++;\n\n if (acks > NODE_IDS.length / 2 && !leader.log[0].committed) {\n leader.log[0].committed = true;\n leader.commitIndex = 0;\n for (const n of nodes) {\n if (n.log.length > 0) {\n n.log[0].committed = true;\n n.commitIndex = 0;\n }\n }\n steps.push({\n operation: 'commit',\n nodes: cloneNodes(nodes),\n description: `Entry committed! (${acks} acks)`,\n highlightNode: leader.id,\n });\n break;\n }\n }\n }\n\n steps.push({\n operation: 'done',\n nodes: cloneNodes(nodes),\n description: `✓ Consensus achieved! Leader: ${leader.id}`,\n });\n\n return steps;\n}\n\nconst RaftInterviewVisualizerComponent: React.FC<RaftInterviewVisualizerProps> = ({\n showControls = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'raft-interview-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'raft-int', scrollToId: VISUALIZER_ID });\n\n const [mode, setMode] = useState<'visualize' | 'interview'>('visualize');\n\n const generateSteps = useMemo(() => generateRaftSteps, []);\n\n const playback = useVisualizerPlayback<RaftStep>({ generateSteps });\n\n const interview = useInterviewMode({\n questions: RAFT_QUESTIONS,\n shuffleQuestions: true,\n });\n\n const stepData: RaftStep = playback.currentStepData || {\n operation: 'init',\n nodes: [],\n description: '',\n };\n\n const { nodes, description, highlightNode, highlightEdge } = stepData;\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: playback.currentStep });\n }, [copyUrlToClipboard, playback.currentStep]);\n\n // Node positions\n const NODE_POSITIONS: Record<string, { x: number; y: number }> = {\n N1: { x: 120, y: 40 },\n N2: { x: 200, y: 80 },\n N3: { x: 180, y: 160 },\n N4: { x: 60, y: 160 },\n N5: { x: 40, y: 80 },\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-orange-50 to-red-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\">Raft Consensus</h3>\n <div className=\"flex gap-1 bg-gray-200 rounded-lg p-0.5\">\n <button\n onClick={() => setMode('visualize')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'visualize'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Visualize\n </button>\n <button\n onClick={() => setMode('interview')}\n className={`px-3 py-1 rounded-md text-xs font-medium transition-colors ${\n mode === 'interview'\n ? 'bg-white text-orange-600 shadow-sm'\n : 'text-gray-600 hover:text-gray-800'\n }`}\n >\n Interview\n </button>\n </div>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Distributed Consensus\n </span>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"orange\" />\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex gap-4 flex-col lg:flex-row\">\n {/* Visualization Panel */}\n <VisualizationArea minHeight={400} className=\"flex-1\">\n {/* Key Concept */}\n <div className=\"mb-4 p-3 bg-orange-50 rounded-lg border border-orange-200\">\n <div className=\"text-sm font-medium text-orange-800 mb-1\">Raft Protocol</div>\n <div className=\"text-xs text-gray-700\">\n Consensus algorithm for replicated state machines.\n Ensures safety if any majority of nodes are alive.\n </div>\n </div>\n\n {/* Cluster Visualization */}\n <div className=\"mb-4 flex justify-center\">\n <svg width=\"240\" height=\"200\" className=\"overflow-visible\">\n {/* Edge highlight */}\n {highlightEdge && (\n <line\n x1={NODE_POSITIONS[highlightEdge.from].x}\n y1={NODE_POSITIONS[highlightEdge.from].y}\n x2={NODE_POSITIONS[highlightEdge.to].x}\n y2={NODE_POSITIONS[highlightEdge.to].y}\n stroke={highlightEdge.type === 'vote' ? '#60a5fa' : '#a855f7'}\n strokeWidth=\"3\"\n strokeDasharray=\"5,5\"\n />\n )}\n\n {/* Nodes */}\n {nodes.map((node) => {\n const pos = NODE_POSITIONS[node.id];\n const isHighlighted = highlightNode === node.id;\n const stateColor =\n node.state === 'leader' ? '#22c55e' :\n node.state === 'candidate' ? '#eab308' : '#9ca3af';\n\n return (\n <g key={node.id}>\n <circle\n cx={pos.x}\n cy={pos.y}\n r={isHighlighted ? 22 : 20}\n fill={stateColor}\n stroke={isHighlighted ? '#fbbf24' : 'white'}\n strokeWidth={isHighlighted ? 3 : 2}\n />\n <text\n x={pos.x}\n y={pos.y + 4}\n textAnchor=\"middle\"\n className=\"text-xs font-bold fill-white\"\n >\n {node.id}\n </text>\n {/* Term badge */}\n <g transform={`translate(${pos.x + 15}, ${pos.y - 15})`}>\n <circle r=\"8\" fill=\"#3b82f6\" />\n <text textAnchor=\"middle\" dominantBaseline=\"middle\" className=\"text-[8px] fill-white font-bold\">\n T{node.term}\n </text>\n </g>\n </g>\n );\n })}\n </svg>\n </div>\n\n {/* Message Type */}\n {stepData.messageType && (\n <div className=\"mb-4 text-center\">\n <span className=\"px-3 py-1 bg-purple-100 text-purple-700 rounded-full text-sm font-medium\">\n 📨 {stepData.messageType}\n </span>\n </div>\n )}\n\n {/* Node Table */}\n <div className=\"mb-4 overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-gray-100\">\n <th className=\"px-2 py-1 text-left\">Node</th>\n <th className=\"px-2 py-1 text-left\">State</th>\n <th className=\"px-2 py-1 text-left\">Term</th>\n <th className=\"px-2 py-1 text-left\">Voted</th>\n <th className=\"px-2 py-1 text-left\">Log</th>\n </tr>\n </thead>\n <tbody>\n {nodes.map((node) => (\n <tr key={node.id} className={highlightNode === node.id ? 'bg-yellow-100' : ''}>\n <td className=\"px-2 py-1 font-mono font-bold\">{node.id}</td>\n <td className=\"px-2 py-1\">\n <span className={`px-1.5 py-0.5 rounded text-white text-[10px] ${STATE_COLORS[node.state]}`}>\n {node.state}\n </span>\n </td>\n <td className=\"px-2 py-1\">{node.term}</td>\n <td className=\"px-2 py-1\">{node.votedFor || '-'}</td>\n <td className=\"px-2 py-1\">\n {node.log.length > 0 ? (\n <span className={`px-1 py-0.5 rounded text-[10px] ${node.log[0]?.committed ? 'bg-green-100 text-green-700' : 'bg-yellow-100 text-yellow-700'}`}>\n {node.log.length} {node.log[0]?.committed ? '✓' : '?'}\n </span>\n ) : '-'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Raft Guarantees */}\n <div className=\"mb-4 grid grid-cols-2 gap-2 text-[10px]\">\n <div className=\"p-2 bg-green-50 rounded border border-green-200\">\n <div className=\"font-bold text-green-800\">Election Safety</div>\n <div className=\"text-green-700\">≤1 leader per term</div>\n </div>\n <div className=\"p-2 bg-blue-50 rounded border border-blue-200\">\n <div className=\"font-bold text-blue-800\">Log Matching</div>\n <div className=\"text-blue-700\">Same index+term = same</div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n variant={\n stepData.operation === 'done' || stepData.operation === 'becomeLeader' || stepData.operation === 'commit'\n ? 'success'\n : stepData.operation === 'timeout'\n ? 'warning'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Interview Panel */}\n {mode === 'interview' && (\n <div className=\"w-full lg:w-96 flex-shrink-0\">\n <InterviewModePanel\n currentQuestion={interview.currentQuestion}\n currentQuestionIndex={interview.session.currentQuestionIndex}\n totalQuestions={interview.session.questions.length}\n selectedAnswer={interview.selectedAnswer}\n showExplanation={interview.showExplanation}\n showHint={interview.showHint}\n isAnswered={interview.isAnswered}\n isComplete={interview.isComplete}\n score={interview.score}\n onSelectAnswer={interview.selectAnswer}\n onNextQuestion={interview.nextQuestion}\n onPreviousQuestion={interview.previousQuestion}\n onUseHint={interview.useHint}\n onRestart={interview.restartSession}\n accentColor=\"orange\"\n />\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={playback.isPlaying}\n currentStep={playback.currentStep}\n totalSteps={playback.steps.length}\n speed={playback.speed}\n onPlayPause={playback.handlePlayPause}\n onStep={playback.handleStep}\n onStepBack={playback.handleStepBack}\n onReset={playback.handleReset}\n onSpeedChange={playback.setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const RaftInterviewVisualizer = React.memo(RaftInterviewVisualizerComponent);\nexport default RaftInterviewVisualizer;\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { Plus } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n useVisualizerPlayback,\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 [customKey, setCustomKey] = useState('');\n const [keys, setKeys] = useState<string[]>(SAMPLE_KEYS.slice(0, 5));\n\n const generateSteps = useMemo(\n () => () => generateHashSteps(keys),\n [keys]\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 reinitialize,\n } = useVisualizerPlayback<HashStep>({\n generateSteps,\n });\n\n const handleAddKey = useCallback(() => {\n if (customKey.trim() && !keys.includes(customKey.trim())) {\n setKeys([...keys, customKey.trim()]);\n setCustomKey('');\n }\n }, [customKey, keys]);\n\n const handleResetKeys = useCallback(() => {\n setKeys(SAMPLE_KEYS.slice(0, 5));\n reinitialize();\n }, [reinitialize]);\n\n const stepData = currentStepData || {\n operation: 'done' as const,\n buckets: [] as (string | null)[][],\n bucketIndex: -1,\n key: '',\n hashValue: 0,\n description: '',\n codeLine: -1,\n variables: undefined,\n };\n const { operation, buckets, bucketIndex, key, description } = stepData;\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={400} className=\"flex-1 min-w-0\">\n {/* Keys to insert */}\n <div className=\"mb-6\">\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-3 py-1.5 text-sm font-medium rounded-lg border-2 transition-colors ${\n isInserted\n ? 'bg-green-100 text-green-700 border-green-400'\n : k === key\n ? 'bg-yellow-100 text-yellow-700 border-yellow-400 ring-2 ring-yellow-300'\n : 'bg-gray-50 text-gray-600 border-gray-300'\n }`}\n >\n {k}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Hash Calculation - Prominent */}\n <div className=\"mb-6 p-4 bg-gradient-to-r from-violet-50 to-purple-50 rounded-xl border-2 border-violet-200 min-h-[80px]\">\n <div className=\"text-sm font-semibold text-violet-800 mb-2\">\n Hash Calculation\n </div>\n {operation === 'insert' && key ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-gray-800\">\n hash(<span className=\"text-violet-600 font-bold\">"{key}"</span>) % {buckets.length} = <span className=\"text-violet-600 font-bold text-xl\">{bucketIndex}</span>\n </div>\n <div className=\"text-violet-600 text-2xl animate-bounce\">↓</div>\n </div>\n ) : operation === 'collision' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-red-700\">\n Collision at bucket <span className=\"font-bold\">[{bucketIndex}]</span>! Adding to chain...\n </div>\n <div className=\"text-red-500 text-2xl\">⚠️</div>\n </div>\n ) : operation === 'placed' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-green-700\">\n <span className=\"font-bold\">"{key}"</span> placed in bucket <span className=\"font-bold\">[{bucketIndex}]</span>\n </div>\n <div className=\"text-green-500 text-2xl\">✓</div>\n </div>\n ) : operation === 'rehash' ? (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"font-mono text-lg text-orange-700\">\n Rehashing: expanding table...\n </div>\n <div className=\"text-orange-500 text-2xl\">🔄</div>\n </div>\n ) : (\n <div className=\"text-gray-400 text-center\">\n Click Play to start visualization\n </div>\n )}\n </div>\n\n {/* Hash Table Buckets - Horizontal Row */}\n <div className=\"mb-6\">\n <div className=\"text-sm font-medium text-gray-700 mb-3\">\n Hash Table ({buckets.length} buckets):\n </div>\n <div className=\"overflow-x-auto pb-2\">\n <div className=\"flex gap-1\" style={{ minWidth: 'max-content' }}>\n {buckets.map((bucket, idx) => (\n <div\n key={idx}\n className=\"flex flex-col items-center\"\n style={{ minWidth: '70px' }}\n >\n {/* Bucket Index */}\n <div\n className={`w-full text-center py-1 px-2 rounded-t-lg font-mono text-sm font-bold transition-colors ${\n idx === bucketIndex\n ? operation === 'collision'\n ? 'bg-red-500 text-white'\n : operation === 'placed'\n ? 'bg-green-500 text-white'\n : 'bg-yellow-400 text-yellow-900'\n : 'bg-gray-200 text-gray-600'\n }`}\n >\n [{idx}]\n </div>\n {/* Bucket Content - Vertical Chain */}\n <div\n className={`w-full border-2 rounded-b-lg min-h-[100px] p-1 transition-colors ${\n idx === bucketIndex\n ? operation === 'collision'\n ? 'border-red-400 bg-red-50'\n : operation === 'placed'\n ? 'border-green-400 bg-green-50'\n : 'border-yellow-400 bg-yellow-50'\n : 'border-gray-300 bg-gray-50'\n }`}\n >\n <div className=\"flex flex-col gap-1\">\n {bucket.length === 0 ? (\n <span className=\"text-xs text-gray-400 italic text-center py-2\">\n empty\n </span>\n ) : (\n bucket.map((bucketKey, keyIdx) => (\n <div\n key={keyIdx}\n className={`px-2 py-1 text-xs font-medium rounded border text-center transition-colors ${\n bucketKey === key &&\n (operation === 'placed' || operation === 'insert')\n ? 'bg-yellow-200 text-yellow-900 border-yellow-400'\n : 'bg-blue-100 text-blue-800 border-blue-300'\n }`}\n >\n {bucketKey}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\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={stepData?.codeLine ?? -1}\n variables={stepData?.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 vs ArrayList - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-blue-50 to-indigo-50 rounded-xl border-2 border-blue-200\">\n <div className=\"text-sm font-bold text-blue-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔗</span> LinkedList vs ArrayList\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-xs\">\n <div className=\"bg-white p-2 rounded-lg border border-blue-200 text-center\">\n <div className=\"font-semibold text-gray-700 mb-1\">Operation</div>\n </div>\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-semibold text-blue-700 mb-1\">LinkedList</div>\n </div>\n <div className=\"bg-orange-100 p-2 rounded-lg border border-orange-300 text-center\">\n <div className=\"font-semibold text-orange-700 mb-1\">ArrayList</div>\n </div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">add/remove (ends)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)*</div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">add/remove (middle)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)**</div>\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300 text-center font-bold text-red-700\">O(n)</div>\n\n <div className=\"bg-white p-2 rounded-lg border border-gray-200 text-center font-medium\">get(index)</div>\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300 text-center font-bold text-red-700\">O(n)</div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center font-bold text-green-700\">O(1)</div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-500 text-center\">\n * amortized | ** if you have the node reference\n </div>\n </div>\n\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-colors ${\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 - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-orange-50 to-amber-50 rounded-xl border-2 border-orange-200\">\n <div className=\"text-sm font-bold text-orange-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔗</span> LinkedHashMap = HashMap + LinkedList\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div className=\"bg-white p-3 rounded-lg border border-orange-200\">\n <div className=\"text-xs font-semibold text-gray-700 mb-1\">\n 🗂️ Hash Table\n </div>\n <div className=\"text-[10px] text-gray-500\">\n O(1) get/put • Same as HashMap\n </div>\n </div>\n <div className=\"bg-white p-3 rounded-lg border border-orange-200\">\n <div className=\"text-xs font-semibold text-gray-700 mb-1\">\n 🔗 Doubly Linked List\n </div>\n <div className=\"text-[10px] text-gray-500\">\n {accessOrder ? 'Access order (LRU cache)' : 'Insertion order'} • O(1) reorder\n </div>\n </div>\n </div>\n {stepData.operation === 'access' && (\n <div className=\"mt-3 p-2 bg-orange-100 rounded-lg border border-orange-300\">\n <div className=\"text-xs text-center text-orange-800\">\n <span className=\"font-bold\">LRU Update:</span> Entry "{stepData.key}" moved to end of list (most recently used)\n </div>\n </div>\n )}\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 - Prominent */}\n <div className=\"mb-4 p-3 bg-gradient-to-r from-orange-100 to-amber-100 rounded-xl border-2 border-orange-300\">\n <div className=\"text-sm font-semibold text-orange-800 mb-2 flex items-center gap-2\">\n <span>🔗</span> {accessOrder ? 'Access Order (LRU: oldest → newest)' : 'Insertion Order'}\n </div>\n <div className=\"bg-white rounded-lg p-3 border border-orange-200\">\n <div className=\"flex flex-wrap items-center gap-1\">\n {linkedOrder.length > 0 ? (\n <>\n <div className=\"px-2 py-1 bg-gray-100 text-[10px] text-gray-600 rounded font-semibold\">HEAD</div>\n <span className=\"text-orange-400 font-bold\">→</span>\n {linkedOrder.map((key, idx) => (\n <React.Fragment key={key}>\n {idx > 0 && (\n <span className=\"text-orange-400 font-bold\">⇄</span>\n )}\n <div\n className={`px-3 py-1 text-xs font-bold rounded-full transition-colors ${getLinkedNodeStyle(key)}`}\n >\n {key}\n </div>\n </React.Fragment>\n ))}\n <span className=\"text-orange-400 font-bold\">→</span>\n <div className=\"px-2 py-1 bg-gray-100 text-[10px] text-gray-600 rounded font-semibold\">TAIL</div>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">HEAD → TAIL (empty)</span>\n )}\n </div>\n {linkedOrder.length > 0 && (\n <div className=\"mt-2 pt-2 border-t border-orange-200 text-[10px] text-gray-500 text-center\">\n Doubly linked: each entry has prev/next pointers\n </div>\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 oldArray?: (number | null)[]; // For resize: show before state\n size: number;\n capacity: number;\n oldCapacity?: number; // For resize\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 const oldArray = [...array];\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 oldArray,\n size,\n capacity,\n oldCapacity,\n description: `Resize! Array full (${oldCapacity}/${oldCapacity}). Create new array with capacity ${capacity}, copy ${size} 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, oldArray, oldCapacity, operation } =\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={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Resize Comparison - Show when resize happens */}\n {operation === 'resize' && oldArray && (\n <div className=\"mb-4 p-4 bg-gradient-to-r from-red-50 to-orange-50 rounded-xl border-2 border-red-200\">\n <div className=\"text-sm font-bold text-red-700 mb-3 flex items-center gap-2\">\n <span className=\"text-xl\">⚠️</span> RESIZE OPERATION (O(n) cost!)\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* Old Array */}\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">\n OLD Array (capacity: {oldCapacity}) - FULL!\n </div>\n <div className=\"bg-white rounded-lg p-2 border border-red-200\">\n <div className=\"flex gap-1 flex-wrap\">\n {oldArray.map((val, idx) => (\n <div\n key={idx}\n className=\"w-10 h-10 flex items-center justify-center rounded border-2 text-sm font-medium bg-red-100 border-red-300 text-red-800\"\n >\n {val !== null ? val : ''}\n </div>\n ))}\n </div>\n </div>\n </div>\n {/* Arrow */}\n <div className=\"hidden md:flex items-center justify-center absolute left-1/2 -translate-x-1/2\">\n <div className=\"text-2xl text-orange-500\">→</div>\n </div>\n {/* New Array */}\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">\n NEW Array (capacity: {capacity}) - 2x bigger\n </div>\n <div className=\"bg-white rounded-lg p-2 border border-green-200\">\n <div className=\"flex gap-1 flex-wrap\">\n {array.map((val, idx) => (\n <div\n key={idx}\n className={`w-10 h-10 flex items-center justify-center rounded border-2 text-sm font-medium ${\n idx < size\n ? 'bg-green-100 border-green-300 text-green-800'\n : 'bg-gray-100 border-gray-200 text-gray-300'\n }`}\n >\n {val !== null ? val : ''}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-xs text-red-600 text-center\">\n All {size} elements copied to new array → This is why add() is O(1) <strong>amortized</strong>, not O(1)\n </div>\n </div>\n )}\n\n {/* Array Visualization (normal view) */}\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-colors ${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-colors 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 {/* BST Property - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-emerald-50 to-teal-50 rounded-xl border-2 border-emerald-200\">\n <div className=\"text-sm font-bold text-emerald-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🌳</span> Binary Search Tree Property\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-emerald-200\">\n <div className=\"text-center text-emerald-700 font-bold text-base mb-2\">\n left < <span className=\"text-gray-800\">node</span> < right\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n All values in left subtree are smaller • All values in right subtree are larger\n </div>\n </div>\n {/* Current comparison */}\n {currentStepData.operation === 'add' && currentStepData.value !== undefined && currentNode !== undefined && currentNode !== currentStepData.value && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-emerald-200\">\n <div className=\"text-xs text-center\">\n <span className=\"font-semibold text-emerald-700\">Comparing:</span>{' '}\n <span className=\"font-mono\">\n {currentStepData.value} {currentStepData.value < currentNode ? '<' : '>'} {currentNode}\n </span>\n {' → '}\n <span className={`font-bold ${currentStepData.value < currentNode ? 'text-blue-600' : 'text-orange-600'}`}>\n Go {currentStepData.value < currentNode ? 'LEFT' : 'RIGHT'}\n </span>\n </div>\n </div>\n )}\n {currentStepData.operation === 'contains' && currentStepData.value !== undefined && currentNode !== undefined && !found && path.length > 0 && path[path.length - 1] !== currentStepData.value && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-emerald-200\">\n <div className=\"text-xs text-center\">\n <span className=\"font-semibold text-emerald-700\">Comparing:</span>{' '}\n <span className=\"font-mono\">\n {currentStepData.value} {currentStepData.value < currentNode ? '<' : '>'} {currentNode}\n </span>\n {' → '}\n <span className={`font-bold ${currentStepData.value < currentNode ? 'text-blue-600' : 'text-orange-600'}`}>\n Go {currentStepData.value < currentNode ? 'LEFT' : 'RIGHT'}\n </span>\n </div>\n </div>\n )}\n {found === true && (\n <div className=\"mt-3 p-2 bg-green-100 rounded-lg border border-green-300\">\n <div className=\"text-xs text-center text-green-800 font-bold\">\n ✓ Found! {currentStepData.value} == {currentNode}\n </div>\n </div>\n )}\n {found === false && (\n <div className=\"mt-3 p-2 bg-red-100 rounded-lg border border-red-300\">\n <div className=\"text-xs text-center text-red-800 font-bold\">\n ✗ Not found! Reached null (no more children to check)\n </div>\n </div>\n )}\n </div>\n\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-colors 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 {/* Why EnumSet? Memory Comparison - PROMINENT */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-green-50 to-lime-50 rounded-xl border-2 border-green-200\">\n <div className=\"text-sm font-bold text-green-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">💡</span> Why EnumSet? Memory Efficiency!\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n {/* EnumSet */}\n <div className=\"bg-white p-3 rounded-lg border-2 border-green-300\">\n <div className=\"text-sm font-bold text-green-700 mb-2\">EnumSet</div>\n <div className=\"text-2xl font-bold text-green-600 mb-1\">8 bytes</div>\n <div className=\"text-xs text-gray-600\">\n 1 long for up to 64 enum values\n </div>\n <div className=\"mt-2 text-xs text-green-600\">\n ✓ Single CPU instruction per operation\n </div>\n </div>\n {/* HashSet */}\n <div className=\"bg-white p-3 rounded-lg border-2 border-gray-300\">\n <div className=\"text-sm font-bold text-gray-500 mb-2\">HashSet</div>\n <div className=\"text-2xl font-bold text-gray-500 mb-1\">~280 bytes</div>\n <div className=\"text-xs text-gray-500\">\n For 7 enum values (~40 bytes each)\n </div>\n <div className=\"mt-2 text-xs text-gray-500\">\n Hash computation + object overhead\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-center\">\n <span className=\"inline-block px-3 py-1 bg-green-100 text-green-800 rounded-full text-sm font-bold\">\n 35x smaller memory footprint!\n </span>\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 siftPath?: number[]; // Path from current index to root (siftUp) or to leaf (siftDown)\n currentIndex?: number; // Current position being processed\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-purple-200', label: 'Sift Path', border: '#a78bfa' },\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 // Calculate path to root for this index\n const getPathToRoot = (index: number): number[] => {\n const path: number[] = [index];\n let i = index;\n while (i > 0) {\n i = Math.floor((i - 1) / 2);\n path.push(i);\n }\n return path;\n };\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 siftPath: getPathToRoot(idx),\n currentIndex: 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 siftPath: getPathToRoot(idx),\n currentIndex: idx,\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 siftPath: getPathToRoot(parentIdx),\n currentIndex: 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 siftPath: getPathToRoot(idx),\n currentIndex: 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 // Calculate path from index to deepest reachable leaf\n const getPathToLeaf = (heapSize: number, startIdx: number): number[] => {\n const path: number[] = [startIdx];\n let i = startIdx;\n while (2 * i + 1 < heapSize) {\n // Follow smaller child path\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (right < heapSize) {\n path.push(left, right);\n } else {\n path.push(left);\n }\n i = left; // Just trace left path for visualization\n }\n return path;\n };\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 siftPath: getPathToLeaf(heap.length, 0),\n currentIndex: 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 currentIndex: 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 siftPath: [idx, leftIdx < heap.length ? leftIdx : -1, rightIdx < heap.length ? rightIdx : -1].filter(i => i >= 0),\n currentIndex: idx,\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 currentIndex: 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, siftPath, currentIndex } =\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 (siftPath?.includes(idx) && idx !== currentIndex) {\n return 'fill-purple-200 stroke-purple-400'; // Sift path highlight\n }\n if (idx === 0) {\n return 'fill-purple-100 stroke-purple-300';\n }\n return 'fill-white stroke-gray-300';\n };\n\n // Check if an edge is on the sift path\n const isEdgeOnPath = (parentIdx: number, childIdx: number): boolean => {\n if (!siftPath || siftPath.length < 2) return false;\n for (let i = 0; i < siftPath.length - 1; i++) {\n const a = siftPath[i];\n const b = siftPath[i + 1];\n if ((a === parentIdx && b === childIdx) || (a === childIdx && b === parentIdx)) {\n return true;\n }\n }\n return false;\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 Property Formula - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🏔️</span> Min-Heap Property\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-purple-200\">\n <div className=\"text-center text-purple-700 font-bold mb-2\">\n heap[parent] ≤ heap[children]\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 text-xs text-gray-600\">\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">parent(i)</span> = ⌊(i-1)/2⌋\n </div>\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">left(i)</span> = 2i + 1\n </div>\n <div className=\"bg-purple-50 p-2 rounded text-center\">\n <span className=\"font-semibold\">right(i)</span> = 2i + 2\n </div>\n </div>\n </div>\n {/* Current Index Calculation */}\n {currentIndex !== undefined && currentIndex >= 0 && (\n <div className=\"mt-3 p-2 bg-white rounded-lg border border-purple-200\">\n <div className=\"text-xs text-gray-600 text-center\">\n <span className=\"font-semibold text-purple-700\">Current: i = {currentIndex}</span>\n {currentIndex > 0 && (\n <span className=\"mx-2\">→ parent({currentIndex}) = ⌊({currentIndex}-1)/2⌋ = <span className=\"text-purple-600 font-bold\">{Math.floor((currentIndex - 1) / 2)}</span></span>\n )}\n {2 * currentIndex + 1 < heap.length && (\n <span className=\"mx-2\">→ left({currentIndex}) = <span className=\"text-purple-600 font-bold\">{2 * currentIndex + 1}</span></span>\n )}\n </div>\n </div>\n )}\n </div>\n\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 const isOnPath = isEdgeOnPath(parentIdx, idx);\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' : isOnPath ? '#c4b5fd' : '#d1d5db'}\n strokeWidth={isHighlighted ? 3 : isOnPath ? 2 : 1}\n strokeDasharray={isOnPath && !isHighlighted ? '4,2' : undefined}\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-colors`}\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 {/* ConcurrentHashMap vs synchronized - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-red-50 to-orange-50 rounded-xl border-2 border-red-200\">\n <div className=\"text-sm font-bold text-red-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">⚡</span> Why ConcurrentHashMap?\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className=\"bg-red-100 p-2 rounded-lg border border-red-300\">\n <div className=\"font-bold text-red-700\">synchronized HashMap</div>\n <div className=\"text-red-600\">❌ Single lock for entire map</div>\n <div className=\"text-[10px] text-red-500\">All threads wait for one lock</div>\n </div>\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300\">\n <div className=\"font-bold text-green-700\">ConcurrentHashMap</div>\n <div className=\"text-green-600\">✓ Segment-level locking</div>\n <div className=\"text-[10px] text-green-500\">Threads work in parallel on different segments</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n get() never blocks • put() only locks one segment • Much better concurrency!\n </div>\n </div>\n\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 Pattern - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-cyan-50 to-blue-50 rounded-xl border-2 border-cyan-200\">\n <div className=\"text-sm font-bold text-cyan-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🔄</span> Producer-Consumer Pattern\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-xs\">\n <div className=\"bg-green-100 p-2 rounded-lg border border-green-300 text-center\">\n <div className=\"font-bold text-green-700\">Producers</div>\n <div className=\"text-green-600\">put() → queue</div>\n <div className=\"text-[10px] text-green-500\">Block if FULL</div>\n </div>\n <div className=\"bg-gray-100 p-2 rounded-lg border border-gray-300 text-center\">\n <div className=\"font-bold text-gray-700\">BlockingQueue</div>\n <div className=\"text-gray-600\">Thread-safe buffer</div>\n <div className=\"text-[10px] text-gray-500\">Capacity: {capacity}</div>\n </div>\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Consumers</div>\n <div className=\"text-blue-600\">take() ← queue</div>\n <div className=\"text-[10px] text-blue-500\">Block if EMPTY</div>\n </div>\n </div>\n </div>\n\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-colors ${\n activeThread === p\n ? 'bg-green-500 text-white'\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-colors ${\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-colors ${\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-colors ${\n activeThread === c\n ? 'bg-blue-500 text-white'\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-colors ${\n isNew && idx === highlightIndex\n ? 'bg-green-500 border-green-600 text-white'\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 {/* Copy-on-Write Pattern - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-lime-50 to-green-50 rounded-xl border-2 border-lime-200\">\n <div className=\"text-sm font-bold text-lime-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">📋</span> Copy-on-Write Pattern\n </div>\n <div className=\"grid grid-cols-2 gap-3 text-xs\">\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Read (get)</div>\n <div className=\"text-2xl text-blue-600\">O(1)</div>\n <div className=\"text-[10px] text-blue-500\">No lock, no copy</div>\n </div>\n <div className=\"bg-orange-100 p-2 rounded-lg border border-orange-300 text-center\">\n <div className=\"font-bold text-orange-700\">Write (add/set)</div>\n <div className=\"text-2xl text-orange-600\">O(n)</div>\n <div className=\"text-[10px] text-orange-500\">Full array copy</div>\n </div>\n </div>\n <div className=\"mt-2 text-[10px] text-gray-600 text-center\">\n Best for: Read-heavy, rarely-modified collections • Iterators never throw ConcurrentModificationException\n </div>\n </div>\n\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-colors ${\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, useCallback, useState } 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 BloomFilterStep {\n operation: 'init' | 'add' | 'hash' | 'setBit' | 'check' | 'checkBit' | 'result' | 'done';\n element?: string;\n hashIndex?: number;\n hashFunction?: number;\n bitArray: boolean[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightBits?: number[];\n result?: 'definitely_not' | 'probably_yes' | 'false_positive';\n}\n\ninterface BloomFilterVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst BIT_ARRAY_SIZE = 16;\nconst NUM_HASH_FUNCTIONS = 3;\n\n// Elements to add and check\nconst ADD_ELEMENTS = ['apple', 'banana', 'cherry'];\nconst CHECK_ELEMENTS = ['apple', 'grape', 'banana', 'mango'];\n\nconst BLOOM_FILTER_CODE = [\n 'class BloomFilter:',\n ' def __init__(size, k):',\n ' self.bits = [0] * size',\n ' self.k = k # hash functions',\n '',\n ' def add(element):',\n ' for i in range(k):',\n ' index = hash_i(element) % size',\n ' bits[index] = 1',\n '',\n ' def contains(element):',\n ' for i in range(k):',\n ' index = hash_i(element) % size',\n ' if bits[index] == 0:',\n ' return False # definitely not',\n ' return True # probably yes',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-200', label: 'Bit = 0' },\n { color: 'bg-indigo-500', label: 'Bit = 1' },\n { color: 'bg-yellow-400', label: 'Currently checking', border: '#fbbf24' },\n { color: 'bg-green-500', label: 'Match (probably in set)' },\n { color: 'bg-red-500', label: 'Miss (definitely not in set)' },\n];\n\n// Simple hash functions for visualization\nfunction hash1(str: string, size: number): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) % size;\n }\n return Math.abs(hash);\n}\n\nfunction hash2(str: string, size: number): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) % size;\n }\n return Math.abs(hash);\n}\n\nfunction hash3(str: string, size: number): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 17 + str.charCodeAt(i) * (i + 1)) % size;\n }\n return Math.abs(hash);\n}\n\nfunction getHashes(element: string, size: number): number[] {\n return [\n hash1(element, size),\n hash2(element, size),\n hash3(element, size),\n ];\n}\n\nfunction generateBloomFilterSteps(): BloomFilterStep[] {\n const steps: BloomFilterStep[] = [];\n const bitArray: boolean[] = new Array(BIT_ARRAY_SIZE).fill(false);\n const addedElements = new Set<string>();\n\n // Initialize\n steps.push({\n operation: 'init',\n bitArray: [...bitArray],\n description: `Initialize Bloom Filter with ${BIT_ARRAY_SIZE} bits and ${NUM_HASH_FUNCTIONS} hash functions. All bits start as 0.`,\n codeLine: 1,\n variables: { size: BIT_ARRAY_SIZE, k: NUM_HASH_FUNCTIONS },\n });\n\n // Add elements\n for (const element of ADD_ELEMENTS) {\n const hashes = getHashes(element, BIT_ARRAY_SIZE);\n\n // Step: Start adding element\n steps.push({\n operation: 'add',\n element,\n bitArray: [...bitArray],\n description: `add(\"${element}\"): Calculate ${NUM_HASH_FUNCTIONS} hash positions`,\n codeLine: 5,\n variables: { element: `\"${element}\"` },\n });\n\n // Step through each hash function\n for (let i = 0; i < hashes.length; i++) {\n const hashIndex = hashes[i];\n\n // Show hash calculation\n steps.push({\n operation: 'hash',\n element,\n hashIndex,\n hashFunction: i + 1,\n bitArray: [...bitArray],\n description: `hash_${i + 1}(\"${element}\") % ${BIT_ARRAY_SIZE} = ${hashIndex}`,\n codeLine: 7,\n variables: { i: i + 1, index: hashIndex },\n highlightBits: [hashIndex],\n });\n\n // Set bit\n const wasSet = bitArray[hashIndex];\n bitArray[hashIndex] = true;\n\n steps.push({\n operation: 'setBit',\n element,\n hashIndex,\n hashFunction: i + 1,\n bitArray: [...bitArray],\n description: wasSet\n ? `bits[${hashIndex}] already 1 (no change)`\n : `Set bits[${hashIndex}] = 1`,\n codeLine: 8,\n variables: { index: hashIndex, value: 1 },\n highlightBits: [hashIndex],\n });\n }\n\n addedElements.add(element);\n }\n\n // Check elements\n for (const element of CHECK_ELEMENTS) {\n const hashes = getHashes(element, BIT_ARRAY_SIZE);\n const isActuallyInSet = addedElements.has(element);\n\n // Start check\n steps.push({\n operation: 'check',\n element,\n bitArray: [...bitArray],\n description: `contains(\"${element}\"): Check all ${NUM_HASH_FUNCTIONS} hash positions`,\n codeLine: 10,\n variables: { element: `\"${element}\"` },\n });\n\n let allBitsSet = true;\n let missIndex = -1;\n\n // Check each hash position\n for (let i = 0; i < hashes.length; i++) {\n const hashIndex = hashes[i];\n const bitValue = bitArray[hashIndex];\n\n steps.push({\n operation: 'checkBit',\n element,\n hashIndex,\n hashFunction: i + 1,\n bitArray: [...bitArray],\n description: `hash_${i + 1}(\"${element}\") = ${hashIndex}, bits[${hashIndex}] = ${bitValue ? '1 ✓' : '0 ✗'}`,\n codeLine: 12,\n variables: { i: i + 1, index: hashIndex, bit: bitValue ? 1 : 0 },\n highlightBits: [hashIndex],\n });\n\n if (!bitValue) {\n allBitsSet = false;\n missIndex = hashIndex;\n break; // Early exit on miss\n }\n }\n\n // Result\n let result: 'definitely_not' | 'probably_yes' | 'false_positive';\n let resultDescription: string;\n let resultCodeLine: number;\n\n if (!allBitsSet) {\n result = 'definitely_not';\n resultDescription = `\"${element}\" is DEFINITELY NOT in the set (bit ${missIndex} is 0)`;\n resultCodeLine = 14;\n } else if (isActuallyInSet) {\n result = 'probably_yes';\n resultDescription = `\"${element}\" is PROBABLY in the set (all bits are 1) ✓ Correct!`;\n resultCodeLine = 15;\n } else {\n result = 'false_positive';\n resultDescription = `\"${element}\" is PROBABLY in the set (all bits are 1) ⚠️ FALSE POSITIVE! (not actually added)`;\n resultCodeLine = 15;\n }\n\n steps.push({\n operation: 'result',\n element,\n bitArray: [...bitArray],\n description: resultDescription,\n codeLine: resultCodeLine,\n variables: { element: `\"${element}\"`, result: result.replace('_', ' ') },\n highlightBits: hashes,\n result,\n });\n }\n\n // Final\n const setBits = bitArray.filter(b => b).length;\n steps.push({\n operation: 'done',\n bitArray: [...bitArray],\n description: `✓ Done! ${setBits}/${BIT_ARRAY_SIZE} bits set. Added: ${ADD_ELEMENTS.join(', ')}. False positive rate depends on size and hash functions.`,\n codeLine: -1,\n variables: { setBits, totalBits: BIT_ARRAY_SIZE, elements: ADD_ELEMENTS.length },\n });\n\n return steps;\n}\n\nconst BloomFilterVisualizerComponent: React.FC<BloomFilterVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'bloom-filter-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'bloom', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateBloomFilterSteps, []);\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<BloomFilterStep>({\n generateSteps,\n });\n\n const stepData: BloomFilterStep = currentStepData || {\n operation: 'init',\n bitArray: new Array(BIT_ARRAY_SIZE).fill(false),\n description: '',\n highlightBits: undefined,\n result: undefined,\n };\n\n const { bitArray, highlightBits, description, result } = stepData;\n\n const getBitStyle = (index: number, value: boolean): string => {\n const isHighlighted = highlightBits?.includes(index);\n\n if (isHighlighted) {\n if (stepData.operation === 'result') {\n if (result === 'definitely_not' && !value) {\n return 'bg-red-500 text-white border-red-600';\n }\n if (result === 'probably_yes') {\n return 'bg-green-500 text-white border-green-600';\n }\n if (result === 'false_positive') {\n return 'bg-yellow-500 text-white border-yellow-600';\n }\n }\n return 'bg-yellow-400 text-gray-900 border-yellow-500';\n }\n\n return value\n ? 'bg-indigo-500 text-white border-indigo-600'\n : 'bg-gray-200 text-gray-500 border-gray-300';\n };\n\n const getStatusVariant = () => {\n if (result === 'definitely_not') return 'error' as const;\n if (result === 'probably_yes') return 'success' as const;\n if (result === 'false_positive') 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\">Bloom Filter</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 Space: O(m)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-pink-100 text-pink-700 rounded\">\n Probabilistic\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"purple\" />\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 {/* Key Concept */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-2 flex items-center gap-2\">\n <span className=\"text-lg\">🎲</span> Probabilistic Data Structure\n </div>\n <div className=\"text-xs text-gray-700 space-y-1\">\n <p><strong>False Positives:</strong> May say "probably yes" when element was never added</p>\n <p><strong>No False Negatives:</strong> If it says "no", element is DEFINITELY not in set</p>\n <p><strong>No Deletion:</strong> Cannot remove elements (would cause false negatives)</p>\n </div>\n </div>\n\n {/* Bit Array Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2 flex items-center justify-between\">\n <span>Bit Array ({BIT_ARRAY_SIZE} bits, {NUM_HASH_FUNCTIONS} hash functions)</span>\n <span className=\"text-xs text-gray-500\">\n Set: {bitArray.filter(b => b).length} / {BIT_ARRAY_SIZE}\n </span>\n </div>\n\n {/* Bit array grid */}\n <div className=\"grid grid-cols-8 gap-1 mb-2\">\n {bitArray.map((bit, idx) => (\n <div\n key={idx}\n className={`\n h-10 flex flex-col items-center justify-center rounded\n border-2 transition-all duration-200 text-xs font-mono\n ${getBitStyle(idx, bit)}\n `}\n >\n <span className=\"text-[10px] opacity-60\">{idx}</span>\n <span className=\"font-bold\">{bit ? '1' : '0'}</span>\n </div>\n ))}\n </div>\n\n {/* Index labels */}\n <div className=\"grid grid-cols-8 gap-1\">\n {bitArray.map((_, idx) => (\n <div key={idx} className=\"text-center text-[9px] text-gray-400\">\n [{idx}]\n </div>\n ))}\n </div>\n </div>\n\n {/* Current Operation */}\n {stepData.element && (\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg border border-gray-200\">\n <div className=\"text-sm\">\n <span className=\"text-gray-500\">Element: </span>\n <span className=\"font-mono font-bold text-purple-600\">"{stepData.element}"</span>\n {stepData.hashFunction && (\n <>\n <span className=\"text-gray-500 ml-4\">Hash #{stepData.hashFunction}: </span>\n <span className=\"font-mono font-bold text-pink-600\">{stepData.hashIndex}</span>\n </>\n )}\n </div>\n </div>\n )}\n\n {/* Hash Functions Explanation */}\n {stepData.operation === 'init' && (\n <div className=\"mb-4 p-3 bg-indigo-50 rounded-lg border border-indigo-200\">\n <div className=\"text-xs font-medium text-indigo-800 mb-2\">Hash Functions (k={NUM_HASH_FUNCTIONS})</div>\n <div className=\"font-mono text-[10px] text-gray-600 space-y-1\">\n <div>hash_1(x) = (x * 31) % {BIT_ARRAY_SIZE}</div>\n <div>hash_2(x) = (djb2 hash) % {BIT_ARRAY_SIZE}</div>\n <div>hash_3(x) = (x * 17 * pos) % {BIT_ARRAY_SIZE}</div>\n </div>\n </div>\n )}\n\n {/* Elements Summary */}\n <div className=\"mb-4 grid grid-cols-2 gap-3\">\n <div className=\"p-2 bg-green-50 rounded-lg border border-green-200\">\n <div className=\"text-xs font-medium text-green-800 mb-1\">Added Elements</div>\n <div className=\"text-xs text-green-700\">\n {ADD_ELEMENTS.map((el, i) => (\n <span key={el} className=\"font-mono\">\n {el}{i < ADD_ELEMENTS.length - 1 ? ', ' : ''}\n </span>\n ))}\n </div>\n </div>\n <div className=\"p-2 bg-blue-50 rounded-lg border border-blue-200\">\n <div className=\"text-xs font-medium text-blue-800 mb-1\">Checking</div>\n <div className=\"text-xs text-blue-700\">\n {CHECK_ELEMENTS.map((el, i) => (\n <span key={el} className=\"font-mono\">\n {el}{i < CHECK_ELEMENTS.length - 1 ? ', ' : ''}\n </span>\n ))}\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-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={BLOOM_FILTER_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 BloomFilterVisualizer = React.memo(BloomFilterVisualizerComponent);\nexport default BloomFilterVisualizer;\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 BTreeNode {\n id: string;\n keys: number[];\n children: string[]; // child node IDs\n isLeaf: boolean;\n}\n\ninterface BTreeStep {\n operation: 'init' | 'search' | 'compare' | 'descend' | 'found' | 'notFound' | 'insert' | 'split' | 'done';\n nodes: Map<string, BTreeNode>;\n rootId: string;\n targetKey?: number;\n currentNodeId?: string;\n highlightKeyIndex?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n splitInfo?: {\n nodeId: string;\n medianKey: number;\n leftKeys: number[];\n rightKeys: number[];\n };\n}\n\ninterface BTreeVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst ORDER = 3; // B-Tree order (max 2 keys per node for simplicity)\n\nconst OPERATIONS: Array<{ op: 'insert' | 'search'; key: number }> = [\n { op: 'insert', key: 10 },\n { op: 'insert', key: 20 },\n { op: 'insert', key: 5 },\n { op: 'insert', key: 15 },\n { op: 'insert', key: 25 },\n { op: 'insert', key: 30 },\n { op: 'search', key: 15 },\n { op: 'search', key: 12 },\n];\n\nconst BTREE_CODE = [\n 'class BTreeNode:',\n ' keys[] # sorted keys',\n ' children[] # child pointers',\n ' isLeaf # leaf flag',\n '',\n 'function search(node, key):',\n ' i = 0',\n ' while i < len(keys) and key > keys[i]:',\n ' i += 1',\n ' if i < len(keys) and key == keys[i]:',\n ' return (node, i) # found',\n ' if isLeaf:',\n ' return null # not found',\n ' return search(children[i], key)',\n '',\n 'function insert(key):',\n ' if root is full:',\n ' split root, create new root',\n ' insertNonFull(root, key)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-100', label: 'Node', border: '#d1d5db' },\n { color: 'bg-yellow-200', label: 'Current node', border: '#fbbf24' },\n { color: 'bg-blue-500', label: 'Comparing key' },\n { color: 'bg-green-500', label: 'Found / Inserted' },\n { color: 'bg-red-400', label: 'Not found' },\n { color: 'bg-purple-400', label: 'Splitting' },\n];\n\nlet nodeIdCounter = 0;\nfunction generateNodeId(): string {\n return `node_${nodeIdCounter++}`;\n}\n\nfunction cloneNodes(nodes: Map<string, BTreeNode>): Map<string, BTreeNode> {\n const cloned = new Map<string, BTreeNode>();\n nodes.forEach((node, id) => {\n cloned.set(id, {\n ...node,\n keys: [...node.keys],\n children: [...node.children],\n });\n });\n return cloned;\n}\n\nfunction generateBTreeSteps(): BTreeStep[] {\n nodeIdCounter = 0;\n const steps: BTreeStep[] = [];\n let nodes = new Map<string, BTreeNode>();\n let rootId = '';\n\n // Initialize empty tree\n const initialRoot = generateNodeId();\n rootId = initialRoot;\n nodes.set(initialRoot, {\n id: initialRoot,\n keys: [],\n children: [],\n isLeaf: true,\n });\n\n steps.push({\n operation: 'init',\n nodes: cloneNodes(nodes),\n rootId,\n description: `Initialize empty B-Tree of order ${ORDER} (max ${ORDER - 1} keys per node)`,\n codeLine: 0,\n variables: { order: ORDER, maxKeys: ORDER - 1 },\n });\n\n for (const { op, key } of OPERATIONS) {\n if (op === 'insert') {\n // Simple insert for visualization (not full B-Tree implementation)\n const root = nodes.get(rootId)!;\n\n steps.push({\n operation: 'insert',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: rootId,\n description: `insert(${key}): Start at root`,\n codeLine: 15,\n variables: { key },\n });\n\n // Find insert position\n let insertNode = root;\n let i = 0;\n while (i < insertNode.keys.length && key > insertNode.keys[i]) {\n i++;\n }\n\n // Insert key\n insertNode.keys.splice(i, 0, key);\n insertNode.keys.sort((a, b) => a - b);\n\n steps.push({\n operation: 'insert',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: rootId,\n highlightKeyIndex: insertNode.keys.indexOf(key),\n description: `Inserted ${key} at position ${i}. Keys: [${insertNode.keys.join(', ')}]`,\n codeLine: 18,\n variables: { key, position: i },\n });\n\n // Check if split needed\n if (insertNode.keys.length >= ORDER) {\n const medianIndex = Math.floor(insertNode.keys.length / 2);\n const medianKey = insertNode.keys[medianIndex];\n const leftKeys = insertNode.keys.slice(0, medianIndex);\n const rightKeys = insertNode.keys.slice(medianIndex + 1);\n\n steps.push({\n operation: 'split',\n nodes: cloneNodes(nodes),\n rootId,\n currentNodeId: rootId,\n description: `Node full (${insertNode.keys.length} keys)! Split: median=${medianKey}, left=[${leftKeys.join(',')}], right=[${rightKeys.join(',')}]`,\n codeLine: 17,\n variables: { median: medianKey },\n splitInfo: {\n nodeId: rootId,\n medianKey,\n leftKeys,\n rightKeys,\n },\n });\n\n // Create new structure after split\n const leftId = generateNodeId();\n const rightId = generateNodeId();\n const newRootId = generateNodeId();\n\n nodes.set(leftId, {\n id: leftId,\n keys: leftKeys,\n children: [],\n isLeaf: true,\n });\n\n nodes.set(rightId, {\n id: rightId,\n keys: rightKeys,\n children: [],\n isLeaf: true,\n });\n\n nodes.set(newRootId, {\n id: newRootId,\n keys: [medianKey],\n children: [leftId, rightId],\n isLeaf: false,\n });\n\n nodes.delete(rootId);\n rootId = newRootId;\n\n steps.push({\n operation: 'split',\n nodes: cloneNodes(nodes),\n rootId,\n description: `Split complete! New root with median ${medianKey}`,\n codeLine: 17,\n variables: { newRoot: medianKey },\n });\n }\n } else {\n // Search operation\n steps.push({\n operation: 'search',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: rootId,\n description: `search(${key}): Start at root`,\n codeLine: 5,\n variables: { key },\n });\n\n const searchInNode = (nodeId: string): boolean => {\n const node = nodes.get(nodeId)!;\n\n for (let i = 0; i < node.keys.length; i++) {\n steps.push({\n operation: 'compare',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: nodeId,\n highlightKeyIndex: i,\n description: `Compare ${key} with keys[${i}]=${node.keys[i]}`,\n codeLine: 7,\n variables: { key, comparing: node.keys[i], i },\n });\n\n if (key === node.keys[i]) {\n steps.push({\n operation: 'found',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: nodeId,\n highlightKeyIndex: i,\n description: `Found ${key} at index ${i}!`,\n codeLine: 10,\n variables: { key, index: i },\n });\n return true;\n }\n\n if (key < node.keys[i]) {\n if (node.isLeaf) {\n steps.push({\n operation: 'notFound',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: nodeId,\n description: `${key} < ${node.keys[i]} but node is leaf. Not found!`,\n codeLine: 12,\n variables: { key },\n });\n return false;\n }\n // Would descend to child[i]\n break;\n }\n }\n\n if (node.isLeaf) {\n steps.push({\n operation: 'notFound',\n nodes: cloneNodes(nodes),\n rootId,\n targetKey: key,\n currentNodeId: nodeId,\n description: `${key} > all keys in leaf node. Not found!`,\n codeLine: 12,\n variables: { key },\n });\n return false;\n }\n\n return false; // Simplified - real B-Tree would descend\n };\n\n searchInNode(rootId);\n }\n }\n\n // Final state\n const allKeys: number[] = [];\n nodes.forEach(node => allKeys.push(...node.keys));\n\n steps.push({\n operation: 'done',\n nodes: cloneNodes(nodes),\n rootId,\n description: `✓ Done! B-Tree contains ${allKeys.length} keys across ${nodes.size} nodes.`,\n codeLine: -1,\n variables: { totalKeys: allKeys.length, totalNodes: nodes.size },\n });\n\n return steps;\n}\n\nconst BTreeVisualizerComponent: React.FC<BTreeVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'btree-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'btree', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateBTreeSteps, []);\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<BTreeStep>({\n generateSteps,\n });\n\n const stepData: BTreeStep = currentStepData || {\n operation: 'init',\n nodes: new Map(),\n rootId: '',\n description: '',\n };\n\n const { nodes, rootId, currentNodeId, highlightKeyIndex, description, targetKey, splitInfo } = stepData;\n\n const getNodeStyle = (nodeId: string): string => {\n if (nodeId === currentNodeId) {\n if (stepData.operation === 'found') {\n return 'border-green-500 bg-green-50';\n }\n if (stepData.operation === 'notFound') {\n return 'border-red-400 bg-red-50';\n }\n if (stepData.operation === 'split') {\n return 'border-purple-500 bg-purple-50';\n }\n return 'border-yellow-400 bg-yellow-50';\n }\n return 'border-gray-300 bg-white';\n };\n\n const getKeyStyle = (nodeId: string, keyIndex: number): string => {\n if (nodeId === currentNodeId && keyIndex === highlightKeyIndex) {\n if (stepData.operation === 'found') {\n return 'bg-green-500 text-white';\n }\n if (stepData.operation === 'insert') {\n return 'bg-green-500 text-white';\n }\n return 'bg-blue-500 text-white';\n }\n return 'bg-gray-100 text-gray-800';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'notFound') return 'error' as const;\n if (stepData.operation === 'found') return 'success' as const;\n if (stepData.operation === 'split') 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 // Render tree recursively\n const renderNode = (nodeId: string, level: number = 0): React.ReactNode => {\n const node = nodes.get(nodeId);\n if (!node) return null;\n\n return (\n <div key={nodeId} className=\"flex flex-col items-center\">\n {/* Node box */}\n <div\n className={`\n flex items-center gap-0.5 px-2 py-1 rounded-lg border-2 transition-all\n ${getNodeStyle(nodeId)}\n `}\n >\n {node.keys.length === 0 ? (\n <span className=\"text-gray-400 text-xs px-2\">empty</span>\n ) : (\n node.keys.map((key, idx) => (\n <div\n key={idx}\n className={`\n px-2 py-1 rounded text-sm font-mono font-bold transition-all\n ${getKeyStyle(nodeId, idx)}\n `}\n >\n {key}\n </div>\n ))\n )}\n </div>\n\n {/* Children */}\n {node.children.length > 0 && (\n <div className=\"mt-2 flex flex-col items-center\">\n {/* Connection lines */}\n <div className=\"h-4 w-px bg-gray-300\" />\n <div className=\"flex gap-4\">\n {node.children.map((childId) => renderNode(childId, level + 1))}\n </div>\n </div>\n )}\n </div>\n );\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-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\">B-Tree (Order {ORDER})</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 Search: 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 Insert: O(log n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"green\" />\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 {/* Key Concept */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-emerald-50 to-teal-50 rounded-xl border-2 border-emerald-200\">\n <div className=\"text-sm font-bold text-emerald-800 mb-2 flex items-center gap-2\">\n <span className=\"text-lg\">🌳</span> B-Tree Properties\n </div>\n <div className=\"text-xs text-gray-700 space-y-1\">\n <p><strong>Self-balancing:</strong> All leaves at same depth</p>\n <p><strong>Order {ORDER}:</strong> Max {ORDER - 1} keys, {ORDER} children per node</p>\n <p><strong>Sorted:</strong> Keys within node are sorted</p>\n <p><strong>Use case:</strong> Database indexes, file systems</p>\n </div>\n </div>\n\n {/* Tree Visualization */}\n <div className=\"mb-4 p-4 bg-gray-50 rounded-lg border border-gray-200 min-h-[150px] flex items-center justify-center\">\n {nodes.size > 0 ? (\n renderNode(rootId)\n ) : (\n <span className=\"text-gray-400\">Empty tree</span>\n )}\n </div>\n\n {/* Current Operation */}\n {targetKey !== undefined && (\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg border border-gray-200\">\n <div className=\"text-sm\">\n <span className=\"text-gray-500\">Target key: </span>\n <span className=\"font-mono font-bold text-emerald-600\">{targetKey}</span>\n </div>\n </div>\n )}\n\n {/* Split Info */}\n {splitInfo && (\n <div className=\"mb-4 p-3 bg-purple-50 rounded-lg border border-purple-200\">\n <div className=\"text-sm font-medium text-purple-800 mb-1\">Node Split</div>\n <div className=\"text-xs text-purple-700 font-mono\">\n <div>Median: <strong>{splitInfo.medianKey}</strong> (promoted)</div>\n <div>Left: [{splitInfo.leftKeys.join(', ')}]</div>\n <div>Right: [{splitInfo.rightKeys.join(', ')}]</div>\n </div>\n </div>\n )}\n\n {/* Operations Queue */}\n <div className=\"mb-4 p-2 bg-blue-50 rounded-lg border border-blue-200\">\n <div className=\"text-xs font-medium text-blue-800 mb-1\">Operations</div>\n <div className=\"text-xs text-blue-700 font-mono\">\n {OPERATIONS.map((op, i) => (\n <span key={i} className=\"mr-2\">\n {op.op}({op.key})\n </span>\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={BTREE_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 BTreeVisualizer = React.memo(BTreeVisualizerComponent);\nexport default BTreeVisualizer;\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 VirtualNode {\n id: string;\n serverId: string;\n position: number; // 0-359 degrees on ring\n isVirtual: boolean;\n virtualIndex?: number;\n}\n\ninterface DataKey {\n key: string;\n hash: number;\n position: number;\n assignedServer?: string;\n}\n\ninterface ConsistentHashingStep {\n operation: 'init' | 'addServer' | 'addKey' | 'findServer' | 'removeServer' | 'rebalance' | 'done';\n servers: string[];\n virtualNodes: VirtualNode[];\n dataKeys: DataKey[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightPosition?: number;\n highlightServer?: string;\n highlightKey?: string;\n movingKeys?: string[];\n}\n\ninterface ConsistentHashingVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst VIRTUAL_NODES_PER_SERVER = 3;\n\nconst OPERATIONS: Array<\n | { op: 'addServer'; server: string }\n | { op: 'addKey'; key: string }\n | { op: 'removeServer'; server: string }\n> = [\n { op: 'addServer', server: 'Server-A' },\n { op: 'addServer', server: 'Server-B' },\n { op: 'addServer', server: 'Server-C' },\n { op: 'addKey', key: 'user:1001' },\n { op: 'addKey', key: 'user:1002' },\n { op: 'addKey', key: 'session:abc' },\n { op: 'addKey', key: 'cache:page1' },\n { op: 'removeServer', server: 'Server-B' },\n];\n\nconst CONSISTENT_HASHING_CODE = [\n 'class ConsistentHash:',\n ' ring = SortedMap() # position → server',\n ' virtualNodes = 3 # replicas per server',\n '',\n 'function addServer(server):',\n ' for i in range(virtualNodes):',\n ' pos = hash(server + \"#\" + i) % 360',\n ' ring[pos] = server',\n '',\n 'function getServer(key):',\n ' pos = hash(key) % 360',\n ' # Find first server with pos >= key pos',\n ' server = ring.ceiling(pos)',\n ' if server is null:',\n ' server = ring.first() # wrap around',\n ' return server',\n '',\n 'function removeServer(server):',\n ' # Only keys on this server move',\n ' for i in range(virtualNodes):',\n ' pos = hash(server + \"#\" + i) % 360',\n ' ring.remove(pos)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Server A' },\n { color: 'bg-green-500', label: 'Server B' },\n { color: 'bg-purple-500', label: 'Server C' },\n { color: 'bg-yellow-400', label: 'Data key' },\n { color: 'bg-red-400', label: 'Removing / Moving' },\n];\n\nconst SERVER_COLORS: Record<string, string> = {\n 'Server-A': 'bg-blue-500',\n 'Server-B': 'bg-green-500',\n 'Server-C': 'bg-purple-500',\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 % 360;\n}\n\nfunction findServer(position: number, virtualNodes: VirtualNode[]): string | undefined {\n if (virtualNodes.length === 0) return undefined;\n\n const sorted = [...virtualNodes].sort((a, b) => a.position - b.position);\n\n // Find first node with position >= key position\n for (const node of sorted) {\n if (node.position >= position) {\n return node.serverId;\n }\n }\n\n // Wrap around to first node\n return sorted[0].serverId;\n}\n\nfunction generateConsistentHashingSteps(): ConsistentHashingStep[] {\n const steps: ConsistentHashingStep[] = [];\n const servers: string[] = [];\n const virtualNodes: VirtualNode[] = [];\n const dataKeys: DataKey[] = [];\n\n // Initialize\n steps.push({\n operation: 'init',\n servers: [...servers],\n virtualNodes: [...virtualNodes],\n dataKeys: [...dataKeys],\n description: `Initialize consistent hashing ring with ${VIRTUAL_NODES_PER_SERVER} virtual nodes per server`,\n codeLine: 0,\n variables: { virtualNodes: VIRTUAL_NODES_PER_SERVER },\n });\n\n for (const operation of OPERATIONS) {\n if (operation.op === 'addServer') {\n const { server } = operation;\n servers.push(server);\n\n steps.push({\n operation: 'addServer',\n servers: [...servers],\n virtualNodes: [...virtualNodes],\n dataKeys: [...dataKeys],\n description: `addServer(\"${server}\"): Adding ${VIRTUAL_NODES_PER_SERVER} virtual nodes`,\n codeLine: 4,\n variables: { server: `\"${server}\"` },\n highlightServer: server,\n });\n\n // Add virtual nodes\n for (let i = 0; i < VIRTUAL_NODES_PER_SERVER; i++) {\n const nodeId = `${server}#${i}`;\n const position = simpleHash(nodeId);\n\n virtualNodes.push({\n id: nodeId,\n serverId: server,\n position,\n isVirtual: i > 0,\n virtualIndex: i,\n });\n\n steps.push({\n operation: 'addServer',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `Virtual node ${i + 1}: hash(\"${nodeId}\") = ${position}°`,\n codeLine: 6,\n variables: { i, position, nodeId: `\"${nodeId}\"` },\n highlightPosition: position,\n highlightServer: server,\n });\n }\n\n // Reassign any existing keys\n for (const key of dataKeys) {\n const newServer = findServer(key.position, virtualNodes);\n if (newServer !== key.assignedServer) {\n const oldServer = key.assignedServer;\n key.assignedServer = newServer;\n\n steps.push({\n operation: 'rebalance',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `Key \"${key.key}\" reassigned: ${oldServer} → ${newServer}`,\n codeLine: -1,\n highlightKey: key.key,\n movingKeys: [key.key],\n });\n }\n }\n } else if (operation.op === 'addKey') {\n const { key } = operation;\n const position = simpleHash(key);\n const assignedServer = findServer(position, virtualNodes);\n\n steps.push({\n operation: 'addKey',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `addKey(\"${key}\"): hash = ${position}°`,\n codeLine: 9,\n variables: { key: `\"${key}\"`, position },\n highlightPosition: position,\n highlightKey: key,\n });\n\n dataKeys.push({\n key,\n hash: simpleHash(key),\n position,\n assignedServer,\n });\n\n steps.push({\n operation: 'findServer',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `\"${key}\" (${position}°) → ${assignedServer || 'none'} (clockwise search)`,\n codeLine: 12,\n variables: { key: `\"${key}\"`, server: assignedServer || 'null' },\n highlightPosition: position,\n highlightKey: key,\n highlightServer: assignedServer,\n });\n } else if (operation.op === 'removeServer') {\n const { server } = operation;\n\n steps.push({\n operation: 'removeServer',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `removeServer(\"${server}\"): Only keys on this server will move!`,\n codeLine: 17,\n variables: { server: `\"${server}\"` },\n highlightServer: server,\n });\n\n // Find keys that will need to move\n const keysOnServer = dataKeys.filter((k) => k.assignedServer === server);\n\n // Remove virtual nodes\n const removedPositions: number[] = [];\n for (let i = virtualNodes.length - 1; i >= 0; i--) {\n if (virtualNodes[i].serverId === server) {\n removedPositions.push(virtualNodes[i].position);\n virtualNodes.splice(i, 1);\n }\n }\n\n servers.splice(servers.indexOf(server), 1);\n\n steps.push({\n operation: 'removeServer',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `Removed ${VIRTUAL_NODES_PER_SERVER} virtual nodes at positions: ${removedPositions.join('°, ')}°`,\n codeLine: 20,\n highlightServer: server,\n });\n\n // Reassign affected keys\n for (const key of keysOnServer) {\n const newServer = findServer(key.position, virtualNodes);\n\n steps.push({\n operation: 'rebalance',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `Key \"${key.key}\" moves: ${server} → ${newServer}`,\n codeLine: -1,\n highlightKey: key.key,\n highlightServer: newServer,\n movingKeys: [key.key],\n });\n\n key.assignedServer = newServer;\n }\n\n steps.push({\n operation: 'rebalance',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `✓ Only ${keysOnServer.length} keys moved (minimal disruption!)`,\n codeLine: -1,\n });\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n servers: [...servers],\n virtualNodes: virtualNodes.map((v) => ({ ...v })),\n dataKeys: dataKeys.map((d) => ({ ...d })),\n description: `✓ Done! ${servers.length} servers, ${virtualNodes.length} virtual nodes, ${dataKeys.length} keys distributed`,\n codeLine: -1,\n variables: {\n servers: servers.length,\n virtualNodes: virtualNodes.length,\n keys: dataKeys.length,\n },\n });\n\n return steps;\n}\n\nconst ConsistentHashingVisualizerComponent: React.FC<ConsistentHashingVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'consistent-hashing-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'chash', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateConsistentHashingSteps, []);\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<ConsistentHashingStep>({\n generateSteps,\n });\n\n const stepData: ConsistentHashingStep = currentStepData || {\n operation: 'init',\n servers: [],\n virtualNodes: [],\n dataKeys: [],\n description: '',\n };\n\n const {\n servers,\n virtualNodes,\n dataKeys,\n description,\n highlightPosition,\n highlightServer,\n highlightKey,\n movingKeys,\n } = stepData;\n\n const getStatusVariant = () => {\n if (stepData.operation === 'removeServer') return 'error' as const;\n if (stepData.operation === 'rebalance' && movingKeys?.length) 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 // Ring visualization\n const RING_RADIUS = 120;\n const CENTER = { x: 150, y: 150 };\n\n const getPositionOnRing = (degrees: number) => {\n const radians = ((degrees - 90) * Math.PI) / 180;\n return {\n x: CENTER.x + RING_RADIUS * Math.cos(radians),\n y: CENTER.y + RING_RADIUS * Math.sin(radians),\n };\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-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\">Consistent Hashing</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 Distributed Systems\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n Load Balancing\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"cyan\" />\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 {/* Key Concept */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-cyan-50 to-blue-50 rounded-xl border-2 border-cyan-200\">\n <div className=\"text-sm font-bold text-cyan-800 mb-2 flex items-center gap-2\">\n <span className=\"text-lg\">🔄</span> Why Consistent Hashing?\n </div>\n <div className=\"text-xs text-gray-700 space-y-1\">\n <p><strong>Problem:</strong> Regular hash (key % N) redistributes ALL keys when N changes</p>\n <p><strong>Solution:</strong> Consistent hashing only moves K/N keys (minimal disruption)</p>\n <p><strong>Virtual nodes:</strong> Multiple positions per server for better distribution</p>\n </div>\n </div>\n\n {/* Hash Ring SVG */}\n <div className=\"mb-4 flex justify-center\">\n <svg width=\"300\" height=\"300\" className=\"overflow-visible\">\n {/* Ring circle */}\n <circle\n cx={CENTER.x}\n cy={CENTER.y}\n r={RING_RADIUS}\n fill=\"none\"\n stroke=\"#e5e7eb\"\n strokeWidth=\"2\"\n />\n\n {/* Degree markers */}\n {[0, 90, 180, 270].map((deg) => {\n const pos = getPositionOnRing(deg);\n return (\n <g key={deg}>\n <text\n x={pos.x}\n y={pos.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-[10px] fill-gray-400\"\n dx={deg === 0 ? 0 : deg === 90 ? 15 : deg === 180 ? 0 : -15}\n dy={deg === 0 ? -15 : deg === 180 ? 15 : 0}\n >\n {deg}°\n </text>\n </g>\n );\n })}\n\n {/* Virtual nodes */}\n {virtualNodes.map((node) => {\n const pos = getPositionOnRing(node.position);\n const isHighlighted = highlightServer === node.serverId;\n const color = SERVER_COLORS[node.serverId] || 'bg-gray-500';\n const fillColor = color\n .replace('bg-', '')\n .replace('blue-500', '#3b82f6')\n .replace('green-500', '#22c55e')\n .replace('purple-500', '#a855f7')\n .replace('gray-500', '#6b7280');\n\n return (\n <g key={node.id}>\n <circle\n cx={pos.x}\n cy={pos.y}\n r={isHighlighted ? 10 : 8}\n fill={fillColor}\n stroke={isHighlighted ? '#fbbf24' : 'white'}\n strokeWidth={isHighlighted ? 3 : 2}\n className=\"transition-all\"\n />\n {/* Label on hover or highlight */}\n {isHighlighted && (\n <text\n x={pos.x}\n y={pos.y - 15}\n textAnchor=\"middle\"\n className=\"text-[9px] fill-gray-700 font-medium\"\n >\n {node.serverId}#{node.virtualIndex}\n </text>\n )}\n </g>\n );\n })}\n\n {/* Data keys */}\n {dataKeys.map((key) => {\n const pos = getPositionOnRing(key.position);\n const isHighlighted = highlightKey === key.key;\n const isMoving = movingKeys?.includes(key.key);\n\n return (\n <g key={key.key}>\n {/* Line to assigned server */}\n {key.assignedServer && !isMoving && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={CENTER.x}\n y2={CENTER.y}\n stroke=\"#d1d5db\"\n strokeWidth=\"1\"\n strokeDasharray=\"3\"\n />\n )}\n <rect\n x={pos.x - 4}\n y={pos.y - 4}\n width={8}\n height={8}\n fill={isMoving ? '#ef4444' : '#fbbf24'}\n stroke={isHighlighted ? '#000' : 'white'}\n strokeWidth={isHighlighted ? 2 : 1}\n transform={`rotate(45 ${pos.x} ${pos.y})`}\n className=\"transition-all\"\n />\n {isHighlighted && (\n <text\n x={pos.x}\n y={pos.y + 18}\n textAnchor=\"middle\"\n className=\"text-[8px] fill-gray-700 font-medium\"\n >\n {key.key}\n </text>\n )}\n </g>\n );\n })}\n\n {/* Highlight position indicator */}\n {highlightPosition !== undefined && (\n <g>\n {(() => {\n const pos = getPositionOnRing(highlightPosition);\n return (\n <>\n <line\n x1={CENTER.x}\n y1={CENTER.y}\n x2={pos.x}\n y2={pos.y}\n stroke=\"#fbbf24\"\n strokeWidth=\"2\"\n strokeDasharray=\"5\"\n />\n <text\n x={pos.x}\n y={pos.y - 12}\n textAnchor=\"middle\"\n className=\"text-[10px] fill-yellow-600 font-bold\"\n >\n {highlightPosition}°\n </text>\n </>\n );\n })()}\n </g>\n )}\n\n {/* Center label */}\n <text\n x={CENTER.x}\n y={CENTER.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-[10px] fill-gray-500\"\n >\n Hash Ring\n </text>\n </svg>\n </div>\n\n {/* Server Legend */}\n <div className=\"mb-4 flex flex-wrap gap-2 justify-center\">\n {servers.map((server) => (\n <div\n key={server}\n className={`\n flex items-center gap-2 px-2 py-1 rounded-lg border\n ${highlightServer === server ? 'border-yellow-400 bg-yellow-50' : 'border-gray-200 bg-gray-50'}\n `}\n >\n <div className={`w-3 h-3 rounded-full ${SERVER_COLORS[server]}`} />\n <span className=\"text-xs font-medium\">{server}</span>\n <span className=\"text-[10px] text-gray-500\">\n ({dataKeys.filter((k) => k.assignedServer === server).length} keys)\n </span>\n </div>\n ))}\n </div>\n\n {/* Data Keys Table */}\n {dataKeys.length > 0 && (\n <div className=\"mb-4 overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-gray-100\">\n <th className=\"px-2 py-1 text-left\">Key</th>\n <th className=\"px-2 py-1 text-left\">Hash (°)</th>\n <th className=\"px-2 py-1 text-left\">Server</th>\n </tr>\n </thead>\n <tbody>\n {dataKeys.map((key) => (\n <tr\n key={key.key}\n className={`\n ${highlightKey === key.key ? 'bg-yellow-100' : ''}\n ${movingKeys?.includes(key.key) ? 'bg-red-100' : ''}\n `}\n >\n <td className=\"px-2 py-1 font-mono\">{key.key}</td>\n <td className=\"px-2 py-1\">{key.position}°</td>\n <td className=\"px-2 py-1\">\n <span\n className={`\n px-1.5 py-0.5 rounded text-white text-[10px]\n ${SERVER_COLORS[key.assignedServer || ''] || 'bg-gray-400'}\n `}\n >\n {key.assignedServer || 'none'}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\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={CONSISTENT_HASHING_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 ConsistentHashingVisualizer = React.memo(ConsistentHashingVisualizerComponent);\nexport default ConsistentHashingVisualizer;\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\ntype NodeState = 'follower' | 'candidate' | 'leader';\n\ninterface LogEntry {\n term: number;\n command: string;\n committed: boolean;\n}\n\ninterface RaftNode {\n id: string;\n state: NodeState;\n term: number;\n votedFor: string | null;\n log: LogEntry[];\n commitIndex: number;\n}\n\ninterface RaftStep {\n operation:\n | 'init'\n | 'timeout'\n | 'requestVote'\n | 'vote'\n | 'becomeLeader'\n | 'heartbeat'\n | 'appendEntries'\n | 'replicate'\n | 'commit'\n | 'done';\n nodes: RaftNode[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightNode?: string;\n highlightEdge?: { from: string; to: string; type: 'vote' | 'heartbeat' | 'append' };\n messageType?: string;\n}\n\ninterface RaftVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst NODE_IDS = ['N1', 'N2', 'N3', 'N4', 'N5'];\n\nconst RAFT_CODE = [\n '# Raft Consensus Algorithm',\n '',\n '# State: follower → candidate → leader',\n '',\n '# On election timeout (follower):',\n ' state = candidate',\n ' term += 1',\n ' votedFor = self',\n ' send RequestVote to all',\n '',\n '# On receiving votes (candidate):',\n ' if votes > N/2:',\n ' state = leader',\n ' send heartbeats',\n '',\n '# Leader operations:',\n ' append entry to log',\n ' replicate to followers',\n ' if majority ack:',\n ' commit entry',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-400', label: 'Follower' },\n { color: 'bg-yellow-500', label: 'Candidate' },\n { color: 'bg-green-500', label: 'Leader' },\n { color: 'bg-blue-400', label: 'Vote message' },\n { color: 'bg-purple-400', label: 'Heartbeat/AppendEntries' },\n];\n\nconst STATE_COLORS: Record<NodeState, string> = {\n follower: 'bg-gray-400',\n candidate: 'bg-yellow-500',\n leader: 'bg-green-500',\n};\n\nfunction cloneNodes(nodes: RaftNode[]): RaftNode[] {\n return nodes.map((n) => ({\n ...n,\n log: n.log.map((e) => ({ ...e })),\n }));\n}\n\nfunction generateRaftSteps(): RaftStep[] {\n const steps: RaftStep[] = [];\n\n // Initialize all nodes as followers\n let nodes: RaftNode[] = NODE_IDS.map((id) => ({\n id,\n state: 'follower',\n term: 0,\n votedFor: null,\n log: [],\n commitIndex: -1,\n }));\n\n steps.push({\n operation: 'init',\n nodes: cloneNodes(nodes),\n description: `Initialize ${NODE_IDS.length} nodes as followers in term 0`,\n codeLine: 2,\n variables: { nodes: NODE_IDS.length, term: 0 },\n });\n\n // === LEADER ELECTION ===\n\n // N1 times out and becomes candidate\n const candidateId = 'N1';\n const candidateNode = nodes.find((n) => n.id === candidateId)!;\n candidateNode.state = 'candidate';\n candidateNode.term = 1;\n candidateNode.votedFor = candidateId;\n\n steps.push({\n operation: 'timeout',\n nodes: cloneNodes(nodes),\n description: `${candidateId} election timeout! Becomes candidate, increments term to 1`,\n codeLine: 4,\n variables: { node: candidateId, term: 1 },\n highlightNode: candidateId,\n });\n\n // Request votes from all\n steps.push({\n operation: 'requestVote',\n nodes: cloneNodes(nodes),\n description: `${candidateId} sends RequestVote(term=1) to all nodes`,\n codeLine: 8,\n variables: { from: candidateId, term: 1 },\n highlightNode: candidateId,\n messageType: 'RequestVote',\n });\n\n // Each follower votes\n let votes = 1; // Self-vote\n for (const node of nodes) {\n if (node.id !== candidateId && node.state === 'follower') {\n node.term = 1;\n node.votedFor = candidateId;\n votes++;\n\n steps.push({\n operation: 'vote',\n nodes: cloneNodes(nodes),\n description: `${node.id} grants vote to ${candidateId} (votes: ${votes}/${NODE_IDS.length})`,\n codeLine: 10,\n variables: { voter: node.id, candidate: candidateId, votes },\n highlightNode: node.id,\n highlightEdge: { from: node.id, to: candidateId, type: 'vote' },\n });\n\n // Check if majority\n if (votes > NODE_IDS.length / 2 && candidateNode.state === 'candidate') {\n candidateNode.state = 'leader';\n\n steps.push({\n operation: 'becomeLeader',\n nodes: cloneNodes(nodes),\n description: `${candidateId} received majority (${votes}/${NODE_IDS.length})! Becomes LEADER`,\n codeLine: 11,\n variables: { leader: candidateId, votes, needed: Math.floor(NODE_IDS.length / 2) + 1 },\n highlightNode: candidateId,\n });\n break;\n }\n }\n }\n\n // === HEARTBEATS ===\n steps.push({\n operation: 'heartbeat',\n nodes: cloneNodes(nodes),\n description: `Leader ${candidateId} sends heartbeats to maintain authority`,\n codeLine: 13,\n variables: { leader: candidateId },\n highlightNode: candidateId,\n messageType: 'Heartbeat',\n });\n\n // === LOG REPLICATION ===\n const leader = nodes.find((n) => n.state === 'leader')!;\n\n // Client request\n const command = 'SET x=5';\n leader.log.push({ term: 1, command, committed: false });\n\n steps.push({\n operation: 'appendEntries',\n nodes: cloneNodes(nodes),\n description: `Client request: \"${command}\". Leader appends to local log`,\n codeLine: 15,\n variables: { command: `\"${command}\"`, logIndex: 0 },\n highlightNode: leader.id,\n });\n\n // Replicate to followers\n let acks = 1; // Leader has it\n for (const node of nodes) {\n if (node.id !== leader.id) {\n node.log.push({ term: 1, command, committed: false });\n acks++;\n\n steps.push({\n operation: 'replicate',\n nodes: cloneNodes(nodes),\n description: `Replicate to ${node.id} (acks: ${acks}/${NODE_IDS.length})`,\n codeLine: 16,\n variables: { follower: node.id, acks },\n highlightNode: node.id,\n highlightEdge: { from: leader.id, to: node.id, type: 'append' },\n });\n\n // Check majority for commit\n if (acks > NODE_IDS.length / 2 && !leader.log[0].committed) {\n // Commit on leader\n leader.log[0].committed = true;\n leader.commitIndex = 0;\n\n steps.push({\n operation: 'commit',\n nodes: cloneNodes(nodes),\n description: `Majority acks (${acks})! Leader commits entry at index 0`,\n codeLine: 17,\n variables: { commitIndex: 0, acks },\n highlightNode: leader.id,\n });\n\n // Notify followers to commit\n for (const n of nodes) {\n if (n.id !== leader.id && n.log.length > 0) {\n n.log[0].committed = true;\n n.commitIndex = 0;\n }\n }\n\n steps.push({\n operation: 'commit',\n nodes: cloneNodes(nodes),\n description: `Followers apply committed entry: \"${command}\"`,\n codeLine: 18,\n variables: { command: `\"${command}\"` },\n });\n break;\n }\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n nodes: cloneNodes(nodes),\n description: `✓ Consensus achieved! Leader: ${leader.id}, Term: 1, Committed entries: 1`,\n codeLine: -1,\n variables: { leader: leader.id, term: 1, entries: 1 },\n });\n\n return steps;\n}\n\nconst RaftVisualizerComponent: React.FC<RaftVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'raft-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'raft', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateRaftSteps, []);\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<RaftStep>({\n generateSteps,\n });\n\n const stepData: RaftStep = currentStepData || {\n operation: 'init',\n nodes: [],\n description: '',\n };\n\n const { nodes, description, highlightNode, highlightEdge } = stepData;\n\n const getNodeStyle = (nodeId: string, state: NodeState): string => {\n const baseColor = STATE_COLORS[state];\n const isHighlighted = highlightNode === nodeId;\n\n if (isHighlighted) {\n return `${baseColor} ring-4 ring-yellow-300 ring-offset-2`;\n }\n return baseColor;\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'becomeLeader') return 'success' as const;\n if (stepData.operation === 'commit') return 'success' as const;\n if (stepData.operation === 'done') return 'success' as const;\n if (stepData.operation === 'timeout') 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 // Node positions in a circle\n const NODE_POSITIONS: Record<string, { x: number; y: number }> = {\n N1: { x: 150, y: 50 },\n N2: { x: 250, y: 100 },\n N3: { x: 220, y: 200 },\n N4: { x: 80, y: 200 },\n N5: { x: 50, y: 100 },\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-orange-50 to-red-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\">Raft Consensus</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 Distributed\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700 rounded\">\n Consensus\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} accentColor=\"orange\" />\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 {/* Key Concept */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-orange-50 to-red-50 rounded-xl border-2 border-orange-200\">\n <div className=\"text-sm font-bold text-orange-800 mb-2 flex items-center gap-2\">\n <span className=\"text-lg\">🗳️</span> Raft Consensus Protocol\n </div>\n <div className=\"text-xs text-gray-700 space-y-1\">\n <p><strong>Purpose:</strong> Replicated state machine consensus for distributed systems</p>\n <p><strong>Safety:</strong> At most one leader per term, committed entries never lost</p>\n <p><strong>Liveness:</strong> System makes progress if majority of nodes are alive</p>\n </div>\n </div>\n\n {/* Cluster Visualization */}\n <div className=\"mb-4 flex justify-center\">\n <svg width=\"300\" height=\"260\" className=\"overflow-visible\">\n {/* Connection lines */}\n {highlightEdge && (\n <line\n x1={NODE_POSITIONS[highlightEdge.from].x}\n y1={NODE_POSITIONS[highlightEdge.from].y}\n x2={NODE_POSITIONS[highlightEdge.to].x}\n y2={NODE_POSITIONS[highlightEdge.to].y}\n stroke={highlightEdge.type === 'vote' ? '#60a5fa' : '#a855f7'}\n strokeWidth=\"3\"\n strokeDasharray=\"5,5\"\n markerEnd=\"url(#arrowhead)\"\n />\n )}\n\n {/* Arrow marker */}\n <defs>\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon\n points=\"0 0, 10 3.5, 0 7\"\n fill={highlightEdge?.type === 'vote' ? '#60a5fa' : '#a855f7'}\n />\n </marker>\n </defs>\n\n {/* Nodes */}\n {nodes.map((node) => {\n const pos = NODE_POSITIONS[node.id];\n const isHighlighted = highlightNode === node.id;\n const stateColor =\n node.state === 'leader'\n ? '#22c55e'\n : node.state === 'candidate'\n ? '#eab308'\n : '#9ca3af';\n\n return (\n <g key={node.id}>\n {/* Node circle */}\n <circle\n cx={pos.x}\n cy={pos.y}\n r={isHighlighted ? 28 : 25}\n fill={stateColor}\n stroke={isHighlighted ? '#fbbf24' : 'white'}\n strokeWidth={isHighlighted ? 4 : 2}\n className=\"transition-all\"\n />\n\n {/* Node ID */}\n <text\n x={pos.x}\n y={pos.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-sm font-bold fill-white\"\n >\n {node.id}\n </text>\n\n {/* State label */}\n <text\n x={pos.x}\n y={pos.y + 40}\n textAnchor=\"middle\"\n className=\"text-[10px] fill-gray-600 font-medium\"\n >\n {node.state}\n </text>\n\n {/* Term badge */}\n <g transform={`translate(${pos.x + 20}, ${pos.y - 20})`}>\n <circle r=\"10\" fill=\"#3b82f6\" />\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-[9px] fill-white font-bold\"\n >\n T{node.term}\n </text>\n </g>\n\n {/* Log indicator */}\n {node.log.length > 0 && (\n <g transform={`translate(${pos.x - 20}, ${pos.y - 20})`}>\n <rect\n x=\"-8\"\n y=\"-8\"\n width=\"16\"\n height=\"16\"\n rx=\"2\"\n fill={node.log[0]?.committed ? '#22c55e' : '#f59e0b'}\n />\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-[9px] fill-white font-bold\"\n >\n {node.log.length}\n </text>\n </g>\n )}\n </g>\n );\n })}\n </svg>\n </div>\n\n {/* Message Type */}\n {stepData.messageType && (\n <div className=\"mb-4 text-center\">\n <span className=\"px-3 py-1 bg-purple-100 text-purple-700 rounded-full text-sm font-medium\">\n 📨 {stepData.messageType}\n </span>\n </div>\n )}\n\n {/* Node Details Table */}\n <div className=\"mb-4 overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"bg-gray-100\">\n <th className=\"px-2 py-1 text-left\">Node</th>\n <th className=\"px-2 py-1 text-left\">State</th>\n <th className=\"px-2 py-1 text-left\">Term</th>\n <th className=\"px-2 py-1 text-left\">Voted For</th>\n <th className=\"px-2 py-1 text-left\">Log</th>\n <th className=\"px-2 py-1 text-left\">Commit</th>\n </tr>\n </thead>\n <tbody>\n {nodes.map((node) => (\n <tr\n key={node.id}\n className={highlightNode === node.id ? 'bg-yellow-100' : ''}\n >\n <td className=\"px-2 py-1 font-mono font-bold\">{node.id}</td>\n <td className=\"px-2 py-1\">\n <span\n className={`px-1.5 py-0.5 rounded text-white text-[10px] ${STATE_COLORS[node.state]}`}\n >\n {node.state}\n </span>\n </td>\n <td className=\"px-2 py-1\">{node.term}</td>\n <td className=\"px-2 py-1\">{node.votedFor || '-'}</td>\n <td className=\"px-2 py-1\">{node.log.length} entries</td>\n <td className=\"px-2 py-1\">{node.commitIndex >= 0 ? node.commitIndex : '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Raft Guarantees */}\n <div className=\"mb-4 grid grid-cols-2 gap-2 text-[10px]\">\n <div className=\"p-2 bg-green-50 rounded border border-green-200\">\n <div className=\"font-bold text-green-800\">Election Safety</div>\n <div className=\"text-green-700\">At most one leader per term</div>\n </div>\n <div className=\"p-2 bg-blue-50 rounded border border-blue-200\">\n <div className=\"font-bold text-blue-800\">Log Matching</div>\n <div className=\"text-blue-700\">Same index+term = same entry</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-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={RAFT_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 RaftVisualizer = React.memo(RaftVisualizerComponent);\nexport default RaftVisualizer;\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-[width] 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-colors 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 {/* Generational Hypothesis - Prominent */}\n <div className=\"mb-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl border-2 border-purple-200\">\n <div className=\"text-sm font-bold text-purple-800 mb-3 flex items-center gap-2\">\n <span className=\"text-lg\">🧬</span> Generational Hypothesis\n </div>\n <div className=\"font-mono text-sm bg-white rounded-lg p-3 border border-purple-200\">\n <div className=\"text-center text-purple-700 font-bold mb-2\">\n "Most objects die young"\n </div>\n <div className=\"text-xs text-gray-500 text-center\">\n ~95% of objects become garbage before first GC • Optimize for the common case\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs\">\n <div className=\"bg-blue-100 p-2 rounded-lg border border-blue-300 text-center\">\n <div className=\"font-bold text-blue-700\">Young Gen</div>\n <div className=\"text-blue-600\">Fast copy collection</div>\n <div className=\"text-[10px] text-blue-500\">Minor GC (frequent)</div>\n </div>\n <div className=\"bg-amber-100 p-2 rounded-lg border border-amber-300 text-center\">\n <div className=\"font-bold text-amber-700\">Old Gen</div>\n <div className=\"text-amber-600\">Mark-sweep collection</div>\n <div className=\"text-[10px] text-amber-500\">Major GC (rare, slow)</div>\n </div>\n </div>\n </div>\n\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":["forwardRef","createElement","jsxs","jsx","Code2","ACCENT_COLORS","useState","useCallback","Edit2","useRef","useEffect","useMemo","CheckCircle","XCircle","ALGORITHM_NAMES","ALGORITHM_COMPLEXITIES","ALGORITHM_CODE","LEGEND_ITEMS","Fragment","generateBubbleSortSteps","generateSelectionSortSteps","generateInsertionSortSteps","generateQuickSortSteps","generateMergeSortSteps","STEP_GENERATORS","generateRandomArray","generateGraph","generateDijkstraSteps","DEFAULT_ITEMS","DEFAULT_CAPACITY","generateKnapsackSteps","generateDFSSteps","generateBFSSteps","BUCKET_COUNT","OPERATIONS","simpleHash","generateHashMapSteps","cloneTree","insertNode","findPath","generateTreeSetSteps","calculatePositions","NODES","EDGES","buildAdjacencyList","BIT_ARRAY_SIZE","generateBloomFilterSteps","ORDER","generateBTreeSteps","VIRTUAL_NODES_PER_SERVER","SERVER_COLORS","findServer","generateConsistentHashingSteps","NODE_IDS","STATE_COLORS","cloneNodes","generateRaftSteps","nodeIdCounter","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,24,25,26,27,28]}
|