@yewdiel21/motion-kit 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +245 -222
  2. package/bin/motion-kit.mjs +0 -0
  3. package/dist/auto/index.d.ts +4 -3
  4. package/dist/auto/index.js +5 -3
  5. package/dist/auto/index.js.map +1 -1
  6. package/dist/{chunk-QFBOHPWZ.js → chunk-CQP66AZK.js} +2 -2
  7. package/dist/{chunk-QP4QJOEN.js → chunk-H4STLMCM.js} +2 -2
  8. package/dist/{chunk-AWDEKDEJ.js → chunk-LIXSOGS2.js} +8 -22
  9. package/dist/chunk-LIXSOGS2.js.map +1 -0
  10. package/dist/{chunk-Q7IW4FV3.js → chunk-NCGNIPJE.js} +1430 -968
  11. package/dist/chunk-NCGNIPJE.js.map +1 -0
  12. package/dist/{chunk-DOOMULVV.js → chunk-OLT3CWDJ.js} +4 -2
  13. package/dist/chunk-OLT3CWDJ.js.map +1 -0
  14. package/dist/{chunk-EDMXWUW3.js → chunk-PVN7YVKV.js} +3 -3
  15. package/dist/css/components/code-block.css +267 -0
  16. package/dist/css/components/command-search.css +274 -2
  17. package/dist/css/components/dialog.css +264 -0
  18. package/dist/css/components/heatmap-chart.css +267 -1
  19. package/dist/css/components/pill-button.css +7 -5
  20. package/dist/css/components/scroll-area.css +261 -0
  21. package/dist/css/components/scroll-island.css +6 -0
  22. package/dist/css/components/select.css +284 -4
  23. package/dist/elements/index.d.ts +15 -4
  24. package/dist/elements/index.js +36 -6
  25. package/dist/elements/index.js.map +1 -1
  26. package/dist/{engine-t8d7brjn.d.ts → engine-D6XV-WNt.d.ts} +50 -1
  27. package/dist/gl/index.js +2 -2
  28. package/dist/index.css +321 -12
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +7 -5
  31. package/dist/index.js.map +1 -1
  32. package/dist/react/index.d.ts +20 -7
  33. package/dist/react/index.js +56 -7
  34. package/dist/react/index.js.map +1 -1
  35. package/dist/{reduced-dPsZYqtI.d.ts → reduced-4croIXl-.d.ts} +1 -1
  36. package/dist/{store-6hZNKiee.d.ts → store-CAHWkurn.d.ts} +1 -1
  37. package/package.json +117 -110
  38. package/registry.json +1357 -1340
  39. package/src/auto/auto-init.ts +341 -339
  40. package/src/components/code-block/README.md +1 -1
  41. package/src/components/code-block/code-block.css +5 -0
  42. package/src/components/code-block/engine.ts +5 -0
  43. package/src/components/command-search/README.md +1 -1
  44. package/src/components/command-search/command-search.css +12 -2
  45. package/src/components/command-search/engine.ts +6 -0
  46. package/src/components/dialog/README.md +104 -103
  47. package/src/components/dialog/dialog.css +2 -0
  48. package/src/components/dialog/engine.ts +465 -449
  49. package/src/components/heatmap-chart/README.md +48 -48
  50. package/src/components/heatmap-chart/engine.ts +6 -1
  51. package/src/components/heatmap-chart/heatmap-chart.css +5 -1
  52. package/src/components/icons.ts +1 -0
  53. package/src/components/pill-button/engine.ts +1 -1
  54. package/src/components/pill-button/pill-button.css +7 -5
  55. package/src/components/scroll-area/README.md +89 -0
  56. package/src/components/scroll-area/element.ts +35 -0
  57. package/src/components/scroll-area/engine.ts +528 -0
  58. package/src/components/scroll-area/react.tsx +67 -0
  59. package/src/components/scroll-area/scroll-area.css +260 -0
  60. package/src/components/scroll-island/engine.ts +10 -1
  61. package/src/components/scroll-island/scroll-island.css +6 -0
  62. package/src/components/select/README.md +1 -1
  63. package/src/components/select/engine.ts +16 -4
  64. package/src/components/select/select.css +22 -4
  65. package/src/core/timing.ts +2 -0
  66. package/src/elements/index.ts +321 -318
  67. package/src/index.ts +1 -0
  68. package/src/motion/morph.ts +5 -2
  69. package/src/react/index.ts +2 -1
  70. package/dist/chunk-AWDEKDEJ.js.map +0 -1
  71. package/dist/chunk-DOOMULVV.js.map +0 -1
  72. package/dist/chunk-Q7IW4FV3.js.map +0 -1
  73. /package/dist/{chunk-QFBOHPWZ.js.map → chunk-CQP66AZK.js.map} +0 -0
  74. /package/dist/{chunk-QP4QJOEN.js.map → chunk-H4STLMCM.js.map} +0 -0
  75. /package/dist/{chunk-EDMXWUW3.js.map → chunk-PVN7YVKV.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/chat.ts","../src/components/theme-picker/engine.ts","../src/components/toast/store.ts","../src/components/toast/engine.ts","../src/components/chat/engine.ts","../src/components/nav/engine.ts","../src/components/cursor/engine.ts","../src/components/island/engine.ts","../src/components/pill-button/engine.ts","../src/components/toolbar/engine.ts","../src/components/bidirectional-slider/engine.ts","../src/components/voice-dots/engine.ts","../src/components/chart/parts.ts","../src/components/pie-chart/engine.ts","../src/components/radar-chart/engine.ts","../src/components/radial-chart/engine.ts","../src/components/sankey-chart/engine.ts","../src/components/heatmap-chart/engine.ts","../src/components/orbit-menu/engine.ts"],"sourcesContent":["import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { splitWords } from '../core/split';\n\n/*\n * chat (PrettyChat): new bubbles grow from their speaker's side\n * (scale .5, 24 px blur, 0.7 s, 60 ms apart) while their words rise into place\n * (16 px, 6 px blur, 0.25 s, 50 ms apart, back.out). Words are split only for\n * the animation; tables and code stay whole; if splitting would reflow the text\n * by more than half a line, the text block moves as one.\n */\n\nexport interface EnterMessagesOptions {\n /** Text inside each bubble whose words rise. */\n textSelector?: string;\n}\n\nconst isUser = (bubble: HTMLElement) => bubble.dataset.mkRole === 'user' || bubble.classList.contains('user');\n\nexport function enterMessages(bubbles: HTMLElement[], { textSelector = '[data-mk-text], .message-text' }: EnterMessagesOptions = {}) {\n if (!bubbles.length || reduced()) return null;\n registerMotion();\n const reverts: Array<() => void> = [];\n const cleanup = () => {\n for (const revert of reverts.splice(0)) revert();\n };\n const timeline = gsap.timeline({ onComplete: cleanup, onInterrupt: cleanup });\n bubbles.forEach((bubble, index) => {\n gsap.set(bubble, { transformOrigin: isUser(bubble) ? '100% 50%' : '0% 50%' });\n timeline.fromTo(\n bubble,\n { scale: 0.5, autoAlpha: 0, filter: 'blur(24px)' },\n { scale: 1, autoAlpha: 1, filter: 'blur(0px)', duration: TIMING.bubble, ease: EASE.signature, clearProps: 'transform,opacity,visibility,filter' },\n index * TIMING.bubbleStagger,\n );\n const text = bubble.querySelector<HTMLElement>(textSelector);\n if (!text) return;\n const before = text.offsetHeight;\n const split = splitWords(text);\n const lineHeight = parseFloat(getComputedStyle(text).lineHeight) || 0;\n let targets: HTMLElement[] = split.parts;\n if (!split.parts.length || text.offsetHeight - before > lineHeight / 2) {\n split.revert();\n targets = [text];\n } else reverts.push(() => split.revert());\n timeline.fromTo(\n targets,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n },\n index * TIMING.bubbleStagger,\n );\n });\n return timeline;\n}\n\n/** A message box grows or shrinks to its text (0.18 s, power2.out), from `min` px. */\nexport function fitComposer(field: HTMLTextAreaElement, min = 64) {\n const from = field.offsetHeight;\n field.style.height = 'auto';\n const to = Math.max(min, field.scrollHeight);\n field.style.height = `${from}px`;\n if (from === to || reduced()) {\n field.style.height = `${to}px`;\n return null;\n }\n registerMotion();\n return gsap.to(field, { height: to, duration: TIMING.composer, ease: 'power2.out', overwrite: 'auto' });\n}\n\n/** Scroll a conversation to its newest message. */\nexport function scrollToLatest(scroller: HTMLElement) {\n const top = scroller.scrollHeight - scroller.clientHeight;\n if (reduced()) {\n scroller.scrollTop = top;\n return null;\n }\n registerMotion();\n const state = { top: scroller.scrollTop };\n return gsap.to(state, {\n top,\n duration: TIMING.chatScroll,\n ease: EASE.chatScroll,\n overwrite: 'auto',\n onUpdate: () => {\n scroller.scrollTop = state.top;\n },\n });\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { flowInPalette } from '../../motion/entrances';\nimport { THEMES } from '../../theme/presets';\nimport { THEME_EVENT, getTheme, setTheme } from '../../theme/theme';\n\n/*\n * theme picker: colour balls pop in (scale .5, blur 4, 10 ms apart);\n * a ball rounds into a squircle on hover and into a rounded square when chosen\n * (0.5 s, cubic(.38,.49,0,1.5)), with two blurred lights drifting inside.\n * Clicking one applies the theme (setTheme); external changes keep it in sync.\n */\n\nexport interface ThemePickerOptions {\n /** Theme ids to show, in order. Default: visible presets, or all with showHidden. */\n themes?: string[];\n showHidden?: boolean;\n labels?: { group?: string };\n onChange?: (id: string) => void;\n}\n\nexport interface ThemePickerInstance extends Instance {\n select(id: string): void;\n}\n\nexport function createThemePicker(root: HTMLElement | null, options: ThemePickerOptions = {}): ThemePickerInstance {\n if (!root) {\n warnOnce('theme-picker: missing root');\n return inert({ select() {} });\n }\n registerMotion();\n const scope = createScope();\n const ctx = gsap.context(() => {});\n const generated: HTMLElement[] = [];\n\n let swatches = [...root.querySelectorAll<HTMLElement>('[data-mk-swatch]')];\n if (!swatches.length) {\n const byId = new Map(THEMES.map((theme) => [theme.id as string, theme]));\n const ids = options.themes ?? THEMES.filter((theme) => options.showHidden || !theme.hidden).map((theme) => theme.id);\n for (const id of ids) {\n const theme = byId.get(id);\n if (!theme) {\n warnOnce(`theme-picker: unknown theme \"${id}\"`);\n continue;\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'mk-swatch';\n button.dataset.mkSwatch = theme.id;\n button.title = theme.name;\n button.setAttribute('aria-label', theme.name);\n button.style.setProperty('--mk-swatch', theme.seed);\n root.append(button);\n generated.push(button);\n }\n swatches = generated;\n }\n\n scope.attr(root, 'role', 'group');\n if (!root.hasAttribute('aria-label')) scope.attr(root, 'aria-label', options.labels?.group ?? 'Tema');\n\n const sync = () => {\n const current = getTheme().id;\n for (const swatch of swatches) scope.attr(swatch, 'aria-pressed', String(swatch.dataset.mkSwatch === current));\n };\n const select = (id: string) => {\n setTheme(id);\n options.onChange?.(id);\n };\n\n scope.on(root, 'click', (event) => {\n const swatch = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-swatch]');\n if (swatch && root.contains(swatch) && swatch.dataset.mkSwatch) select(swatch.dataset.mkSwatch);\n });\n scope.on(document, THEME_EVENT, sync);\n sync();\n if (entrances()) ctx.add(() => flowInPalette(swatches));\n root.dataset.mkReady = '';\n\n return {\n select,\n destroy() {\n scope.dispose();\n ctx.revert();\n for (const button of generated.splice(0)) button.remove();\n delete root.dataset.mkReady;\n },\n };\n}\n","/*\n * The toasts on screen and their timers. Framework-agnostic: any number of toasters (vanilla, element, React)\n * render the same list. A timer pauses while the deck is open and resumes with\n * what was left. Never put a secret in a message: toasts confirm an action.\n */\n\nexport type ToastTone = 'success' | 'error' | 'info' | 'neutral';\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface ToastOptions {\n /** The control the toast grows out of. */\n origin?: HTMLElement | null;\n /** ms on screen; 0 keeps it until dismissed. */\n duration?: number;\n tone?: ToastTone;\n action?: ToastAction;\n /** Show the tone's icon (default). */\n icon?: boolean;\n}\n\nexport interface ToastItem {\n id: number;\n message: string;\n origin: HTMLElement | null;\n duration: number;\n tone: ToastTone;\n action: ToastAction | null;\n icon: boolean;\n closing: boolean;\n}\n\n/** At most this many live toasts; older ones leave to make room. */\nexport const TOAST_LIMIT = 5;\n\nlet items: ToastItem[] = [];\nlet nextId = 1;\nconst listeners = new Set<() => void>();\nconst emit = () => {\n for (const listener of listeners) listener();\n};\n\nexport const getToasts = () => items;\n\nexport function subscribeToasts(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction show(message: string, { origin = null, duration = 4000, tone = 'success', action, icon = true }: ToastOptions = {}) {\n const id = nextId++;\n const live = items.filter((item) => !item.closing);\n const extra = new Set(live.slice(0, Math.max(0, live.length - TOAST_LIMIT + 1)).map((item) => item.id));\n items = [\n ...items.map((item) => (extra.has(item.id) ? { ...item, closing: true } : item)),\n { id, message, origin, duration, tone, action: action ?? null, icon, closing: false },\n ];\n emit();\n return id;\n}\n\n/** Start the closing animation of a toast. */\nexport function dismissToast(id: number) {\n const item = items.find((entry) => entry.id === id);\n if (!item || item.closing) return;\n items = items.map((entry) => (entry.id === id ? { ...entry, closing: true } : entry));\n emit();\n}\n\n/** Take a toast out of the list (after its exit animation). */\nexport function removeToast(id: number) {\n toastTimers.clear(id);\n items = items.filter((entry) => entry.id !== id);\n emit();\n}\n\n/** Remove every toast at once (no animation). */\nexport function clearToasts() {\n for (const item of items) toastTimers.clear(item.id);\n items = [];\n emit();\n}\n\n/** Show a toast: `toast('Copiado', { origin: button })`. Returns its id. */\nexport const toast = Object.assign(show, { dismiss: dismissToast, clear: clearToasts });\n\nconst running = new Map<number, { handle: ReturnType<typeof setTimeout> | null; remaining: number; started: number }>();\n\nexport const toastTimers = {\n start(id: number, duration: number) {\n if (duration <= 0 || running.has(id)) return;\n running.set(id, { handle: setTimeout(() => dismissToast(id), duration), remaining: duration, started: Date.now() });\n },\n pause(id: number) {\n const timer = running.get(id);\n if (!timer?.handle) return;\n clearTimeout(timer.handle);\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.started));\n timer.handle = null;\n },\n resume(id: number) {\n const timer = running.get(id);\n if (!timer || timer.handle) return;\n if (timer.remaining <= 0) {\n dismissToast(id);\n return;\n }\n timer.started = Date.now();\n timer.handle = setTimeout(() => dismissToast(id), timer.remaining);\n },\n clear(id: number) {\n const timer = running.get(id);\n if (timer?.handle) clearTimeout(timer.handle);\n running.delete(id);\n },\n};\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { bezier, channels, easeInCubic, easeOut, easeOutCubic, eased, spring, springEase } from '../../core/channels';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitGraphemes } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { iconSvg, type IconName } from '../icons';\nimport { dismissToast, getToasts, removeToast, subscribeToasts, toastTimers, type ToastItem, type ToastTone } from './store';\n\n/*\n * toast deck:\n * - toasts stack at the top; older ones peek out 16 px below, 5 % smaller each,\n * three drawn; hovering opens the deck (spring .55, 60 ms cascade) and pauses\n * the timers, leaving closes it after 150 ms;\n * - a toast with an origin grows out of that control (spring travel 144/14 with\n * a 2400 px/s kick, size 0.32 s, content zooming in from twice its size);\n * otherwise it slides in 12 px out of a 6 px blur; its letters rise one by one;\n * - it leaves 24 px up into a 4 px blur (0.3 s) and can be swiped up (48 px) or\n * wheeled away (80 px).\n */\n\nconst STACK = { peek: 16, scaleStep: 0.05, minScale: 0.7, maxVisible: 3, gap: 8, baseZ: 1000 };\nconst DISTANCE = { enter: 12, enterBlur: 6, exit: 24, exitBlur: 4, fade: 120 };\nconst GESTURE = { swipe: 48, wheel: 80, expandDrag: 24, resistance: 0.15, wheelEndMs: 140 };\nconst TONE_ICONS: Record<ToastTone, IconName | null> = { success: 'check', error: 'alert', info: 'info', neutral: null };\n\nexport interface ToasterLabels {\n dismiss?: string;\n}\n\nexport interface ToasterOptions {\n labels?: ToasterLabels;\n}\n\nexport type ToasterInstance = Instance;\n\ninterface Card {\n card: HTMLElement;\n shell: HTMLElement;\n body: HTMLElement;\n message: HTMLElement;\n}\n\n/** Where each live toast rests: index 0 is the newest, on top. */\nfunction layout(count: number, expanded: boolean, heights: number[]) {\n let offset = 0;\n return Array.from({ length: count }, (_, index) => {\n if (expanded) {\n const slot = { y: offset, scale: 1, opacity: 1, visible: true, zIndex: STACK.baseZ - index };\n offset += (heights[index] ?? 0) + STACK.gap;\n return slot;\n }\n const visible = index < STACK.maxVisible;\n return {\n y: index * STACK.peek,\n scale: Math.max(STACK.minScale, 1 - index * STACK.scaleStep),\n opacity: visible ? 1 : 0,\n visible,\n zIndex: STACK.baseZ - index,\n };\n });\n}\n\n/** A message's letters rise into place (graphemes, words kept together, at most 64). */\nfunction revealLetters(element: HTMLElement) {\n const text = element.textContent ?? '';\n const T = TIMING.toast;\n if (!text || text.length > 64 || reduced()) return;\n const letters = splitGraphemes(text, 64);\n const original = element.innerHTML;\n const width = element.getBoundingClientRect().width;\n const fragment = document.createDocumentFragment();\n const chars: HTMLSpanElement[] = [];\n let word: HTMLSpanElement | null = null;\n for (const letter of letters) {\n if (!letter.trim()) {\n word = null;\n fragment.append(document.createTextNode(letter));\n continue;\n }\n if (!word) {\n word = document.createElement('span');\n word.style.display = 'inline-block';\n word.style.whiteSpace = 'nowrap';\n fragment.append(word);\n }\n const char = document.createElement('span');\n char.textContent = letter;\n char.style.display = 'inline-block';\n word.append(char);\n chars.push(char);\n }\n if (width) element.style.width = `${width}px`;\n element.textContent = '';\n element.append(fragment);\n gsap.fromTo(\n chars,\n { opacity: 0, yPercent: 40, filter: 'blur(4px)' },\n {\n opacity: 1,\n yPercent: 0,\n filter: 'blur(0px)',\n duration: T.chars,\n ease: easeOutCubic,\n delay: (index: number) => T.charsDelay + index * T.charsStagger,\n onComplete: () => {\n element.innerHTML = original;\n element.style.width = '';\n },\n },\n );\n}\n\n/** Grow a toast's shell out of `origin`. Returns a function that settles it now. */\nfunction morphFrom(card: HTMLElement, shell: HTMLElement, body: HTMLElement, origin: HTMLElement) {\n const T = TIMING.toast;\n const box = shell.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const look = getComputedStyle(origin);\n const own = getComputedStyle(shell);\n const endRadius = parseFloat(own.borderTopLeftRadius) || 20;\n const startRadius = Math.min(parseFloat(look.borderTopLeftRadius) || 0, start.height / 2);\n card.style.width = `${box.width}px`;\n card.style.height = `${box.height}px`;\n body.style.width = `${body.getBoundingClientRect().width}px`;\n const towardX = start.left + start.width / 2 < innerWidth / 2 ? 1 : -1;\n const towardY = start.top + start.height / 2 < innerHeight / 2 ? 1 : -1;\n const offset = { x: start.left - box.left, y: start.top - box.top };\n Object.assign(shell.style, {\n position: 'absolute',\n top: '0px',\n left: '0px',\n width: `${start.width}px`,\n height: `${start.height}px`,\n borderRadius: `${startRadius}px`,\n background: look.backgroundColor,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n transition: 'none',\n });\n Object.assign(body.style, { transform: 'scale(2)', transformOrigin: 'center center', filter: 'blur(8px)', opacity: '0' });\n // The control steps aside while its toast leaves it.\n origin.style.transition = 'opacity 160ms ease';\n origin.style.opacity = '0';\n void shell.offsetWidth;\n shell.style.transition = `background ${T.morphColor}s ease-out ${T.morphColorDelay}s, box-shadow ${T.morphShadow}s ease-out ${T.morphShadowDelay}s`;\n shell.style.background = '';\n body.style.transition = `opacity ${T.morphColor}s ease-out ${T.morphColorDelay}s`;\n body.style.opacity = '1';\n const motion = channels(\n { x: offset.x, y: offset.y, width: start.width, height: start.height, radius: startRadius, scale: 2, blur: 8 },\n (name, value) => {\n if (name === 'x') offset.x = value;\n else if (name === 'y') offset.y = value;\n else if (name === 'width') shell.style.width = `${value}px`;\n else if (name === 'height') shell.style.height = `${value}px`;\n else if (name === 'radius') shell.style.borderRadius = `${value}px`;\n else if (name === 'scale') body.style.transform = `scale(${value})`;\n else if (name === 'blur') body.style.filter = `blur(${value}px)`;\n if (name === 'x' || name === 'y') shell.style.transform = `translate(${offset.x}px, ${offset.y}px)`;\n },\n );\n void motion.animate(\n { x: 0, y: 0, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n x: spring(144, 14, { velocity: 2400, direction: towardX }),\n y: spring(144, 14, { velocity: 2400, direction: towardY }),\n width: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(T.morphRadius, easeOut),\n scale: eased(T.morphContent, easeOut),\n blur: eased(T.morphContent, easeOut),\n },\n );\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n motion.stop();\n for (const name of ['position', 'top', 'left', 'width', 'height', 'border-radius', 'background', 'transform', 'transition']) shell.style.removeProperty(name);\n card.style.removeProperty('width');\n card.style.removeProperty('height');\n for (const name of ['transform', 'transform-origin', 'filter', 'opacity', 'width', 'transition']) body.style.removeProperty(name);\n origin.style.transition = 'opacity 300ms ease';\n origin.style.opacity = '';\n setTimeout(() => {\n origin.style.transition = '';\n }, 320);\n };\n const timer = setTimeout(settle, T.safetyMs);\n return settle;\n}\n\nfunction buildCard(item: ToastItem, dismissLabel: string): Card {\n const card = document.createElement('div');\n card.className = 'mk-toast';\n card.dataset.mkToast = String(item.id);\n card.dataset.mkTone = item.tone;\n const shell = document.createElement('div');\n shell.className = 'mk-toast__shell';\n const body = document.createElement('div');\n body.className = 'mk-toast__body';\n const icon = item.icon ? TONE_ICONS[item.tone] : null;\n if (icon) {\n const holder = document.createElement('span');\n holder.className = 'mk-toast__icon';\n holder.innerHTML = iconSvg(icon, 18);\n body.append(holder);\n }\n const message = document.createElement('span');\n message.className = 'mk-toast__message';\n message.textContent = item.message;\n body.append(message);\n if (item.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.className = 'mk-toast__action';\n action.dataset.mkToastAction = '';\n action.textContent = item.action.label;\n body.append(action);\n }\n const dismiss = document.createElement('button');\n dismiss.type = 'button';\n dismiss.className = 'mk-toast__dismiss';\n dismiss.dataset.mkToastDismiss = '';\n dismiss.setAttribute('aria-label', dismissLabel);\n dismiss.innerHTML = iconSvg('close', 14);\n body.append(dismiss);\n shell.append(body);\n card.append(shell);\n return { card, shell, body, message };\n}\n\n/** Render the toast list into `host` (a fixed layer at the top of the screen). */\nexport function createToaster(host: HTMLElement | null, options: ToasterOptions = {}): ToasterInstance {\n if (!host) {\n warnOnce('toaster: missing host');\n return inert();\n }\n registerMotion();\n const dismissLabel = options.labels?.dismiss ?? 'Cerrar';\n const scope = createScope();\n const cards = new Map<number, Card>();\n const entered = new Set<number>();\n const leaving = new Set<number>();\n const dragging = new Set<number>();\n const settles = new Map<number, () => void>();\n let expanded = false;\n let collapse: ReturnType<typeof setTimeout> | undefined;\n const popover = typeof host.showPopover === 'function';\n\n scope.attr(host, 'role', 'status');\n scope.attr(host, 'aria-live', 'polite');\n if (popover) scope.attr(host, 'popover', 'manual');\n\n const live = () =>\n getToasts()\n .filter((item) => !item.closing)\n .reverse()\n .map((item) => ({ item, entry: cards.get(item.id) }))\n .filter((pair): pair is { item: ToastItem; entry: Card } => pair.entry !== undefined);\n\n const slotsFor = () => {\n const entries = live();\n return { entries, slots: layout(entries.length, expanded, entries.map(({ entry }) => entry.card.offsetHeight)) };\n };\n\n const relayout = (duration: number = TIMING.toast.relayout, ease: gsap.EaseFunction = easeOutCubic, stagger = 0) => {\n const { entries, slots } = slotsFor();\n entries.forEach(({ item, entry }, index) => {\n const slot = slots[index];\n if (!slot) return;\n entry.card.style.zIndex = String(slot.zIndex);\n entry.card.style.pointerEvents = slot.visible ? 'auto' : 'none';\n entry.card.setAttribute('aria-hidden', slot.visible ? 'false' : 'true');\n if (dragging.has(item.id) || !entered.has(item.id)) return;\n gsap.to(entry.card, {\n xPercent: -50,\n y: slot.y,\n scale: slot.scale,\n opacity: slot.opacity,\n duration: reduced() ? 0 : duration,\n ease,\n delay: stagger * index,\n overwrite: 'auto',\n });\n });\n };\n const restingY = (id: number) => {\n const { entries, slots } = slotsFor();\n return slots[entries.findIndex(({ item }) => item.id === id)]?.y ?? 0;\n };\n\n const openDeck = () => {\n clearTimeout(collapse);\n if (expanded) return;\n expanded = true;\n for (const { item } of live()) toastTimers.pause(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n };\n const closeDeck = () => {\n clearTimeout(collapse);\n collapse = setTimeout(() => {\n if (!expanded) return;\n expanded = false;\n for (const { item } of live()) toastTimers.resume(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n }, TIMING.toast.collapseDelayMs);\n };\n\n const showLayer = (visible: boolean) => {\n if (!popover) return;\n try {\n if (host.matches(':popover-open')) host.hidePopover();\n if (visible) host.showPopover();\n } catch {\n // :popover-open unsupported (no popover API): nothing to toggle.\n }\n };\n\n const attachGestures = (item: ToastItem, card: HTMLElement) => {\n let start: { y: number; type: string } | null = null;\n let wheel: { offset: number; end: ReturnType<typeof setTimeout> | undefined } | null = null;\n const move = (offset: number) => gsap.set(card, { y: restingY(item.id) + offset, opacity: Math.max(0, 1 + Math.min(0, offset) / DISTANCE.fade) });\n const cancel = () => {\n dragging.delete(item.id);\n gsap.to(card, { y: restingY(item.id), opacity: 1, duration: 0.25, ease: easeOutCubic });\n if (!expanded) toastTimers.resume(item.id);\n };\n card.addEventListener('mouseenter', openDeck);\n card.addEventListener('mouseleave', closeDeck);\n card.addEventListener('pointerdown', (event) => {\n if (event.button !== 0 || (event.target as Element).closest('button, a, input, textarea, select, [role=\"button\"]')) return;\n start = { y: event.clientY, type: event.pointerType };\n card.setPointerCapture?.(event.pointerId);\n dragging.add(item.id);\n gsap.killTweensOf(card);\n toastTimers.pause(item.id);\n });\n card.addEventListener('pointermove', (event) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n move(dy < 0 ? dy : start.type === 'touch' ? dy * GESTURE.resistance : 0);\n });\n const up = (event: PointerEvent) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n const type = start.type;\n start = null;\n if (dy < -GESTURE.swipe) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else if (type === 'touch' && dy > GESTURE.expandDrag) {\n cancel();\n if (expanded) closeDeck();\n else openDeck();\n } else cancel();\n };\n card.addEventListener('pointerup', up);\n card.addEventListener('pointercancel', up);\n card.addEventListener(\n 'wheel',\n (event) => {\n const delta = event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n if (!wheel) {\n wheel = { offset: 0, end: undefined };\n dragging.add(item.id);\n toastTimers.pause(item.id);\n }\n wheel.offset = Math.min(0, wheel.offset - delta);\n move(wheel.offset);\n clearTimeout(wheel.end);\n wheel.end = setTimeout(() => {\n const offset = wheel?.offset ?? 0;\n wheel = null;\n if (offset < -GESTURE.wheel) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else cancel();\n }, GESTURE.wheelEndMs);\n },\n { passive: true },\n );\n card.addEventListener('click', (event) => {\n const target = event.target as Element;\n if (target.closest('[data-mk-toast-dismiss]')) dismissToast(item.id);\n else if (target.closest('[data-mk-toast-action]')) {\n item.action?.onClick();\n dismissToast(item.id);\n }\n });\n };\n\n const finishCard = (id: number) => {\n settles.get(id)?.();\n settles.delete(id);\n const entry = cards.get(id);\n if (entry) {\n gsap.killTweensOf(entry.card);\n entry.card.remove();\n }\n cards.delete(id);\n entered.delete(id);\n leaving.delete(id);\n dragging.delete(id);\n };\n\n const render = () => {\n const list = getToasts();\n const ids = new Set(list.map((item) => item.id));\n for (const id of [...cards.keys()]) if (!ids.has(id)) finishCard(id);\n for (const item of list) {\n if (!cards.has(item.id) && !item.closing) {\n const entry = buildCard(item, dismissLabel);\n cards.set(item.id, entry);\n host.append(entry.card);\n gsap.set(entry.card, { xPercent: -50 });\n attachGestures(item, entry.card);\n }\n }\n showLayer(list.some((item) => !item.closing) || leaving.size > 0);\n for (const item of list) {\n const entry = cards.get(item.id);\n if (!entry) continue;\n if (!entered.has(item.id) && !item.closing) {\n entered.add(item.id);\n toastTimers.start(item.id, item.duration);\n relayout();\n gsap.killTweensOf(entry.card);\n gsap.set(entry.card, { xPercent: -50, y: restingY(item.id), scale: 1, opacity: 1 });\n if (expanded) toastTimers.pause(item.id);\n revealLetters(entry.message);\n if (reduced()) continue;\n if (item.origin?.isConnected) settles.set(item.id, morphFrom(entry.card, entry.shell, entry.body, item.origin));\n else {\n const y = restingY(item.id);\n gsap.fromTo(\n entry.card,\n { y: y - DISTANCE.enter, opacity: 0, filter: `blur(${DISTANCE.enterBlur}px)` },\n { y, opacity: 1, filter: 'blur(0px)', duration: TIMING.toast.enter, ease: springEase(0.58, -3.5), clearProps: 'filter' },\n );\n }\n }\n if (item.closing && !leaving.has(item.id)) {\n leaving.add(item.id);\n toastTimers.clear(item.id);\n entry.card.style.zIndex = String(STACK.baseZ + 1);\n const done = () => {\n finishCard(item.id);\n removeToast(item.id);\n };\n if (reduced()) done();\n else {\n gsap.to(entry.card, {\n y: Number(gsap.getProperty(entry.card, 'y')) - DISTANCE.exit,\n opacity: 0,\n filter: `blur(${DISTANCE.exitBlur}px)`,\n duration: TIMING.toast.exit,\n ease: easeInCubic,\n overwrite: 'auto',\n onComplete: done,\n });\n }\n relayout();\n }\n }\n };\n\n scope.add(subscribeToasts(render));\n render();\n host.dataset.mkReady = '';\n\n return {\n destroy() {\n clearTimeout(collapse);\n for (const id of [...cards.keys()]) finishCard(id);\n showLayer(false);\n scope.dispose();\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, Flip, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitWords } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { enterMessages, fitComposer, scrollToLatest } from '../../motion/chat';\nimport { flowIn } from '../../motion/flow';\nimport { iconSvg } from '../icons';\n\n/*\n * Chat: new bubbles grow from their speaker's side while their\n * words rise (enterMessages); the conversation scrolls to the newest one\n * (0.35 s). A \"Pensando…\" placeholder shows only if the answer takes more than\n * 500 ms, and then morphs (Flip, 0.7 s, no scaling of the text) into the reply.\n * The composer grows with its text (0.18 s, from 64 px); Enter sends.\n * Parts: [data-mk-part] messages, composer, input, mic, send.\n * Messages: [data-mk-message] with data-mk-role=\"user|assistant|system\" and a [data-mk-text].\n */\n\nexport type ChatRole = 'user' | 'assistant' | 'system';\n\nexport interface ChatLabels {\n thinking?: string;\n}\n\nexport interface ChatOptions {\n /** Animate the messages already there when the chat starts (default: no, history stays still). */\n animateExisting?: boolean;\n /** Clear the input after sending (default). */\n clearOnSend?: boolean;\n labels?: ChatLabels;\n onSend?: (text: string) => void;\n}\n\nexport interface ChatInstance extends Instance {\n /** Append a plain-text message (vanilla convenience); it enters on its own. */\n add(role: ChatRole, text: string): HTMLElement;\n /** Show the thinking placeholder after 500 ms (a fast answer never shows it). */\n pending(): void;\n /** Add the answer: it morphs out of the placeholder if that was showing, else it enters. */\n reply(message: HTMLElement | string): HTMLElement;\n /** A confirmation bar flows in and its words rise. */\n confirm(bar: HTMLElement): void;\n setRecording(on: boolean): void;\n scrollToLatest(): void;\n /** Mark a message as already shown (a framework animates it itself). */\n adopt(message: Element): void;\n readonly messages: HTMLElement;\n}\n\nconst MESSAGE = '[data-mk-message]';\n/** data-flip-id of the thinking placeholder; a framework's own placeholder must carry it. */\nexport const PENDING_ID = 'mk-chat-pending';\nconst part = (root: HTMLElement, name: string) => root.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\n\n/** The thinking placeholder's geometry, taken before the DOM changes (for frameworks). */\nexport const capturePending = (placeholder: Element | null) => {\n registerMotion();\n return placeholder ? Flip.getState(placeholder) : null;\n};\n\n/** Morph a captured placeholder into the reply (after the DOM shows the reply). */\nexport function morphPendingToReply(state: ReturnType<typeof Flip.getState> | null, reply: HTMLElement, scroller?: HTMLElement | null) {\n registerMotion();\n if (!state || reduced()) {\n if (!reduced()) enterMessages([reply]);\n return null;\n }\n const text = reply.querySelector<HTMLElement>('[data-mk-text], .message-text');\n if (text) text.style.width = `${text.getBoundingClientRect().width}px`;\n // Flip pairs the reply with the placeholder by this id (the placeholder carries it too).\n reply.setAttribute('data-flip-id', PENDING_ID);\n const words = text && !text.querySelector('table, pre') ? splitWords(text) : null;\n if (words?.parts.length) {\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n }\n return Flip.from(state, {\n targets: reply,\n duration: TIMING.bubble,\n scale: false,\n ease: EASE.signature,\n onUpdate: () => {\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n },\n onComplete: () => {\n reply.removeAttribute('data-flip-id');\n if (text) text.style.width = '';\n },\n });\n}\n\n/** A message bubble element (plain text). */\nexport function chatMessage(role: ChatRole, text: string) {\n const message = document.createElement('div');\n message.dataset.mkMessage = '';\n message.dataset.mkRole = role;\n const body = document.createElement('span');\n body.dataset.mkText = '';\n body.textContent = text;\n message.append(body);\n return message;\n}\n\nexport function createChat(root: HTMLElement | null, options: ChatOptions = {}): ChatInstance {\n const messages = root ? part(root, 'messages') : null;\n if (!root || !messages) {\n warnOnce('chat: needs a [data-mk-part=\"messages\"] container');\n return inert({\n add: () => document.createElement('div'),\n pending() {},\n reply: () => document.createElement('div'),\n confirm() {},\n setRecording() {},\n scrollToLatest() {},\n adopt() {},\n messages: null as unknown as HTMLElement,\n });\n }\n registerMotion();\n const { clearOnSend = true } = options;\n const thinking = options.labels?.thinking ?? 'Pensando...';\n const scope = createScope();\n const composer = part(root, 'composer');\n const input = composer?.querySelector<HTMLTextAreaElement>('[data-mk-part=\"input\"], textarea') ?? null;\n const mic = part(root, 'mic');\n const seen = new WeakSet<Element>();\n let placeholder: HTMLElement | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | undefined;\n let waiting = false;\n\n scope.attr(messages, 'role', 'log');\n scope.attr(messages, 'aria-live', 'polite');\n const existing = [...messages.querySelectorAll<HTMLElement>(MESSAGE)];\n if (options.animateExisting) enterMessages(existing);\n for (const message of existing) seen.add(message);\n\n // New bubbles (from the app, a framework or add()) enter on their own.\n const observer = scope.observe(\n new MutationObserver((records) => {\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n if (!(node instanceof HTMLElement) || !node.matches(MESSAGE) || seen.has(node)) continue;\n seen.add(node);\n fresh.push(node);\n }\n }\n if (!fresh.length) return;\n enterMessages(fresh);\n scrollToLatest(messages);\n }),\n );\n observer.observe(messages, { childList: true });\n\n const clearPending = () => {\n clearTimeout(pendingTimer);\n pendingTimer = undefined;\n waiting = false;\n };\n\n const add = (role: ChatRole, text: string) => {\n const message = chatMessage(role, text);\n messages.append(message);\n return message;\n };\n\n const pending = () => {\n clearPending();\n waiting = true;\n pendingTimer = setTimeout(() => {\n pendingTimer = undefined;\n if (!waiting || placeholder) return;\n placeholder = document.createElement('div');\n placeholder.dataset.mkMessage = '';\n placeholder.dataset.mkRole = 'assistant';\n placeholder.dataset.mkPending = '';\n placeholder.setAttribute('data-flip-id', PENDING_ID);\n placeholder.innerHTML = `<span class=\"mk-chat__thinking\">${iconSvg('sparkle', 18)}<span></span></span>`;\n placeholder.querySelector('span span')!.textContent = thinking;\n seen.add(placeholder);\n messages.append(placeholder);\n enterMessages([placeholder]);\n scrollToLatest(messages);\n }, TIMING.chat.pendingDelayMs);\n };\n\n const reply = (content: HTMLElement | string) => {\n const message = typeof content === 'string' ? chatMessage('assistant', content) : content;\n clearPending();\n seen.add(message);\n const was = placeholder;\n placeholder = null;\n if (was?.isConnected) {\n const state = capturePending(was);\n was.replaceWith(message);\n morphPendingToReply(state, message, messages);\n } else {\n if (!message.isConnected) messages.append(message);\n enterMessages([message]);\n scrollToLatest(messages);\n }\n return message;\n };\n\n const confirm = (bar: HTMLElement) => {\n if (reduced()) return;\n flowIn(bar);\n const words = splitWords(bar);\n if (!words.parts.length) return;\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.chat.confirmWordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n };\n\n const send = () => {\n if (!input) return;\n const text = input.value.trim();\n if (!text) return;\n const allowed = root.dispatchEvent(new CustomEvent('mk:send', { bubbles: true, cancelable: true, detail: { text } }));\n if (!allowed) return;\n options.onSend?.(text);\n if (clearOnSend) {\n input.value = '';\n fitComposer(input);\n }\n };\n\n if (input) {\n scope.on(input, 'input', () => fitComposer(input));\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (key.key !== 'Enter' || key.shiftKey || key.isComposing) return;\n event.preventDefault();\n send();\n });\n }\n if (composer) {\n scope.on(composer, 'submit', (event) => {\n event.preventDefault();\n send();\n });\n const sendButton = part(root, 'send');\n if (sendButton && !composer.matches('form')) scope.on(sendButton, 'click', send);\n }\n scope.add(() => {\n clearPending();\n placeholder?.remove();\n placeholder = null;\n });\n if (input) fitComposer(input);\n root.dataset.mkReady = '';\n\n return {\n add,\n pending,\n reply,\n confirm,\n setRecording(on: boolean) {\n if (mic) scope.attr(mic, 'data-mk-recording', on ? '' : null);\n },\n scrollToLatest: () => scrollToLatest(messages),\n adopt: (message: Element) => seen.add(message),\n messages,\n destroy() {\n scope.dispose();\n if (input) input.style.removeProperty('height');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealFrom, type RevealHandle } from '../../motion/reveal';\n\n/*\n * navigation: seven desktop styles named after how they look (sidebar, pills,\n * dock, card, rail, wash, magnify) and one glass bar on phones, all in CSS (nav.css). The\n * engine marks the current page (aria-current=\"page\"), switches styles (and can\n * remember the choice), and on start can reveal the\n * app shell from the first button.\n * Parts: .mk-nav__buttons .mk-nav__button (data-mk-value or href), .mk-nav__button--first.\n */\n\nexport const NAV_STYLES = ['sidebar', 'pills', 'dock', 'card', 'rail', 'wash', 'magnify'] as const;\nexport type NavStyle = (typeof NAV_STYLES)[number];\n/** The names before 0.15, still accepted: each turns into the style it always was. */\nexport const NAV_STYLE_ALIASES = { clasica: 'sidebar', bonita: 'pills', guapa: 'card', tasks: 'rail', melon: 'wash', tunnel: 'magnify' } as const satisfies Record<string, NavStyle>;\nexport type NavStyleAlias = keyof typeof NAV_STYLE_ALIASES;\n/** A style name (new or old) as one of NAV_STYLES, or undefined. */\nexport const toNavStyle = (value: unknown): NavStyle | undefined =>\n NAV_STYLES.includes(value as NavStyle) ? (value as NavStyle) : (NAV_STYLE_ALIASES as Record<string, NavStyle>)[value as string];\n\nexport interface NavOptions {\n /** Default: the saved one (storageKey), else the mk-nav--<style> class in the markup, else 'pills'. Old names (clasica…) work too. */\n style?: NavStyle | NavStyleAlias;\n /** The accent variant: the current page in primary-container. */\n accent?: boolean;\n /** Reveal the shell from the first button when the nav starts (off by default). */\n reveal?: boolean;\n /** Remember the chosen style in localStorage under this key. */\n storageKey?: string;\n labels?: { nav?: string };\n onSelect?: (index: number, value: string | undefined, item: HTMLElement) => void;\n}\n\nexport interface NavInstance extends Instance {\n /** Mark a page as current, by index or value (silent: no event). */\n select(target: number | string): void;\n setStyle(style: NavStyle | NavStyleAlias): void;\n setAccent(on: boolean): void;\n readonly index: number;\n readonly style: NavStyle;\n readonly items: HTMLElement[];\n}\n\nexport interface NavigateDetail {\n index: number;\n value: string | undefined;\n item: HTMLElement;\n /** The click: call its preventDefault() to stop a link (single-page apps). */\n originalEvent: MouseEvent;\n}\n\nconst ITEM = '.mk-nav__buttons .mk-nav__button';\nconst valueOf = (item: HTMLElement) => item.dataset.mkValue ?? item.getAttribute('href') ?? undefined;\n\nconst read = (key: string) => {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n};\nconst write = (key: string, value: string) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Private mode or blocked storage: the style still changes for this page.\n }\n};\n\n/** nav entrance: the app shell is uncovered from the nav's first button. */\nexport function revealShell(nav: HTMLElement): RevealHandle | null {\n if (!entrances()) return null;\n const shell = nav.closest<HTMLElement>('.mk-shell') ?? nav.parentElement;\n if (!shell) return null;\n const origin = nav.querySelector<HTMLElement>('.mk-nav__button--first') ?? nav.querySelector<HTMLElement>(ITEM) ?? nav;\n return revealFrom(shell, { origin });\n}\n\nexport function createNav(root: HTMLElement | null, options: NavOptions = {}): NavInstance {\n if (!root) {\n warnOnce('nav: missing root');\n return inert({ select() {}, setStyle() {}, setAccent() {}, index: -1, style: 'pills', items: [] });\n }\n const scope = createScope();\n const items = () => [...root.querySelectorAll<HTMLElement>(ITEM)];\n const known = [...NAV_STYLES, ...Object.keys(NAV_STYLE_ALIASES)];\n const fromClass = toNavStyle(known.find((name) => root.classList.contains(`mk-nav--${name}`)));\n const saved = options.storageKey ? read(options.storageKey) : null;\n let style: NavStyle = toNavStyle(options.style) ?? toNavStyle(saved) ?? fromClass ?? 'pills';\n\n const paint = (accent: boolean) => {\n const classes = new Set(root.classList);\n for (const name of known) classes.delete(`mk-nav--${name}`);\n classes.add('mk-nav');\n classes.add(`mk-nav--${style}`);\n if (accent) classes.add('mk-nav--accent');\n else classes.delete('mk-nav--accent');\n scope.attr(root, 'class', [...classes].join(' '));\n };\n let accent = options.accent ?? root.classList.contains('mk-nav--accent');\n paint(accent);\n\n if (root.localName !== 'nav') scope.attr(root, 'role', 'navigation');\n if (!root.hasAttribute('aria-label') && !root.hasAttribute('aria-labelledby')) scope.attr(root, 'aria-label', options.labels?.nav ?? 'Principal');\n\n const mark = (current: HTMLElement | undefined) => {\n for (const item of items()) scope.attr(item, 'aria-current', item === current ? 'page' : null);\n };\n const find = (target: number | string) => {\n const list = items();\n return typeof target === 'number' ? list[target] : list.find((item) => valueOf(item) === target);\n };\n\n scope.on(root, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (!item || !root.contains(item)) return;\n const index = items().indexOf(item);\n const value = valueOf(item);\n const detail: NavigateDetail = { index, value, item, originalEvent: event as MouseEvent };\n if (!root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, cancelable: true, detail }))) {\n event.preventDefault();\n return;\n }\n mark(item);\n options.onSelect?.(index, value, item);\n });\n\n let reveal: RevealHandle | null = null;\n if (options.reveal) reveal = revealShell(root);\n root.dataset.mkReady = '';\n\n return {\n select(target) {\n const item = find(target);\n if (!item) warnOnce(`nav: no item ${JSON.stringify(target)}`);\n else mark(item);\n },\n setStyle(next) {\n const resolved = toNavStyle(next);\n if (!resolved) {\n warnOnce(`nav: unknown style \"${String(next)}\" (use ${NAV_STYLES.join(', ')})`);\n return;\n }\n style = resolved;\n paint(accent);\n if (options.storageKey) write(options.storageKey, resolved);\n },\n setAccent(on) {\n accent = on;\n paint(accent);\n },\n get index() {\n return items().findIndex((item) => item.getAttribute('aria-current') === 'page');\n },\n get style() {\n return style;\n },\n get items() {\n return items();\n },\n destroy() {\n reveal?.cancel();\n reveal = null;\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { subscribe } from '../../core/loop';\nimport { motionSpring } from '../../core/physics-spring';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { ICON_PATHS } from '../icons';\n\n/*\n * Two cursors.\n * chip: the system cursor stays; over [data-mk-cursor=\"Label\"] a glass\n * chip with the label follows the pointer on a Motion 800/35 spring, popping in\n * from scale .8 (500/30); data-mk-cursor-shape=\"circle\" makes it a 96 px disc;\n * it stays 10 px inside the window; its ink is the accent on light backgrounds\n * and white on dark ones.\n * dot: inside its zone a disc replaces the cursor and eases after it\n * (lerp .2 a frame) with a word (data-mk-cursor or `text`); pressing shrinks it\n * to .7, drops the word and slides two arrows in; [data-mk-cursor-hide] hides it.\n * Off on touch screens and with reduced motion.\n */\n\nexport type CursorVariant = 'chip' | 'dot';\n\nexport interface CursorOptions {\n variant?: CursorVariant;\n /** Where it works. chip: the document; dot: the host's parent. */\n zone?: Element | null;\n /** dot: the word when nothing under the pointer gives one. */\n text?: string;\n /** dot: arrows shown while pressed. */\n arrows?: 'x' | 'y' | 'none';\n}\n\nexport interface CursorInstance extends Instance {\n readonly visible: boolean;\n readonly label: string;\n readonly position: { x: number; y: number };\n readonly tone: 'light' | 'dark';\n /** One frame (dt = 1 at 60 Hz); the shared ticker calls it. */\n update(dt?: number): void;\n}\n\nconst svg = (extra = '') =>\n `<svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${extra}><path d=\"${ICON_PATHS.send}\"/></svg>`;\n\n/** the first background with alpha > .1 up the tree; light when (299R + 587G + 114B) / 1000 > 180. */\nfunction backgroundTone(el: Element | null): 'light' | 'dark' {\n if (!el) return 'light';\n if (el.closest('img, video, picture, canvas')) return 'dark';\n for (let node: Element | null = el; node; node = node.parentElement) {\n const match = getComputedStyle(node).backgroundColor.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (!match) continue;\n const alpha = match[4] === undefined ? 1 : parseFloat(match[4]);\n if (alpha <= 0.1) continue;\n const luminance = (Number(match[1]) * 299 + Number(match[2]) * 587 + Number(match[3]) * 114) / 1000;\n return luminance > TIMING.cursor.light ? 'light' : 'dark';\n }\n return 'light';\n}\n\nexport function createCursor(host: HTMLElement | null, options: CursorOptions = {}): CursorInstance {\n const variant = options.variant ?? 'chip';\n const idle = inert<CursorInstance>({ visible: false, label: '', position: { x: 0, y: 0 }, tone: 'light', update() {} });\n if (!host) {\n warnOnce('cursor: missing element');\n return idle;\n }\n const coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches;\n if (coarse || reduced()) return idle;\n registerMotion();\n const scope = createScope();\n const t = TIMING.cursor;\n const zone = options.zone ?? (variant === 'dot' ? (host.parentElement ?? document.body) : document.documentElement);\n scope.attr(host, 'class', [host.getAttribute('class'), 'mk-cursor', `mk-cursor--${variant}`].filter(Boolean).join(' '));\n scope.attr(host, 'aria-hidden', 'true');\n\n const pointer = { x: -100, y: -100, placed: false };\n const position = { x: -100, y: -100 };\n const velocity = { x: 0, y: 0 };\n let visible = false;\n let label = '';\n let tone: 'light' | 'dark' = 'light';\n const made: Element[] = [];\n\n // ── Markup ────────────────────────────────────────────────────────────────\n let chip: HTMLElement | null = null;\n let chipLabel: HTMLElement | null = null;\n let chipIcon: HTMLElement | null = null;\n let word: HTMLElement | null = null;\n const size = { width: 0, height: 0 };\n if (variant === 'chip') {\n chip = document.createElement('span');\n chip.className = 'mk-cursor__chip mk-glass';\n chip.innerHTML =\n '<span class=\"mk-glass__shadow\" aria-hidden=\"true\"></span><span class=\"mk-cursor__icon mk-icon\"></span><span class=\"mk-cursor__label\"></span>';\n chipIcon = chip.querySelector('.mk-cursor__icon');\n chipLabel = chip.querySelector('.mk-cursor__label');\n host.append(chip);\n made.push(chip);\n gsap.set(chip, { autoAlpha: 0, scale: 0.8 });\n } else {\n const arrows = options.arrows ?? 'y';\n scope.attr(host, 'data-mk-arrows', arrows);\n scope.attr(zone, 'data-mk-cursor-zone', '');\n const dot = document.createElement('span');\n dot.className = 'mk-cursor__dot';\n dot.innerHTML =\n arrows === 'none'\n ? '<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span>'\n : `<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__arrow mk-cursor__arrow--start\">${svg()}</span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span><span class=\"mk-cursor__arrow mk-cursor__arrow--end\">${svg()}</span>`;\n word = dot.querySelector('.mk-cursor__word');\n if (word) word.textContent = options.text ?? '';\n host.append(dot);\n made.push(dot);\n scope.attr(host, 'data-mk-hidden', '');\n }\n\n // ── Chip ──────────────────────────────────────────────────────────────────\n const appear = motionSpring(...TIMING.springs.cursorAppear);\n const showChip = (next: HTMLElement | null) => {\n if (!chip || !chipLabel || !chipIcon) return;\n const text = next?.dataset.mkCursor ?? '';\n if (text) {\n label = text;\n chipLabel.textContent = text;\n chipIcon.textContent = next?.dataset.mkCursorIcon ?? '';\n chip.classList.toggle('mk-cursor__chip--circle', next?.dataset.mkCursorShape === 'circle');\n const box = chip.getBoundingClientRect();\n size.width = box.width;\n size.height = box.height;\n }\n if (Boolean(text) === visible) return;\n visible = Boolean(text);\n if (!visible) label = '';\n gsap.to(chip, {\n autoAlpha: visible ? 1 : 0,\n scale: visible ? 1 : 0.8,\n duration: appear.duration,\n ease: appear.ease,\n overwrite: 'auto',\n });\n };\n\n // ── Dot ───────────────────────────────────────────────────────────────────\n let inZone = false;\n let overHide = false;\n const syncDot = () => scope.attr(host, 'data-mk-hidden', inZone && !overHide ? null : '');\n const wordFor = (target: Element | null) => {\n if (!word) return;\n const source = target?.closest<HTMLElement>('[data-mk-cursor]');\n word.textContent = source && zone.contains(source) ? (source.dataset.mkCursor ?? '') : (options.text ?? '');\n };\n\n // ── Events ────────────────────────────────────────────────────────────────\n const place = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n pointer.x = event.clientX;\n pointer.y = event.clientY;\n if (!pointer.placed) {\n pointer.placed = true;\n if (variant === 'dot') {\n position.x = pointer.x;\n position.y = pointer.y;\n }\n }\n };\n scope.on(window, 'pointermove', (event) => place(event as PointerEvent), { passive: true });\n const overTarget = variant === 'chip' ? document : zone;\n scope.on(overTarget, 'pointerover', (event) => {\n const target = event.target as Element | null;\n if (variant === 'chip') {\n const source = target?.closest<HTMLElement>('[data-mk-cursor]') ?? null;\n showChip(source && zone.contains(source) ? source : null);\n return;\n }\n overHide = Boolean(target?.closest('[data-mk-cursor-hide]'));\n wordFor(target);\n syncDot();\n });\n if (variant === 'dot') {\n scope.on(zone, 'pointerenter', (event) => {\n place(event as PointerEvent);\n inZone = true;\n visible = true;\n syncDot();\n });\n scope.on(zone, 'pointerleave', () => {\n inZone = false;\n visible = false;\n scope.attr(host, 'data-mk-pressed', null);\n syncDot();\n });\n scope.on(zone, 'pointerdown', () => scope.attr(host, 'data-mk-pressed', ''));\n scope.on(window, 'pointerup', () => scope.attr(host, 'data-mk-pressed', null));\n }\n\n // ── Frame ─────────────────────────────────────────────────────────────────\n const [stiffness, damping] = TIMING.springs.cursorFollow;\n const update = (dt = 1) => {\n if (variant === 'chip') {\n // Keeps the chip inside the window, 10 px from its edges.\n const halfW = size.width / 2 + t.gutter;\n const halfH = size.height / 2 + t.gutter;\n const tx = size.width ? Math.min(Math.max(pointer.x, halfW), innerWidth - halfW) : pointer.x;\n const ty = size.height ? Math.min(Math.max(pointer.y, halfH), innerHeight - halfH) : pointer.y;\n // Motion's spring, integrated in small steps.\n const steps = Math.max(1, Math.ceil(dt * 4));\n const h = dt / 60 / steps;\n for (let i = 0; i < steps; i++) {\n velocity.x += (stiffness * (tx - position.x) - damping * velocity.x) * h;\n velocity.y += (stiffness * (ty - position.y) - damping * velocity.y) * h;\n position.x += velocity.x * h;\n position.y += velocity.y * h;\n }\n if (visible && typeof document.elementFromPoint === 'function') {\n tone = backgroundTone(document.elementFromPoint(pointer.x, pointer.y));\n if (chip && chip.dataset.mkTone !== tone) chip.dataset.mkTone = tone;\n }\n } else {\n const step = 1 - Math.pow(1 - t.dotLerp, dt);\n position.x += (pointer.x - position.x) * step;\n position.y += (pointer.y - position.y) * step;\n }\n host.style.transform = `translate3d(${position.x.toFixed(2)}px, ${position.y.toFixed(2)}px, 0) translate(-50%, -50%)`;\n };\n scope.add(subscribe(update));\n update(0);\n host.dataset.mkReady = '';\n\n return {\n get visible() {\n return visible;\n },\n get label() {\n return label;\n },\n get position() {\n return { ...position };\n },\n get tone() {\n return tone;\n },\n update,\n destroy() {\n if (chip) gsap.killTweensOf(chip);\n scope.dispose();\n for (const node of made.splice(0)) node.remove();\n host.style.removeProperty('transform');\n if (host.getAttribute('style') === '') host.removeAttribute('style');\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances, reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * floating navbar: a frosted glass pill centred at the top that grows\n * into a rounded panel (CSS grid rows 0fr → 1fr, 0.6 s cubic-bezier(.625,.05,0,1),\n * 0.125 s late; radius 3em → 2em) while the page behind darkens to .4 and the\n * panel's rows rise in 0.15 s + 0.025 s apart. Several triggers share the shell:\n * the same one closes, another switches straight to its panel. Escape, the\n * backdrop, a link inside and scrolling after a wheel/touch close it. On load it\n * drops in from −300 % over 1.8 s.\n *\n * Markup: [data-mk-island-toggle=\"name\"] buttons, [data-mk-island-panel=\"name\"]\n * sections, [data-mk-island-item] rows, [data-mk-island-close] backdrop,\n * .mk-island__shell and .mk-island__cta (hidden while open).\n */\n\nexport interface IslandOptions {\n /** Drop in from above on load (true), wait for ready() ('manual') or not at all. */\n entrance?: boolean | 'manual';\n /** Close when the page scrolls after a wheel or touch. */\n closeOnScroll?: boolean;\n /** Close when a link inside a panel is followed. */\n closeOnNavigate?: boolean;\n /** Focus the first control of the panel that opens. */\n focusOnOpen?: boolean;\n /** The open panel's name, or null when it closes. */\n onChange?: (active: string | null) => void;\n}\n\nexport interface IslandInstance extends Instance {\n open(name?: string): void;\n close(returnFocus?: boolean): void;\n toggle(name?: string): void;\n /** Play the entrance (entrance: 'manual'). */\n ready(): void;\n readonly active: string | null;\n}\n\nlet sequence = 0;\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function createIsland(root: HTMLElement | null, options: IslandOptions = {}): IslandInstance {\n const shell = root?.querySelector<HTMLElement>('.mk-island__shell') ?? null;\n const panels = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-island-panel]')] : [];\n if (!root || !shell || !panels.length) {\n warnOnce('island: needs .mk-island__shell and at least one [data-mk-island-panel]');\n return inert({ open() {}, close() {}, toggle() {}, ready() {}, active: null });\n }\n const t = TIMING.island;\n const { entrance = true, closeOnScroll = true, closeOnNavigate = true, focusOnOpen = true, onChange } = options;\n registerMotion();\n const scope = createScope();\n const toggles = [...root.querySelectorAll<HTMLElement>('[data-mk-island-toggle]')];\n const cta = root.querySelector<HTMLElement>('.mk-island__cta');\n const backdrops = [...root.querySelectorAll<HTMLElement>('[data-mk-island-close]')];\n let active: string | null = null;\n let trigger: HTMLElement | null = null;\n let scrollStart = 0;\n let armed = false;\n let focusTimer: ReturnType<typeof setTimeout> | undefined;\n let entered = false;\n let entry: gsap.core.Tween | null = null;\n\n const flag = (el: Element | null, name: string, on: boolean) => {\n if (el) scope.attr(el, name, on ? '' : null);\n };\n const sync = () => {\n for (const panel of panels) {\n const on = panel.dataset.mkIslandPanel === active;\n // A closing panel stays in the collapsing grid for its exit.\n if (active) flag(panel, 'hidden', !on);\n scope.attr(panel, 'aria-hidden', String(!on));\n flag(panel, 'inert', !on);\n }\n for (const button of toggles) scope.attr(button, 'aria-expanded', String(button.dataset.mkIslandToggle === active));\n flag(cta, 'inert', Boolean(active));\n for (const backdrop of backdrops) {\n flag(backdrop, 'inert', !active);\n scope.attr(backdrop, 'aria-hidden', String(!active));\n }\n flag(root, 'data-mk-open', Boolean(active));\n scope.attr(root, 'data-mk-active', active);\n };\n const stagger = (opening: boolean) => {\n root.querySelectorAll<HTMLElement>('[data-mk-island-item]').forEach((item, index) => {\n // Saves the original style once, so destroy() puts it back.\n scope.attr(item, 'style', item.getAttribute('style'));\n item.style.setProperty('--mk-island-delay', opening ? `${Number((t.delay + index * t.step).toFixed(3))}s` : '0s');\n });\n };\n\n const close = (returnFocus = true) => {\n if (scope.disposed || !active) return;\n clearTimeout(focusTimer);\n active = null;\n stagger(false);\n sync();\n onChange?.(null);\n if (returnFocus && trigger?.isConnected) trigger.focus({ preventScroll: true });\n };\n const open = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => {\n if (scope.disposed) return;\n const panel = panels.find((el) => el.dataset.mkIslandPanel === name);\n if (!panel) return;\n const wasClosed = !active;\n clearTimeout(focusTimer);\n active = name;\n trigger = source ?? toggles.find((el) => el.dataset.mkIslandToggle === name) ?? trigger;\n if (wasClosed) {\n scrollStart = window.scrollY;\n armed = false;\n stagger(true);\n }\n sync();\n onChange?.(name);\n if (focusOnOpen)\n focusTimer = setTimeout(\n () => {\n if (active !== name) return;\n const first = [...panel.querySelectorAll<HTMLElement>(FOCUSABLE)].find((el) => !el.closest('[hidden], [inert]'));\n (first ?? panel).focus({ preventScroll: true });\n },\n reduced() ? 0 : t.focus,\n );\n };\n const toggle = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => (active === name ? close(false) : open(name, source));\n\n for (const panel of panels) {\n if (!panel.id) scope.attr(panel, 'id', `mk-island-panel-${++sequence}`);\n if (!panel.hasAttribute('tabindex')) scope.attr(panel, 'tabindex', '-1');\n if (!panel.hasAttribute('role')) scope.attr(panel, 'role', 'region');\n }\n for (const button of toggles) {\n const panel = panels.find((el) => el.dataset.mkIslandPanel === button.dataset.mkIslandToggle);\n if (panel) scope.attr(button, 'aria-controls', panel.id);\n scope.on(button, 'click', () => toggle(button.dataset.mkIslandToggle, button));\n }\n for (const backdrop of backdrops) scope.on(backdrop, 'click', () => close(true));\n scope.on(document, 'keydown', (event) => {\n if (active && (event as KeyboardEvent).key === 'Escape') {\n event.preventDefault();\n close(true);\n }\n });\n if (closeOnNavigate)\n scope.on(root, 'click', (event) => {\n const link = (event.target as Element | null)?.closest?.('a[href]');\n if (active && link?.closest('[data-mk-island-panel]')) close(false);\n });\n if (closeOnScroll) {\n const arm = () => {\n if (active) armed = true;\n };\n scope.on(window, 'wheel', arm, { passive: true });\n scope.on(window, 'touchmove', arm, { passive: true });\n scope.on(\n window,\n 'scroll',\n () => {\n if (active && armed && Math.abs(window.scrollY - scrollStart) > 1) close(false);\n },\n { passive: true },\n );\n }\n scope.add(() => clearTimeout(focusTimer));\n\n // The entrance uses GSAP's default ease (power1.out).\n const moving = entrance !== false && entrances();\n if (moving) gsap.set(shell, { yPercent: t.offset });\n const ready = () => {\n if (scope.disposed || entered || !moving) return;\n entered = true;\n entry = gsap.to(shell, { yPercent: 0, duration: t.entrance });\n };\n scope.add(() => {\n entry?.kill();\n if (moving) gsap.set(shell, { clearProps: 'transform,translate' });\n if (shell.getAttribute('style') === '') shell.removeAttribute('style');\n });\n\n sync();\n if (entrance === true) ready();\n scope.attr(root, 'data-mk-ready', '');\n\n return {\n open: (name?: string) => open(name),\n close,\n toggle: (name?: string) => toggle(name),\n ready,\n get active() {\n return active;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Pill button: a dark pill with a label and an arrow. When the pointer comes in\n * (or the keyboard focuses it) the dark fill gathers into a circle around the\n * icon on the swatch curve (.38,.49,0,1.5, a small overshoot), the label slides\n * left and turns to the text colour, and the arrow stays centred; leaving, the\n * fill spreads back into the pill. `expand` turns it around: a circle by the\n * label that spreads into the pill. The motion is CSS (pill-button.css); the\n * engine builds the label, icon and fill when the markup lacks them, presses on\n * click, and shows the gathered state for a moment after a tap on touch.\n */\n\nexport interface PillButtonOptions {\n /** Start as the circle and spread into the pill on hover (default false). */\n expand?: boolean;\n /** The icon's markup when the button has no [data-mk-pill-icon] (default: an arrow). */\n icon?: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface PillButtonInstance extends Instance {}\n\nexport const PILL_ARROW =\n '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14\"/><path d=\"m13 6 6 6-6 6\"/></svg>';\n\nexport function createPillButton(root: HTMLElement | null, options: PillButtonOptions = {}): PillButtonInstance {\n const control = root ? (root.matches('button, a, [role=\"button\"]') ? root : root.querySelector<HTMLElement>('button, a, [role=\"button\"]')) : null;\n if (!root || !control) return inert();\n registerMotion();\n const scope = createScope();\n\n // Only what the engine adds is taken back (React keeps its own nodes).\n const icon = control.querySelector<HTMLElement>('[data-mk-pill-icon]');\n if (!control.querySelector('[data-mk-pill-label]')) {\n const label = document.createElement('span');\n label.dataset.mkPillLabel = '';\n for (const node of [...control.childNodes]) if (node !== icon) label.append(node);\n control.prepend(label);\n scope.add(() => label.replaceWith(...label.childNodes));\n }\n if (!icon) {\n const made = document.createElement('span');\n made.dataset.mkPillIcon = '';\n made.setAttribute('aria-hidden', 'true');\n made.innerHTML = options.icon ?? PILL_ARROW;\n control.append(made);\n scope.add(() => made.remove());\n }\n const fill = document.createElement('span');\n fill.dataset.mkPillFill = '';\n fill.setAttribute('aria-hidden', 'true');\n control.prepend(fill);\n scope.add(() => fill.remove());\n\n scope.attr(control, 'data-mk-pill', options.expand ? 'expand' : '');\n scope.attr(root, 'data-mk-ready', '');\n\n // A tap has no hover: the gathered state shows for a moment.\n let tapped: ReturnType<typeof setTimeout> | undefined;\n scope.on(control, 'pointerdown', (event) => {\n press(control);\n if ((event as PointerEvent).pointerType !== 'touch') return;\n control.setAttribute('data-mk-active', '');\n clearTimeout(tapped);\n tapped = setTimeout(() => control.removeAttribute('data-mk-active'), 650);\n });\n scope.add(() => {\n clearTimeout(tapped);\n control.removeAttribute('data-mk-active');\n });\n\n return { destroy: () => scope.dispose() };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Toolbar: a rail of tools where one is chosen, marked by a light blob under\n * its icon. Choosing another stretches the blob like slime: its leading edge\n * reaches the new tool first (.2 s) while it narrows, then the trailing edge\n * lets go and catches up on the swatch curve (.38,.49,0,1.5), so it wobbles\n * into place; choosing the same tool squeezes it. A label slides out beside\n * the tool under the pointer (or focus) and glides between tools. A toolbar\n * for the keyboard: arrows and Home/End move and choose (roving tabindex),\n * each tool says aria-pressed. Vertical by default, or horizontal.\n */\n\nexport interface ToolbarOptions {\n /** The chosen tool (its data-mk-tool, else its position); default: the first one. */\n value?: string;\n /** Default 'vertical'. */\n orientation?: 'vertical' | 'horizontal';\n /** The label beside the tool under the pointer or focus (default true). */\n tips?: boolean;\n onChange?: (value: string) => void;\n}\n\nexport interface ToolbarInstance extends Instance {\n setValue(value: string, notify?: boolean): void;\n readonly value: string;\n}\n\nexport function createToolbar(root: HTMLElement | null, options: ToolbarOptions = {}): ToolbarInstance {\n const tools = root ? [...root.querySelectorAll<HTMLButtonElement>('button')] : [];\n if (!root || !tools.length) {\n if (root) warnOnce('toolbar: needs at least one <button>');\n return inert({ setValue() {}, value: '' });\n }\n registerMotion();\n const scope = createScope();\n const vertical = options.orientation !== 'horizontal';\n const valueOf = (tool: HTMLElement) => tool.dataset.mkTool ?? String(tools.indexOf(tool as HTMLButtonElement));\n const labelOf = (tool: HTMLElement) => tool.getAttribute('aria-label') ?? tool.title ?? tool.textContent?.trim() ?? '';\n\n scope.attr(root, 'role', 'toolbar');\n scope.attr(root, 'aria-orientation', vertical ? 'vertical' : 'horizontal');\n scope.attr(root, 'data-mk-orientation', vertical ? 'vertical' : 'horizontal');\n for (const tool of tools) {\n scope.attr(tool, 'type', tool.getAttribute('type') ?? 'button');\n scope.attr(tool, 'aria-pressed', 'false');\n scope.attr(tool, 'tabindex', '-1');\n // A title would show the browser's own tooltip over ours.\n if (options.tips !== false && tool.title) {\n scope.attr(tool, 'aria-label', tool.getAttribute('aria-label') ?? tool.title);\n scope.attr(tool, 'title', null);\n }\n }\n\n const blob = document.createElement('span');\n blob.dataset.mkToolbarBlob = '';\n blob.setAttribute('aria-hidden', 'true');\n root.prepend(blob);\n const tip = document.createElement('span');\n tip.dataset.mkToolbarTip = '';\n tip.setAttribute('aria-hidden', 'true');\n tip.hidden = true;\n if (options.tips !== false) root.append(tip);\n scope.add(() => {\n gsap.killTweensOf([blob, tip]);\n blob.remove();\n tip.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n const find = (value: string | undefined) => tools.find((tool) => valueOf(tool) === value);\n let current = find(options.value) ?? tools.find((tool) => !tool.disabled) ?? tools[0]!;\n\n /** Where a tool sits inside the rail (offsets, so transforms on the rail do not count). */\n const box = (tool: HTMLElement) => ({ start: vertical ? tool.offsetTop : tool.offsetLeft, size: vertical ? tool.offsetHeight : tool.offsetWidth, cross: vertical ? tool.offsetLeft : tool.offsetTop, crossSize: vertical ? tool.offsetWidth : tool.offsetHeight });\n const along = vertical ? 'y' : 'x';\n const across = vertical ? 'x' : 'y';\n const length = vertical ? 'height' : 'width';\n const thickness = vertical ? 'width' : 'height';\n\n let timeline: gsap.core.Timeline | null = null;\n const place = () => {\n const at = box(current);\n timeline?.kill();\n gsap.set(blob, { [along]: at.start, [across]: at.cross, [length]: at.size, [thickness]: at.crossSize, scaleX: 1, scaleY: 1 });\n };\n\n /** The slime: the leading edge reaches the tool, then the trailing edge lets go and wobbles in. */\n const slide = (from: HTMLElement, to: HTMLElement) => {\n if (reduced() || from === to) return place();\n const a = box(from);\n const b = box(to);\n const forward = b.start > a.start;\n const reach = forward ? b.start + b.size - a.start : a.start + a.size - b.start;\n const squeeze = vertical ? { scaleX: 0.84 } : { scaleY: 0.84 };\n const relax = vertical ? { scaleX: 1 } : { scaleY: 1 };\n timeline?.kill();\n timeline = gsap.timeline();\n timeline.to(blob, { [along]: forward ? a.start : b.start, [length]: reach, ...squeeze, duration: 0.2, ease: 'power2.in' }, 0);\n timeline.to(blob, { [along]: b.start, [length]: b.size, duration: 0.42, ease: EASE.swatch }, 0.16);\n timeline.to(blob, { ...relax, duration: 0.5, ease: 'elastic.out(1, 0.45)' }, 0.18);\n };\n\n const squish = () => {\n if (reduced()) return;\n timeline?.kill();\n place();\n timeline = gsap.timeline();\n timeline.to(blob, { scaleX: 0.88, scaleY: 0.88, duration: 0.1, ease: 'power2.out' }).to(blob, { scaleX: 1, scaleY: 1, duration: 0.45, ease: 'elastic.out(1, 0.4)' });\n };\n\n const paint = () => {\n for (const tool of tools) {\n tool.setAttribute('aria-pressed', String(tool === current));\n tool.setAttribute('tabindex', tool === current ? '0' : '-1');\n }\n };\n\n // ── The label beside a tool ───────────────────────────────────────────────\n let tipFor: HTMLElement | null = null;\n let tipTimer: ReturnType<typeof setTimeout> | undefined;\n scope.add(() => clearTimeout(tipTimer));\n const showTip = (tool: HTMLElement, linger = 0) => {\n if (options.tips === false) return;\n clearTimeout(tipTimer);\n const text = labelOf(tool);\n if (!text) return hideTip();\n const at = box(tool);\n const appearing = tip.hidden;\n const changed = tipFor !== tool;\n tipFor = tool;\n tip.textContent = text;\n tip.hidden = false;\n const tipSize = vertical ? tip.offsetHeight : tip.offsetWidth;\n const spot = at.start + at.size / 2 - tipSize / 2;\n if (appearing || reduced()) {\n gsap.killTweensOf(tip);\n gsap.set(tip, { [along]: spot });\n if (!reduced()) gsap.fromTo(tip, { opacity: 0, [across]: -8, filter: 'blur(4px)', scale: 0.9 }, { opacity: 1, [across]: 0, filter: 'blur(0px)', scale: 1, duration: 0.28, ease: EASE.pop });\n else gsap.set(tip, { opacity: 1, [across]: 0, scale: 1, filter: 'none' });\n } else if (changed) {\n gsap.to(tip, { [along]: spot, opacity: 1, [across]: 0, scale: 1, filter: 'blur(0px)', duration: 0.32, ease: EASE.swatch, overwrite: 'auto' });\n }\n if (linger) tipTimer = setTimeout(hideTip, linger);\n };\n const hideTip = () => {\n clearTimeout(tipTimer);\n tipFor = null;\n if (tip.hidden) return;\n if (reduced()) {\n tip.hidden = true;\n return;\n }\n gsap.to(tip, { opacity: 0, [across]: -6, filter: 'blur(4px)', scale: 0.92, duration: 0.18, ease: 'power2.in', overwrite: 'auto', onComplete: () => {\n tip.hidden = true;\n } });\n };\n\n const choose = (tool: HTMLElement, notify: boolean) => {\n if ((tool as HTMLButtonElement).disabled) return;\n const previous = current;\n current = tool as HTMLButtonElement;\n paint();\n if (previous === current) squish();\n else slide(previous, current);\n if (previous === current || !notify) return;\n const value = valueOf(current);\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value } }));\n };\n\n scope.on(root, 'click', (event) => {\n const tool = (event.target as Element).closest<HTMLButtonElement>('button');\n if (!tool || !tools.includes(tool)) return;\n press(tool);\n choose(tool, true);\n showTip(tool, 1200);\n });\n scope.on(root, 'pointerover', (event) => {\n const tool = (event.target as Element).closest<HTMLButtonElement>('button');\n if (tool && tools.includes(tool) && (event as PointerEvent).pointerType !== 'touch') showTip(tool);\n });\n scope.on(root, 'pointerleave', () => {\n tipTimer = setTimeout(hideTip, 120);\n });\n scope.on(root, 'focusin', (event) => {\n const tool = event.target as HTMLElement;\n if (tools.includes(tool as HTMLButtonElement) && tool.matches(':focus-visible')) showTip(tool);\n });\n scope.on(root, 'focusout', (event) => {\n if (!root.contains((event as FocusEvent).relatedTarget as Node)) hideTip();\n });\n scope.on(root, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const enabled = tools.filter((tool) => !tool.disabled);\n const at = enabled.indexOf(document.activeElement as HTMLButtonElement);\n if (at < 0) return;\n const next =\n key === 'ArrowDown' || key === 'ArrowRight' ? enabled[(at + 1) % enabled.length]\n : key === 'ArrowUp' || key === 'ArrowLeft' ? enabled[(at - 1 + enabled.length) % enabled.length]\n : key === 'Home' ? enabled[0]\n : key === 'End' ? enabled[enabled.length - 1]\n : null;\n if (!next) return;\n event.preventDefault();\n choose(next, true);\n next.focus();\n showTip(next, 1200);\n });\n\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(() => place())).observe(root);\n\n paint();\n place();\n\n return {\n setValue(value, notify = false) {\n const tool = find(value);\n if (tool) choose(tool, notify);\n },\n get value() {\n return valueOf(current);\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Bidirectional slider: a value either side of an origin (−100…100 around 0 by\n * default), for volume, balance, exposure or a correction. The fill grows from\n * the origin towards the thumb in the \"less\" or \"more\" colour; crossing the\n * origin pops its notch; reaching an end bumps that end's icon. Dragging past\n * an end stretches the track like rubber (up to 4 %) and it springs back when\n * let go. The − and + buttons step it (held, they repeat), a double click\n * glides back to the origin, and a bubble shows the signed value while it is\n * held or focused. Keys, the buttons and setValue glide on the swatch curve\n * (.38,.49,0,1.5); dragging follows the pointer. Built on a native\n * <input type=\"range\"> (keyboard, touch, forms and assistive tech).\n */\n\nexport interface BidirectionalSliderOptions {\n /** Default −100. */\n min?: number;\n /** Default 100. */\n max?: number;\n /** Where the fill starts (default 0, kept inside min…max). */\n origin?: number;\n step?: number;\n value?: number;\n disabled?: boolean;\n name?: string;\n /** Accessible name of the input. */\n label?: string;\n /** The end icons: − and + (default), the speaker, or none. */\n icons?: 'signs' | 'volume' | false;\n /** Text for the bubble and aria-valuetext (default: signed, \"+24\", \"−12\"). */\n formatValue?: (value: number) => string;\n onInput?: (value: number) => void;\n onChange?: (value: number) => void;\n}\n\nexport interface BidirectionalSliderInstance extends Instance {\n setValue(value: number, notify?: boolean): void;\n /** Back to the origin. */\n reset(notify?: boolean): void;\n readonly value: number;\n}\n\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst ICONS = {\n signs: ['<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h12\"/></svg>', '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h12M12 6v12\"/></svg>'],\n volume: [\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 9.5v5h3.5L12 18.5v-13L7.5 9.5z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\"/></svg>',\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 9.5v5h3.5L12 18.5v-13L7.5 9.5z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\"/><path d=\"M18 7a7 7 0 0 1 0 10\"/></svg>',\n ],\n} as const;\n\nexport function createBidirectionalSlider(root: HTMLElement | null, options: BidirectionalSliderOptions = {}): BidirectionalSliderInstance {\n if (!root) return inert({ setValue() {}, reset() {}, value: 0 });\n registerMotion();\n const scope = createScope();\n const min = finite(options.min) ? options.min : -100;\n const max = finite(options.max) && options.max > min ? options.max : Math.max(min + 1, 100);\n const origin = Math.min(max, Math.max(min, finite(options.origin) ? options.origin : 0));\n const step = finite(options.step) && options.step > 0 ? options.step : 1;\n const decimals = (String(step).split('.')[1] ?? '').length;\n const snap = (n: number) => Number(Math.min(max, Math.max(min, Math.round((n - min) / step) * step + min)).toFixed(decimals));\n const format =\n options.formatValue ??\n ((n: number) => {\n const delta = Number((n - origin).toFixed(decimals));\n const text = new Intl.NumberFormat(undefined, { maximumFractionDigits: decimals }).format(Math.abs(delta));\n return delta > 0 ? `+${text}` : delta < 0 ? `−${text}` : text;\n });\n\n const made = <K extends keyof HTMLElementTagNameMap>(tag: K, parent: Element, data: string) => {\n const element = document.createElement(tag);\n element.setAttribute(`data-mk-bislider-${data}`, '');\n parent.append(element);\n scope.add(() => element.remove());\n return element;\n };\n const icons = options.icons === false ? null : ICONS[options.icons ?? 'signs'];\n const less = icons ? made('button', root, 'less') : null;\n const track = made('span', root, 'track');\n const more = icons ? made('button', root, 'more') : null;\n if (less && more && icons) {\n less.type = more.type = 'button';\n less.tabIndex = more.tabIndex = -1;\n less.innerHTML = icons[0];\n more.innerHTML = icons[1];\n less.setAttribute('aria-label', 'Menos');\n more.setAttribute('aria-label', 'Más');\n root.prepend(less);\n }\n // The fill and notch are clipped to the track's corners; the thumb and bubble are not.\n const clip = made('span', track, 'clip');\n clip.setAttribute('aria-hidden', 'true');\n const fill = made('span', clip, 'fill');\n const notch = made('span', clip, 'notch');\n const thumb = made('span', track, 'thumb');\n const bubble = made('span', track, 'bubble');\n for (const part of [fill, notch, thumb, bubble]) part.setAttribute('aria-hidden', 'true');\n\n let input = root.querySelector<HTMLInputElement>('input[type=\"range\"]');\n if (input) {\n // An authored input goes into the track and back to its place (with its attributes) on destroy.\n const kept = input;\n const place = { parent: kept.parentNode, next: kept.nextSibling };\n const saved = ['min', 'max', 'step', 'value', 'data-mk-bislider-input'].map((name) => [name, kept.getAttribute(name)] as const);\n const value = kept.value;\n scope.add(() => {\n for (const [name, was] of saved) {\n if (was === null) kept.removeAttribute(name);\n else kept.setAttribute(name, was);\n }\n kept.value = value;\n place.parent?.insertBefore(kept, place.next);\n });\n } else {\n input = document.createElement('input');\n input.type = 'range';\n scope.add(() => input!.remove());\n }\n const range = input;\n track.append(range);\n range.dataset.mkBisliderInput = '';\n range.min = String(min);\n range.max = String(max);\n range.step = String(step);\n if (options.name) scope.attr(range, 'name', options.name);\n if (options.label && !range.getAttribute('aria-label')) scope.attr(range, 'aria-label', options.label);\n if (options.disabled) scope.attr(range, 'disabled', '');\n const start = snap(finite(options.value) ? options.value : range.getAttribute('value') !== null ? Number(range.getAttribute('value')) : origin);\n range.value = String(start);\n range.defaultValue = String(start);\n scope.attr(root, 'data-mk-ready', '');\n\n let value = start;\n let committed = start;\n /** What is drawn (trails the value while gliding). */\n const shown = { v: start };\n const pct = (n: number) => ((n - min) / (max - min)) * 100;\n notch.style.left = `${pct(origin)}%`;\n\n const paint = () => {\n const at = pct(shown.v);\n const from = pct(origin);\n fill.style.left = `${Math.min(at, from)}%`;\n fill.style.width = `${Math.abs(at - from)}%`;\n thumb.style.left = `${at}%`;\n bubble.style.left = `${at}%`;\n root.setAttribute('data-mk-side', shown.v > origin ? 'more' : shown.v < origin ? 'less' : 'origin');\n };\n scope.add(() => root.removeAttribute('data-mk-side'));\n const describe = () => {\n const text = format(value);\n bubble.textContent = text;\n range.setAttribute('aria-valuetext', text);\n };\n scope.add(() => range.removeAttribute('aria-valuetext'));\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n gsap.killTweensOf(shown);\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n const bump = (element: Element | null, scale = 1.25) => {\n if (!element || reduced()) return;\n keep(gsap.fromTo(element, { scale }, { scale: 1, duration: 0.5, ease: 'elastic.out(1, 0.4)', overwrite: 'auto' }));\n };\n\n let held = false;\n /** Set the value; `glide` tweens the drawing, else it follows at once. */\n const set = (next: number, glide: boolean, notify: 'input' | 'change' | false) => {\n const before = value;\n value = snap(next);\n range.value = String(value);\n describe();\n gsap.killTweensOf(shown);\n if (glide && !reduced()) keep(gsap.to(shown, { v: value, duration: 0.45, ease: EASE.swatch, onUpdate: paint }));\n else {\n shown.v = value;\n paint();\n }\n // Crossing the origin pops its notch; arriving at an end bumps that end's icon.\n if ((before - origin) * (value - origin) < 0 || (before !== origin && value === origin)) bump(notch, 1.8);\n if (value !== before && value === max) bump(more);\n if (value !== before && value === min) bump(less);\n if (notify && value !== before) {\n options.onInput?.(value);\n root.dispatchEvent(new CustomEvent('mk:input', { bubbles: true, detail: { value } }));\n }\n if (notify === 'change') commit();\n };\n const commit = () => {\n if (value === committed) return;\n committed = value;\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value } }));\n };\n\n scope.on(range, 'input', () => {\n const next = Number(range.value);\n const before = value;\n set(next, !held, false);\n if (value !== before) {\n options.onInput?.(value);\n root.dispatchEvent(new CustomEvent('mk:input', { bubbles: true, detail: { value } }));\n }\n });\n scope.on(range, 'change', commit);\n scope.on(range, 'dblclick', () => set(origin, true, 'change'));\n\n // Held: the thumb grows and the bubble shows; past an end, the track stretches like rubber.\n let pointer: number | null = null;\n scope.on(range, 'pointerdown', (event) => {\n const down = event as PointerEvent;\n if (range.disabled || down.button !== 0) return;\n held = true;\n pointer = down.pointerId;\n root.setAttribute('data-mk-held', '');\n });\n scope.on(window, 'pointermove', (event) => {\n const move = event as PointerEvent;\n if (!held || move.pointerId !== pointer || reduced()) return;\n const box = track.getBoundingClientRect();\n const over = move.clientX > box.right ? move.clientX - box.right : move.clientX < box.left ? move.clientX - box.left : 0;\n const stretch = Math.min(1, Math.abs(over) / 80) * 0.04;\n gsap.set(track, { scaleX: 1 + stretch, transformOrigin: over > 0 ? '0% 50%' : '100% 50%' });\n });\n const release = (event: Event) => {\n if (!held || (event as PointerEvent).pointerId !== pointer) return;\n held = false;\n pointer = null;\n root.removeAttribute('data-mk-held');\n if (!reduced()) keep(gsap.to(track, { scaleX: 1, duration: 0.6, ease: 'elastic.out(1, 0.35)', clearProps: 'transform,transformOrigin' }));\n };\n scope.on(window, 'pointerup', release);\n scope.on(window, 'pointercancel', release);\n scope.add(() => {\n root.removeAttribute('data-mk-held');\n gsap.set(track, { clearProps: 'transform,transformOrigin' });\n });\n\n // − and +: a step per press, repeating while held.\n let repeat: ReturnType<typeof setTimeout> | undefined;\n const stop = () => {\n clearTimeout(repeat);\n if (repeat !== undefined) commit();\n repeat = undefined;\n };\n scope.add(() => clearTimeout(repeat));\n for (const [button, direction] of [[less, -1], [more, 1]] as const) {\n if (!button) continue;\n scope.on(button, 'pointerdown', (event) => {\n if (range.disabled || (event as PointerEvent).button !== 0) return;\n event.preventDefault();\n press(button);\n const tick = (delay: number) => {\n set(value + step * direction, true, 'input');\n repeat = setTimeout(() => tick(Math.max(50, delay * 0.8)), delay);\n };\n tick(400);\n });\n scope.on(button, 'pointerup', stop);\n scope.on(button, 'pointerleave', stop);\n scope.on(button, 'pointercancel', stop);\n }\n const form = range.form;\n if (form) scope.on(form, 'reset', () => setTimeout(() => set(Number(range.defaultValue), true, false)));\n\n describe();\n paint();\n\n return {\n setValue: (next, notify = false) => set(next, true, notify ? 'change' : false),\n reset: (notify = false) => set(origin, true, notify ? 'change' : false),\n get value() {\n return value;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { whileVisible } from '../../core/loop';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\n/*\n * Voice dots: four dots that show a voice conversation, like an assistant's.\n * Idle, they breathe one after another. Listening, each dot stretches into a\n * pill with its band of the voice (from a microphone or a playing element\n * through an AnalyserNode, or levels the app gives), springing up fast and\n * settling slower so syllables read as a bounce. Thinking, they gather into a\n * ring and orbit. Speaking, they ride a travelling wave (with the playing\n * audio's level when there is one). Every change of state flows from where the\n * dots are, so nothing jumps; the frame loop only runs while the dots are on\n * screen. Monochrome (the text colour) by default, or the chart colours. A\n * status line says the state to assistive tech; with reduced motion the dots\n * stay still and only their colour and the status change.\n */\n\nexport type VoiceState = 'idle' | 'listening' | 'thinking' | 'speaking';\n\nexport interface VoiceDotsOptions {\n /** Default 'idle'. */\n state?: VoiceState;\n /** Dots (default 4, 3…6). */\n count?: number;\n /** The chart colours instead of the text colour. */\n colorful?: boolean;\n /** Dot size in px (default 12). */\n size?: number;\n /** The status text for each state. */\n labels?: Partial<Record<VoiceState, string>>;\n}\n\nexport interface VoiceDotsInstance extends Instance {\n setState(state: VoiceState): void;\n readonly state: VoiceState;\n /** The voice's level, 0…1: one for all dots or one per dot (from your own analysis). */\n setLevel(level: number | number[]): void;\n /** Follow a microphone stream or a playing <audio>/<video>; resolves to a function that stops following. */\n listen(source: MediaStream | HTMLMediaElement): Promise<() => void>;\n /** Stop following the audio (the state stays). */\n stop(): void;\n}\n\nconst LABELS: Record<VoiceState, string> = { idle: 'Asistente en espera', listening: 'Escuchando…', thinking: 'Pensando…', speaking: 'Hablando…' };\nconst STATES: VoiceState[] = ['idle', 'listening', 'thinking', 'speaking'];\n/** One AudioContext source per media element: the platform allows only one. */\nconst mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\nlet audio: AudioContext | null = null;\n\nexport function createVoiceDots(root: HTMLElement | null, options: VoiceDotsOptions = {}): VoiceDotsInstance {\n if (!root) return inert({ setState() {}, state: 'idle' as VoiceState, setLevel() {}, listen: async () => () => {}, stop() {} });\n registerMotion();\n const scope = createScope();\n const count = Math.max(3, Math.min(6, Math.round(options.count ?? 4)));\n const size = Math.max(4, options.size ?? 12);\n const labels = { ...LABELS, ...options.labels };\n let state: VoiceState = STATES.includes(options.state as VoiceState) ? options.state! : 'idle';\n\n const row = document.createElement('span');\n row.dataset.mkVoiceRow = '';\n row.setAttribute('aria-hidden', 'true');\n const dots = Array.from({ length: count }, (_, i) => {\n const dot = document.createElement('span');\n dot.dataset.mkVoiceDot = String(i + 1);\n row.append(dot);\n return dot;\n });\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(row, status);\n scope.add(() => {\n row.remove();\n status.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-state', state);\n if (options.colorful) scope.attr(root, 'data-mk-colorful', '');\n root.style.setProperty('--mk-voice-size', `${size}px`);\n scope.add(() => {\n root.style.removeProperty('--mk-voice-size');\n if (!root.getAttribute('style')) root.removeAttribute('style');\n });\n\n // Per dot: what is drawn (height, x, y) and the level it follows.\n const drawn = dots.map(() => ({ h: size, x: 0, y: 0, vh: 0 }));\n const levels = dots.map(() => 0);\n let time = 0;\n const gap = size * 0.9;\n const home = (i: number) => (i - (count - 1) / 2) * (size + gap);\n\n const draw = () => {\n dots.forEach((dot, i) => {\n const d = drawn[i]!;\n dot.style.height = `${d.h.toFixed(2)}px`;\n dot.style.transform = `translate(${d.x.toFixed(2)}px, ${d.y.toFixed(2)}px)`;\n });\n };\n const still = () => {\n dots.forEach((_, i) => Object.assign(drawn[i]!, { h: size, x: 0, y: 0, vh: 0 }));\n draw();\n };\n\n let analyser: AnalyserNode | null = null;\n let bins: Uint8Array<ArrayBuffer> | null = null;\n let release: (() => void) | null = null;\n let listening = 0;\n /** The voice's bands (about 120 Hz – 3 kHz) into one level per dot. */\n const sample = () => {\n if (!analyser || !bins) return;\n analyser.getByteFrequencyData(bins);\n const hz = (audio?.sampleRate ?? 48000) / 2 / bins.length;\n const low = Math.max(1, Math.floor(120 / hz));\n const high = Math.min(bins.length - 1, Math.ceil(3000 / hz));\n const span = (high - low) / count;\n for (let i = 0; i < count; i++) {\n let sum = 0;\n const from = Math.floor(low + span * i);\n const to = Math.max(from + 1, Math.floor(low + span * (i + 1)));\n for (let k = from; k < to; k++) sum += bins[k]!;\n // Higher bands are quieter in a voice: they get a lift.\n levels[i] = Math.min(1, (sum / (to - from) / 255) * (1.4 + i * 0.35));\n }\n };\n\n const tick = (dt: number) => {\n if (reduced()) return;\n time += dt / 60;\n sample();\n const k = 1 - Math.exp(-dt * 0.35);\n dots.forEach((_, i) => {\n const d = drawn[i]!;\n let h = size;\n let x = 0;\n let y = 0;\n if (state === 'idle') {\n h = size * (1 + 0.18 * Math.max(0, Math.sin(time * 3.2 - i * 0.7)));\n y = -2 * Math.max(0, Math.sin(time * 3.2 - i * 0.7));\n } else if (state === 'listening') {\n h = size + levels[i]! * size * 3.2;\n } else if (state === 'thinking') {\n // A ring around the middle, turning.\n const angle = time * 4 + (i / count) * Math.PI * 2;\n const ring = size * 1.2;\n x = Math.cos(angle) * ring - home(i);\n y = Math.sin(angle) * ring;\n } else {\n const wave = 0.5 + 0.5 * Math.sin(time * 9 - i * 0.9);\n const voice = analyser ? levels[i]! : 0.55;\n h = size + wave * voice * size * 2.4;\n }\n // Height on a spring that rises fast and falls slower (a bounce per syllable); position eases.\n const stiffness = h > d.h ? 0.5 : 0.18;\n d.vh = (d.vh + (h - d.h) * stiffness) * 0.6;\n d.h = Math.max(size * 0.8, d.h + d.vh * dt);\n d.x += (x - d.x) * k;\n d.y += (y - d.y) * k;\n });\n draw();\n };\n const stopLoop = whileVisible(root, tick);\n scope.add(stopLoop);\n\n const stop = () => {\n listening++;\n release?.();\n release = null;\n analyser = null;\n bins = null;\n levels.fill(0);\n };\n scope.add(stop);\n\n const setState = (next: VoiceState) => {\n if (!STATES.includes(next)) return;\n state = next;\n root.setAttribute('data-mk-state', next);\n status.textContent = next === 'idle' ? '' : labels[next];\n if (reduced()) still();\n root.dispatchEvent(new CustomEvent('mk:state', { bubbles: true, detail: { state: next } }));\n };\n\n draw();\n if (state !== 'idle') status.textContent = labels[state];\n\n return {\n setState,\n get state() {\n return state;\n },\n setLevel(level) {\n const list = Array.isArray(level) ? level : dots.map(() => level);\n dots.forEach((_, i) => {\n const value = Number(list[i % Math.max(1, list.length)]);\n levels[i] = Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\n });\n },\n async listen(source) {\n stop();\n const request = listening;\n const Context = globalThis.AudioContext ?? (globalThis as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Context || scope.disposed) return () => {};\n audio ??= new Context();\n if (audio.state === 'suspended') await audio.resume().catch(() => {});\n if (scope.disposed || request !== listening) return () => {};\n const node = audio.createAnalyser();\n node.fftSize = 256;\n node.smoothingTimeConstant = 0.55;\n let input: AudioNode;\n if (source instanceof HTMLMediaElement) {\n const existing = mediaSources.get(source) ?? audio.createMediaElementSource(source);\n mediaSources.set(source, existing);\n // Followed before: its direct line to the speakers goes, the analyser's takes over.\n existing.disconnect();\n input = existing;\n // A playing element must still be heard.\n node.connect(audio.destination);\n } else input = audio.createMediaStreamSource(source);\n input.connect(node);\n analyser = node;\n bins = new Uint8Array(new ArrayBuffer(node.frequencyBinCount));\n const mine = () => {\n try {\n input.disconnect(node);\n node.disconnect();\n } catch {\n // Already disconnected.\n }\n // The element keeps playing through the speakers.\n if (source instanceof HTMLMediaElement && audio) input.connect(audio.destination);\n };\n release = mine;\n return () => {\n if (release === mine) stop();\n };\n },\n stop,\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport type { Scope } from '../../core/scope';\n\n/*\n * The parts the round and flow charts (pie, radar, radial, sankey, heatmap)\n * share with chart: the same plot, inverse-glass tooltip, outlined legend,\n * screen-reader table and colour slots, so they read as one family and use\n * chart.css. Each chart draws its own marks.\n */\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\nexport const SLOTS = 8;\n\nexport const svg = <K extends keyof SVGElementTagNameMap>(tag: K, attrs: Record<string, string | number> = {}) => {\n const element = document.createElementNS(SVG_NS, tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, String(value));\n return element;\n};\nexport const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nexport const round = (n: number) => Math.round(n * 100) / 100;\n\n/** The colour of slot `i`: monochrome alone, --mk-chart-N for up to 8, a neutral past them. */\nexport const slotColor = (i: number, total = SLOTS) => (total === 1 ? 'var(--mk-chart-mono)' : i < SLOTS ? `var(--mk-chart-${i + 1})` : 'var(--mk-chart-other)');\n\nexport const formatNumber = (value: number) => new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format(value);\n\n/** A point on a circle: angle 0 is 12 o'clock, clockwise. */\nexport const polar = (cx: number, cy: number, r: number, angle: number) => [cx + r * Math.sin(angle), cy - r * Math.cos(angle)] as const;\n\n/** An annular sector (a pie slice when `inner` is 0) from angle `a0` to `a1`. */\nexport function arcPath(cx: number, cy: number, outer: number, inner: number, a0: number, a1: number) {\n const sweep = Math.min(a1 - a0, Math.PI * 2 - 1e-4);\n const end = a0 + sweep;\n const large = sweep > Math.PI ? 1 : 0;\n const [x0, y0] = polar(cx, cy, outer, a0);\n const [x1, y1] = polar(cx, cy, outer, end);\n if (inner <= 0) return `M${round(cx)},${round(cy)}L${round(x0)},${round(y0)}A${round(outer)},${round(outer)} 0 ${large} 1 ${round(x1)},${round(y1)}Z`;\n const [x2, y2] = polar(cx, cy, inner, end);\n const [x3, y3] = polar(cx, cy, inner, a0);\n return `M${round(x0)},${round(y0)}A${round(outer)},${round(outer)} 0 ${large} 1 ${round(x1)},${round(y1)}L${round(x2)},${round(y2)}A${round(inner)},${round(inner)} 0 ${large} 0 ${round(x3)},${round(y3)}Z`;\n}\n\nexport interface TipRow {\n name: string;\n color?: string;\n value: string;\n}\n\nexport interface ChartFrame {\n plot: HTMLDivElement;\n canvas: SVGSVGElement;\n tooltip: HTMLDivElement;\n empty: HTMLParagraphElement;\n legend: HTMLUListElement;\n table: HTMLTableElement;\n live: HTMLSpanElement;\n /** Fill and show the tooltip near (x, y) in plot px; null hides it. */\n tip(at: { x: number; y: number; title: string; rows: TipRow[] } | null): void;\n /** One outlined pill per item; `type` picks the swatch's shape. */\n fillLegend(items: Array<{ name: string; color: string }>, show: boolean, type?: string): HTMLLIElement[];\n /** The values for screen readers: a caption, the column heads and the rows. */\n fillTable(caption: string, head: string[], rows: string[][]): void;\n keep(animation: gsap.core.Animation | null | undefined): void;\n}\n\n/** The plot, tooltip, legend and table of a chart, removed by the scope. The root gets .mk-chart for chart.css. */\nexport function chartFrame(root: HTMLElement, scope: Scope, kind: string): ChartFrame {\n if (!root.classList.contains('mk-chart')) {\n root.classList.add('mk-chart');\n scope.add(() => {\n root.classList.remove('mk-chart');\n if (!root.classList.length) root.removeAttribute('class');\n });\n }\n scope.attr(root, 'data-mk-chart-type', kind);\n const made = <K extends keyof HTMLElementTagNameMap>(tag: K, parent: Element = root) => {\n const element = document.createElement(tag);\n parent.append(element);\n scope.add(() => element.remove());\n return element;\n };\n const plot = made('div');\n plot.dataset.mkChartPlot = '';\n const canvas = svg('svg');\n canvas.dataset.mkChartSvg = '';\n canvas.setAttribute('role', 'img');\n canvas.setAttribute('tabindex', '0');\n canvas.setAttribute('focusable', 'true');\n plot.append(canvas);\n const tooltip = made('div', plot);\n tooltip.dataset.mkChartTooltip = '';\n tooltip.setAttribute('aria-hidden', 'true');\n tooltip.hidden = true;\n const empty = made('p');\n empty.dataset.mkChartEmpty = '';\n empty.hidden = true;\n const legend = made('ul');\n legend.dataset.mkChartLegend = '';\n const table = made('table');\n table.dataset.mkChartTable = '';\n table.className = 'mk-sr-only';\n const live = made('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n scope.attr(root, 'data-mk-ready', '');\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null | undefined) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(tooltip);\n });\n\n const tip: ChartFrame['tip'] = (at) => {\n if (!at) {\n if (!tooltip.hidden && !reduced()) {\n gsap.killTweensOf(tooltip, 'opacity,scale');\n keep(gsap.to(tooltip, { opacity: 0, scale: 0.94, duration: 0.15, ease: 'power2.in', onComplete: () => {\n tooltip.hidden = true;\n } }));\n } else tooltip.hidden = true;\n return;\n }\n tooltip.replaceChildren();\n const title = document.createElement('strong');\n title.textContent = at.title;\n tooltip.append(title);\n for (const each of at.rows) {\n const row = document.createElement('span');\n row.dataset.mkChartRow = '';\n const swatch = document.createElement('i');\n if (!each.color || /--mk-(text|chart-mono|muted)/.test(each.color)) swatch.dataset.mkMono = '';\n else swatch.style.background = each.color;\n const name = document.createElement('span');\n name.textContent = each.name;\n const amount = document.createElement('b');\n amount.textContent = each.value;\n row.append(swatch, name, amount);\n tooltip.append(row);\n }\n const appearing = tooltip.hidden;\n tooltip.hidden = false;\n const width = plot.clientWidth || 300;\n const height = plot.clientHeight || 240;\n const tipW = tooltip.offsetWidth || 160;\n const tipH = tooltip.offsetHeight || 60;\n // Beside the point, towards the middle of the plot, inside it.\n const left = round(Math.max(0, Math.min(width - tipW, at.x > width / 2 ? at.x - 16 - tipW : at.x + 16)));\n const top = round(Math.max(0, Math.min(height - tipH, at.y - tipH - 12)));\n if (appearing || reduced()) {\n gsap.killTweensOf(tooltip);\n gsap.set(tooltip, { x: left, y: top });\n if (!reduced()) keep(gsap.fromTo(tooltip, { opacity: 0, scale: 0.9 }, { opacity: 1, scale: 1, duration: 0.25, ease: EASE.pop }));\n else gsap.set(tooltip, { opacity: 1, scale: 1 });\n } else {\n gsap.killTweensOf(tooltip, 'opacity,scale');\n gsap.set(tooltip, { opacity: 1, scale: 1 });\n keep(gsap.to(tooltip, { x: left, y: top, duration: 0.25, ease: 'power3.out', overwrite: 'auto' }));\n }\n };\n\n const fillLegend: ChartFrame['fillLegend'] = (items, show, type = 'bar') => {\n legend.replaceChildren();\n legend.hidden = !show || !items.length;\n if (legend.hidden) return [];\n return items.map((item) => {\n const li = document.createElement('li');\n const swatch = document.createElement('span');\n swatch.dataset.mkChartSwatch = '';\n swatch.dataset.mkType = type;\n swatch.style.background = item.color;\n swatch.style.color = item.color;\n swatch.setAttribute('aria-hidden', 'true');\n const name = document.createElement('span');\n name.textContent = item.name;\n li.append(swatch, name);\n legend.append(li);\n return li;\n });\n };\n\n const fillTable: ChartFrame['fillTable'] = (caption, head, rows) => {\n table.replaceChildren();\n const cap = document.createElement('caption');\n cap.textContent = caption;\n const thead = document.createElement('thead');\n const headRow = document.createElement('tr');\n for (const text of head) {\n const th = document.createElement('th');\n th.scope = 'col';\n th.textContent = text;\n headRow.append(th);\n }\n thead.append(headRow);\n const body = document.createElement('tbody');\n for (const cells of rows) {\n const row = document.createElement('tr');\n cells.forEach((text, i) => {\n const cell = document.createElement(i ? 'td' : 'th');\n if (!i) (cell as HTMLTableCellElement).scope = 'row';\n cell.textContent = text;\n row.append(cell);\n });\n body.append(row);\n }\n table.append(cap, thead, body);\n };\n\n return { plot, canvas, tooltip, empty, legend, table, live, tip, fillLegend, fillTable, keep };\n}\n\n/** Calls `draw` again when the root changes width (on the next frame, once). */\nexport function onWidth(root: HTMLElement, scope: Scope, draw: () => void) {\n if (typeof ResizeObserver !== 'function') return;\n let width = 0;\n let frame = 0;\n const observer = scope.observe(\n new ResizeObserver(() => {\n const next = Math.round(root.clientWidth);\n if (!next || next === width) return;\n const first = !width;\n width = next;\n if (first) return;\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(draw);\n }),\n );\n observer.observe(root);\n scope.add(() => cancelAnimationFrame(frame));\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn, rollDigits } from '../../motion/micro';\nimport { arcPath, chartFrame, finite, formatNumber, onWidth, polar, round, slotColor, svg } from '../chart/parts';\n\n/*\n * Pie chart: parts of a whole as a donut (default) or a pie, in chart's family\n * (colour slots, inverse-glass tooltip, outlined legend, a table for screen\n * readers). Slices sweep in clockwise from 12 o'clock on the swatch curve\n * (.38,.49,0,1.5) while the total in the middle rolls up; new data glides each\n * slice from its old angles. Pointing at a slice (or its legend pill, or the\n * arrows) pulls it out along its middle and dims the others; the middle of a\n * donut then says the slice, its value and share, else the tooltip does.\n */\n\nexport interface PieSlice {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface PieChartOptions {\n data?: PieSlice[];\n /** Hole size as a share of the radius: 0 is a pie (default 0.62). */\n donut?: number;\n /** Degrees of surface between slices (default 1.5). */\n gap?: number;\n /** Diameter in px (default 240; it shrinks with its container). */\n size?: number;\n /** Accessible name (and table caption). */\n label?: string;\n /** The donut's middle when nothing is chosen (default 'Total'). */\n totalLabel?: string;\n legend?: boolean;\n formatValue?: (value: number) => string;\n emptyLabel?: string;\n onSelect?: (index: number | null) => void;\n}\n\nexport interface PieChartInstance extends Instance {\n update(options: PieChartOptions): void;\n select(index: number | null): void;\n readonly selected: number | null;\n}\n\nconst PULL = 7;\n\nexport function createPieChart(root: HTMLElement | null, initial: PieChartOptions = {}): PieChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const frame = chartFrame(root, scope, 'pie');\n const { plot, canvas, keep } = frame;\n let options: PieChartOptions = { ...initial };\n let selected: number | null = null;\n\n const center = document.createElement('div');\n center.dataset.mkPieCenter = '';\n center.setAttribute('aria-hidden', 'true');\n const centerValue = document.createElement('strong');\n const centerLabel = document.createElement('span');\n center.append(centerValue, centerLabel);\n plot.append(center);\n scope.add(() => center.remove());\n\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : formatNumber(value));\n const slices = () =>\n (options.data ?? [])\n .filter((slice) => finite(slice.value) && slice.value > 0)\n .map((slice, i, all) => ({ label: String(slice.label), value: slice.value, color: slice.color ?? slotColor(i, Math.max(2, all.length)) }));\n let model = slices();\n const total = () => model.reduce((sum, slice) => sum + slice.value, 0);\n const share = (value: number) => new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 1 }).format(value / (total() || 1));\n const donut = () => Math.min(0.9, Math.max(0, finite(options.donut) ? options.donut : 0.62));\n\n /** Each slice's angles for `values` (fractions of a turn, with the gap taken from both sides). */\n const anglesOf = (values: number[]) => {\n const sum = values.reduce((a, b) => a + b, 0) || 1;\n const pad = values.filter((v) => v > 0).length > 1 ? ((finite(options.gap) ? options.gap : 1.5) * Math.PI) / 180 : 0;\n let at = 0;\n return values.map((value) => {\n const sweep = (value / sum) * Math.PI * 2;\n const a0 = at + Math.min(pad / 2, sweep / 4);\n const a1 = at + sweep - Math.min(pad / 2, sweep / 4);\n at += sweep;\n return [a0, Math.max(a0, a1)] as [number, number];\n });\n };\n\n let paths: SVGPathElement[] = [];\n let shown: Array<[number, number]> = [];\n let geometry = { size: 240, cx: 120, cy: 120, outer: 112, inner: 70 };\n let glide: gsap.core.Tween | null = null;\n scope.add(() => glide?.kill());\n\n const measure = () => {\n const width = Math.round(plot.clientWidth || root.clientWidth || 0);\n const wanted = finite(options.size) ? options.size : 240;\n const size = Math.max(120, width ? Math.min(wanted, width) : wanted);\n const outer = size / 2 - PULL - 2;\n geometry = { size, cx: size / 2, cy: size / 2, outer, inner: outer * donut() };\n canvas.setAttribute('viewBox', `0 0 ${size} ${size}`);\n canvas.setAttribute('width', String(size));\n canvas.setAttribute('height', String(size));\n plot.style.setProperty('--mk-pie-size', `${size}px`);\n };\n scope.add(() => plot.style.removeProperty('--mk-pie-size'));\n\n const paint = (angles: Array<[number, number]>) => {\n shown = angles;\n const { cx, cy, outer, inner } = geometry;\n paths.forEach((path, i) => {\n const [a0, a1] = angles[i] ?? [0, 0];\n path.setAttribute('d', a1 - a0 > 1e-4 ? arcPath(cx, cy, outer, inner, a0, a1) : '');\n });\n };\n\n const build = () => {\n canvas.replaceChildren();\n const group = svg('g', { 'data-mk-part': 'series' });\n paths = model.map((slice, i) => {\n const path = svg('path', { 'data-mk-index': i });\n path.style.fill = slice.color;\n group.append(path);\n return path;\n });\n canvas.append(group);\n };\n\n const paintCenter = (animate: boolean) => {\n center.hidden = donut() < 0.35 || !model.length;\n if (center.hidden) return;\n const slice = selected === null ? null : model[selected];\n const text = slice ? format(slice.value) : format(total());\n const caption = slice ? `${slice.label} · ${share(slice.value)}` : (options.totalLabel ?? 'Total');\n const changed = centerLabel.textContent !== caption;\n if (centerValue.textContent !== text) {\n if (animate && !reduced() && centerValue.textContent) keep(rollDigits(centerValue, text, 1, 0.35));\n else centerValue.textContent = text;\n }\n centerLabel.textContent = caption;\n if (changed && animate && !reduced()) keep(blurIn(centerLabel, { from: 'soft', duration: 0.3 }));\n };\n\n const paintSelection = (announce: boolean) => {\n const { outer } = geometry;\n paths.forEach((path, i) => {\n const chosen = i === selected;\n path.toggleAttribute('data-mk-dim', selected !== null && !chosen);\n if (!chosen) {\n path.style.transform = '';\n return;\n }\n const [a0, a1] = shown[i] ?? [0, 0];\n const [dx, dy] = polar(0, 0, Math.min(PULL, outer * 0.06), (a0 + a1) / 2);\n path.style.transform = `translate(${round(dx)}px, ${round(dy)}px)`;\n });\n legendItems.forEach((item, i) => item.toggleAttribute('data-mk-dim', selected !== null && i !== selected));\n paintCenter(true);\n const slice = selected === null ? null : model[selected];\n // The tooltip speaks for a pie (a donut's middle already does).\n if (slice && center.hidden) {\n const [a0, a1] = shown[selected!] ?? [0, 0];\n const [x, y] = polar(geometry.cx, geometry.cy, geometry.outer * 0.7, (a0 + a1) / 2);\n frame.tip({ x, y, title: slice.label, rows: [{ name: share(slice.value), color: slice.color, value: format(slice.value) }] });\n } else frame.tip(null);\n if (announce && slice) frame.live.textContent = `${slice.label}: ${format(slice.value)}, ${share(slice.value)}`;\n };\n\n let legendItems: HTMLLIElement[] = [];\n const draw = (animate: boolean) => {\n glide?.kill();\n const before = shown;\n const sameCount = paths.length === model.length;\n const name = options.label ?? 'Gráfica circular';\n canvas.setAttribute('aria-label', model.length ? `${name}. ${model.length} partes, total ${format(total())}. Usa las flechas para recorrerlas.` : `${name}: ${options.emptyLabel ?? 'sin datos'}`);\n frame.fillTable(name, ['Parte', 'Valor', 'Porcentaje'], model.map((slice) => [slice.label, format(slice.value), share(slice.value)]));\n legendItems = frame.fillLegend(model.map((slice) => ({ name: slice.label, color: slice.color })), options.legend ?? true);\n legendItems.forEach((item, i) => {\n item.addEventListener('pointerenter', () => select(i));\n item.addEventListener('pointerleave', () => select(null));\n });\n frame.empty.hidden = model.length > 0;\n frame.empty.textContent = options.emptyLabel ?? 'Sin datos para mostrar';\n plot.hidden = !model.length;\n if (!model.length) {\n canvas.replaceChildren();\n paths = [];\n shown = [];\n selected = null;\n return;\n }\n if (selected !== null && selected >= model.length) selected = null;\n measure();\n if (!sameCount || !before.length) build();\n paths.forEach((path, i) => { path.style.fill = model[i]!.color; });\n const target = anglesOf(model.map((slice) => slice.value));\n const done = () => {\n paint(target);\n paintSelection(false);\n };\n if (!animate || reduced()) return done();\n const state = { t: 0 };\n if (sameCount && before.length) {\n // New data: every slice glides from its old angles.\n glide = gsap.to(state, {\n t: 1,\n duration: 0.6,\n ease: EASE.swatch,\n onUpdate: () => paint(target.map(([a0, a1], i) => [before[i]![0] + (a0 - before[i]![0]) * state.t, before[i]![1] + (a1 - before[i]![1]) * state.t])),\n onComplete: done,\n });\n paintCenter(true);\n return;\n }\n // First appearance: the slices sweep in clockwise from 12 o'clock and the total rolls up.\n paint(target.map(() => [0, 0]));\n centerValue.textContent = format(0);\n glide = gsap.to(state, {\n t: 1,\n duration: 0.9,\n ease: EASE.signature,\n onUpdate: () => paint(target.map(([a0, a1]) => [a0 * state.t, a1 * state.t])),\n onComplete: done,\n });\n paintCenter(true);\n };\n\n const select = (index: number | null, announce = false) => {\n if (scope.disposed) return;\n const next = index === null || !model.length ? null : ((Math.round(index) % model.length) + model.length) % model.length;\n if (next === selected) return;\n selected = next;\n paintSelection(announce);\n options.onSelect?.(selected);\n const slice = selected === null ? null : model[selected];\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { index: selected, label: slice?.label ?? null, value: slice?.value ?? null } }));\n };\n\n const indexAt = (event: PointerEvent) => {\n const target = (event.target as Element).closest('[data-mk-index]');\n return target ? Number(target.getAttribute('data-mk-index')) : null;\n };\n scope.on(canvas, 'pointermove', (event) => select(indexAt(event as PointerEvent)));\n scope.on(canvas, 'pointerdown', (event) => select(indexAt(event as PointerEvent)));\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'mouse') select(null);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && model.length) select(0, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const moves: Record<string, number | null> = { ArrowRight: (selected ?? -1) + 1, ArrowDown: (selected ?? -1) + 1, ArrowLeft: (selected ?? 1) - 1, ArrowUp: (selected ?? 1) - 1, Home: 0, End: model.length - 1, Escape: null };\n if (!(key in moves) || !model.length) return;\n event.preventDefault();\n select(moves[key]!, true);\n });\n onWidth(root, scope, () => {\n measure();\n paint(shown);\n paintSelection(false);\n });\n\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = slices();\n draw(true);\n },\n select: (index) => select(index),\n get selected() {\n return selected;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { chartFrame, finite, formatNumber, onWidth, polar, round, slotColor, svg } from '../chart/parts';\n\n/*\n * Radar chart: profiles over several measures on radial axes, in chart's\n * family. Hairline rings (polygons or circles) and spokes; each series is a\n * filled shape (18 %) with a 2 px edge and its points. The shapes grow out of\n * the middle on the swatch curve (.38,.49,0,1.5), 90 ms apart; new data glides\n * from the drawn values. Pointing near an axis (or the arrows) lights its spoke\n * as a dotted guide, pops each series' point there and shows the values in the\n * tooltip; a legend pill brings its series forward and dims the rest.\n */\n\nexport interface RadarSeries {\n name: string;\n values: Array<number | null>;\n color?: string;\n}\n\nexport interface RadarChartOptions {\n /** The measures, clockwise from the top. */\n axes?: string[];\n series?: RadarSeries[];\n /** The outer ring's value (default: the largest value, rounded up). */\n max?: number;\n /** Rings (default 4). */\n levels?: number;\n /** Ring shape (default 'polygon'). */\n grid?: 'polygon' | 'circle';\n /** Diameter in px (default 300; it shrinks with its container). */\n size?: number;\n label?: string;\n legend?: boolean;\n formatValue?: (value: number) => string;\n emptyLabel?: string;\n onSelect?: (axis: number | null) => void;\n}\n\nexport interface RadarChartInstance extends Instance {\n update(options: RadarChartOptions): void;\n select(axis: number | null): void;\n readonly selected: number | null;\n}\n\nfunction niceMax(value: number) {\n if (value <= 0) return 1;\n const power = 10 ** Math.floor(Math.log10(value));\n const fraction = value / power;\n return (fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10) * power;\n}\n\nexport function createRadarChart(root: HTMLElement | null, initial: RadarChartOptions = {}): RadarChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const frame = chartFrame(root, scope, 'radar');\n const { plot, canvas, keep } = frame;\n let options: RadarChartOptions = { ...initial };\n let selected: number | null = null;\n let focusSeries: number | null = null;\n\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : formatNumber(value));\n const modelOf = () => {\n const axes = (options.axes ?? []).map(String);\n const raw = options.series ?? [];\n return {\n axes,\n series: raw.map((series, i) => ({\n name: String(series.name ?? ''),\n values: axes.map((_, k) => (finite(series.values[k]) ? Math.max(0, series.values[k]!) : null)),\n color: series.color ?? slotColor(i, raw.length),\n })),\n };\n };\n let model = modelOf();\n const hasData = () => model.axes.length >= 3 && model.series.some((series) => series.values.some(finite));\n const maxOf = () => (finite(options.max) && options.max > 0 ? options.max : niceMax(Math.max(0, ...model.series.flatMap((series) => series.values.filter(finite)))));\n\n let geometry = { size: 300, cx: 150, cy: 150, r: 110 };\n const angle = (k: number) => (k / model.axes.length) * Math.PI * 2;\n let shapes: Array<{ area: SVGPathElement; edge: SVGPathElement; dots: SVGCircleElement[] }> = [];\n let guide: SVGLineElement | null = null;\n let labels: SVGTextElement[] = [];\n let shown: number[][] = [];\n let glide: gsap.core.Tween | null = null;\n scope.add(() => glide?.kill());\n\n const measure = () => {\n const width = Math.round(plot.clientWidth || root.clientWidth || 0);\n const wanted = finite(options.size) ? options.size : 300;\n const size = Math.max(180, width ? Math.min(wanted, width) : wanted);\n // Room around the rings for the axis names.\n const r = size / 2 - Math.min(64, Math.max(36, Math.max(...model.axes.map((axis) => axis.length)) * 3.6 + 14));\n geometry = { size, cx: size / 2, cy: size / 2, r: Math.max(40, r) };\n canvas.setAttribute('viewBox', `0 0 ${size} ${size}`);\n canvas.setAttribute('width', String(size));\n canvas.setAttribute('height', String(size));\n plot.style.setProperty('--mk-radar-size', `${size}px`);\n };\n scope.add(() => plot.style.removeProperty('--mk-radar-size'));\n\n const pointOf = (value: number, k: number, max: number) => polar(geometry.cx, geometry.cy, (Math.min(value, max) / max) * geometry.r, angle(k));\n\n const build = () => {\n canvas.replaceChildren();\n const { cx, cy, r } = geometry;\n const n = model.axes.length;\n const levels = Math.max(1, Math.round(options.levels ?? 4));\n const grid = svg('g', { 'data-mk-part': 'grid' });\n for (let level = 1; level <= levels; level++) {\n const radius = (r * level) / levels;\n if (options.grid === 'circle') grid.append(svg('circle', { cx, cy, r: round(radius) }));\n else {\n const points = Array.from({ length: n }, (_, k) => polar(cx, cy, radius, angle(k)).map(round).join(',')).join(' ');\n grid.append(svg('polygon', { points }));\n }\n }\n for (let k = 0; k < n; k++) {\n const [x, y] = polar(cx, cy, r, angle(k));\n grid.append(svg('line', { x1: cx, y1: cy, x2: round(x), y2: round(y), 'data-mk-spoke': k }));\n }\n canvas.append(grid);\n const names = svg('g', { 'data-mk-part': 'axes' });\n labels = model.axes.map((axis, k) => {\n const a = angle(k);\n const [x, y] = polar(cx, cy, r + 14, a);\n const sin = Math.sin(a);\n const text = svg('text', { x: round(x), y: round(y), 'text-anchor': Math.abs(sin) < 0.2 ? 'middle' : sin > 0 ? 'start' : 'end', 'dominant-baseline': 'middle' });\n text.textContent = axis;\n names.append(text);\n return text;\n });\n canvas.append(names);\n guide = svg('line', { 'data-mk-part': 'guide' });\n guide.style.display = 'none';\n canvas.append(guide);\n const series = svg('g', { 'data-mk-part': 'series' });\n shapes = model.series.map((each, s) => {\n const group = svg('g', { 'data-mk-series': s });\n const area = svg('path', { 'data-mk-part': 'area' });\n area.style.fill = each.color;\n const edge = svg('path', { 'data-mk-part': 'edge' });\n edge.style.stroke = each.color;\n group.append(area, edge);\n const dots = model.axes.map(() => {\n const dot = svg('circle', { r: 3, 'data-mk-part': 'dot' });\n dot.style.fill = each.color;\n group.append(dot);\n return dot;\n });\n series.append(group);\n return { area, edge, dots };\n });\n canvas.append(series);\n };\n\n const paint = (values: number[][]) => {\n shown = values;\n const max = maxOf();\n shapes.forEach((shape, s) => {\n const list = values[s] ?? [];\n const points = model.axes.map((_, k) => pointOf(list[k] ?? 0, k, max));\n const d = `M${points.map(([x, y]) => `${round(x)},${round(y)}`).join('L')}Z`;\n shape.area.setAttribute('d', d);\n shape.edge.setAttribute('d', d);\n shape.dots.forEach((dot, k) => {\n dot.setAttribute('cx', String(round(points[k]![0])));\n dot.setAttribute('cy', String(round(points[k]![1])));\n dot.style.display = finite(model.series[s]!.values[k]) ? '' : 'none';\n });\n });\n };\n\n const paintSelection = (announce: boolean) => {\n shapes.forEach((shape, s) => {\n shape.area.parentElement!.toggleAttribute('data-mk-dim', focusSeries !== null && s !== focusSeries);\n shape.dots.forEach((dot, k) => {\n const on = k === selected;\n if (on === dot.hasAttribute('data-mk-on')) return;\n dot.toggleAttribute('data-mk-on', on);\n const r = on ? 5 : 3;\n if (reduced()) dot.setAttribute('r', String(r));\n else keep(gsap.to(dot, { attr: { r }, duration: on ? 0.3 : 0.2, ease: on ? EASE.pop : 'power2.out' }));\n });\n });\n labels.forEach((label, k) => label.toggleAttribute('data-mk-on', k === selected));\n if (selected === null || !guide) {\n if (guide) guide.style.display = 'none';\n frame.tip(null);\n return;\n }\n const k = selected;\n const [x, y] = polar(geometry.cx, geometry.cy, geometry.r, angle(k));\n Object.entries({ x1: geometry.cx, y1: geometry.cy, x2: round(x), y2: round(y) }).forEach(([name, value]) => guide!.setAttribute(name, String(value)));\n guide.style.display = '';\n const rows = model.series.map((series) => ({ name: series.name, color: series.color, value: finite(series.values[k]) ? format(series.values[k]!) : '—' }));\n const max = maxOf();\n const top = Math.min(...model.series.map((series) => pointOf(series.values[k] ?? 0, k, max)[1]));\n frame.tip({ x: round(x), y: Math.min(round(y), top), title: model.axes[k]!, rows });\n if (announce) frame.live.textContent = `${model.axes[k]}. ${rows.map((row) => `${row.name ? `${row.name}: ` : ''}${row.value}`).join('. ')}`;\n };\n\n let legendItems: HTMLLIElement[] = [];\n const draw = (animate: boolean) => {\n glide?.kill();\n const name = options.label ?? 'Gráfica de radar';\n canvas.setAttribute('aria-label', hasData() ? `${name}. ${model.axes.length} medidas: ${model.axes.join(', ')}. Series: ${model.series.map((series) => series.name).join(', ')}. Usa las flechas para recorrer las medidas.` : `${name}: ${options.emptyLabel ?? 'sin datos'}`);\n frame.fillTable(name, ['Medida', ...model.series.map((series) => series.name || 'Valor')], model.axes.map((axis, k) => [axis, ...model.series.map((series) => (finite(series.values[k]) ? format(series.values[k]!) : '—'))]));\n legendItems = frame.fillLegend(model.series, options.legend ?? model.series.length > 1, 'area');\n legendItems.forEach((item, s) => {\n item.addEventListener('pointerenter', () => {\n focusSeries = s;\n paintSelection(false);\n });\n item.addEventListener('pointerleave', () => {\n focusSeries = null;\n paintSelection(false);\n });\n });\n const ok = hasData();\n frame.empty.hidden = ok;\n frame.empty.textContent = options.emptyLabel ?? 'Sin datos para mostrar';\n plot.hidden = !ok;\n if (!ok) {\n canvas.replaceChildren();\n shapes = [];\n shown = [];\n selected = null;\n return;\n }\n if (selected !== null && selected >= model.axes.length) selected = null;\n const before = shown;\n const comparable = before.length === model.series.length && before.every((list) => list.length === model.axes.length) && shapes.length === model.series.length;\n measure();\n build();\n const target = model.series.map((series) => series.values.map((value) => value ?? 0));\n const done = () => {\n paint(target);\n paintSelection(false);\n };\n if (!animate || reduced()) return done();\n const state = { t: 0 };\n if (comparable) {\n glide = gsap.to(state, { t: 1, duration: 0.6, ease: EASE.swatch, onUpdate: () => paint(target.map((list, s) => list.map((value, k) => before[s]![k]! + (value - before[s]![k]!) * state.t))), onComplete: done });\n return;\n }\n // First appearance: each shape grows out of the middle, one after the other.\n const stagger = 0.09;\n const total = 0.7 + stagger * (target.length - 1);\n paint(target.map((list) => list.map(() => 0)));\n glide = gsap.to(state, {\n t: total,\n duration: total,\n ease: 'none',\n onUpdate: () => paint(target.map((list, s) => {\n const local = Math.min(1, Math.max(0, (state.t - s * stagger) / 0.7));\n const eased = gsap.parseEase(EASE.swatch)(local);\n return list.map((value) => value * eased);\n })),\n onComplete: done,\n });\n };\n\n const select = (axis: number | null, announce = false) => {\n if (scope.disposed) return;\n const n = model.axes.length;\n const next = axis === null || !hasData() ? null : ((Math.round(axis) % n) + n) % n;\n if (next === selected) return;\n selected = next;\n paintSelection(announce);\n options.onSelect?.(selected);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { index: selected, label: selected === null ? null : model.axes[selected], values: selected === null ? [] : model.series.map((series) => series.values[selected!]) } }));\n };\n\n /** The axis nearest the pointer's angle around the middle (none right in the middle). */\n const axisAt = (event: PointerEvent) => {\n const box = canvas.getBoundingClientRect();\n const scale = box.width ? geometry.size / box.width : 1;\n const x = (event.clientX - box.left) * scale - geometry.cx;\n const y = (event.clientY - box.top) * scale - geometry.cy;\n if (Math.hypot(x, y) < geometry.r * 0.12) return selected;\n const a = (Math.atan2(x, -y) + Math.PI * 2) % (Math.PI * 2);\n return Math.round(a / ((Math.PI * 2) / model.axes.length)) % model.axes.length;\n };\n scope.on(canvas, 'pointermove', (event) => select(axisAt(event as PointerEvent)));\n scope.on(canvas, 'pointerdown', (event) => select(axisAt(event as PointerEvent)));\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'mouse') select(null);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && hasData()) select(0, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const moves: Record<string, number | null> = { ArrowRight: (selected ?? -1) + 1, ArrowDown: (selected ?? -1) + 1, ArrowLeft: (selected ?? 1) - 1, ArrowUp: (selected ?? 1) - 1, Home: 0, End: model.axes.length - 1, Escape: null };\n if (!(key in moves) || !hasData()) return;\n event.preventDefault();\n select(moves[key]!, true);\n });\n onWidth(root, scope, () => {\n if (!hasData()) return;\n measure();\n build();\n paint(shown);\n paintSelection(false);\n });\n\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = modelOf();\n draw(true);\n },\n select: (axis) => select(axis),\n get selected() {\n return selected;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn, rollDigits } from '../../motion/micro';\nimport { arcPath, chartFrame, finite, formatNumber, onWidth, polar, round, slotColor, svg } from '../chart/parts';\n\n/*\n * Radial chart: totals as rings, one inside the other, each filling its track\n * from 12 o'clock with round ends (or a 270° gauge), in chart's family. The\n * rings sweep in on the swatch curve (.38,.49,0,1.5), 80 ms apart from the\n * outside in, while the middle rolls up to the total; new data glides each\n * ring. Pointing at a ring (its legend pill, or the arrows) thickens it, dims\n * the rest and the middle says its value and how much of its goal it is.\n */\n\nexport interface RadialDatum {\n label: string;\n value: number;\n /** This ring's goal (default: the chart's max). */\n max?: number;\n color?: string;\n}\n\nexport interface RadialChartOptions {\n /** Rings from the outside in. */\n data?: RadialDatum[];\n /** What a full ring is worth (default: the largest value). */\n max?: number;\n /** Degrees a full ring covers (default 360; 270 makes a gauge). */\n sweep?: number;\n /** Diameter in px (default 240). */\n size?: number;\n /** Ring thickness in px (default: what fits, up to 16). */\n thickness?: number;\n /** Discrete sectors per ring (0: continuous, default). */\n segments?: number;\n /** Show values (default) or progress toward the goals in the middle. */\n center?: 'value' | 'percent';\n label?: string;\n /** The middle when nothing is chosen (default 'Total'). */\n totalLabel?: string;\n legend?: boolean;\n formatValue?: (value: number) => string;\n emptyLabel?: string;\n onSelect?: (index: number | null) => void;\n}\n\nexport interface RadialChartInstance extends Instance {\n update(options: RadialChartOptions): void;\n select(index: number | null): void;\n readonly selected: number | null;\n}\n\n/** A stroked arc on a circle from `a0` to `a1` (radians, 0 at the top, clockwise). */\nfunction strokeArc(cx: number, cy: number, r: number, a0: number, a1: number) {\n const end = a0 + Math.min(a1 - a0, Math.PI * 2 - 1e-3);\n const [x0, y0] = polar(cx, cy, r, a0);\n const [x1, y1] = polar(cx, cy, r, end);\n return `M${round(x0)},${round(y0)}A${round(r)},${round(r)} 0 ${end - a0 > Math.PI ? 1 : 0} 1 ${round(x1)},${round(y1)}`;\n}\n\nexport function createRadialChart(root: HTMLElement | null, initial: RadialChartOptions = {}): RadialChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const frame = chartFrame(root, scope, 'radial');\n const { plot, canvas, keep } = frame;\n let options: RadialChartOptions = { ...initial };\n let selected: number | null = null;\n\n const center = document.createElement('div');\n center.dataset.mkRadialCenter = '';\n center.setAttribute('aria-hidden', 'true');\n const centerValue = document.createElement('strong');\n const centerLabel = document.createElement('span');\n center.append(centerValue, centerLabel);\n plot.append(center);\n scope.add(() => center.remove());\n\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : formatNumber(value));\n const modelOf = () => {\n const data = (options.data ?? []).filter((datum) => finite(datum.value));\n const top = Math.max(0, ...data.map((datum) => datum.value));\n return data.map((datum, i) => ({\n label: String(datum.label),\n value: Math.max(0, datum.value),\n max: finite(datum.max) && datum.max > 0 ? datum.max : finite(options.max) && options.max > 0 ? options.max : top || 1,\n color: datum.color ?? slotColor(i, Math.max(2, data.length)),\n }));\n };\n let model = modelOf();\n const total = () => model.reduce((sum, ring) => sum + ring.value, 0);\n const percent = (ring: { value: number; max: number }) => new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 0 }).format(ring.value / ring.max);\n const sweep = () => (Math.min(360, Math.max(90, finite(options.sweep) ? options.sweep : 360)) * Math.PI) / 180;\n const startAngle = () => -sweep() / 2 + (sweep() >= Math.PI * 2 - 1e-6 ? Math.PI : 0);\n const segments = () => finite(options.segments) ? Math.max(0, Math.min(80, Math.round(options.segments))) : 0;\n\n let geometry = { size: 240, cx: 120, cy: 120, radii: [] as number[], thickness: 12 };\n let arcs: SVGPathElement[] = [];\n let tracks: SVGPathElement[] = [];\n let shown: number[] = [];\n let glide: gsap.core.Tween | null = null;\n scope.add(() => glide?.kill());\n\n const measure = () => {\n const width = Math.round(plot.clientWidth || root.clientWidth || 0);\n const wanted = finite(options.size) ? options.size : 240;\n const size = Math.max(120, width ? Math.min(wanted, width) : wanted);\n const n = Math.max(1, model.length);\n const outer = size / 2 - 4;\n // Rings share the outer 60 % of the radius, a quarter of a ring apart.\n const fit = (outer * 0.6) / (n + (n - 1) * 0.35);\n const thickness = finite(options.thickness) ? options.thickness : Math.max(4, Math.min(16, fit));\n const spacing = thickness * 1.35;\n geometry = { size, cx: size / 2, cy: size / 2, thickness, radii: model.map((_, i) => outer - thickness / 2 - i * spacing) };\n const half = sweep() <= Math.PI + 1e-6;\n const height = half ? size / 2 + 54 : size;\n canvas.setAttribute('viewBox', `0 0 ${size} ${height}`);\n canvas.setAttribute('width', String(size));\n canvas.setAttribute('height', String(height));\n plot.style.setProperty('--mk-radial-size', `${size}px`);\n plot.style.setProperty('--mk-radial-thickness', `${thickness}px`);\n plot.style.setProperty('--mk-radial-center-y', half ? `${size / 2}px` : '50%');\n plot.style.setProperty('--mk-radial-center-width', n === 1 ? '0.68' : '0.36');\n };\n scope.add(() => {\n plot.style.removeProperty('--mk-radial-size');\n plot.style.removeProperty('--mk-radial-thickness');\n plot.style.removeProperty('--mk-radial-center-y');\n plot.style.removeProperty('--mk-radial-center-width');\n });\n\n const segmentedPath = (radius: number, share: number) => {\n const count = segments(), step = sweep() / count, a0 = startAngle();\n const gap = Math.min(step * 0.3, 4 / Math.max(1, radius));\n const limit = a0 + sweep() * Math.min(1, Math.max(0, share));\n const outer = radius + geometry.thickness / 2 - 1, inner = Math.max(0, radius - geometry.thickness / 2 + 1);\n return Array.from({ length: count }, (_, index) => {\n const from = a0 + index * step + gap / 2;\n const to = Math.min(a0 + (index + 1) * step - gap / 2, limit);\n return to > from ? arcPath(geometry.cx, geometry.cy, outer, inner, from, to) : '';\n }).join('');\n };\n\n const build = () => {\n canvas.replaceChildren();\n const { cx, cy, radii } = geometry;\n const a0 = startAngle();\n const back = svg('g', { 'data-mk-part': 'tracks' });\n const front = svg('g', { 'data-mk-part': 'series' });\n tracks = model.map((_, i) => {\n const track = svg('path', { d: segments() ? segmentedPath(radii[i]!, 1) : strokeArc(cx, cy, radii[i]!, a0, a0 + sweep()), 'data-mk-index': i });\n back.append(track);\n return track;\n });\n arcs = model.map((ring, i) => {\n const arc = svg('path', { 'data-mk-index': i, 'data-mk-part': 'ring' });\n arc.style.stroke = ring.color;\n if (segments()) arc.style.fill = ring.color;\n front.append(arc);\n return arc;\n });\n canvas.append(back, front);\n };\n\n const paint = (values: number[]) => {\n shown = values;\n const { cx, cy, radii } = geometry;\n const a0 = startAngle();\n arcs.forEach((arc, i) => {\n const share = Math.min(1, Math.max(0, (values[i] ?? 0) / model[i]!.max));\n arc.setAttribute('d', share > 0.001 ? segments() ? segmentedPath(radii[i]!, share) : strokeArc(cx, cy, radii[i]!, a0, a0 + sweep() * share) : '');\n });\n };\n\n const paintCenter = (animate: boolean) => {\n center.hidden = !model.length;\n const ring = selected === null ? null : model[selected];\n const denominator = ring ? ring.max : model.reduce((sum, each) => sum + each.max, 0);\n const value = ring ? ring.value : total();\n const text = options.center === 'percent' ? new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 1 }).format(value / (denominator || 1)) : format(value);\n const caption = ring ? `${ring.label} · ${percent(ring)}` : (options.totalLabel ?? 'Total');\n const changed = centerLabel.textContent !== caption;\n if (centerValue.textContent !== text) {\n if (animate && !reduced() && centerValue.textContent) keep(rollDigits(centerValue, text, 1, 0.35));\n else centerValue.textContent = text;\n }\n centerLabel.textContent = caption;\n if (changed && animate && !reduced()) keep(blurIn(centerLabel, { from: 'soft', duration: 0.3 }));\n };\n\n let legendItems: HTMLLIElement[] = [];\n const paintSelection = (announce: boolean) => {\n for (const list of [arcs, tracks]) list.forEach((each, i) => {\n each.toggleAttribute('data-mk-on', i === selected);\n each.toggleAttribute('data-mk-dim', selected !== null && i !== selected);\n });\n legendItems.forEach((item, i) => item.toggleAttribute('data-mk-dim', selected !== null && i !== selected));\n paintCenter(true);\n const ring = selected === null ? null : model[selected];\n if (announce && ring) frame.live.textContent = `${ring.label}: ${format(ring.value)} de ${format(ring.max)}, ${percent(ring)}`;\n };\n\n const draw = (animate: boolean) => {\n glide?.kill();\n scope.attr(root, 'data-mk-segmented', segments() ? '' : null);\n const name = options.label ?? 'Gráfica radial';\n canvas.setAttribute('aria-label', model.length ? `${name}. ${model.length} anillos, total ${format(total())}. Usa las flechas para recorrerlos.` : `${name}: ${options.emptyLabel ?? 'sin datos'}`);\n frame.fillTable(name, ['Anillo', 'Valor', 'Meta', 'Avance'], model.map((ring) => [ring.label, format(ring.value), format(ring.max), percent(ring)]));\n legendItems = frame.fillLegend(model.map((datum) => ({ name: datum.label, color: datum.color })), options.legend ?? true);\n legendItems.forEach((item, i) => {\n item.addEventListener('pointerenter', () => select(i));\n item.addEventListener('pointerleave', () => select(null));\n });\n frame.empty.hidden = model.length > 0;\n frame.empty.textContent = options.emptyLabel ?? 'Sin datos para mostrar';\n plot.hidden = !model.length;\n if (!model.length) {\n canvas.replaceChildren();\n arcs = [];\n shown = [];\n selected = null;\n return;\n }\n if (selected !== null && selected >= model.length) selected = null;\n const before = shown;\n const comparable = before.length === model.length && arcs.length === model.length;\n measure();\n build();\n const target = model.map((ring) => ring.value);\n const done = () => {\n paint(target);\n paintSelection(false);\n };\n if (!animate || reduced()) return done();\n const state = { t: 0 };\n if (comparable) {\n glide = gsap.to(state, { t: 1, duration: 0.6, ease: EASE.swatch, onUpdate: () => paint(target.map((value, i) => before[i]! + (value - before[i]!) * state.t)), onComplete: done });\n paintCenter(true);\n return;\n }\n // First appearance: the rings sweep in from the outside in, 80 ms apart, and the total rolls up.\n const stagger = 0.08;\n const length = 0.8 + stagger * (target.length - 1);\n const ease = gsap.parseEase(EASE.swatch);\n paint(target.map(() => 0));\n centerValue.textContent = format(0);\n glide = gsap.to(state, {\n t: length,\n duration: length,\n ease: 'none',\n onUpdate: () => paint(target.map((value, i) => value * ease(Math.min(1, Math.max(0, (state.t - i * stagger) / 0.8))))),\n onComplete: done,\n });\n paintCenter(true);\n };\n\n const select = (index: number | null, announce = false) => {\n if (scope.disposed) return;\n const next = index === null || !model.length ? null : ((Math.round(index) % model.length) + model.length) % model.length;\n if (next === selected) return;\n selected = next;\n paintSelection(announce);\n options.onSelect?.(selected);\n const ring = selected === null ? null : model[selected];\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { index: selected, label: ring?.label ?? null, value: ring?.value ?? null } }));\n };\n\n /** The ring under the pointer (by its distance from the middle). */\n const ringAt = (event: PointerEvent) => {\n const box = canvas.getBoundingClientRect();\n const scale = box.width ? geometry.size / box.width : 1;\n const distance = Math.hypot((event.clientX - box.left) * scale - geometry.cx, (event.clientY - box.top) * scale - geometry.cy);\n const near = geometry.radii.findIndex((r) => Math.abs(distance - r) <= geometry.thickness * 0.7);\n return near < 0 ? null : near;\n };\n scope.on(canvas, 'pointermove', (event) => select(ringAt(event as PointerEvent)));\n scope.on(canvas, 'pointerdown', (event) => select(ringAt(event as PointerEvent)));\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'mouse') select(null);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && model.length) select(0, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const moves: Record<string, number | null> = { ArrowDown: (selected ?? -1) + 1, ArrowRight: (selected ?? -1) + 1, ArrowUp: (selected ?? 1) - 1, ArrowLeft: (selected ?? 1) - 1, Home: 0, End: model.length - 1, Escape: null };\n if (!(key in moves) || !model.length) return;\n event.preventDefault();\n select(moves[key]!, true);\n });\n onWidth(root, scope, () => {\n if (!model.length) return;\n measure();\n build();\n paint(shown);\n paintSelection(false);\n });\n\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = modelOf();\n draw(true);\n },\n select: (index) => select(index),\n get selected() {\n return selected;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { chartFrame, finite, formatNumber, onWidth, round, slotColor, svg, SVG_NS } from '../chart/parts';\n\n/*\n * Sankey chart: flows between stages as bands as wide as their value, in\n * chart's family. Nodes stand in columns by their depth (the ones that lead\n * nowhere end at the right), stacked in the given order and centred; each\n * band fades from its source's colour to its target's. The nodes grow from\n * their middles, column after column, while the bands are wiped in from the\n * left (.9 s); new data with the same nodes and flows glides every node and\n * band. Pointing at a band (or the arrows) lights it and dims the rest, with\n * \"A → B\" and its share in the tooltip; pointing at a node lights its bands.\n */\n\nexport interface SankeyNode {\n id: string;\n label?: string;\n color?: string;\n}\n\nexport interface SankeyLink {\n source: string;\n target: string;\n value: number;\n}\n\nexport interface SankeyChartOptions {\n nodes?: SankeyNode[];\n links?: SankeyLink[];\n /** Plot height in px (default 320). */\n height?: number;\n /** Node width in px (default 12). */\n nodeWidth?: number;\n /** Space between nodes in a column, px (default 14). */\n nodePadding?: number;\n label?: string;\n formatValue?: (value: number) => string;\n emptyLabel?: string;\n /** A flow was chosen (its index in `links`), or none. */\n onSelect?: (index: number | null) => void;\n}\n\nexport interface SankeyChartInstance extends Instance {\n update(options: SankeyChartOptions): void;\n select(index: number | null): void;\n readonly selected: number | null;\n}\n\ninterface Layout {\n nodes: Array<{ x: number; y0: number; y1: number }>;\n links: Array<{ sy: number; ty: number; width: number }>;\n}\n\nexport function createSankeyChart(root: HTMLElement | null, initial: SankeyChartOptions = {}): SankeyChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const frame = chartFrame(root, scope, 'sankey');\n const { plot, canvas } = frame;\n let options: SankeyChartOptions = { ...initial };\n let selected: number | null = null;\n let hoverNode: number | null = null;\n const uid = `mk-sankey-${Math.random().toString(36).slice(2, 8)}`;\n\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : formatNumber(value));\n const modelOf = () => {\n const nodes = (options.nodes ?? []).map((node, i, all) => ({ id: String(node.id), label: String(node.label ?? node.id), color: node.color ?? slotColor(i, Math.max(2, all.length)) }));\n const index = new Map(nodes.map((node, i) => [node.id, i]));\n const links = (options.links ?? [])\n .map((link, i) => ({ source: index.get(String(link.source)) ?? -1, target: index.get(String(link.target)) ?? -1, value: link.value, given: i }))\n .filter((link) => link.source >= 0 && link.target >= 0 && link.source !== link.target && finite(link.value) && link.value > 0);\n // Depth: the longest way in from a source (bounded, so a loop cannot run away).\n const depth = nodes.map(() => 0);\n for (let pass = 0; pass < nodes.length; pass++) {\n let moved = false;\n for (const link of links) {\n if (depth[link.target]! < depth[link.source]! + 1 && depth[link.source]! + 1 < nodes.length) {\n depth[link.target] = depth[link.source]! + 1;\n moved = true;\n }\n }\n if (!moved) break;\n }\n const columns = Math.max(0, ...depth) + 1;\n // The ones that lead nowhere end at the right.\n nodes.forEach((_, i) => {\n if (links.some((link) => link.source === i) || !links.some((link) => link.target === i)) return;\n depth[i] = columns - 1;\n });\n const used = nodes.map((_, i) => links.some((link) => link.source === i || link.target === i));\n const value = nodes.map((_, i) => Math.max(links.filter((link) => link.target === i).reduce((s, l) => s + l.value, 0), links.filter((link) => link.source === i).reduce((s, l) => s + l.value, 0)));\n return { nodes, links, depth, columns, used, value };\n };\n let model = modelOf();\n const hasData = () => model.links.length > 0;\n\n let width = 600;\n let height = 320;\n const layoutOf = (): Layout => {\n width = Math.max(240, Math.round(plot.clientWidth || root.clientWidth || 600));\n height = Math.max(160, finite(options.height) ? options.height : 320);\n const nodeWidth = Math.max(4, finite(options.nodeWidth) ? options.nodeWidth : 12);\n const pad = Math.max(2, finite(options.nodePadding) ? options.nodePadding : 14);\n const top = 6;\n const usable = height - top * 2;\n const columns = Array.from({ length: model.columns }, (_, c) => model.nodes.map((_, i) => i).filter((i) => model.used[i] && model.depth[i] === c));\n const ky = Math.min(...columns.filter((list) => list.length).map((list) => (usable - pad * (list.length - 1)) / list.reduce((sum, i) => sum + model.value[i]!, 0)));\n const step = model.columns > 1 ? (width - nodeWidth) / (model.columns - 1) : 0;\n const nodes = model.nodes.map(() => ({ x: 0, y0: 0, y1: 0 }));\n for (const list of columns) {\n const total = list.reduce((sum, i) => sum + model.value[i]! * ky, 0) + pad * Math.max(0, list.length - 1);\n let y = top + (usable - total) / 2;\n for (const i of list) {\n const h = Math.max(1, model.value[i]! * ky);\n nodes[i] = { x: model.depth[i]! * step, y0: y, y1: y + h };\n y += h + pad;\n }\n }\n // Bands leave a node in the order of their targets and arrive in the order of their sources.\n const out = new Map<number, number>();\n const into = new Map<number, number>();\n const centre = (i: number) => (nodes[i]!.y0 + nodes[i]!.y1) / 2;\n const links = model.links.map(() => ({ sy: 0, ty: 0, width: 0 }));\n const order = model.links.map((_, k) => k);\n for (const k of [...order].sort((a, b) => centre(model.links[a]!.target) - centre(model.links[b]!.target))) {\n const link = model.links[k]!;\n const w = link.value * ky;\n const at = out.get(link.source) ?? nodes[link.source]!.y0;\n links[k]!.sy = at + w / 2;\n links[k]!.width = w;\n out.set(link.source, at + w);\n }\n for (const k of [...order].sort((a, b) => centre(model.links[a]!.source) - centre(model.links[b]!.source))) {\n const link = model.links[k]!;\n const at = into.get(link.target) ?? nodes[link.target]!.y0;\n links[k]!.ty = at + links[k]!.width / 2;\n into.set(link.target, at + links[k]!.width);\n }\n return { nodes, links };\n };\n\n let shown: Layout | null = null;\n let rects: SVGRectElement[] = [];\n let bands: SVGPathElement[] = [];\n let names: SVGTextElement[] = [];\n let glide: gsap.core.Animation | null = null;\n scope.add(() => glide?.kill());\n const nodeWidth = () => Math.max(4, finite(options.nodeWidth) ? options.nodeWidth : 12);\n\n const build = () => {\n canvas.replaceChildren();\n canvas.setAttribute('viewBox', `0 0 ${width} ${height}`);\n canvas.setAttribute('width', String(width));\n canvas.setAttribute('height', String(height));\n const defs = svg('defs');\n const flows = svg('g', { 'data-mk-part': 'links' });\n bands = model.links.map((link, k) => {\n const gradient = svg('linearGradient', { id: `${uid}-${k}`, gradientUnits: 'userSpaceOnUse' });\n const from = svg('stop', { offset: '0' });\n from.style.stopColor = model.nodes[link.source]!.color;\n const to = svg('stop', { offset: '1' });\n to.style.stopColor = model.nodes[link.target]!.color;\n gradient.append(from, to);\n defs.append(gradient);\n const band = svg('path', { 'data-mk-index': k });\n band.style.fill = `url(#${uid}-${k})`;\n flows.append(band);\n return band;\n });\n const nodesLayer = svg('g', { 'data-mk-part': 'nodes' });\n rects = model.nodes.map((node, i) => {\n const rect = svg('rect', { width: nodeWidth(), rx: 3, 'data-mk-node': i });\n rect.style.fill = node.color;\n if (!model.used[i]) rect.style.display = 'none';\n nodesLayer.append(rect);\n return rect;\n });\n const labels = svg('g', { 'data-mk-part': 'labels' });\n names = model.nodes.map((node, i) => {\n const text = svg('text', { 'dominant-baseline': 'middle' });\n text.textContent = node.label;\n const amount = document.createElementNS(SVG_NS, 'tspan');\n amount.setAttribute('data-mk-part', 'amount');\n amount.textContent = ` ${format(model.value[i]!)}`;\n text.append(amount);\n if (!model.used[i]) text.style.display = 'none';\n labels.append(text);\n return text;\n });\n canvas.append(defs, flows, nodesLayer, labels);\n };\n\n const paint = (layout: Layout) => {\n shown = layout;\n const w = nodeWidth();\n layout.nodes.forEach((node, i) => {\n const rect = rects[i]!;\n rect.setAttribute('x', String(round(node.x)));\n rect.setAttribute('y', String(round(node.y0)));\n rect.setAttribute('height', String(round(Math.max(1, node.y1 - node.y0))));\n const last = model.depth[i] === model.columns - 1 && model.columns > 1;\n const name = names[i]!;\n const first = model.depth[i] === 0;\n const x = round(last ? node.x - 8 : first ? node.x + w + 8 : node.x + w / 2);\n const available = model.columns > 1 ? (width - w) / (model.columns - 1) - 20 : width - w - 16;\n const characters = Math.max(3, Math.floor(available / 7));\n const label = model.nodes[i]!.label;\n if (name.firstChild) name.firstChild.textContent = label.length > characters ? `${label.slice(0, characters - 1)}…` : label;\n name.setAttribute('x', String(x));\n name.setAttribute('y', String(round((node.y0 + node.y1) / 2 - 7)));\n name.setAttribute('text-anchor', last ? 'end' : first ? 'start' : 'middle');\n const amount = name.querySelector('tspan');\n amount?.setAttribute('x', String(x));\n amount?.setAttribute('dy', '14');\n });\n layout.links.forEach((link, k) => {\n const { source, target } = model.links[k]!;\n const x0 = layout.nodes[source]!.x + w;\n const x1 = layout.nodes[target]!.x;\n const xm = (x0 + x1) / 2;\n const h = link.width / 2;\n const [s0, s1, t0, t1] = [link.sy - h, link.sy + h, link.ty - h, link.ty + h].map(round);\n bands[k]!.setAttribute('d', `M${round(x0)},${s0}C${round(xm)},${s0} ${round(xm)},${t0} ${round(x1)},${t0}L${round(x1)},${t1}C${round(xm)},${t1} ${round(xm)},${s1} ${round(x0)},${s1}Z`);\n const gradient = canvas.querySelector(`#${uid}-${k}`);\n gradient?.setAttribute('x1', String(round(x0)));\n gradient?.setAttribute('x2', String(round(x1)));\n });\n };\n\n const share = (part: number, whole: number) => new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 1 }).format(part / (whole || 1));\n const paintSelection = (announce: boolean) => {\n const lit = (k: number) => (selected !== null ? k === selected : hoverNode !== null ? model.links[k]!.source === hoverNode || model.links[k]!.target === hoverNode : false);\n const any = selected !== null || hoverNode !== null;\n bands.forEach((band, k) => {\n band.toggleAttribute('data-mk-on', lit(k));\n band.toggleAttribute('data-mk-dim', any && !lit(k));\n });\n rects.forEach((rect, i) => rect.toggleAttribute('data-mk-dim', any && !model.links.some((link, k) => lit(k) && (link.source === i || link.target === i))));\n if (!shown || (selected === null && hoverNode === null)) {\n frame.tip(null);\n return;\n }\n if (selected !== null) {\n const link = model.links[selected]!;\n const geometry = shown.links[selected]!;\n const x = (shown.nodes[link.source]!.x + shown.nodes[link.target]!.x + nodeWidth()) / 2;\n const y = (geometry.sy + geometry.ty) / 2 - geometry.width / 2;\n const from = model.nodes[link.source]!;\n const to = model.nodes[link.target]!;\n const rows = [{ name: `${share(link.value, model.value[link.source]!)} de ${from.label}`, color: from.color, value: format(link.value) }];\n frame.tip({ x: round(x), y: round(y), title: `${from.label} → ${to.label}`, rows });\n if (announce) frame.live.textContent = `${from.label} a ${to.label}: ${format(link.value)}`;\n } else {\n const i = hoverNode!;\n const node = shown.nodes[i]!;\n frame.tip({ x: round(node.x + nodeWidth() / 2), y: round(node.y0), title: model.nodes[i]!.label, rows: [{ name: 'Total', color: model.nodes[i]!.color, value: format(model.value[i]!) }] });\n }\n };\n\n const draw = (animate: boolean) => {\n glide?.kill();\n const name = options.label ?? 'Diagrama de flujo';\n canvas.setAttribute('aria-label', hasData() ? `${name}. ${model.links.length} flujos entre ${model.used.filter(Boolean).length} etapas. Usa las flechas para recorrer los flujos.` : `${name}: ${options.emptyLabel ?? 'sin datos'}`);\n frame.fillTable(name, ['Flujo', 'Valor'], model.links.map((link) => [`${model.nodes[link.source]!.label} → ${model.nodes[link.target]!.label}`, format(link.value)]));\n frame.fillLegend([], false);\n const ok = hasData();\n frame.empty.hidden = ok;\n frame.empty.textContent = options.emptyLabel ?? 'Sin datos para mostrar';\n plot.hidden = !ok;\n if (!ok) {\n canvas.replaceChildren();\n shown = null;\n selected = null;\n return;\n }\n if (selected !== null && selected >= model.links.length) selected = null;\n const before = shown;\n const target = layoutOf();\n const comparable = before && before.nodes.length === target.nodes.length && before.links.length === target.links.length;\n build();\n const done = () => {\n paint(target);\n paintSelection(false);\n };\n if (!animate || reduced()) return done();\n if (comparable) {\n // Same nodes and flows: every node and band glides to its new place.\n const state = { t: 0 };\n const mix = (a: number, b: number) => a + (b - a) * state.t;\n glide = gsap.to(state, {\n t: 1,\n duration: 0.6,\n ease: EASE.swatch,\n onUpdate: () =>\n paint({\n nodes: target.nodes.map((node, i) => ({ x: mix(before!.nodes[i]!.x, node.x), y0: mix(before!.nodes[i]!.y0, node.y0), y1: mix(before!.nodes[i]!.y1, node.y1) })),\n links: target.links.map((link, k) => ({ sy: mix(before!.links[k]!.sy, link.sy), ty: mix(before!.links[k]!.ty, link.ty), width: mix(before!.links[k]!.width, link.width) })),\n }),\n onComplete: done,\n });\n return;\n }\n // First appearance: nodes grow from their middles column by column; the bands are wiped in from the left.\n done();\n const timeline = gsap.timeline();\n rects.forEach((rect, i) => {\n timeline.fromTo(rect, { scaleY: 0, transformOrigin: '50% 50%' }, { scaleY: 1, duration: 0.5, ease: EASE.swatch, clearProps: 'transform' }, (model.depth[i] ?? 0) * 0.12);\n });\n timeline.fromTo(names, { opacity: 0 }, { opacity: 1, duration: 0.4, stagger: 0.02, clearProps: 'opacity' }, 0.2);\n const clip = svg('clipPath', { id: `${uid}-wipe` });\n const rect = svg('rect', { x: 0, y: 0, width: 0, height });\n clip.append(rect);\n canvas.prepend(clip);\n const flows = canvas.querySelector('[data-mk-part=\"links\"]')!;\n flows.setAttribute('clip-path', `url(#${uid}-wipe)`);\n timeline.to(rect, { attr: { width }, duration: 0.9, ease: EASE.wipe, onComplete: () => {\n flows.removeAttribute('clip-path');\n clip.remove();\n } }, 0.1);\n glide = timeline;\n };\n\n const select = (index: number | null, announce = false) => {\n if (scope.disposed) return;\n const n = model.links.length;\n const next = index === null || !n ? null : ((Math.round(index) % n) + n) % n;\n if (next === selected) return;\n selected = next;\n paintSelection(announce);\n options.onSelect?.(selected === null ? null : model.links[selected]!.given);\n const link = selected === null ? null : model.links[selected]!;\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { index: link?.given ?? null, source: link ? model.nodes[link.source]!.id : null, target: link ? model.nodes[link.target]!.id : null, value: link?.value ?? null } }));\n };\n\n scope.on(canvas, 'pointermove', (event) => {\n const target = event.target as Element;\n const band = target.closest('[data-mk-index]');\n const node = target.closest('[data-mk-node]');\n if (node) {\n const i = Number(node.getAttribute('data-mk-node'));\n if (selected !== null) select(null);\n if (hoverNode !== i) {\n hoverNode = i;\n paintSelection(false);\n }\n return;\n }\n if (hoverNode !== null) {\n hoverNode = null;\n paintSelection(false);\n }\n select(band ? Number(band.getAttribute('data-mk-index')) : null);\n });\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType !== 'mouse') return;\n hoverNode = null;\n select(null);\n paintSelection(false);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && hasData()) select(0, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const moves: Record<string, number | null> = { ArrowDown: (selected ?? -1) + 1, ArrowRight: (selected ?? -1) + 1, ArrowUp: (selected ?? 1) - 1, ArrowLeft: (selected ?? 1) - 1, Home: 0, End: model.links.length - 1, Escape: null };\n if (!(key in moves) || !hasData()) return;\n event.preventDefault();\n select(moves[key]!, true);\n });\n onWidth(root, scope, () => {\n if (!hasData()) return;\n const layout = layoutOf();\n build();\n paint(layout);\n paintSelection(false);\n });\n\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = modelOf();\n draw(true);\n },\n select: (index) => {\n // `index` is the flow's place in `links`.\n const at = index === null ? null : model.links.findIndex((link) => link.given === index);\n select(at === null || at < 0 ? null : at);\n },\n get selected() {\n return selected === null ? null : model.links[selected]!.given;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { addDays, capitalize, dayKey, safeFormat, startOfWeek, toDate, weekdayNames, type DateInput } from '../../core/dates';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { chartFrame, finite, formatNumber, onWidth, round, svg } from '../chart/parts';\nimport { createScrollArea } from '../scroll-area/engine';\n\n/*\n * Heatmap chart: daily activity on a calendar, a column per week like\n * GitHub's, in chart's family. Each day is a 3 px rounded cell whose colour\n * deepens in steps (four by default) from the track to the accent. The cells\n * pop in along the diagonal, oldest first (.35 s, 8 ms apart); new data\n * crossfades their colours. Pointing at a day (or the arrows: up and down a\n * day, left and right a week, PageUp/PageDown four) lifts it with a ring and\n * the tooltip says its value and date; the \"less … more\" scale lights the\n * days of a step. Narrow screens scroll the weeks, ending on the latest, under\n * the kit's scroll-area bar (its own lane below the last row).\n */\n\nexport interface HeatmapDatum {\n date: DateInput;\n value: number;\n}\n\nexport interface HeatmapChartOptions {\n /** Values by day: a list or a { 'YYYY-MM-DD': value } map. */\n data?: HeatmapDatum[] | Record<string, number>;\n /** The last day shown (default: today). */\n end?: DateInput;\n /** Weeks shown (default 53). */\n weeks?: number;\n /** First day of the week, 0 Sunday … 6 Saturday (default 1, Monday). */\n firstDay?: number;\n locale?: string;\n /** Coloured steps above zero (default 4). */\n levels?: number;\n /** The deepest step's colour (default the accent). */\n color?: string;\n /** What a value counts, for the tooltip (default 'actividades'). */\n unit?: string;\n label?: string;\n /** The \"less … more\" scale (default true). */\n legend?: boolean;\n formatValue?: (value: number) => string;\n emptyLabel?: string;\n onSelect?: (date: string | null, value: number | null) => void;\n}\n\nexport interface HeatmapChartInstance extends Instance {\n update(options: HeatmapChartOptions): void;\n /** Choose a day ('YYYY-MM-DD') or none. */\n select(date: string | null): void;\n readonly selected: string | null;\n}\n\nconst LEFT = 28;\nconst TOP = 18;\n\nexport function createHeatmapChart(root: HTMLElement | null, initial: HeatmapChartOptions = {}): HeatmapChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const frame = chartFrame(root, scope, 'heatmap');\n const { plot, canvas, keep } = frame;\n let options: HeatmapChartOptions = { ...initial };\n let selected: number | null = null;\n\n // The weeks scroll inside the plot; the tooltip stays over it, unclipped.\n const scroller = document.createElement('div');\n scroller.dataset.mkHeatmapScroll = '';\n plot.prepend(scroller);\n scroller.append(canvas);\n scope.add(() => scroller.remove());\n // The arrows already move through the days: the bar is not a tab stop.\n const area = createScrollArea(plot, { viewport: scroller, axis: 'x', focusable: false, decorative: true });\n scope.add(() => area.destroy());\n\n const scale = document.createElement('div');\n scale.dataset.mkHeatmapScale = '';\n scale.setAttribute('aria-hidden', 'true');\n root.insertBefore(scale, frame.legend);\n scope.add(() => scale.remove());\n\n const locale = () => options.locale ?? (document.documentElement.lang || 'es');\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : formatNumber(value));\n const levels = () => Math.max(1, Math.min(8, Math.round(options.levels ?? 4)));\n\n const modelOf = () => {\n const values = new Map<string, number>();\n const add = (key: string, value: number) => finite(value) && values.set(key, (values.get(key) ?? 0) + value);\n if (Array.isArray(options.data)) for (const datum of options.data) add(dayKey(toDate(datum.date)), datum.value);\n else if (options.data) for (const [key, value] of Object.entries(options.data)) add(dayKey(toDate(key)), value);\n const weeks = Math.max(1, Math.min(106, Math.round(options.weeks ?? 53)));\n const firstDay = Number.isInteger(options.firstDay) && options.firstDay! >= 0 && options.firstDay! <= 6 ? options.firstDay! : 1;\n const end = toDate(options.end ?? new Date());\n const start = startOfWeek(addDays(end, -(weeks - 1) * 7), firstDay);\n const days: Array<{ key: string; date: Date; value: number; week: number; day: number }> = [];\n for (let date = start, i = 0; date <= end; date = addDays(date, 1), i++) {\n const key = dayKey(date);\n days.push({ key, date, value: values.get(key) ?? 0, week: Math.floor(i / 7), day: i % 7 });\n }\n const max = Math.max(0, ...days.map((each) => each.value));\n return { days, weeks: (days[days.length - 1]?.week ?? 0) + 1, firstDay, max, total: days.reduce((sum, each) => sum + each.value, 0) };\n };\n let model = modelOf();\n const levelOf = (value: number) => (value <= 0 || !model.max ? 0 : Math.max(1, Math.ceil((value / model.max) * levels())));\n const fillOf = (level: number) => (level === 0 ? 'var(--mk-heatmap-empty)' : `color-mix(in srgb, ${options.color ?? 'var(--mk-heatmap-color)'} ${Math.round(22 + (78 * level) / levels())}%, var(--mk-heatmap-empty))`);\n\n let cells: SVGRectElement[] = [];\n /** The first day drawn: the same days keep their cells. */\n let builtFrom = '';\n let geometry = { cell: 12, gap: 3, width: 0, height: 0 };\n const longDate = () => safeFormat(locale(), { weekday: 'short', day: 'numeric', month: 'long', year: 'numeric' });\n\n const build = (animate: boolean) => {\n canvas.replaceChildren();\n const available = Math.max(0, (plot.clientWidth || root.clientWidth || 0) - LEFT);\n const gap = 3;\n // Cells fill the width between 10 and 14 px; past that the weeks scroll.\n const fit = available ? Math.floor(available / model.weeks - gap) : 12;\n const cell = Math.max(10, Math.min(14, fit));\n const width = LEFT + model.weeks * (cell + gap);\n const height = TOP + 7 * (cell + gap);\n geometry = { cell, gap, width, height };\n canvas.setAttribute('viewBox', `0 0 ${width} ${height}`);\n canvas.setAttribute('width', String(width));\n canvas.setAttribute('height', String(height));\n plot.style.setProperty('--mk-heatmap-width', `${width}px`);\n\n // Month names over the week where each month starts; weekday names on every other row.\n const months = svg('g', { 'data-mk-part': 'months' });\n const monthName = safeFormat(locale(), { month: 'short' });\n let last = -1;\n for (const each of model.days) {\n if (each.day !== 0) continue;\n const month = addDays(each.date, 6).getMonth();\n if (month === last) continue;\n last = month;\n if (each.week > model.weeks - 2 && model.weeks > 4) continue;\n const text = svg('text', { x: LEFT + each.week * (cell + gap), y: 10 });\n text.textContent = capitalize(monthName.format(addDays(each.date, 6)).replace('.', ''));\n months.append(text);\n }\n const names = weekdayNames(locale(), model.firstDay, 'short');\n const weekdays = svg('g', { 'data-mk-part': 'weekdays' });\n [1, 3, 5].forEach((row) => {\n const text = svg('text', { x: 0, y: round(TOP + row * (cell + gap) + cell / 2), 'dominant-baseline': 'middle' });\n text.textContent = capitalize(names[row]!.replace('.', '')).slice(0, 3);\n weekdays.append(text);\n });\n const grid = svg('g', { 'data-mk-part': 'cells' });\n cells = model.days.map((each, i) => {\n const rect = svg('rect', { x: LEFT + each.week * (cell + gap), y: TOP + each.day * (cell + gap), width: cell, height: cell, rx: 3, 'data-mk-index': i, 'data-mk-level': levelOf(each.value) });\n rect.style.fill = fillOf(levelOf(each.value));\n grid.append(rect);\n return rect;\n });\n canvas.append(months, weekdays, grid);\n builtFrom = model.days[0]?.key ?? '';\n // The latest weeks in view when they scroll.\n scroller.scrollLeft = scroller.scrollWidth;\n if (animate && !reduced()) keep(gsap.fromTo(cells, { opacity: 0, scale: 0.3 }, { opacity: 1, scale: 1, duration: 0.35, ease: EASE.pop, clearProps: 'opacity,transform', stagger: (i: number) => Math.min(0.7, (model.days[i]!.week + model.days[i]!.day) * 0.008) }));\n };\n scope.add(() => plot.style.removeProperty('--mk-heatmap-width'));\n\n const paintScale = () => {\n scale.replaceChildren();\n scale.hidden = options.legend === false || !model.days.length;\n if (scale.hidden) return;\n const less = document.createElement('span');\n less.textContent = 'Menos';\n scale.append(less);\n for (let level = 0; level <= levels(); level++) {\n const swatch = document.createElement('i');\n swatch.style.background = fillOf(level);\n swatch.addEventListener('pointerenter', () => {\n for (const cell of cells) cell.toggleAttribute('data-mk-dim', cell.getAttribute('data-mk-level') !== String(level));\n });\n swatch.addEventListener('pointerleave', () => {\n for (const cell of cells) cell.removeAttribute('data-mk-dim');\n });\n scale.append(swatch);\n }\n const more = document.createElement('span');\n more.textContent = 'Más';\n scale.append(more);\n };\n\n const unit = () => options.unit ?? 'actividades';\n const paintSelection = (announce: boolean) => {\n cells.forEach((cell, i) => cell.toggleAttribute('data-mk-on', i === selected));\n const each = selected === null ? null : model.days[selected];\n if (!each) {\n frame.tip(null);\n return;\n }\n const { cell, gap } = geometry;\n const x = LEFT + each.week * (cell + gap) + cell / 2 - scroller.scrollLeft;\n const y = TOP + each.day * (cell + gap);\n const title = capitalize(longDate().format(each.date));\n frame.tip({ x, y, title, rows: [{ name: unit(), color: fillOf(Math.max(1, levelOf(each.value))), value: format(each.value) }] });\n if (announce) frame.live.textContent = `${title}: ${format(each.value)} ${unit()}`;\n };\n\n const draw = (animate: boolean) => {\n const name = options.label ?? 'Actividad diaria';\n canvas.setAttribute('aria-label', model.days.length ? `${name}. ${model.weeks} semanas, ${format(model.total)} ${unit()} en total. Usa las flechas para recorrer los días.` : `${name}: ${options.emptyLabel ?? 'sin datos'}`);\n // The days with something, for screen readers (a year of empty rows says nothing).\n const active = model.days.filter((each) => each.value > 0);\n frame.fillTable(`${name}: ${format(model.total)} ${unit()}`, ['Día', capitalize(unit())], active.map((each) => [capitalize(longDate().format(each.date)), format(each.value)]));\n frame.fillLegend([], false);\n paintScale();\n if (selected !== null && selected >= model.days.length) selected = null;\n const same = cells.length === model.days.length && cells.length > 0 && builtFrom === model.days[0]!.key;\n if (same && animate) {\n // New values over the same days: the colours crossfade (CSS).\n cells.forEach((cell, i) => {\n const level = levelOf(model.days[i]!.value);\n cell.setAttribute('data-mk-level', String(level));\n cell.style.fill = fillOf(level);\n });\n } else build(animate);\n paintSelection(false);\n };\n\n const select = (index: number | null, announce = false) => {\n if (scope.disposed) return;\n const next = index === null || !model.days.length ? null : Math.max(0, Math.min(model.days.length - 1, Math.round(index)));\n if (next === selected) return;\n selected = next;\n paintSelection(announce);\n const each = selected === null ? null : model.days[selected]!;\n options.onSelect?.(each?.key ?? null, each?.value ?? null);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { date: each?.key ?? null, value: each?.value ?? null } }));\n };\n\n scope.on(canvas, 'pointermove', (event) => {\n const cell = (event.target as Element).closest('[data-mk-index]');\n select(cell ? Number(cell.getAttribute('data-mk-index')) : null);\n });\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'mouse') select(null);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && model.days.length) select(model.days.length - 1, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const at = selected ?? model.days.length - 1;\n const moves: Record<string, number | null> = { ArrowUp: at - 1, ArrowDown: at + 1, ArrowLeft: at - 7, ArrowRight: at + 7, PageUp: at - 28, PageDown: at + 28, Home: 0, End: model.days.length - 1, Escape: null };\n if (!(key in moves) || !model.days.length) return;\n event.preventDefault();\n select(moves[key]!, true);\n // Keep the chosen day in view when the weeks scroll.\n const cell = selected === null ? null : cells[selected];\n if (cell) {\n const x = Number(cell.getAttribute('x'));\n if (x - scroller.scrollLeft < LEFT || x - scroller.scrollLeft > scroller.clientWidth - geometry.cell * 2) scroller.scrollLeft = x - scroller.clientWidth / 2;\n }\n });\n onWidth(root, scope, () => {\n build(false);\n paintSelection(false);\n });\n\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = modelOf();\n draw(true);\n },\n select(date) {\n const index = date === null ? -1 : model.days.findIndex((each) => each.key === date);\n select(index < 0 ? null : index);\n },\n get selected() {\n return selected === null ? null : (model.days[selected]?.key ?? null);\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Orbit menu: a square button in the middle whose options come out around it\n * (four make a cross: up, right, down, left; more share the circle). Opening,\n * the button's lines turn into an ×, it goes glassy, and each option swirls out\n * of it along an arc, its distance on the swatch curve (.38,.49,0,1.5) so it\n * overshoots and settles, out of a blur, 45 ms after the one before; closing,\n * they keep turning and are drawn back in (.3 s). Arrows pick the option on\n * that side, Tab walks them, Escape or a click outside closes and gives focus\n * back. Closed options are inert. Choosing one presses it and closes.\n */\n\nexport interface OrbitMenuOptions {\n /** Distance of the options from the middle, px (default 96). */\n radius?: number;\n /** Where the first option sits, degrees clockwise from the top (default 0). */\n start?: number;\n /** Close after an option is chosen (default true). */\n closeOnSelect?: boolean;\n onToggle?: (open: boolean) => void;\n /** An option was chosen: its data-mk-value, else its position. */\n onSelect?: (value: string) => void;\n}\n\nexport interface OrbitMenuInstance extends Instance {\n open(): void;\n close(): void;\n toggle(): void;\n readonly isOpen: boolean;\n}\n\nexport function createOrbitMenu(root: HTMLElement | null, options: OrbitMenuOptions = {}): OrbitMenuInstance {\n const toggle = root?.querySelector<HTMLButtonElement>('[data-mk-orbit-toggle]') ?? null;\n const items = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-orbit-item]')] : [];\n if (!root || !toggle || !items.length) {\n if (root) warnOnce('orbit-menu: needs a [data-mk-orbit-toggle] and at least one [data-mk-orbit-item]');\n return inert({ open() {}, close() {}, toggle() {}, isOpen: false });\n }\n registerMotion();\n const scope = createScope();\n const radius = Number.isFinite(options.radius) ? Math.max(24, options.radius!) : 96;\n const start = ((Number.isFinite(options.start) ? options.start! : 0) * Math.PI) / 180;\n const angles = items.map((_, i) => start + (i * Math.PI * 2) / items.length);\n const valueOf = (item: HTMLElement) => item.dataset.mkValue ?? String(items.indexOf(item));\n\n // The lines that turn into an ×, when the button brings no icon of its own.\n if (!toggle.children.length && !toggle.textContent?.trim()) {\n const burger = document.createElement('span');\n burger.dataset.mkOrbitBurger = '';\n burger.setAttribute('aria-hidden', 'true');\n burger.append(document.createElement('i'), document.createElement('i'), document.createElement('i'));\n toggle.append(burger);\n scope.add(() => burger.remove());\n }\n scope.attr(toggle, 'aria-expanded', 'false');\n scope.attr(toggle, 'aria-haspopup', 'true');\n if (!toggle.getAttribute('aria-label') && !toggle.textContent?.trim()) scope.attr(toggle, 'aria-label', 'Menú');\n for (const item of items) {\n scope.attr(item, 'inert', '');\n if (item instanceof HTMLButtonElement) scope.attr(item, 'type', item.getAttribute('type') ?? 'button');\n }\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-state', 'closed');\n\n const states = items.map((_, i) => ({ a: angles[i]!, r: 0 }));\n const apply = (i: number) => {\n const { a, r } = states[i]!;\n gsap.set(items[i]!, { x: r * Math.sin(a), y: -r * Math.cos(a) });\n };\n let timeline: gsap.core.Timeline | null = null;\n scope.add(() => {\n timeline?.kill();\n gsap.set(items, { clearProps: 'transform,opacity,filter,visibility' });\n });\n gsap.set(items, { opacity: 0, scale: 0.3, visibility: 'hidden' });\n\n let open = false;\n const set = (next: boolean, focus: 'first' | 'toggle' | false = false) => {\n if (next === open) return;\n open = next;\n toggle.setAttribute('aria-expanded', String(open));\n root.dataset.mkState = open ? 'open' : 'closed';\n for (const item of items) item.toggleAttribute('inert', !open);\n timeline?.kill();\n if (reduced()) {\n items.forEach((item, i) => {\n states[i] = { a: angles[i]!, r: open ? radius : 0 };\n apply(i);\n gsap.set(item, { opacity: open ? 1 : 0, scale: open ? 1 : 0.3, filter: 'none', visibility: open ? 'visible' : 'hidden' });\n });\n } else if (open) {\n timeline = gsap.timeline();\n items.forEach((item, i) => {\n const state = states[i]!;\n // From a little behind its place, swirling out to it.\n if (state.r < 1) state.a = angles[i]! - 0.7;\n const at = i * 0.045;\n gsap.set(item, { visibility: 'visible' });\n timeline!.to(state, { r: radius, duration: 0.55, ease: EASE.swatch, onUpdate: () => apply(i) }, at);\n timeline!.to(state, { a: angles[i]!, duration: 0.5, ease: 'power3.out', onUpdate: () => apply(i) }, at);\n timeline!.fromTo(item, { filter: 'blur(8px)' }, { opacity: 1, scale: 1, filter: 'blur(0px)', duration: 0.35, ease: 'power2.out', clearProps: 'filter' }, at);\n });\n } else {\n timeline = gsap.timeline();\n [...items].reverse().forEach((item, k) => {\n const i = items.length - 1 - k;\n const state = states[i]!;\n const at = k * 0.03;\n timeline!.to(state, { r: 0, a: state.a + 0.6, duration: 0.3, ease: 'power2.in', onUpdate: () => apply(i) }, at);\n timeline!.to(item, { opacity: 0, scale: 0.3, filter: 'blur(6px)', duration: 0.28, ease: 'power2.in', onComplete: () => {\n gsap.set(item, { visibility: 'hidden', clearProps: 'filter' });\n } }, at);\n });\n }\n if (focus === 'first') items[0]!.focus();\n if (focus === 'toggle') toggle.focus();\n options.onToggle?.(open);\n root.dispatchEvent(new CustomEvent('mk:toggle', { bubbles: true, detail: { open } }));\n };\n\n scope.on(toggle, 'click', (event) => {\n press(toggle);\n // A keyboard click (detail 0) opens onto the first option.\n set(!open, !open && (event as MouseEvent).detail === 0 ? 'first' : false);\n });\n scope.on(root, 'click', (event) => {\n const item = (event.target as Element).closest<HTMLElement>('[data-mk-orbit-item]');\n if (!item || !items.includes(item) || !open) return;\n press(item);\n const value = valueOf(item);\n options.onSelect?.(value);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { value } }));\n if (options.closeOnSelect !== false) set(false, 'toggle');\n });\n // Arrows: the option on that side (the nearest angle).\n const sides: Record<string, number> = { ArrowUp: 0, ArrowRight: Math.PI / 2, ArrowDown: Math.PI, ArrowLeft: (Math.PI * 3) / 2 };\n scope.on(root, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === 'Escape' && open) {\n event.preventDefault();\n set(false, 'toggle');\n return;\n }\n if (!(key in sides)) return;\n if (!open) {\n if (document.activeElement !== toggle) return;\n event.preventDefault();\n set(true);\n } else event.preventDefault();\n const want = sides[key]!;\n const gap = (a: number) => {\n const d = Math.abs((((a - want) % (Math.PI * 2)) + Math.PI * 3) % (Math.PI * 2) - Math.PI);\n return d;\n };\n let best = 0;\n angles.forEach((a, i) => {\n if (gap(a) < gap(angles[best]!)) best = i;\n });\n items[best]!.focus();\n });\n scope.on(document, 'pointerdown', (event) => {\n if (open && !root.contains(event.target as Node)) set(false);\n });\n\n return {\n open: () => set(true),\n close: () => set(false),\n toggle: () => set(!open),\n get isOpen() {\n return open;\n },\n destroy: () => scope.dispose(),\n };\n}\n"],"mappings":"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","names":["items","accent","valueOf","part","value","svg","finite","items","show","finite","svg","finite","svg","k","eased","finite","svg","finite","nodeWidth","_","svg","layout","part","rect","finite","svg","cell","items","valueOf"]}