odontogram-view 0.1.0 → 0.1.2

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/lib/constants.ts","../src/lib/utils/odontogram.ts","../src/lib/components/Tooth/ToothSurface.tsx","../src/lib/components/Tooth/toothGeometry.ts","../src/lib/components/Tooth/Tooth.tsx","../src/lib/components/Quadrant/Quadrant.tsx","../src/lib/components/Toolbar/Toolbar.tsx","../src/lib/components/Odontogram/Odontogram.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import type { ConditionDefinition, ToothDefinition, ToothType, ToothVisualConfig } from \"./types\";\n\nconst PERMANENT_SURFACE_MAP: Record<number, ToothType> = {\n 1: \"incisor\",\n 2: \"incisor\",\n 3: \"canine\",\n 4: \"premolar\",\n 5: \"premolar\",\n 6: \"molar\",\n 7: \"molar\",\n 8: \"molar\"\n};\n\nconst PRIMARY_SURFACE_MAP: Record<number, ToothType> = {\n 1: \"incisor\",\n 2: \"incisor\",\n 3: \"canine\",\n 4: \"molar\",\n 5: \"molar\"\n};\n\nconst ROOT_COUNT_BY_TOOTH: Record<string, 1 | 2 | 3> = {\n \"11\": 1,\n \"12\": 1,\n \"13\": 1,\n \"14\": 2,\n \"15\": 1,\n \"16\": 3,\n \"17\": 3,\n \"18\": 3,\n \"21\": 1,\n \"22\": 1,\n \"23\": 1,\n \"24\": 2,\n \"25\": 1,\n \"26\": 3,\n \"27\": 3,\n \"28\": 3,\n \"31\": 1,\n \"32\": 1,\n \"33\": 1,\n \"34\": 1,\n \"35\": 1,\n \"36\": 2,\n \"37\": 2,\n \"38\": 2,\n \"41\": 1,\n \"42\": 1,\n \"43\": 1,\n \"44\": 1,\n \"45\": 1,\n \"46\": 2,\n \"47\": 2,\n \"48\": 2,\n \"51\": 1,\n \"52\": 1,\n \"53\": 1,\n \"54\": 3,\n \"55\": 3,\n \"61\": 1,\n \"62\": 1,\n \"63\": 1,\n \"64\": 3,\n \"65\": 3,\n \"71\": 1,\n \"72\": 1,\n \"73\": 1,\n \"74\": 2,\n \"75\": 2,\n \"81\": 1,\n \"82\": 1,\n \"83\": 1,\n \"84\": 2,\n \"85\": 2\n};\n\nconst visualConfigByType = (\n toothId: string,\n type: ToothType,\n arch: \"upper\" | \"lower\"\n): ToothVisualConfig => {\n const rootCount = ROOT_COUNT_BY_TOOTH[toothId] ?? 1;\n\n if (type === \"incisor\") {\n return {\n centerLabel: \"I\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 32,\n crownHeight: 42,\n rootStyle: \"single\"\n };\n }\n\n if (type === \"canine\") {\n return {\n centerLabel: \"I\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 36,\n crownHeight: 44,\n rootStyle: \"singleLong\"\n };\n }\n\n if (type === \"premolar\") {\n return {\n centerLabel: \"O\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 42,\n crownHeight: 42,\n rootStyle: rootCount === 2 ? \"double\" : \"single\"\n };\n }\n\n return {\n centerLabel: \"O\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 48,\n crownHeight: 42,\n rootStyle: rootCount === 3 ? \"triple\" : arch === \"upper\" ? \"triple\" : \"double\"\n };\n};\n\nconst buildQuadrant = (\n quadrant: number,\n toothNumbers: number[],\n arch: \"upper\" | \"lower\",\n dentition: \"permanent\" | \"primary\"\n): ToothDefinition[] => {\n const typeMap = dentition === \"permanent\" ? PERMANENT_SURFACE_MAP : PRIMARY_SURFACE_MAP;\n\n return toothNumbers.map((position) => {\n const type = typeMap[position];\n const toothId = `${quadrant}${position}`;\n return {\n id: toothId,\n type,\n arch,\n dentition,\n label: toothId,\n visual: visualConfigByType(toothId, type, arch)\n };\n });\n};\n\nconst upperPermanentLeft = buildQuadrant(1, [8, 7, 6, 5, 4, 3, 2, 1], \"upper\", \"permanent\");\nconst upperPermanentRight = buildQuadrant(2, [1, 2, 3, 4, 5, 6, 7, 8], \"upper\", \"permanent\");\nconst lowerPermanentLeft = buildQuadrant(4, [8, 7, 6, 5, 4, 3, 2, 1], \"lower\", \"permanent\");\nconst lowerPermanentRight = buildQuadrant(3, [1, 2, 3, 4, 5, 6, 7, 8], \"lower\", \"permanent\");\n\nconst upperPrimaryLeft = buildQuadrant(5, [5, 4, 3, 2, 1], \"upper\", \"primary\");\nconst upperPrimaryRight = buildQuadrant(6, [1, 2, 3, 4, 5], \"upper\", \"primary\");\nconst lowerPrimaryLeft = buildQuadrant(8, [5, 4, 3, 2, 1], \"lower\", \"primary\");\nconst lowerPrimaryRight = buildQuadrant(7, [1, 2, 3, 4, 5], \"lower\", \"primary\");\n\nexport const PERMANENT_DENTITION_LAYOUT = {\n upper: [...upperPermanentLeft, ...upperPermanentRight],\n lower: [...lowerPermanentLeft, ...lowerPermanentRight]\n};\n\nexport const PRIMARY_DENTITION_LAYOUT = {\n upper: [...upperPrimaryLeft, ...upperPrimaryRight],\n lower: [...lowerPrimaryLeft, ...lowerPrimaryRight]\n};\n\nexport const MIXED_DENTITION_LAYOUT = [\n {\n id: \"upper-permanent\",\n label: \"Superior permanente\",\n teeth: PERMANENT_DENTITION_LAYOUT.upper\n },\n {\n id: \"upper-primary\",\n label: \"Superior temporal\",\n teeth: PRIMARY_DENTITION_LAYOUT.upper\n },\n {\n id: \"lower-primary\",\n label: \"Inferior temporal\",\n teeth: PRIMARY_DENTITION_LAYOUT.lower\n },\n {\n id: \"lower-permanent\",\n label: \"Inferior permanente\",\n teeth: PERMANENT_DENTITION_LAYOUT.lower\n }\n] as const;\n\nexport const CLINICAL_CONDITIONS: ConditionDefinition[] = [\n { id: \"CARIES\", label: \"Caries\", color: \"#ef4444\", scope: \"both\" },\n { id: \"CROWN\", label: \"Corona\", color: \"#f59e0b\", scope: \"both\" },\n { id: \"EXTRACTION\", label: \"Extracción\", color: \"#7c3aed\", scope: \"both\" },\n { id: \"IMPLANT\", label: \"Implante\", color: \"#2563eb\", scope: \"both\" },\n { id: \"FRACTURE\", label: \"Fractura\", color: \"#fb7185\", scope: \"both\" },\n { id: \"RESIN\", label: \"Resina\", color: \"#10b981\", scope: \"both\" },\n { id: \"ENDO\", label: \"Endodoncia\", color: \"#0f172a\", scope: \"both\" },\n { id: \"MISSING\", label: \"Ausente\", color: \"#64748b\", scope: \"both\" },\n { id: \"SEALANT\", label: \"Sellante\", color: \"#14b8a6\", scope: \"both\" }\n];\n","import { CLINICAL_CONDITIONS } from \"../constants\";\nimport type {\n ConditionDefinition,\n OdontogramChange,\n ToothCondition,\n ToothRecord,\n ToothStateMap,\n ToothSurface\n} from \"../types\";\n\nconst conditionMap = new Map<ToothCondition, ConditionDefinition>(\n CLINICAL_CONDITIONS.map((condition) => [condition.id, condition])\n);\n\nconst dedupe = (conditions: ToothCondition[] = []) => Array.from(new Set(conditions));\n\nconst sortConditions = (conditions: ToothCondition[]) =>\n [...conditions].sort((left, right) => left.localeCompare(right));\n\nexport const normalizeChanges = (value: OdontogramChange = []): ToothStateMap => {\n const normalized: ToothStateMap = {};\n\n value.forEach((record) => {\n normalized[record.tooth] = {\n tooth: record.tooth,\n conditions: record.conditions ? sortConditions(dedupe(record.conditions)) : undefined,\n surfaces: record.surfaces\n ? Object.fromEntries(\n Object.entries(record.surfaces)\n .map(([surface, conditions]) => [\n surface,\n conditions?.length ? sortConditions(dedupe(conditions)) : undefined\n ])\n .filter(([, conditions]) => Boolean(conditions?.length))\n ) as ToothRecord[\"surfaces\"]\n : undefined\n };\n });\n\n return normalized;\n};\n\nexport const serializeChanges = (state: ToothStateMap): OdontogramChange =>\n Object.values(state)\n .filter(Boolean)\n .map((record) => {\n const nextRecord: ToothRecord = { tooth: record!.tooth };\n\n if (record?.conditions?.length) {\n nextRecord.conditions = record.conditions;\n }\n\n if (record?.surfaces && Object.keys(record.surfaces).length > 0) {\n nextRecord.surfaces = record.surfaces;\n }\n\n return nextRecord;\n })\n .filter((record) => record.conditions?.length || Object.keys(record.surfaces ?? {}).length)\n .sort((left, right) => left.tooth.localeCompare(right.tooth));\n\nconst cleanupRecord = (record: ToothRecord): ToothRecord | undefined => {\n const surfaces = record.surfaces\n ? Object.fromEntries(\n Object.entries(record.surfaces).filter(([, conditions]) => Boolean(conditions?.length))\n )\n : undefined;\n\n const hasToothConditions = Boolean(record.conditions?.length);\n const hasSurfaceConditions = Boolean(surfaces && Object.keys(surfaces).length > 0);\n\n if (!hasToothConditions && !hasSurfaceConditions) {\n return undefined;\n }\n\n return {\n tooth: record.tooth,\n conditions: hasToothConditions ? record.conditions : undefined,\n surfaces: hasSurfaceConditions ? (surfaces as ToothRecord[\"surfaces\"]) : undefined\n };\n};\n\nexport const applySurfaceCondition = (\n state: ToothStateMap,\n tooth: string,\n surface: ToothSurface,\n condition: ToothCondition\n): ToothStateMap => {\n const definition = conditionMap.get(condition);\n if (!definition) {\n return state;\n }\n\n const current = state[tooth] ?? { tooth };\n const currentSurfaceValues = current.surfaces?.[surface] ?? [];\n const nextRecord: ToothRecord = {\n tooth,\n conditions: current.conditions,\n surfaces: {\n ...(current.surfaces ?? {}),\n [surface]: sortConditions(dedupe([...currentSurfaceValues, condition]))\n }\n };\n\n return {\n ...state,\n [tooth]: cleanupRecord(nextRecord)\n };\n};\n\nexport const applyToothCondition = (\n state: ToothStateMap,\n tooth: string,\n condition: ToothCondition\n): ToothStateMap => {\n const current = state[tooth] ?? { tooth };\n const nextRecord: ToothRecord = {\n tooth,\n surfaces: current.surfaces,\n conditions: sortConditions(dedupe([...(current.conditions ?? []), condition]))\n };\n\n return {\n ...state,\n [tooth]: cleanupRecord(nextRecord)\n };\n};\n\nexport const clearSurfaceCondition = (\n state: ToothStateMap,\n tooth: string,\n surface: ToothSurface\n): ToothStateMap => {\n const current = state[tooth];\n if (!current?.surfaces?.[surface]?.length) {\n return state;\n }\n\n const nextSurfaces = { ...(current.surfaces ?? {}) };\n delete nextSurfaces[surface];\n\n return {\n ...state,\n [tooth]: cleanupRecord({\n tooth,\n conditions: current.conditions,\n surfaces: nextSurfaces\n })\n };\n};\n\nexport const clearToothCondition = (state: ToothStateMap, tooth: string): ToothStateMap => {\n const current = state[tooth];\n if (!current) {\n return state;\n }\n\n const nextRecord = cleanupRecord({\n tooth,\n conditions: undefined,\n surfaces: undefined\n });\n\n if (!nextRecord) {\n const nextState = { ...state };\n delete nextState[tooth];\n return nextState;\n }\n\n return {\n ...state,\n [tooth]: nextRecord\n };\n};\n\nexport const getConditionColor = (condition?: ToothCondition) =>\n CLINICAL_CONDITIONS.find((item) => item.id === condition)?.color ?? \"#dbe4ea\";\n","import { memo } from \"react\";\nimport { getConditionColor } from \"../../utils/odontogram\";\nimport type { ToothCondition, ToothSurface as ToothSurfaceType } from \"../../types\";\n\ntype ToothSurfaceProps = {\n surface: ToothSurfaceType;\n label: string;\n path: string;\n textX: number;\n textY: number;\n condition?: ToothCondition;\n onApply: (surface: ToothSurfaceType) => void;\n onClear: (surface: ToothSurfaceType) => void;\n disabled?: boolean;\n};\n\nexport const ToothSurface = memo(function ToothSurface({\n surface,\n label,\n path,\n textX,\n textY,\n condition,\n onApply,\n onClear,\n disabled\n}: ToothSurfaceProps) {\n return (\n <g>\n <path\n d={path}\n fill={getConditionColor(condition)}\n stroke=\"#1f2937\"\n strokeWidth={1.4}\n strokeLinejoin=\"round\"\n className={disabled ? \"\" : \"ov-cursor-pointer ov-transition-opacity hover:ov-opacity-85\"}\n onClick={disabled ? undefined : () => onApply(surface)}\n onContextMenu={\n disabled\n ? undefined\n : (event) => {\n event.preventDefault();\n onClear(surface);\n }\n }\n />\n <text\n x={textX}\n y={textY}\n textAnchor=\"middle\"\n className=\"ov-pointer-events-none ov-select-none ov-fill-slate-700 ov-text-[10px] ov-font-semibold\"\n >\n {label}\n </text>\n </g>\n );\n});\n","import type { ToothDefinition, ToothSurface } from \"../../types\";\n\ntype GeometrySurface = {\n key: ToothSurface;\n label: string;\n path: string;\n text: { x: number; y: number };\n};\n\ntype ToothGeometry = {\n crownOutline: string;\n crownCap: string;\n rootPaths: string[];\n surfaces: GeometrySurface[];\n};\n\nconst quad = (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) =>\n `M ${x1} ${y1} Q ${cx} ${cy} ${x2} ${y2}`;\n\nconst closed = (...segments: string[]) => `${segments.join(\" \")} Z`;\n\nconst buildIncisorGeometry = (centerLabel: \"I\" | \"O\"): ToothGeometry => {\n const crownOutline = closed(\n \"M 21 20\",\n \"Q 31 13 41 20\",\n \"Q 47 27 45 38\",\n \"Q 43 50 31 55\",\n \"Q 19 50 17 38\",\n \"Q 15 27 21 20\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 21 20\",\n \"Q 31 14 41 20\",\n \"Q 39 26 36 30\",\n \"Q 31 32 26 30\",\n \"Q 23 26 21 20\"\n ),\n text: { x: 31, y: 25 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 17 38\",\n \"Q 17 28 21 20\",\n \"Q 23 26 26 30\",\n \"Q 25 39 26 47\",\n \"Q 20 46 17 38\"\n ),\n text: { x: 22, y: 38 }\n },\n {\n key: centerLabel,\n label: centerLabel,\n path: closed(\n \"M 26 30\",\n \"Q 31 26 36 30\",\n \"Q 39 38 36 46\",\n \"Q 31 51 26 46\",\n \"Q 23 38 26 30\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 45 38\",\n \"Q 45 28 41 20\",\n \"Q 39 26 36 30\",\n \"Q 37 39 36 47\",\n \"Q 42 46 45 38\"\n ),\n text: { x: 40, y: 38 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 24 45\",\n \"Q 31 54 38 45\",\n \"Q 42 47 45 38\",\n \"Q 43 54 31 59\",\n \"Q 19 54 17 38\",\n \"Q 20 47 24 45\"\n ),\n text: { x: 31, y: 55 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 27 54\",\n \"Q 31 58 35 54\",\n \"Q 38 65 36 84\",\n \"Q 34 100 31 112\",\n \"Q 28 100 26 84\",\n \"Q 24 65 27 54\"\n )\n ],\n surfaces\n };\n};\n\nconst buildCanineGeometry = (): ToothGeometry => {\n const crownOutline = closed(\n \"M 24 23\",\n \"Q 31 12 38 23\",\n \"Q 44 31 42 41\",\n \"Q 40 52 31 58\",\n \"Q 22 52 20 41\",\n \"Q 18 31 24 23\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 24 23\",\n \"Q 31 13 38 23\",\n \"Q 36 29 35 31\",\n \"Q 31 34 27 31\",\n \"Q 26 29 24 23\"\n ),\n text: { x: 31, y: 26 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 20 41\",\n \"Q 20 31 24 23\",\n \"Q 26 29 27 31\",\n \"Q 26 40 27 49\",\n \"Q 22 47 20 41\"\n ),\n text: { x: 23, y: 40 }\n },\n {\n key: \"I\",\n label: \"I\",\n path: closed(\n \"M 27 31\",\n \"Q 31 28 35 31\",\n \"Q 37 40 35 48\",\n \"Q 31 53 27 48\",\n \"Q 25 40 27 31\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 42 41\",\n \"Q 42 31 38 23\",\n \"Q 36 29 35 31\",\n \"Q 36 40 35 49\",\n \"Q 40 47 42 41\"\n ),\n text: { x: 39, y: 40 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 25 47\",\n \"Q 31 56 37 47\",\n \"Q 40 49 42 41\",\n \"Q 40 54 31 60\",\n \"Q 22 54 20 41\",\n \"Q 22 49 25 47\"\n ),\n text: { x: 31, y: 55 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 27 58\",\n \"Q 31 62 35 58\",\n \"Q 39 73 37 92\",\n \"Q 35 112 31 122\",\n \"Q 27 112 25 92\",\n \"Q 23 73 27 58\"\n )\n ],\n surfaces\n };\n};\n\nconst buildPremolarGeometry = (): ToothGeometry => {\n const crownOutline = closed(\n \"M 20 20\",\n \"Q 31 15 42 20\",\n \"Q 48 28 46 39\",\n \"Q 44 52 31 57\",\n \"Q 18 52 16 39\",\n \"Q 14 28 20 20\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 20 20\",\n \"Q 31 14 42 20\",\n \"Q 39 28 36 31\",\n \"Q 31 33 26 31\",\n \"Q 23 28 20 20\"\n ),\n text: { x: 31, y: 25 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 16 39\",\n \"Q 15 29 20 20\",\n \"Q 23 28 26 31\",\n \"Q 24 40 26 49\",\n \"Q 20 48 16 39\"\n ),\n text: { x: 22, y: 40 }\n },\n {\n key: \"O\",\n label: \"O\",\n path: closed(\n \"M 26 31\",\n \"Q 31 27 36 31\",\n \"Q 39 39 36 48\",\n \"Q 31 52 26 48\",\n \"Q 23 39 26 31\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 46 39\",\n \"Q 47 29 42 20\",\n \"Q 39 28 36 31\",\n \"Q 38 40 36 49\",\n \"Q 42 48 46 39\"\n ),\n text: { x: 40, y: 40 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 24 47\",\n \"Q 31 56 38 47\",\n \"Q 43 49 46 39\",\n \"Q 44 54 31 59\",\n \"Q 18 54 16 39\",\n \"Q 19 49 24 47\"\n ),\n text: { x: 31, y: 56 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 22 57\",\n \"Q 25 60 28 57\",\n \"Q 28 71 25 90\",\n \"Q 23 101 20 109\",\n \"Q 17 99 17 86\",\n \"Q 17 71 22 57\"\n ),\n closed(\n \"M 34 57\",\n \"Q 37 60 40 57\",\n \"Q 45 71 45 86\",\n \"Q 45 99 42 109\",\n \"Q 39 101 37 90\",\n \"Q 34 71 34 57\"\n )\n ],\n surfaces\n };\n};\n\nconst buildMolarGeometry = (arch: \"upper\" | \"lower\"): ToothGeometry => {\n const crownOutline = closed(\n \"M 16 22\",\n \"Q 31 13 46 22\",\n \"Q 52 32 49 43\",\n \"Q 46 56 31 61\",\n \"Q 16 56 13 43\",\n \"Q 10 32 16 22\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 16 22\",\n \"Q 31 12 46 22\",\n \"Q 42 31 38 34\",\n \"Q 31 36 24 34\",\n \"Q 20 31 16 22\"\n ),\n text: { x: 31, y: 26 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 13 43\",\n \"Q 11 32 16 22\",\n \"Q 20 31 24 34\",\n \"Q 22 44 24 53\",\n \"Q 17 52 13 43\"\n ),\n text: { x: 21, y: 43 }\n },\n {\n key: \"O\",\n label: \"O\",\n path: closed(\n \"M 24 34\",\n \"Q 31 29 38 34\",\n \"Q 41 43 38 52\",\n \"Q 31 56 24 52\",\n \"Q 21 43 24 34\"\n ),\n text: { x: 31, y: 43 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 49 43\",\n \"Q 51 32 46 22\",\n \"Q 42 31 38 34\",\n \"Q 40 44 38 53\",\n \"Q 45 52 49 43\"\n ),\n text: { x: 41, y: 43 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 22 51\",\n \"Q 31 62 40 51\",\n \"Q 46 52 49 43\",\n \"Q 46 58 31 64\",\n \"Q 16 58 13 43\",\n \"Q 16 52 22 51\"\n ),\n text: { x: 31, y: 60 }\n }\n ];\n\n const rootPaths =\n arch === \"upper\"\n ? [\n closed(\n \"M 17 61\",\n \"Q 20 64 23 61\",\n \"Q 24 73 22 91\",\n \"Q 20 103 17 111\",\n \"Q 14 101 14 88\",\n \"Q 14 73 17 61\"\n ),\n closed(\n \"M 28 61\",\n \"Q 31 65 34 61\",\n \"Q 36 76 35 96\",\n \"Q 34 111 31 122\",\n \"Q 28 111 27 96\",\n \"Q 26 76 28 61\"\n ),\n closed(\n \"M 39 61\",\n \"Q 42 64 45 61\",\n \"Q 48 73 48 88\",\n \"Q 48 101 45 111\",\n \"Q 42 103 40 91\",\n \"Q 38 73 39 61\"\n )\n ]\n : [\n closed(\n \"M 22 61\",\n \"Q 26 64 29 61\",\n \"Q 29 76 26 96\",\n \"Q 24 109 20 118\",\n \"Q 17 107 17 92\",\n \"Q 17 75 22 61\"\n ),\n closed(\n \"M 33 61\",\n \"Q 36 64 40 61\",\n \"Q 45 75 45 92\",\n \"Q 45 107 42 118\",\n \"Q 38 109 36 96\",\n \"Q 33 76 33 61\"\n )\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths,\n surfaces\n };\n};\n\nexport const getToothGeometry = (definition: ToothDefinition): ToothGeometry => {\n if (definition.type === \"incisor\") {\n return buildIncisorGeometry(definition.visual.centerLabel);\n }\n\n if (definition.type === \"canine\") {\n return buildCanineGeometry();\n }\n\n if (definition.type === \"premolar\") {\n return buildPremolarGeometry();\n }\n\n return buildMolarGeometry(definition.arch);\n};\n","import { memo, useCallback, useMemo } from \"react\";\nimport { getConditionColor } from \"../../utils/odontogram\";\nimport { ToothSurface } from \"./ToothSurface\";\nimport { getToothGeometry } from \"./toothGeometry\";\nimport type { ToothCondition, ToothDefinition, ToothRecord, ToothSurface as ToothSurfaceType } from \"../../types\";\n\ntype ToothProps = {\n definition: ToothDefinition;\n record?: ToothRecord;\n editable: boolean;\n selectedCondition: ToothCondition;\n size: \"sm\" | \"md\" | \"lg\";\n onApplySurface: (tooth: string, surface: ToothSurfaceType, condition: ToothCondition) => void;\n onApplyTooth: (tooth: string, condition: ToothCondition) => void;\n onClearSurface: (tooth: string, surface: ToothSurfaceType) => void;\n onClearTooth: (tooth: string) => void;\n};\n\nconst sizeClassMap = {\n sm: {\n wrapper: \"ov-min-w-[64px] ov-gap-0.5\",\n label: \"ov-text-[11px]\",\n svg: \"ov-h-[124px] ov-w-[62px]\"\n },\n md: {\n wrapper: \"ov-min-w-[74px] ov-gap-0.5\",\n label: \"ov-text-xs\",\n svg: \"ov-h-[138px] ov-w-[98px]\"\n },\n lg: {\n wrapper: \"ov-min-w-[84px] ov-gap-0.5\",\n label: \"ov-text-sm\",\n svg: \"ov-h-[154px] ov-w-[108px]\"\n }\n} as const;\n\nexport const Tooth = memo(function Tooth({\n definition,\n record,\n editable,\n selectedCondition,\n size,\n onApplySurface,\n onApplyTooth,\n onClearSurface,\n onClearTooth\n}: ToothProps) {\n const sizeClasses = sizeClassMap[size];\n const geometry = useMemo(() => getToothGeometry(definition), [definition]);\n const toothConditions = record?.conditions ?? [];\n const toothFill = useMemo(\n () => (toothConditions.length ? getConditionColor(toothConditions[0]) : \"#f8fafc\"),\n [toothConditions]\n );\n\n const accentClass = useMemo(() => {\n if (definition.type === \"incisor\") {\n return \"ov-border-sky-100\";\n }\n if (definition.type === \"canine\") {\n return \"ov-border-amber-100\";\n }\n if (definition.type === \"premolar\") {\n return \"ov-border-emerald-100\";\n }\n return \"ov-border-rose-100\";\n }, [definition.type]);\n\n const handleApplySurface = useCallback(\n (surface: ToothSurfaceType) => onApplySurface(definition.id, surface, selectedCondition),\n [definition.id, onApplySurface, selectedCondition]\n );\n\n const handleClearSurface = useCallback(\n (surface: ToothSurfaceType) => onClearSurface(definition.id, surface),\n [definition.id, onClearSurface]\n );\n\n const handleApplyTooth = useCallback(() => {\n onApplyTooth(definition.id, selectedCondition);\n }, [definition.id, onApplyTooth, selectedCondition]);\n\n const handleClearTooth = useCallback(() => {\n onClearTooth(definition.id);\n }, [definition.id, onClearTooth]);\n\n return (\n <div className={[\"ov-flex ov-flex-col ov-items-center\", accentClass, sizeClasses.wrapper].join(\" \")}>\n <span className={[\"ov-font-semibold ov-text-clinic-700\", sizeClasses.label].join(\" \")}>\n {definition.label}\n </span>\n\n <svg viewBox=\"0 0 62 128\" className={sizeClasses.svg}>\n {geometry.rootPaths.map((root, index) => (\n <path\n key={`${definition.id}-root-${index}`}\n d={root}\n fill={toothFill}\n stroke=\"#1f2937\"\n strokeWidth={1.4}\n strokeLinejoin=\"round\"\n className={editable ? \"ov-cursor-pointer ov-transition-opacity hover:ov-opacity-85\" : \"\"}\n onClick={editable ? handleApplyTooth : undefined}\n onContextMenu={\n editable\n ? (event) => {\n event.preventDefault();\n handleClearTooth();\n }\n : undefined\n }\n />\n ))}\n\n <path d={geometry.crownCap} fill={toothFill} stroke=\"#1f2937\" strokeWidth={1.6} />\n\n {geometry.surfaces.map((surface) => (\n <ToothSurface\n key={`${definition.id}-${surface.key}`}\n surface={surface.key}\n label={surface.label}\n path={surface.path}\n textX={surface.text.x}\n textY={surface.text.y}\n condition={record?.surfaces?.[surface.key]?.[0]}\n onApply={handleApplySurface}\n onClear={handleClearSurface}\n disabled={!editable}\n />\n ))}\n\n <path\n d={geometry.crownOutline}\n fill=\"none\"\n stroke=\"#0f172a\"\n strokeWidth={1.6}\n strokeLinejoin=\"round\"\n className={editable ? \"ov-cursor-pointer\" : \"\"}\n onClick={editable ? handleApplyTooth : undefined}\n onContextMenu={\n editable\n ? (event) => {\n event.preventDefault();\n handleClearTooth();\n }\n : undefined\n }\n />\n </svg>\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { Tooth } from \"../Tooth/Tooth\";\nimport type { ToothCondition, ToothDefinition, ToothStateMap, ToothSurface } from \"../../types\";\n\ntype QuadrantProps = {\n label: string;\n teeth: readonly ToothDefinition[];\n records: ToothStateMap;\n editable: boolean;\n selectedCondition: ToothCondition;\n size: \"sm\" | \"md\" | \"lg\";\n onApplySurface: (tooth: string, surface: ToothSurface, condition: ToothCondition) => void;\n onApplyTooth: (tooth: string, condition: ToothCondition) => void;\n onClearSurface: (tooth: string, surface: ToothSurface) => void;\n onClearTooth: (tooth: string) => void;\n};\n\nexport const Quadrant = memo(function Quadrant({\n teeth,\n records,\n editable,\n selectedCondition,\n size,\n onApplySurface,\n onApplyTooth,\n onClearSurface,\n onClearTooth\n}: QuadrantProps) {\n return (\n <section>\n <div className=\"ov-overflow-x-auto ov-pb-1\">\n <div className=\"ov-flex ov-min-w-max ov-justify-center ov-gap-0.5\">\n {teeth.map((definition) => (\n <Tooth\n key={definition.id}\n definition={definition}\n record={records[definition.id]}\n editable={editable}\n selectedCondition={selectedCondition}\n size={size}\n onApplySurface={onApplySurface}\n onApplyTooth={onApplyTooth}\n onClearSurface={onClearSurface}\n onClearTooth={onClearTooth}\n />\n ))}\n </div>\n </div>\n </section>\n );\n});\n","import { memo } from \"react\";\nimport { CLINICAL_CONDITIONS } from \"../../constants\";\nimport type { ToothCondition } from \"../../types\";\n\ntype ToolbarProps = {\n selectedCondition: ToothCondition;\n onSelect: (condition: ToothCondition) => void;\n};\n\nexport const Toolbar = memo(function Toolbar({ selectedCondition, onSelect }: ToolbarProps) {\n return (\n <div className=\"ov-rounded-3xl ov-border ov-border-slate-200 ov-bg-white ov-p-4 ov-shadow-panel\">\n <div className=\"ov-mb-3 ov-flex ov-items-center ov-justify-between ov-gap-3\">\n <div>\n <p className=\"ov-text-xs ov-font-semibold ov-uppercase ov-tracking-[0.22em] ov-text-clinic-600\">\n Estados clínicos\n </p>\n <p className=\"ov-text-sm ov-text-slate-500\">\n Click izquierdo aplica. Click derecho limpia solo la pieza o superficie elegida.\n </p>\n </div>\n <div className=\"ov-rounded-full ov-bg-clinic-50 ov-px-3 ov-py-1 ov-text-xs ov-font-medium ov-text-clinic-700\">\n Activo: {selectedCondition}\n </div>\n </div>\n\n <div className=\"ov-flex ov-flex-wrap ov-gap-2\">\n {CLINICAL_CONDITIONS.map((condition) => {\n const isActive = condition.id === selectedCondition;\n\n return (\n <button\n key={condition.id}\n type=\"button\"\n onClick={() => onSelect(condition.id)}\n className={[\n \"ov-flex ov-items-center ov-gap-2 ov-rounded-full ov-border ov-px-3 ov-py-2 ov-text-sm ov-transition\",\n isActive\n ? \"ov-border-clinic-700 ov-bg-clinic-900 ov-text-white\"\n : \"ov-border-slate-200 ov-bg-slate-50 ov-text-slate-700 hover:ov-border-clinic-400 hover:ov-bg-white\"\n ].join(\" \")}\n >\n <span\n className=\"ov-h-3 ov-w-3 ov-rounded-full ov-border ov-border-white/40\"\n style={{ backgroundColor: condition.color }}\n />\n <span>{condition.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useMemo, useState } from \"react\";\nimport {\n MIXED_DENTITION_LAYOUT,\n PERMANENT_DENTITION_LAYOUT,\n PRIMARY_DENTITION_LAYOUT\n} from \"../../constants\";\nimport {\n applySurfaceCondition,\n applyToothCondition,\n clearSurfaceCondition,\n clearToothCondition,\n normalizeChanges,\n serializeChanges\n} from \"../../utils/odontogram\";\nimport { Quadrant } from \"../Quadrant/Quadrant\";\nimport { Toolbar } from \"../Toolbar/Toolbar\";\nimport type { OdontogramProps, ToothCondition, ToothStateMap, ToothSurface } from \"../../types\";\n\nconst DEFAULT_CONDITION: ToothCondition = \"CARIES\";\n\nexport const Odontogram = memo(function Odontogram({\n value,\n defaultValue,\n onChange,\n dentition = \"mixed\",\n selectedCondition,\n onSelectedConditionChange,\n editable = true,\n size = \"md\",\n className,\n theme\n}: OdontogramProps) {\n const isControlled = typeof value !== \"undefined\";\n const [internalState, setInternalState] = useState<ToothStateMap>(() =>\n normalizeChanges(defaultValue)\n );\n const [internalCondition, setInternalCondition] = useState<ToothCondition>(DEFAULT_CONDITION);\n\n const records = useMemo(\n () => (isControlled ? normalizeChanges(value) : internalState),\n [internalState, isControlled, value]\n );\n\n const activeCondition = selectedCondition ?? internalCondition;\n\n const updateRecords = useCallback(\n (nextState: ToothStateMap) => {\n if (!isControlled) {\n setInternalState(nextState);\n }\n\n onChange?.(serializeChanges(nextState));\n },\n [isControlled, onChange]\n );\n\n const selectCondition = useCallback(\n (condition: ToothCondition) => {\n if (!selectedCondition) {\n setInternalCondition(condition);\n }\n\n onSelectedConditionChange?.(condition);\n },\n [onSelectedConditionChange, selectedCondition]\n );\n\n const handleApplySurface = useCallback(\n (tooth: string, surface: ToothSurface, condition: ToothCondition) => {\n updateRecords(applySurfaceCondition(records, tooth, surface, condition));\n },\n [records, updateRecords]\n );\n\n const handleApplyTooth = useCallback(\n (tooth: string, condition: ToothCondition) => {\n updateRecords(applyToothCondition(records, tooth, condition));\n },\n [records, updateRecords]\n );\n\n const handleClearSurface = useCallback(\n (tooth: string, surface: ToothSurface) => {\n updateRecords(clearSurfaceCondition(records, tooth, surface));\n },\n [records, updateRecords]\n );\n\n const handleClearTooth = useCallback(\n (tooth: string) => {\n updateRecords(clearToothCondition(records, tooth));\n },\n [records, updateRecords]\n );\n\n const layout = useMemo(() => {\n if (dentition === \"permanent\") {\n return [\n { id: \"permanent-upper\", label: \"Superior permanente\", teeth: PERMANENT_DENTITION_LAYOUT.upper },\n { id: \"permanent-lower\", label: \"Inferior permanente\", teeth: PERMANENT_DENTITION_LAYOUT.lower }\n ];\n }\n\n if (dentition === \"primary\") {\n return [\n { id: \"primary-upper\", label: \"Superior temporal\", teeth: PRIMARY_DENTITION_LAYOUT.upper },\n { id: \"primary-lower\", label: \"Inferior temporal\", teeth: PRIMARY_DENTITION_LAYOUT.lower }\n ];\n }\n\n return [...MIXED_DENTITION_LAYOUT];\n }, [dentition]);\n\n return (\n <div\n className={[\n \"ov-odontogram ov-w-full ov-max-w-full ov-overflow-hidden ov-rounded-[28px] ov-border ov-border-slate-200 ov-bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.98),_rgba(240,248,249,0.98)_40%,_rgba(229,239,241,1)_100%)] ov-p-4 ov-text-slate-900 ov-shadow-panel md:ov-p-6\",\n className ?? \"\"\n ].join(\" \")}\n style={theme?.panelStyle}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n >\n <div className=\"ov-space-y-5\">\n <Toolbar selectedCondition={activeCondition} onSelect={selectCondition} />\n\n <div className=\"ov-overflow-x-auto ov-overflow-y-hidden\">\n <div className=\"ov-grid ov-min-w-max ov-gap-5\">\n {layout.map((section) => (\n <Quadrant\n key={section.id}\n label={section.label}\n teeth={section.teeth}\n records={records}\n editable={editable}\n selectedCondition={activeCondition}\n size={size}\n onApplySurface={handleApplySurface}\n onApplyTooth={handleApplyTooth}\n onClearSurface={handleClearSurface}\n onClearTooth={handleClearTooth}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n});\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","PERMANENT_SURFACE_MAP","PRIMARY_SURFACE_MAP","ROOT_COUNT_BY_TOOTH","visualConfigByType","toothId","arch","rootCount","buildQuadrant","quadrant","toothNumbers","dentition","typeMap","position","upperPermanentLeft","upperPermanentRight","lowerPermanentLeft","lowerPermanentRight","upperPrimaryLeft","upperPrimaryRight","lowerPrimaryLeft","lowerPrimaryRight","PERMANENT_DENTITION_LAYOUT","PRIMARY_DENTITION_LAYOUT","MIXED_DENTITION_LAYOUT","CLINICAL_CONDITIONS","conditionMap","condition","dedupe","conditions","sortConditions","left","right","normalizeChanges","normalized","record","surface","serializeChanges","state","nextRecord","_a","cleanupRecord","surfaces","hasToothConditions","hasSurfaceConditions","applySurfaceCondition","tooth","current","currentSurfaceValues","applyToothCondition","clearSurfaceCondition","_b","nextSurfaces","clearToothCondition","nextState","getConditionColor","item","ToothSurface","memo","label","path","textX","textY","onApply","onClear","disabled","jsx","event","closed","segments","buildIncisorGeometry","centerLabel","crownOutline","buildCanineGeometry","buildPremolarGeometry","buildMolarGeometry","rootPaths","getToothGeometry","definition","sizeClassMap","Tooth","editable","selectedCondition","size","onApplySurface","onApplyTooth","onClearSurface","onClearTooth","sizeClasses","geometry","useMemo","toothConditions","toothFill","accentClass","handleApplySurface","useCallback","handleClearSurface","handleApplyTooth","handleClearTooth","jsxs","root","index","Quadrant","teeth","records","Toolbar","onSelect","isActive","DEFAULT_CONDITION","Odontogram","defaultValue","onChange","onSelectedConditionChange","className","theme","isControlled","internalState","setInternalState","useState","internalCondition","setInternalCondition","activeCondition","updateRecords","selectCondition","layout","section"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/utils/injectStyles.ts","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/lib/constants.ts","../src/lib/utils/odontogram.ts","../src/lib/components/Tooth/ToothSurface.tsx","../src/lib/components/Tooth/toothGeometry.ts","../src/lib/components/Tooth/Tooth.tsx","../src/lib/components/Quadrant/Quadrant.tsx","../src/lib/components/Toolbar/Toolbar.tsx","../src/lib/components/Odontogram/Odontogram.tsx","../src/index.ts"],"sourcesContent":["let stylesInjected = false;\n\nexport function injectLibraryStyles(cssText: string) {\n if (stylesInjected || typeof document === \"undefined\") {\n return;\n }\n\n const styleTag = document.createElement(\"style\");\n styleTag.setAttribute(\"data-odontogram-view\", \"true\");\n styleTag.textContent = cssText;\n document.head.appendChild(styleTag);\n stylesInjected = true;\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import type { ConditionDefinition, ToothDefinition, ToothType, ToothVisualConfig } from \"./types\";\n\nconst PERMANENT_SURFACE_MAP: Record<number, ToothType> = {\n 1: \"incisor\",\n 2: \"incisor\",\n 3: \"canine\",\n 4: \"premolar\",\n 5: \"premolar\",\n 6: \"molar\",\n 7: \"molar\",\n 8: \"molar\"\n};\n\nconst PRIMARY_SURFACE_MAP: Record<number, ToothType> = {\n 1: \"incisor\",\n 2: \"incisor\",\n 3: \"canine\",\n 4: \"molar\",\n 5: \"molar\"\n};\n\nconst ROOT_COUNT_BY_TOOTH: Record<string, 1 | 2 | 3> = {\n \"11\": 1,\n \"12\": 1,\n \"13\": 1,\n \"14\": 2,\n \"15\": 1,\n \"16\": 3,\n \"17\": 3,\n \"18\": 3,\n \"21\": 1,\n \"22\": 1,\n \"23\": 1,\n \"24\": 2,\n \"25\": 1,\n \"26\": 3,\n \"27\": 3,\n \"28\": 3,\n \"31\": 1,\n \"32\": 1,\n \"33\": 1,\n \"34\": 1,\n \"35\": 1,\n \"36\": 2,\n \"37\": 2,\n \"38\": 2,\n \"41\": 1,\n \"42\": 1,\n \"43\": 1,\n \"44\": 1,\n \"45\": 1,\n \"46\": 2,\n \"47\": 2,\n \"48\": 2,\n \"51\": 1,\n \"52\": 1,\n \"53\": 1,\n \"54\": 3,\n \"55\": 3,\n \"61\": 1,\n \"62\": 1,\n \"63\": 1,\n \"64\": 3,\n \"65\": 3,\n \"71\": 1,\n \"72\": 1,\n \"73\": 1,\n \"74\": 2,\n \"75\": 2,\n \"81\": 1,\n \"82\": 1,\n \"83\": 1,\n \"84\": 2,\n \"85\": 2\n};\n\nconst visualConfigByType = (\n toothId: string,\n type: ToothType,\n arch: \"upper\" | \"lower\"\n): ToothVisualConfig => {\n const rootCount = ROOT_COUNT_BY_TOOTH[toothId] ?? 1;\n\n if (type === \"incisor\") {\n return {\n centerLabel: \"I\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 32,\n crownHeight: 42,\n rootStyle: \"single\"\n };\n }\n\n if (type === \"canine\") {\n return {\n centerLabel: \"I\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 36,\n crownHeight: 44,\n rootStyle: \"singleLong\"\n };\n }\n\n if (type === \"premolar\") {\n return {\n centerLabel: \"O\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 42,\n crownHeight: 42,\n rootStyle: rootCount === 2 ? \"double\" : \"single\"\n };\n }\n\n return {\n centerLabel: \"O\",\n roots: rootCount,\n surfaces: 5,\n crownWidth: 48,\n crownHeight: 42,\n rootStyle: rootCount === 3 ? \"triple\" : arch === \"upper\" ? \"triple\" : \"double\"\n };\n};\n\nconst buildQuadrant = (\n quadrant: number,\n toothNumbers: number[],\n arch: \"upper\" | \"lower\",\n dentition: \"permanent\" | \"primary\"\n): ToothDefinition[] => {\n const typeMap = dentition === \"permanent\" ? PERMANENT_SURFACE_MAP : PRIMARY_SURFACE_MAP;\n\n return toothNumbers.map((position) => {\n const type = typeMap[position];\n const toothId = `${quadrant}${position}`;\n return {\n id: toothId,\n type,\n arch,\n dentition,\n label: toothId,\n visual: visualConfigByType(toothId, type, arch)\n };\n });\n};\n\nconst upperPermanentLeft = buildQuadrant(1, [8, 7, 6, 5, 4, 3, 2, 1], \"upper\", \"permanent\");\nconst upperPermanentRight = buildQuadrant(2, [1, 2, 3, 4, 5, 6, 7, 8], \"upper\", \"permanent\");\nconst lowerPermanentLeft = buildQuadrant(4, [8, 7, 6, 5, 4, 3, 2, 1], \"lower\", \"permanent\");\nconst lowerPermanentRight = buildQuadrant(3, [1, 2, 3, 4, 5, 6, 7, 8], \"lower\", \"permanent\");\n\nconst upperPrimaryLeft = buildQuadrant(5, [5, 4, 3, 2, 1], \"upper\", \"primary\");\nconst upperPrimaryRight = buildQuadrant(6, [1, 2, 3, 4, 5], \"upper\", \"primary\");\nconst lowerPrimaryLeft = buildQuadrant(8, [5, 4, 3, 2, 1], \"lower\", \"primary\");\nconst lowerPrimaryRight = buildQuadrant(7, [1, 2, 3, 4, 5], \"lower\", \"primary\");\n\nexport const PERMANENT_DENTITION_LAYOUT = {\n upper: [...upperPermanentLeft, ...upperPermanentRight],\n lower: [...lowerPermanentLeft, ...lowerPermanentRight]\n};\n\nexport const PRIMARY_DENTITION_LAYOUT = {\n upper: [...upperPrimaryLeft, ...upperPrimaryRight],\n lower: [...lowerPrimaryLeft, ...lowerPrimaryRight]\n};\n\nexport const MIXED_DENTITION_LAYOUT = [\n {\n id: \"upper-permanent\",\n label: \"Superior permanente\",\n teeth: PERMANENT_DENTITION_LAYOUT.upper\n },\n {\n id: \"upper-primary\",\n label: \"Superior temporal\",\n teeth: PRIMARY_DENTITION_LAYOUT.upper\n },\n {\n id: \"lower-primary\",\n label: \"Inferior temporal\",\n teeth: PRIMARY_DENTITION_LAYOUT.lower\n },\n {\n id: \"lower-permanent\",\n label: \"Inferior permanente\",\n teeth: PERMANENT_DENTITION_LAYOUT.lower\n }\n] as const;\n\nexport const CLINICAL_CONDITIONS: ConditionDefinition[] = [\n { id: \"CARIES\", label: \"Caries\", color: \"#ef4444\", scope: \"both\" },\n { id: \"CROWN\", label: \"Corona\", color: \"#f59e0b\", scope: \"both\" },\n { id: \"EXTRACTION\", label: \"Extracción\", color: \"#7c3aed\", scope: \"both\" },\n { id: \"IMPLANT\", label: \"Implante\", color: \"#2563eb\", scope: \"both\" },\n { id: \"FRACTURE\", label: \"Fractura\", color: \"#fb7185\", scope: \"both\" },\n { id: \"RESIN\", label: \"Resina\", color: \"#10b981\", scope: \"both\" },\n { id: \"ENDO\", label: \"Endodoncia\", color: \"#0f172a\", scope: \"both\" },\n { id: \"MISSING\", label: \"Ausente\", color: \"#64748b\", scope: \"both\" },\n { id: \"SEALANT\", label: \"Sellante\", color: \"#14b8a6\", scope: \"both\" }\n];\n","import { CLINICAL_CONDITIONS } from \"../constants\";\nimport type {\n ConditionDefinition,\n OdontogramChange,\n ToothCondition,\n ToothRecord,\n ToothStateMap,\n ToothSurface\n} from \"../types\";\n\nconst conditionMap = new Map<ToothCondition, ConditionDefinition>(\n CLINICAL_CONDITIONS.map((condition) => [condition.id, condition])\n);\n\nconst dedupe = (conditions: ToothCondition[] = []) => Array.from(new Set(conditions));\n\nconst sortConditions = (conditions: ToothCondition[]) =>\n [...conditions].sort((left, right) => left.localeCompare(right));\n\nexport const normalizeChanges = (value: OdontogramChange = []): ToothStateMap => {\n const normalized: ToothStateMap = {};\n\n value.forEach((record) => {\n normalized[record.tooth] = {\n tooth: record.tooth,\n conditions: record.conditions ? sortConditions(dedupe(record.conditions)) : undefined,\n surfaces: record.surfaces\n ? Object.fromEntries(\n Object.entries(record.surfaces)\n .map(([surface, conditions]) => [\n surface,\n conditions?.length ? sortConditions(dedupe(conditions)) : undefined\n ])\n .filter(([, conditions]) => Boolean(conditions?.length))\n ) as ToothRecord[\"surfaces\"]\n : undefined\n };\n });\n\n return normalized;\n};\n\nexport const serializeChanges = (state: ToothStateMap): OdontogramChange =>\n Object.values(state)\n .filter(Boolean)\n .map((record) => {\n const nextRecord: ToothRecord = { tooth: record!.tooth };\n\n if (record?.conditions?.length) {\n nextRecord.conditions = record.conditions;\n }\n\n if (record?.surfaces && Object.keys(record.surfaces).length > 0) {\n nextRecord.surfaces = record.surfaces;\n }\n\n return nextRecord;\n })\n .filter((record) => record.conditions?.length || Object.keys(record.surfaces ?? {}).length)\n .sort((left, right) => left.tooth.localeCompare(right.tooth));\n\nconst cleanupRecord = (record: ToothRecord): ToothRecord | undefined => {\n const surfaces = record.surfaces\n ? Object.fromEntries(\n Object.entries(record.surfaces).filter(([, conditions]) => Boolean(conditions?.length))\n )\n : undefined;\n\n const hasToothConditions = Boolean(record.conditions?.length);\n const hasSurfaceConditions = Boolean(surfaces && Object.keys(surfaces).length > 0);\n\n if (!hasToothConditions && !hasSurfaceConditions) {\n return undefined;\n }\n\n return {\n tooth: record.tooth,\n conditions: hasToothConditions ? record.conditions : undefined,\n surfaces: hasSurfaceConditions ? (surfaces as ToothRecord[\"surfaces\"]) : undefined\n };\n};\n\nexport const applySurfaceCondition = (\n state: ToothStateMap,\n tooth: string,\n surface: ToothSurface,\n condition: ToothCondition\n): ToothStateMap => {\n const definition = conditionMap.get(condition);\n if (!definition) {\n return state;\n }\n\n const current = state[tooth] ?? { tooth };\n const currentSurfaceValues = current.surfaces?.[surface] ?? [];\n const nextRecord: ToothRecord = {\n tooth,\n conditions: current.conditions,\n surfaces: {\n ...(current.surfaces ?? {}),\n [surface]: sortConditions(dedupe([...currentSurfaceValues, condition]))\n }\n };\n\n return {\n ...state,\n [tooth]: cleanupRecord(nextRecord)\n };\n};\n\nexport const applyToothCondition = (\n state: ToothStateMap,\n tooth: string,\n condition: ToothCondition\n): ToothStateMap => {\n const current = state[tooth] ?? { tooth };\n const nextRecord: ToothRecord = {\n tooth,\n surfaces: current.surfaces,\n conditions: sortConditions(dedupe([...(current.conditions ?? []), condition]))\n };\n\n return {\n ...state,\n [tooth]: cleanupRecord(nextRecord)\n };\n};\n\nexport const clearSurfaceCondition = (\n state: ToothStateMap,\n tooth: string,\n surface: ToothSurface\n): ToothStateMap => {\n const current = state[tooth];\n if (!current?.surfaces?.[surface]?.length) {\n return state;\n }\n\n const nextSurfaces = { ...(current.surfaces ?? {}) };\n delete nextSurfaces[surface];\n\n return {\n ...state,\n [tooth]: cleanupRecord({\n tooth,\n conditions: current.conditions,\n surfaces: nextSurfaces\n })\n };\n};\n\nexport const clearToothCondition = (state: ToothStateMap, tooth: string): ToothStateMap => {\n const current = state[tooth];\n if (!current) {\n return state;\n }\n\n const nextRecord = cleanupRecord({\n tooth,\n conditions: undefined,\n surfaces: undefined\n });\n\n if (!nextRecord) {\n const nextState = { ...state };\n delete nextState[tooth];\n return nextState;\n }\n\n return {\n ...state,\n [tooth]: nextRecord\n };\n};\n\nexport const getConditionColor = (condition?: ToothCondition) =>\n CLINICAL_CONDITIONS.find((item) => item.id === condition)?.color ?? \"#dbe4ea\";\n","import { memo } from \"react\";\nimport { getConditionColor } from \"../../utils/odontogram\";\nimport type { ToothCondition, ToothSurface as ToothSurfaceType } from \"../../types\";\n\ntype ToothSurfaceProps = {\n surface: ToothSurfaceType;\n label: string;\n path: string;\n textX: number;\n textY: number;\n condition?: ToothCondition;\n onApply: (surface: ToothSurfaceType) => void;\n onClear: (surface: ToothSurfaceType) => void;\n disabled?: boolean;\n};\n\nexport const ToothSurface = memo(function ToothSurface({\n surface,\n label,\n path,\n textX,\n textY,\n condition,\n onApply,\n onClear,\n disabled\n}: ToothSurfaceProps) {\n return (\n <g>\n <path\n d={path}\n fill={getConditionColor(condition)}\n stroke=\"#1f2937\"\n strokeWidth={1.4}\n strokeLinejoin=\"round\"\n className={disabled ? \"\" : \"ov-cursor-pointer ov-transition-opacity hover:ov-opacity-85\"}\n onClick={disabled ? undefined : () => onApply(surface)}\n onContextMenu={\n disabled\n ? undefined\n : (event) => {\n event.preventDefault();\n onClear(surface);\n }\n }\n />\n <text\n x={textX}\n y={textY}\n textAnchor=\"middle\"\n className=\"ov-pointer-events-none ov-select-none ov-fill-slate-700 ov-text-[10px] ov-font-semibold\"\n >\n {label}\n </text>\n </g>\n );\n});\n","import type { ToothDefinition, ToothSurface } from \"../../types\";\n\ntype GeometrySurface = {\n key: ToothSurface;\n label: string;\n path: string;\n text: { x: number; y: number };\n};\n\ntype ToothGeometry = {\n crownOutline: string;\n crownCap: string;\n rootPaths: string[];\n surfaces: GeometrySurface[];\n};\n\nconst quad = (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) =>\n `M ${x1} ${y1} Q ${cx} ${cy} ${x2} ${y2}`;\n\nconst closed = (...segments: string[]) => `${segments.join(\" \")} Z`;\n\nconst buildIncisorGeometry = (centerLabel: \"I\" | \"O\"): ToothGeometry => {\n const crownOutline = closed(\n \"M 21 20\",\n \"Q 31 13 41 20\",\n \"Q 47 27 45 38\",\n \"Q 43 50 31 55\",\n \"Q 19 50 17 38\",\n \"Q 15 27 21 20\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 21 20\",\n \"Q 31 14 41 20\",\n \"Q 39 26 36 30\",\n \"Q 31 32 26 30\",\n \"Q 23 26 21 20\"\n ),\n text: { x: 31, y: 25 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 17 38\",\n \"Q 17 28 21 20\",\n \"Q 23 26 26 30\",\n \"Q 25 39 26 47\",\n \"Q 20 46 17 38\"\n ),\n text: { x: 22, y: 38 }\n },\n {\n key: centerLabel,\n label: centerLabel,\n path: closed(\n \"M 26 30\",\n \"Q 31 26 36 30\",\n \"Q 39 38 36 46\",\n \"Q 31 51 26 46\",\n \"Q 23 38 26 30\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 45 38\",\n \"Q 45 28 41 20\",\n \"Q 39 26 36 30\",\n \"Q 37 39 36 47\",\n \"Q 42 46 45 38\"\n ),\n text: { x: 40, y: 38 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 24 45\",\n \"Q 31 54 38 45\",\n \"Q 42 47 45 38\",\n \"Q 43 54 31 59\",\n \"Q 19 54 17 38\",\n \"Q 20 47 24 45\"\n ),\n text: { x: 31, y: 55 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 27 54\",\n \"Q 31 58 35 54\",\n \"Q 38 65 36 84\",\n \"Q 34 100 31 112\",\n \"Q 28 100 26 84\",\n \"Q 24 65 27 54\"\n )\n ],\n surfaces\n };\n};\n\nconst buildCanineGeometry = (): ToothGeometry => {\n const crownOutline = closed(\n \"M 24 23\",\n \"Q 31 12 38 23\",\n \"Q 44 31 42 41\",\n \"Q 40 52 31 58\",\n \"Q 22 52 20 41\",\n \"Q 18 31 24 23\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 24 23\",\n \"Q 31 13 38 23\",\n \"Q 36 29 35 31\",\n \"Q 31 34 27 31\",\n \"Q 26 29 24 23\"\n ),\n text: { x: 31, y: 26 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 20 41\",\n \"Q 20 31 24 23\",\n \"Q 26 29 27 31\",\n \"Q 26 40 27 49\",\n \"Q 22 47 20 41\"\n ),\n text: { x: 23, y: 40 }\n },\n {\n key: \"I\",\n label: \"I\",\n path: closed(\n \"M 27 31\",\n \"Q 31 28 35 31\",\n \"Q 37 40 35 48\",\n \"Q 31 53 27 48\",\n \"Q 25 40 27 31\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 42 41\",\n \"Q 42 31 38 23\",\n \"Q 36 29 35 31\",\n \"Q 36 40 35 49\",\n \"Q 40 47 42 41\"\n ),\n text: { x: 39, y: 40 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 25 47\",\n \"Q 31 56 37 47\",\n \"Q 40 49 42 41\",\n \"Q 40 54 31 60\",\n \"Q 22 54 20 41\",\n \"Q 22 49 25 47\"\n ),\n text: { x: 31, y: 55 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 27 58\",\n \"Q 31 62 35 58\",\n \"Q 39 73 37 92\",\n \"Q 35 112 31 122\",\n \"Q 27 112 25 92\",\n \"Q 23 73 27 58\"\n )\n ],\n surfaces\n };\n};\n\nconst buildPremolarGeometry = (): ToothGeometry => {\n const crownOutline = closed(\n \"M 20 20\",\n \"Q 31 15 42 20\",\n \"Q 48 28 46 39\",\n \"Q 44 52 31 57\",\n \"Q 18 52 16 39\",\n \"Q 14 28 20 20\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 20 20\",\n \"Q 31 14 42 20\",\n \"Q 39 28 36 31\",\n \"Q 31 33 26 31\",\n \"Q 23 28 20 20\"\n ),\n text: { x: 31, y: 25 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 16 39\",\n \"Q 15 29 20 20\",\n \"Q 23 28 26 31\",\n \"Q 24 40 26 49\",\n \"Q 20 48 16 39\"\n ),\n text: { x: 22, y: 40 }\n },\n {\n key: \"O\",\n label: \"O\",\n path: closed(\n \"M 26 31\",\n \"Q 31 27 36 31\",\n \"Q 39 39 36 48\",\n \"Q 31 52 26 48\",\n \"Q 23 39 26 31\"\n ),\n text: { x: 31, y: 40 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 46 39\",\n \"Q 47 29 42 20\",\n \"Q 39 28 36 31\",\n \"Q 38 40 36 49\",\n \"Q 42 48 46 39\"\n ),\n text: { x: 40, y: 40 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 24 47\",\n \"Q 31 56 38 47\",\n \"Q 43 49 46 39\",\n \"Q 44 54 31 59\",\n \"Q 18 54 16 39\",\n \"Q 19 49 24 47\"\n ),\n text: { x: 31, y: 56 }\n }\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths: [\n closed(\n \"M 22 57\",\n \"Q 25 60 28 57\",\n \"Q 28 71 25 90\",\n \"Q 23 101 20 109\",\n \"Q 17 99 17 86\",\n \"Q 17 71 22 57\"\n ),\n closed(\n \"M 34 57\",\n \"Q 37 60 40 57\",\n \"Q 45 71 45 86\",\n \"Q 45 99 42 109\",\n \"Q 39 101 37 90\",\n \"Q 34 71 34 57\"\n )\n ],\n surfaces\n };\n};\n\nconst buildMolarGeometry = (arch: \"upper\" | \"lower\"): ToothGeometry => {\n const crownOutline = closed(\n \"M 16 22\",\n \"Q 31 13 46 22\",\n \"Q 52 32 49 43\",\n \"Q 46 56 31 61\",\n \"Q 16 56 13 43\",\n \"Q 10 32 16 22\"\n );\n\n const surfaces: GeometrySurface[] = [\n {\n key: \"V\",\n label: \"V\",\n path: closed(\n \"M 16 22\",\n \"Q 31 12 46 22\",\n \"Q 42 31 38 34\",\n \"Q 31 36 24 34\",\n \"Q 20 31 16 22\"\n ),\n text: { x: 31, y: 26 }\n },\n {\n key: \"M\",\n label: \"M\",\n path: closed(\n \"M 13 43\",\n \"Q 11 32 16 22\",\n \"Q 20 31 24 34\",\n \"Q 22 44 24 53\",\n \"Q 17 52 13 43\"\n ),\n text: { x: 21, y: 43 }\n },\n {\n key: \"O\",\n label: \"O\",\n path: closed(\n \"M 24 34\",\n \"Q 31 29 38 34\",\n \"Q 41 43 38 52\",\n \"Q 31 56 24 52\",\n \"Q 21 43 24 34\"\n ),\n text: { x: 31, y: 43 }\n },\n {\n key: \"D\",\n label: \"D\",\n path: closed(\n \"M 49 43\",\n \"Q 51 32 46 22\",\n \"Q 42 31 38 34\",\n \"Q 40 44 38 53\",\n \"Q 45 52 49 43\"\n ),\n text: { x: 41, y: 43 }\n },\n {\n key: \"L\",\n label: \"L\",\n path: closed(\n \"M 22 51\",\n \"Q 31 62 40 51\",\n \"Q 46 52 49 43\",\n \"Q 46 58 31 64\",\n \"Q 16 58 13 43\",\n \"Q 16 52 22 51\"\n ),\n text: { x: 31, y: 60 }\n }\n ];\n\n const rootPaths =\n arch === \"upper\"\n ? [\n closed(\n \"M 17 61\",\n \"Q 20 64 23 61\",\n \"Q 24 73 22 91\",\n \"Q 20 103 17 111\",\n \"Q 14 101 14 88\",\n \"Q 14 73 17 61\"\n ),\n closed(\n \"M 28 61\",\n \"Q 31 65 34 61\",\n \"Q 36 76 35 96\",\n \"Q 34 111 31 122\",\n \"Q 28 111 27 96\",\n \"Q 26 76 28 61\"\n ),\n closed(\n \"M 39 61\",\n \"Q 42 64 45 61\",\n \"Q 48 73 48 88\",\n \"Q 48 101 45 111\",\n \"Q 42 103 40 91\",\n \"Q 38 73 39 61\"\n )\n ]\n : [\n closed(\n \"M 22 61\",\n \"Q 26 64 29 61\",\n \"Q 29 76 26 96\",\n \"Q 24 109 20 118\",\n \"Q 17 107 17 92\",\n \"Q 17 75 22 61\"\n ),\n closed(\n \"M 33 61\",\n \"Q 36 64 40 61\",\n \"Q 45 75 45 92\",\n \"Q 45 107 42 118\",\n \"Q 38 109 36 96\",\n \"Q 33 76 33 61\"\n )\n ];\n\n return {\n crownOutline,\n crownCap: crownOutline,\n rootPaths,\n surfaces\n };\n};\n\nexport const getToothGeometry = (definition: ToothDefinition): ToothGeometry => {\n if (definition.type === \"incisor\") {\n return buildIncisorGeometry(definition.visual.centerLabel);\n }\n\n if (definition.type === \"canine\") {\n return buildCanineGeometry();\n }\n\n if (definition.type === \"premolar\") {\n return buildPremolarGeometry();\n }\n\n return buildMolarGeometry(definition.arch);\n};\n","import { memo, useCallback, useMemo } from \"react\";\nimport { getConditionColor } from \"../../utils/odontogram\";\nimport { ToothSurface } from \"./ToothSurface\";\nimport { getToothGeometry } from \"./toothGeometry\";\nimport type { ToothCondition, ToothDefinition, ToothRecord, ToothSurface as ToothSurfaceType } from \"../../types\";\n\ntype ToothProps = {\n definition: ToothDefinition;\n record?: ToothRecord;\n editable: boolean;\n selectedCondition: ToothCondition;\n size: \"sm\" | \"md\" | \"lg\";\n onApplySurface: (tooth: string, surface: ToothSurfaceType, condition: ToothCondition) => void;\n onApplyTooth: (tooth: string, condition: ToothCondition) => void;\n onClearSurface: (tooth: string, surface: ToothSurfaceType) => void;\n onClearTooth: (tooth: string) => void;\n};\n\nconst sizeClassMap = {\n sm: {\n wrapper: \"ov-min-w-[64px] ov-gap-0.5\",\n label: \"ov-text-[11px]\",\n svg: \"ov-h-[124px] ov-w-[62px]\"\n },\n md: {\n wrapper: \"ov-min-w-[74px] ov-gap-0.5\",\n label: \"ov-text-xs\",\n svg: \"ov-h-[138px] ov-w-[98px]\"\n },\n lg: {\n wrapper: \"ov-min-w-[84px] ov-gap-0.5\",\n label: \"ov-text-sm\",\n svg: \"ov-h-[154px] ov-w-[108px]\"\n }\n} as const;\n\nexport const Tooth = memo(function Tooth({\n definition,\n record,\n editable,\n selectedCondition,\n size,\n onApplySurface,\n onApplyTooth,\n onClearSurface,\n onClearTooth\n}: ToothProps) {\n const sizeClasses = sizeClassMap[size];\n const geometry = useMemo(() => getToothGeometry(definition), [definition]);\n const toothConditions = record?.conditions ?? [];\n const toothFill = useMemo(\n () => (toothConditions.length ? getConditionColor(toothConditions[0]) : \"#f8fafc\"),\n [toothConditions]\n );\n\n const accentClass = useMemo(() => {\n if (definition.type === \"incisor\") {\n return \"ov-border-sky-100\";\n }\n if (definition.type === \"canine\") {\n return \"ov-border-amber-100\";\n }\n if (definition.type === \"premolar\") {\n return \"ov-border-emerald-100\";\n }\n return \"ov-border-rose-100\";\n }, [definition.type]);\n\n const handleApplySurface = useCallback(\n (surface: ToothSurfaceType) => onApplySurface(definition.id, surface, selectedCondition),\n [definition.id, onApplySurface, selectedCondition]\n );\n\n const handleClearSurface = useCallback(\n (surface: ToothSurfaceType) => onClearSurface(definition.id, surface),\n [definition.id, onClearSurface]\n );\n\n const handleApplyTooth = useCallback(() => {\n onApplyTooth(definition.id, selectedCondition);\n }, [definition.id, onApplyTooth, selectedCondition]);\n\n const handleClearTooth = useCallback(() => {\n onClearTooth(definition.id);\n }, [definition.id, onClearTooth]);\n\n return (\n <div className={[\"ov-flex ov-flex-col ov-items-center\", accentClass, sizeClasses.wrapper].join(\" \")}>\n <span className={[\"ov-font-semibold ov-text-clinic-700\", sizeClasses.label].join(\" \")}>\n {definition.label}\n </span>\n\n <svg viewBox=\"0 0 62 128\" className={sizeClasses.svg}>\n {geometry.rootPaths.map((root, index) => (\n <path\n key={`${definition.id}-root-${index}`}\n d={root}\n fill={toothFill}\n stroke=\"#1f2937\"\n strokeWidth={1.4}\n strokeLinejoin=\"round\"\n className={editable ? \"ov-cursor-pointer ov-transition-opacity hover:ov-opacity-85\" : \"\"}\n onClick={editable ? handleApplyTooth : undefined}\n onContextMenu={\n editable\n ? (event) => {\n event.preventDefault();\n handleClearTooth();\n }\n : undefined\n }\n />\n ))}\n\n <path d={geometry.crownCap} fill={toothFill} stroke=\"#1f2937\" strokeWidth={1.6} />\n\n {geometry.surfaces.map((surface) => (\n <ToothSurface\n key={`${definition.id}-${surface.key}`}\n surface={surface.key}\n label={surface.label}\n path={surface.path}\n textX={surface.text.x}\n textY={surface.text.y}\n condition={record?.surfaces?.[surface.key]?.[0]}\n onApply={handleApplySurface}\n onClear={handleClearSurface}\n disabled={!editable}\n />\n ))}\n\n <path\n d={geometry.crownOutline}\n fill=\"none\"\n stroke=\"#0f172a\"\n strokeWidth={1.6}\n strokeLinejoin=\"round\"\n className={editable ? \"ov-cursor-pointer\" : \"\"}\n onClick={editable ? handleApplyTooth : undefined}\n onContextMenu={\n editable\n ? (event) => {\n event.preventDefault();\n handleClearTooth();\n }\n : undefined\n }\n />\n </svg>\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { Tooth } from \"../Tooth/Tooth\";\nimport type { ToothCondition, ToothDefinition, ToothStateMap, ToothSurface } from \"../../types\";\n\ntype QuadrantProps = {\n label: string;\n teeth: readonly ToothDefinition[];\n records: ToothStateMap;\n editable: boolean;\n selectedCondition: ToothCondition;\n size: \"sm\" | \"md\" | \"lg\";\n onApplySurface: (tooth: string, surface: ToothSurface, condition: ToothCondition) => void;\n onApplyTooth: (tooth: string, condition: ToothCondition) => void;\n onClearSurface: (tooth: string, surface: ToothSurface) => void;\n onClearTooth: (tooth: string) => void;\n};\n\nexport const Quadrant = memo(function Quadrant({\n teeth,\n records,\n editable,\n selectedCondition,\n size,\n onApplySurface,\n onApplyTooth,\n onClearSurface,\n onClearTooth\n}: QuadrantProps) {\n return (\n <section>\n <div className=\"ov-overflow-x-auto ov-pb-1\">\n <div className=\"ov-flex ov-min-w-max ov-justify-center ov-gap-0.5\">\n {teeth.map((definition) => (\n <Tooth\n key={definition.id}\n definition={definition}\n record={records[definition.id]}\n editable={editable}\n selectedCondition={selectedCondition}\n size={size}\n onApplySurface={onApplySurface}\n onApplyTooth={onApplyTooth}\n onClearSurface={onClearSurface}\n onClearTooth={onClearTooth}\n />\n ))}\n </div>\n </div>\n </section>\n );\n});\n","import { memo } from \"react\";\nimport { CLINICAL_CONDITIONS } from \"../../constants\";\nimport type { ToothCondition } from \"../../types\";\n\ntype ToolbarProps = {\n selectedCondition: ToothCondition;\n onSelect: (condition: ToothCondition) => void;\n};\n\nexport const Toolbar = memo(function Toolbar({ selectedCondition, onSelect }: ToolbarProps) {\n return (\n <div className=\"ov-rounded-3xl ov-border ov-border-slate-200 ov-bg-white ov-p-4 ov-shadow-panel\">\n <div className=\"ov-mb-3 ov-flex ov-items-center ov-justify-between ov-gap-3\">\n <div>\n <p className=\"ov-text-xs ov-font-semibold ov-uppercase ov-tracking-[0.22em] ov-text-clinic-600\">\n Estados clínicos\n </p>\n <p className=\"ov-text-sm ov-text-slate-500\">\n Click izquierdo aplica. Click derecho limpia solo la pieza o superficie elegida.\n </p>\n </div>\n <div className=\"ov-rounded-full ov-bg-clinic-50 ov-px-3 ov-py-1 ov-text-xs ov-font-medium ov-text-clinic-700\">\n Activo: {selectedCondition}\n </div>\n </div>\n\n <div className=\"ov-flex ov-flex-wrap ov-gap-2\">\n {CLINICAL_CONDITIONS.map((condition) => {\n const isActive = condition.id === selectedCondition;\n\n return (\n <button\n key={condition.id}\n type=\"button\"\n onClick={() => onSelect(condition.id)}\n className={[\n \"ov-flex ov-items-center ov-gap-2 ov-rounded-full ov-border ov-px-3 ov-py-2 ov-text-sm ov-transition\",\n isActive\n ? \"ov-border-clinic-700 ov-bg-clinic-900 ov-text-white\"\n : \"ov-border-slate-200 ov-bg-slate-50 ov-text-slate-700 hover:ov-border-clinic-400 hover:ov-bg-white\"\n ].join(\" \")}\n >\n <span\n className=\"ov-h-3 ov-w-3 ov-rounded-full ov-border ov-border-white/40\"\n style={{ backgroundColor: condition.color }}\n />\n <span>{condition.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n});\n","import { memo, useCallback, useMemo, useState } from \"react\";\nimport {\n MIXED_DENTITION_LAYOUT,\n PERMANENT_DENTITION_LAYOUT,\n PRIMARY_DENTITION_LAYOUT\n} from \"../../constants\";\nimport {\n applySurfaceCondition,\n applyToothCondition,\n clearSurfaceCondition,\n clearToothCondition,\n normalizeChanges,\n serializeChanges\n} from \"../../utils/odontogram\";\nimport { Quadrant } from \"../Quadrant/Quadrant\";\nimport { Toolbar } from \"../Toolbar/Toolbar\";\nimport type { OdontogramProps, ToothCondition, ToothStateMap, ToothSurface } from \"../../types\";\n\nconst DEFAULT_CONDITION: ToothCondition = \"CARIES\";\n\nexport const Odontogram = memo(function Odontogram({\n value,\n defaultValue,\n onChange,\n dentition = \"mixed\",\n selectedCondition,\n onSelectedConditionChange,\n editable = true,\n size = \"md\",\n className,\n theme\n}: OdontogramProps) {\n const isControlled = typeof value !== \"undefined\";\n const [internalState, setInternalState] = useState<ToothStateMap>(() =>\n normalizeChanges(defaultValue)\n );\n const [internalCondition, setInternalCondition] = useState<ToothCondition>(DEFAULT_CONDITION);\n\n const records = useMemo(\n () => (isControlled ? normalizeChanges(value) : internalState),\n [internalState, isControlled, value]\n );\n\n const activeCondition = selectedCondition ?? internalCondition;\n\n const updateRecords = useCallback(\n (nextState: ToothStateMap) => {\n if (!isControlled) {\n setInternalState(nextState);\n }\n\n onChange?.(serializeChanges(nextState));\n },\n [isControlled, onChange]\n );\n\n const selectCondition = useCallback(\n (condition: ToothCondition) => {\n if (!selectedCondition) {\n setInternalCondition(condition);\n }\n\n onSelectedConditionChange?.(condition);\n },\n [onSelectedConditionChange, selectedCondition]\n );\n\n const handleApplySurface = useCallback(\n (tooth: string, surface: ToothSurface, condition: ToothCondition) => {\n updateRecords(applySurfaceCondition(records, tooth, surface, condition));\n },\n [records, updateRecords]\n );\n\n const handleApplyTooth = useCallback(\n (tooth: string, condition: ToothCondition) => {\n updateRecords(applyToothCondition(records, tooth, condition));\n },\n [records, updateRecords]\n );\n\n const handleClearSurface = useCallback(\n (tooth: string, surface: ToothSurface) => {\n updateRecords(clearSurfaceCondition(records, tooth, surface));\n },\n [records, updateRecords]\n );\n\n const handleClearTooth = useCallback(\n (tooth: string) => {\n updateRecords(clearToothCondition(records, tooth));\n },\n [records, updateRecords]\n );\n\n const layout = useMemo(() => {\n if (dentition === \"permanent\") {\n return [\n { id: \"permanent-upper\", label: \"Superior permanente\", teeth: PERMANENT_DENTITION_LAYOUT.upper },\n { id: \"permanent-lower\", label: \"Inferior permanente\", teeth: PERMANENT_DENTITION_LAYOUT.lower }\n ];\n }\n\n if (dentition === \"primary\") {\n return [\n { id: \"primary-upper\", label: \"Superior temporal\", teeth: PRIMARY_DENTITION_LAYOUT.upper },\n { id: \"primary-lower\", label: \"Inferior temporal\", teeth: PRIMARY_DENTITION_LAYOUT.lower }\n ];\n }\n\n return [...MIXED_DENTITION_LAYOUT];\n }, [dentition]);\n\n return (\n <div\n className={[\n \"ov-odontogram ov-w-full ov-max-w-full ov-overflow-hidden ov-rounded-[28px] ov-border ov-border-slate-200 ov-bg-[radial-gradient(circle_at_top_left,_rgba(255,255,255,0.98),_rgba(240,248,249,0.98)_40%,_rgba(229,239,241,1)_100%)] ov-p-4 ov-text-slate-900 ov-shadow-panel md:ov-p-6\",\n className ?? \"\"\n ].join(\" \")}\n style={theme?.panelStyle}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n >\n <div className=\"ov-space-y-5\">\n <Toolbar selectedCondition={activeCondition} onSelect={selectCondition} />\n\n <div className=\"ov-overflow-x-auto ov-overflow-y-hidden\">\n <div className=\"ov-grid ov-min-w-max ov-gap-5\">\n {layout.map((section) => (\n <Quadrant\n key={section.id}\n label={section.label}\n teeth={section.teeth}\n records={records}\n editable={editable}\n selectedCondition={activeCondition}\n size={size}\n onApplySurface={handleApplySurface}\n onApplyTooth={handleApplyTooth}\n onClearSurface={handleClearSurface}\n onClearTooth={handleClearTooth}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n});\n","import styles from \"./lib/styles.css?inline\";\nimport { injectLibraryStyles } from \"./lib/utils/injectStyles\";\n\ninjectLibraryStyles(styles);\n\nexport { Odontogram } from \"./lib/components/Odontogram/Odontogram\";\nexport type {\n OdontogramChange,\n OdontogramProps,\n ToothCondition,\n ToothRecord,\n ToothSurface,\n ToothType\n} from \"./lib/types\";\nexport {\n CLINICAL_CONDITIONS,\n MIXED_DENTITION_LAYOUT,\n PERMANENT_DENTITION_LAYOUT,\n PRIMARY_DENTITION_LAYOUT\n} from \"./lib/constants\";\n"],"names":["stylesInjected","injectLibraryStyles","cssText","styleTag","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","PERMANENT_SURFACE_MAP","PRIMARY_SURFACE_MAP","ROOT_COUNT_BY_TOOTH","visualConfigByType","toothId","arch","rootCount","buildQuadrant","quadrant","toothNumbers","dentition","typeMap","position","upperPermanentLeft","upperPermanentRight","lowerPermanentLeft","lowerPermanentRight","upperPrimaryLeft","upperPrimaryRight","lowerPrimaryLeft","lowerPrimaryRight","PERMANENT_DENTITION_LAYOUT","PRIMARY_DENTITION_LAYOUT","MIXED_DENTITION_LAYOUT","CLINICAL_CONDITIONS","conditionMap","condition","dedupe","conditions","sortConditions","left","right","normalizeChanges","normalized","record","surface","serializeChanges","state","nextRecord","_a","cleanupRecord","surfaces","hasToothConditions","hasSurfaceConditions","applySurfaceCondition","tooth","current","currentSurfaceValues","applyToothCondition","clearSurfaceCondition","_b","nextSurfaces","clearToothCondition","nextState","getConditionColor","item","ToothSurface","memo","label","path","textX","textY","onApply","onClear","disabled","jsx","event","closed","segments","buildIncisorGeometry","centerLabel","crownOutline","buildCanineGeometry","buildPremolarGeometry","buildMolarGeometry","rootPaths","getToothGeometry","definition","sizeClassMap","Tooth","editable","selectedCondition","size","onApplySurface","onApplyTooth","onClearSurface","onClearTooth","sizeClasses","geometry","useMemo","toothConditions","toothFill","accentClass","handleApplySurface","useCallback","handleClearSurface","handleApplyTooth","handleClearTooth","jsxs","root","index","Quadrant","teeth","records","Toolbar","onSelect","isActive","DEFAULT_CONDITION","Odontogram","defaultValue","onChange","onSelectedConditionChange","className","theme","isControlled","internalState","setInternalState","useState","internalCondition","setInternalCondition","activeCondition","updateRecords","selectCondition","layout","section","styles"],"mappings":"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","x_google_ignoreList":[1,2,3]}
@@ -0,0 +1 @@
1
+ export declare function injectLibraryStyles(cssText: string): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "odontogram-view",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Reusable React odontogram component library for dental systems.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -11,15 +11,14 @@
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.js",
13
13
  "require": "./dist/index.cjs"
14
- },
15
- "./styles.css": "./dist/styles.css"
14
+ }
16
15
  },
17
16
  "files": [
18
17
  "dist"
19
18
  ],
20
19
  "scripts": {
21
20
  "dev": "vite",
22
- "build": "tsc -p tsconfig.build.json && vite build",
21
+ "build": "vite build",
23
22
  "preview": "vite preview"
24
23
  },
25
24
  "peerDependencies": {
package/dist/styles.css DELETED
@@ -1 +0,0 @@
1
- .ov-pointer-events-none{pointer-events:none}.ov-m-0{margin:0}.ov-mx-auto{margin-left:auto;margin-right:auto}.ov-mb-3{margin-bottom:.75rem}.ov-mt-3{margin-top:.75rem}.ov-flex{display:flex}.ov-grid{display:grid}.ov-h-3{height:.75rem}.ov-h-\[124px\]{height:124px}.ov-h-\[138px\]{height:138px}.ov-h-\[154px\]{height:154px}.ov-min-h-screen{min-height:100vh}.ov-w-3{width:.75rem}.ov-w-\[108px\]{width:108px}.ov-w-\[62px\]{width:62px}.ov-w-\[98px\]{width:98px}.ov-w-full{width:100%}.ov-min-w-0{min-width:0px}.ov-min-w-\[64px\]{min-width:64px}.ov-min-w-\[74px\]{min-width:74px}.ov-min-w-\[84px\]{min-width:84px}.ov-min-w-max{min-width:-moz-max-content;min-width:max-content}.ov-max-w-3xl{max-width:48rem}.ov-max-w-7xl{max-width:80rem}.ov-max-w-full{max-width:100%}.ov-cursor-pointer{cursor:pointer}.ov-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ov-flex-col{flex-direction:column}.ov-flex-wrap{flex-wrap:wrap}.ov-items-center{align-items:center}.ov-justify-center{justify-content:center}.ov-justify-between{justify-content:space-between}.ov-gap-0\.5{gap:.125rem}.ov-gap-2{gap:.5rem}.ov-gap-3{gap:.75rem}.ov-gap-4{gap:1rem}.ov-gap-5{gap:1.25rem}.ov-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.ov-overflow-hidden{overflow:hidden}.ov-overflow-x-auto{overflow-x:auto}.ov-overflow-x-hidden{overflow-x:hidden}.ov-overflow-y-hidden{overflow-y:hidden}.ov-rounded-2xl{border-radius:1rem}.ov-rounded-3xl{border-radius:1.5rem}.ov-rounded-\[24px\]{border-radius:24px}.ov-rounded-\[28px\]{border-radius:28px}.ov-rounded-full{border-radius:9999px}.ov-border{border-width:1px}.ov-border-amber-100{--tw-border-opacity: 1;border-color:rgb(254 243 199 / var(--tw-border-opacity, 1))}.ov-border-clinic-700{--tw-border-opacity: 1;border-color:rgb(46 91 105 / var(--tw-border-opacity, 1))}.ov-border-emerald-100{--tw-border-opacity: 1;border-color:rgb(209 250 229 / var(--tw-border-opacity, 1))}.ov-border-rose-100{--tw-border-opacity: 1;border-color:rgb(255 228 230 / var(--tw-border-opacity, 1))}.ov-border-sky-100{--tw-border-opacity: 1;border-color:rgb(224 242 254 / var(--tw-border-opacity, 1))}.ov-border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.ov-border-white\/40{border-color:#fff6}.ov-border-white\/80{border-color:#fffc}.ov-bg-clinic-50{--tw-bg-opacity: 1;background-color:rgb(246 251 252 / var(--tw-bg-opacity, 1))}.ov-bg-clinic-900{--tw-bg-opacity: 1;background-color:rgb(41 63 72 / var(--tw-bg-opacity, 1))}.ov-bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.ov-bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.ov-bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.ov-bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.ov-bg-white\/80{background-color:#fffc}.ov-bg-white\/85{background-color:#ffffffd9}.ov-bg-\[linear-gradient\(180deg\,_\#f7fbfc_0\%\,_\#e2eef1_55\%\,_\#d4e5ea_100\%\)\]{background-image:linear-gradient(180deg,#f7fbfc,#e2eef1 55%,#d4e5ea)}.ov-bg-\[radial-gradient\(circle_at_top_left\,_rgba\(255\,255\,255\,0\.98\)\,_rgba\(240\,248\,249\,0\.98\)_40\%\,_rgba\(229\,239\,241\,1\)_100\%\)\]{background-image:radial-gradient(circle at top left,#fffffffa,#f0f8f9fa 40%,#e5eff1)}.ov-fill-slate-700{fill:#334155}.ov-p-3{padding:.75rem}.ov-p-4{padding:1rem}.ov-px-3{padding-left:.75rem;padding-right:.75rem}.ov-py-1{padding-top:.25rem;padding-bottom:.25rem}.ov-py-2{padding-top:.5rem;padding-bottom:.5rem}.ov-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.ov-pb-1{padding-bottom:.25rem}.ov-text-2xl{font-size:1.5rem;line-height:2rem}.ov-text-\[10px\]{font-size:10px}.ov-text-\[11px\]{font-size:11px}.ov-text-lg{font-size:1.125rem;line-height:1.75rem}.ov-text-sm{font-size:.875rem;line-height:1.25rem}.ov-text-xs{font-size:.75rem;line-height:1rem}.ov-font-medium{font-weight:500}.ov-font-semibold{font-weight:600}.ov-uppercase{text-transform:uppercase}.ov-leading-6{line-height:1.5rem}.ov-tracking-\[0\.22em\]{letter-spacing:.22em}.ov-tracking-\[0\.3em\]{letter-spacing:.3em}.ov-text-clinic-600{--tw-text-opacity: 1;color:rgb(51 111 128 / var(--tw-text-opacity, 1))}.ov-text-clinic-700{--tw-text-opacity: 1;color:rgb(46 91 105 / var(--tw-text-opacity, 1))}.ov-text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.ov-text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.ov-text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.ov-text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.ov-text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.ov-text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.ov-shadow-panel{--tw-shadow: 0 16px 40px rgba(22, 56, 68, .14);--tw-shadow-colored: 0 16px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ov-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ov-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ov-odontogram,.ov-odontogram *{box-sizing:border-box}.ov-odontogram{color-scheme:light;font-family:IBM Plex Sans,Segoe UI,sans-serif}.ov-odontogram button,.ov-odontogram svg,.ov-odontogram polygon,.ov-odontogram text{-webkit-tap-highlight-color:transparent}.hover\:ov-border-clinic-400:hover{--tw-border-opacity: 1;border-color:rgb(99 175 188 / var(--tw-border-opacity, 1))}.hover\:ov-bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:ov-text-clinic-700:hover{--tw-text-opacity: 1;color:rgb(46 91 105 / var(--tw-text-opacity, 1))}.hover\:ov-opacity-85:hover{opacity:.85}@media(min-width:640px){.sm\:ov-w-auto{width:auto}.sm\:ov-flex-row{flex-direction:row}.sm\:ov-items-center{align-items:center}.sm\:ov-justify-between{justify-content:space-between}.sm\:ov-gap-6{gap:1.5rem}.sm\:ov-rounded-\[28px\]{border-radius:28px}.sm\:ov-rounded-\[32px\]{border-radius:32px}.sm\:ov-p-4{padding:1rem}.sm\:ov-p-5{padding:1.25rem}.sm\:ov-p-6{padding:1.5rem}.sm\:ov-px-4{padding-left:1rem;padding-right:1rem}.sm\:ov-py-8{padding-top:2rem;padding-bottom:2rem}.sm\:ov-text-3xl{font-size:1.875rem;line-height:2.25rem}}@media(min-width:768px){.md\:ov-p-6{padding:1.5rem}.md\:ov-px-8{padding-left:2rem;padding-right:2rem}.md\:ov-text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:ov-text-base{font-size:1rem;line-height:1.5rem}}@media(min-width:1024px){.lg\:ov-grid-cols-\[1\.25fr_0\.75fr\]{grid-template-columns:1.25fr .75fr}}