{"version":3,"sources":["../src/twScales.generated.ts","../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/motionPhysics.generated.ts","../src/locale/translate.ts","../src/locale/zh-CN.json","../src/locale/zh-CN.ts","../src/shortcut.ts","../src/menu.ts","../src/splitPane.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/avatarFallbackImage.ts","../src/avatarFallback.ts","../src/chat/constants.ts","../src/chat/entities.ts","../src/chat/markdown.ts","../src/chat/album.ts","../src/chat/grouping.ts","../src/icons-data.ts","../src/icons.ts"],"names":["extendTailwindMerge","clsx","ranges","out","contentEnd","i"],"mappings":"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","file":"index.cjs","sourcesContent":["// AUTO-GENERATED by scripts/gen-tw-scales.mjs from @kungal/ui-tokens — do not edit.\n//\n// The Tailwind scale names KunUI mints itself. `cn()` feeds them to\n// tailwind-merge, which otherwise cannot parse them and silently keeps two\n// conflicting classes.\nexport const KUN_TW_SCALES = {\n  radius: ['kun-full', 'kun-lg', 'kun-md', 'kun-none', 'kun-sm'],\n  shadow: ['kun-lg', 'kun-md', 'kun-sm'],\n  ease: ['kun-emphasized', 'kun-in', 'kun-out', 'kun-standard'],\n  animate: ['bounce', 'bounceInDown', 'bounceInRight', 'fadeInUp', 'fadeOutDown', 'shake', 'swing', 'tada'],\n  z: ['kun-alert', 'kun-message', 'kun-modal', 'kun-popover', 'kun-sticky'],\n  duration: ['kun-base', 'kun-exit', 'kun-fast', 'kun-slow'],\n} as const\n","import { clsx, type ClassValue } from 'clsx'\nimport { extendTailwindMerge } from 'tailwind-merge'\nimport { KUN_TW_SCALES } from './twScales.generated'\n\n// tailwind-merge only ships Tailwind's OWN scales, so every name KunUI mints in\n// `@theme` / `@utility` was invisible to it and got passed through untouched:\n// `cn('rounded-kun-md', 'rounded-full')` returned both classes and left CSS\n// source order to pick the winner. Measured, a consumer passing\n// `classNames.trigger: 'rounded-full'` to KunSelect still rendered a 12px\n// radius — the documented \"your class wins\" contract was false for the whole\n// `rounded-kun-*`, `shadow-kun-*`, `z-kun-*`, `ease-kun-*` and `duration-kun-*`\n// surface.\n//\n// `shadow-kun-*` failed worse than the rest. The shadow COLOUR group's\n// validator accepts any non-arbitrary word, so `shadow-kun-md` was classified\n// as a colour: it resolved against `shadow-primary/20` and the box-shadow was\n// the class that got dropped.\n//\n// The scale names are generated from tokens.css (`pnpm gen`) because a drifted\n// hand-written list fails silently — nothing errors, the classes just stop\n// merging again.\nconst twMerge = extendTailwindMerge({\n  extend: {\n    theme: {\n      radius: [...KUN_TW_SCALES.radius],\n      shadow: [...KUN_TW_SCALES.shadow],\n      ease: [...KUN_TW_SCALES.ease],\n      animate: [...KUN_TW_SCALES.animate],\n    },\n    // z-index and transition-duration are not Tailwind v4 theme namespaces —\n    // these are `@utility` blocks, so they extend the class group directly.\n    classGroups: {\n      z: [{ z: [...KUN_TW_SCALES.z] }],\n      duration: [{ duration: [...KUN_TW_SCALES.duration] }],\n    },\n  },\n})\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variant\n// `bordered` actually renders — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n  // Filled buttons keep white text in BOTH modes, so the fill must stay dark\n  // enough for contrast. The dark color scale is inverted (`-500`/`-600` become\n  // LIGHT in dark mode), so a plain `bg-{color}` renders pale — worst on the\n  // light hues (info ≈ L88%, default/secondary ≈ L65–72%). Each entry pins a\n  // `dark:bg-{color}-{n}` that lands every color at a consistent ~L44–55% so the\n  // whole row reads as one saturated tier with legible white text.\n  // Foreground: the dark hues take white; the light hues (success / warning /\n  // info) are light in BOTH modes, so white text fails WCAG on them (~1.5–3.4:1)\n  // — they take dark text (≈6–18:1). See kunSolidFgClasses.\n  solid: {\n    default: 'border border-transparent bg-default text-default-foreground',\n    primary: 'border border-transparent bg-primary text-primary-foreground',\n    secondary: 'border border-transparent bg-secondary text-secondary-foreground',\n    success: 'border border-transparent bg-success text-success-foreground',\n    warning: 'border border-transparent bg-warning text-warning-foreground',\n    danger: 'border border-transparent bg-danger text-danger-foreground',\n    info: 'border border-transparent bg-info text-info-foreground',\n  },\n  // `{c}-text`, not the fill: a fill used as text measured 1.75–4.42:1 on the\n  // light page. The generator holds `{c}-text` at 4.5:1 on the page, on cards\n  // and on the hue's 20% tint, so the hover fill and a flat chip stay readable.\n  bordered: {\n    default: 'border border-default bg-transparent',\n    primary: 'border border-primary bg-transparent text-primary-text',\n    secondary: 'border border-secondary bg-transparent text-secondary-text',\n    success: 'border border-success bg-transparent text-success-text',\n    warning: 'border border-warning bg-transparent text-warning-text',\n    danger: 'border border-danger bg-transparent text-danger-text',\n    info: 'border border-info bg-transparent text-info-text',\n  },\n  light: {\n    default: 'border border-transparent bg-transparent hover:bg-default/20',\n    primary: 'border border-transparent bg-transparent text-primary-text hover:bg-primary/20',\n    secondary: 'border border-transparent bg-transparent text-secondary-text hover:bg-secondary/20',\n    success: 'border border-transparent bg-transparent text-success-text hover:bg-success/20',\n    warning: 'border border-transparent bg-transparent text-warning-text hover:bg-warning/20',\n    danger: 'border border-transparent bg-transparent text-danger-text hover:bg-danger/20',\n    info: 'border border-transparent bg-transparent text-info-text hover:bg-info/20',\n  },\n  flat: {\n    default: 'border border-transparent bg-default/20 text-default-text',\n    primary: 'border border-transparent bg-primary/20 text-primary-text',\n    secondary: 'border border-transparent bg-secondary/20 text-secondary-text',\n    success: 'border border-transparent bg-success/20 text-success-text',\n    warning: 'border border-transparent bg-warning/20 text-warning-text',\n    danger: 'border border-transparent bg-danger/20 text-danger-text',\n    info: 'border border-transparent bg-info/20 text-info-text',\n  },\n  // Same fill logic as `solid` (see note above) plus a COLORED glow. The glow\n  // needs both a size (`shadow-lg` — the geometry) AND a tint (`shadow-{color}/40`\n  // — sets --tw-shadow-color): a color utility alone leaves --tw-shadow empty, so\n  // the button rendered with NO shadow at all. `overflow-hidden` on the button\n  // doesn't clip its own outset box-shadow, so the glow shows.\n  shadow: {\n    default: 'border border-transparent shadow-lg shadow-default/40 bg-default text-default-foreground',\n    primary: 'border border-transparent shadow-lg shadow-primary/40 bg-primary text-primary-foreground',\n    secondary: 'border border-transparent shadow-lg shadow-secondary/40 bg-secondary text-secondary-foreground',\n    success: 'border border-transparent shadow-lg shadow-success/40 bg-success text-success-foreground',\n    warning: 'border border-transparent shadow-lg shadow-warning/40 bg-warning text-warning-foreground',\n    danger: 'border border-transparent shadow-lg shadow-danger/40 bg-danger text-danger-foreground',\n    info: 'border border-transparent shadow-lg shadow-info/40 bg-info text-info-foreground',\n  },\n}\n\nexport const kunVariantClasses = (\n  variant: KunUIVariant,\n  color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n  default: 'bg-default',\n  primary: 'bg-primary',\n  secondary: 'bg-secondary',\n  success: 'bg-success',\n  warning: 'bg-warning',\n  danger: 'bg-danger',\n  info: 'bg-info',\n}\n\n// ─── Solid fills (a colored fill that carries text / icons) ──────────────────\n// Each semantic color ships a paired on-color token — `--color-{c}` (the vivid\n// fill) + `--color-{c}-foreground` (the text that stays legible on it) — both\n// generated in OKLCH and WCAG-AA-verified in BOTH light and dark by\n// scripts/gen-tokens.mjs (the build fails if any pair regresses). So a solid is\n// just `bg-{c} text-{c}-foreground`: no per-color white/black guess, no `dark:`\n// pin (the tokens are mode-correct by construction). Medium hues land white,\n// the bright hues (magenta/green/cyan/amber) land a refined dark tint.\n// Reach for these — NOT plain `kunBgClasses` — whenever a colored fill carries a\n// foreground. `kunBgClasses` stays for tints / bars / dots that carry no text.\n\n/** Just the fill. Pair with {@link kunSolidFgClasses} when the fill and its text\n *  live on different elements. */\nexport const kunSolidBgClasses: Record<KunUIColor, string> = {\n  default: 'bg-default',\n  primary: 'bg-primary',\n  secondary: 'bg-secondary',\n  success: 'bg-success',\n  warning: 'bg-warning',\n  danger: 'bg-danger',\n  info: 'bg-info',\n}\n\n/** The generated on-color that stays legible on the matching solid fill in both\n *  modes (white on medium hues, a dark hue-tint on the bright ones). */\nexport const kunSolidFgClasses: Record<KunUIColor, string> = {\n  default: 'text-default-foreground',\n  primary: 'text-primary-foreground',\n  secondary: 'text-secondary-foreground',\n  success: 'text-success-foreground',\n  warning: 'text-warning-foreground',\n  danger: 'text-danger-foreground',\n  info: 'text-info-foreground',\n}\n\n/** Fill + matching foreground — the common case (text sits on the fill). */\nexport const kunSolidClasses: Record<KunUIColor, string> = {\n  default: 'bg-default text-default-foreground',\n  primary: 'bg-primary text-primary-foreground',\n  secondary: 'bg-secondary text-secondary-foreground',\n  success: 'bg-success text-success-foreground',\n  warning: 'bg-warning text-warning-foreground',\n  danger: 'bg-danger text-danger-foreground',\n  info: 'bg-info text-info-foreground',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n  default: 'text-foreground',\n  primary: 'text-primary-text',\n  secondary: 'text-secondary-text',\n  success: 'text-success-text',\n  warning: 'text-warning-text',\n  danger: 'text-danger-text',\n  info: 'text-info-text',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n  default: 'border-default',\n  primary: 'border-primary',\n  secondary: 'border-secondary',\n  success: 'border-success',\n  warning: 'border-warning',\n  danger: 'border-danger',\n  info: 'border-info',\n}\n\n/**\n * @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}\n * for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click\n * lit the ring, and used a different opacity from the rest of the library.\n */\nexport const kunRingClasses: Record<KunUIColor, string> = {\n  default: 'focus-within:ring-default/40 focus:ring-default/40',\n  primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n  secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n  success: 'focus-within:ring-success/40 focus:ring-success/40',\n  warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n  danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n  info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n/**\n * Unified focus ring — ONE recipe for every directly-focusable control (inputs,\n * textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).\n * Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no\n * ring; text fields still show it on click via the browser's focus-visible\n * heuristic). A flush 2px ring in the control's semantic color at 50% — replaces\n * the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.\n * Pair with `border-kun` at rest; on an invalid control use the `danger` entry.\n */\nexport const kunFocusRingClasses: Record<KunUIColor, string> = {\n  default: 'outline-none focus-visible:ring-2 focus-visible:ring-default/50',\n  primary: 'outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n  secondary: 'outline-none focus-visible:ring-2 focus-visible:ring-secondary/50',\n  success: 'outline-none focus-visible:ring-2 focus-visible:ring-success/50',\n  warning: 'outline-none focus-visible:ring-2 focus-visible:ring-warning/50',\n  danger: 'outline-none focus-visible:ring-2 focus-visible:ring-danger/50',\n  info: 'outline-none focus-visible:ring-2 focus-visible:ring-info/50',\n}\n\n/**\n * Composite-widget variant of {@link kunFocusRingClasses}: the focusable element\n * is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the\n * wrapper and give the inner input `outline-none` (and no ring of its own) so\n * there's exactly one indicator. Used by KunNumberInput / KunTagInput.\n *\n * Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the\n * two are equivalent — a text input matches `:focus-visible` on click too — and\n * `focus-within` is a native variant that reliably compiles, whereas the\n * `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.\n */\nexport const kunFocusRingWithinClasses: Record<KunUIColor, string> = {\n  default: 'focus-within:ring-2 focus-within:ring-default/50',\n  primary: 'focus-within:ring-2 focus-within:ring-primary/50',\n  secondary: 'focus-within:ring-2 focus-within:ring-secondary/50',\n  success: 'focus-within:ring-2 focus-within:ring-success/50',\n  warning: 'focus-within:ring-2 focus-within:ring-warning/50',\n  danger: 'focus-within:ring-2 focus-within:ring-danger/50',\n  info: 'focus-within:ring-2 focus-within:ring-info/50',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n  default: 'bg-default/5',\n  primary: 'bg-primary/5',\n  secondary: 'bg-secondary/5',\n  success: 'bg-success/5',\n  warning: 'bg-warning/5',\n  danger: 'bg-danger/5',\n  info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n  none: 'rounded-kun-none',\n  sm: 'rounded-kun-sm',\n  md: 'rounded-kun-md',\n  lg: 'rounded-kun-lg',\n  full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n//   prop  >  component built-in fallback  >  app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n//   Vue:   computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n//   React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n  prop: KunUIRounded | undefined,\n  fallback: KunUIRounded | undefined,\n  configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n\n// A floating panel has no correct `full`. `border-radius: 9999px` on an n-row\n// listbox is not a pill — CSS Backgrounds 3 §5.5 scales every corner by\n// min(side / sum of its radii), so the used radius is half the short side. A\n// measured 80x116 KunSelect popup rendered 40px corners and pushed its option\n// labels inward; the docs' own FilterBar example prescribed `rounded=\"full\"`\n// and shipped that. `full` means \"pill\", and a pill is only defined for a\n// single-line control. So a trigger + panel component keeps `full` on the\n// trigger and resolves the panel to `lg`, the bucket --radius-kun-lg documents\n// as \"containers / floating panels\". Every other bucket passes through.\nexport const kunPanelRoundedClass = (rounded: KunUIRounded): string =>\n  kunRoundedClasses[rounded === 'full' ? 'lg' : rounded]\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n//   xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n  xs: 'text-xs px-2.5 py-1',\n  sm: 'text-sm px-3.5 py-1.5',\n  md: 'text-sm px-4 py-2',\n  lg: 'text-base px-5 py-2.5',\n  xl: 'text-lg px-6 py-3',\n}\n\n// Icon-only buttons: a fixed SQUARE whose side equals the text-button height at\n// the same size, so an icon button lines up with text buttons in a row.\n//\n// Why this exists: kunControlSizeClasses is padding-driven (height = line-height\n// + 2·py + border). A text label contributes a full line-box (≈1.5em), but a lone\n// 1em icon does not — with the same padding the icon button would come out\n// shorter and break the row. Mainstream libraries dodge this by giving buttons a\n// fixed height and making the icon button a square of that height (shadcn\n// `size-9`, HeroUI/Chakra/Ant `isIconOnly`/`.ant-btn-icon-only`). We do the same,\n// ONLY for icon-only, keeping the icon at its natural 1em centered in the box.\n//\n// Sides MUST equal the kunControlSizeClasses heights (incl. the 1px border every\n// variant carries): xs 26 · sm 34 · md 38 · lg 46 · xl 54. (size-* is border-box,\n// so the value already accounts for the icon button's own 1px border.)\nexport const kunControlSquareClasses: Record<KunUISize, string> = {\n  xs: 'size-[26px] p-0',\n  sm: 'size-[34px] p-0',\n  md: 'size-[38px] p-0',\n  lg: 'size-[46px] p-0',\n  xl: 'size-[54px] p-0',\n}\n\nexport interface KunSelectionSize {\n  box: string // the square: checkbox box / radio indicator outer ring\n  dot: string // radio's inner filled dot (unused by checkbox)\n  check: string // checkbox's check glyph (unused by radio)\n  text: string // the adjacent label\n  gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n  xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n  sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n  md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n  lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n  xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n\n// The single source of truth for chip / tag pills — a standalone KunChip and the\n// tags inside KunTagInput share it, so a tag looks identical either way. A\n// compact sub-scale (~0.7× the form-control height): vertical padding is tighter\n// than kunControlSizeClasses because a chip is text + tight padding, not a tap\n// target. Pair with `gap-1` + `rounded-full`.\nexport const kunChipSizeClasses: Record<KunUISize, string> = {\n  xs: 'px-2 py-0.5 text-xs',\n  sm: 'px-2 py-1 text-xs',\n  md: 'px-3 py-1 text-sm',\n  lg: 'px-4 py-1.5 text-sm',\n  xl: 'px-6 py-2 text-base',\n}\n","// AUTO-GENERATED by scripts/gen-motion.mjs from\n// packages/ui-tokens/scripts/motion-physics.mjs — do not edit.\n\n/**\n * The ballistic model behind `KunShatter`, as data — outward impulse, air\n * drag (`1 − (1−t)^dragExponent`), gravity as a t² acceleration — sampled\n * into `keyframeSteps` linear keyframes per shard. The same manifest\n * generates `KunShatterPhysics` in the kun_ui_tokens pub package, so the\n * web and Flutter renditions of the motion cannot drift. Tune the feel in\n * the manifest, never inline in a component.\n */\nexport const KUN_SHATTER_PHYSICS = {\n  keyframeSteps: 16,\n  reachFactor: 0.5,\n  launchMin: 0.32,\n  launchSpan: 0.55,\n  verticalFactor: 0.8,\n  gravityMin: 0.85,\n  gravitySpan: 0.5,\n  dragExponent: 1.7,\n  scaleEndMin: 0.8,\n  scaleEndSpan: 0.16,\n  fadeOutStartMin: 0.5,\n  fadeOutStartSpan: 0.18,\n  settleExponent: 2,\n  fadeInWindow: 0.4,\n  staggerFraction: 0.22,\n  staggerCapMs: 120,\n  defaultDurationMs: 1100,\n  defaultRotationDeg: 140,\n} as const\n\n/**\n * Drag-to-dismiss on a bottom sheet, as data: dismiss on release when the\n * sheet moved down and either the release velocity exceeds `closeVelocity`\n * (px/ms) or the offset reaches `closeDistanceRatio` of the panel height\n * (capped at the viewport); an upward drag of d px moves the panel\n * `rubberBandLimit × (1 − e^(−d / rubberBandLimit))`. The same manifest\n * generates `KunSwipeDismissPhysics` in kun_ui_tokens.\n */\nexport const KUN_SWIPE_DISMISS_PHYSICS = {\n  closeDistanceRatio: 0.25,\n  closeVelocity: 0.4,\n  rubberBandLimit: 32,\n} as const\n","import type { KunMessagePath, KunMessages } from './types'\n\n// Resolve one message and substitute its `{name}` placeholders. Framework-free\n// on purpose: each render layer binds it to however that layer holds the\n// active locale.\n//\n// A `{name}` with no matching param is left as written rather than blanked —\n// a missing interpolation should be visible in the UI, not silently produce a\n// half-sentence.\nexport const translateKunMessage = (\n  messages: KunMessages,\n  path: KunMessagePath,\n  params?: Record<string, string | number>\n): string => {\n  const [namespace, key] = path.split('.') as [keyof KunMessages, string]\n  const group = messages[namespace] as Record<string, string> | undefined\n  const template = group?.[key]\n\n  if (typeof template !== 'string') {\n    // NODE_ENV, not import.meta.env.DEV: Vite folds the latter to false when it\n    // builds a consuming package, which strips the warning from the bundle.\n    if (process.env.NODE_ENV !== 'production') {\n      console.warn(\n        `[KunUI] no locale message at \"${path}\". A custom locale must supply every key in KunMessages.`\n      )\n    }\n    return path\n  }\n\n  if (!params) return template\n  return template.replace(/\\{(\\w+)\\}/g, (raw, name: string) =>\n    params[name] === undefined ? raw : String(params[name])\n  )\n}\n","{\n  \"name\": \"简体中文\",\n  \"code\": \"zh-CN\",\n  \"messages\": {\n    \"alert\": {\n      \"title\": \"确认\",\n      \"confirm\": \"确定\",\n      \"cancel\": \"取消\"\n    },\n    \"autocomplete\": {\n      \"clear\": \"清除\",\n      \"loading\": \"加载中…\",\n      \"noResult\": \"无匹配项\"\n    },\n    \"avatar\": {\n      \"unknownUser\": \"未知用户\"\n    },\n    \"avatarGroup\": {\n      \"label\": \"{count} 位用户\"\n    },\n    \"banner\": {\n      \"label\": \"公告\",\n      \"close\": \"关闭公告\"\n    },\n    \"carousel\": {\n      \"label\": \"轮播\",\n      \"prev\": \"上一张\",\n      \"next\": \"下一张\",\n      \"nav\": \"轮播导航\",\n      \"goto\": \"跳到第 {index} 张\"\n    },\n    \"chat\": {\n      \"deletedUser\": \"已注销用户\",\n      \"you\": \"你\",\n      \"senderPrefix\": \"{name}：\",\n      \"today\": \"今天\",\n      \"yesterday\": \"昨天\",\n      \"unreadDivider\": \"以下为未读消息\",\n      \"edited\": \"已编辑\",\n      \"deletedMessage\": \"消息已删除\",\n      \"photo\": \"图片\",\n      \"album\": \"{count} 张图片\",\n      \"media\": \"媒体\",\n      \"draft\": \"草稿：\",\n      \"messages\": \"消息\",\n      \"empty\": \"还没有消息\",\n      \"loading\": \"加载中…\",\n      \"scrollToBottom\": \"回到底部\",\n      \"scrollToBottomUnread\": \"回到底部，{count} 条新消息\",\n      \"unreadCount\": \"{count} 条未读消息\",\n      \"mentioned\": \"有人提到了你\",\n      \"pinned\": \"已置顶\",\n      \"muted\": \"已静音\",\n      \"photoFrom\": \"{name} 发送的图片\",\n      \"openLink\": \"打开链接 {url}\",\n      \"reactions\": \"回应\",\n      \"reactionCount\": \"{label}，{count} 人\",\n      \"back\": \"返回\",\n      \"members\": \"{count} 位成员\"\n    },\n    \"chatComposer\": {\n      \"placeholder\": \"发消息…\",\n      \"send\": \"发送\",\n      \"save\": \"保存\",\n      \"attach\": \"添加图片\",\n      \"removeAttachment\": \"移除附件\",\n      \"retryAttachment\": \"上传失败，点击重试\",\n      \"replyTo\": \"回复 {name}\",\n      \"quoteFrom\": \"引用 {name}\",\n      \"editing\": \"编辑消息\",\n      \"cancelReply\": \"取消回复\",\n      \"cancelEdit\": \"取消编辑\",\n      \"remaining\": \"还可输入 {count} 字\",\n      \"overLimit\": \"超出 {count} 字\",\n      \"dropHint\": \"松开以添加图片\"\n    },\n    \"chatMenu\": {\n      \"label\": \"消息操作\",\n      \"reply\": \"回复\",\n      \"quote\": \"引用\",\n      \"copy\": \"复制\",\n      \"copied\": \"已复制\",\n      \"edit\": \"编辑\",\n      \"pin\": \"置顶\",\n      \"unpin\": \"取消置顶\",\n      \"delete\": \"删除\",\n      \"report\": \"举报\",\n      \"retry\": \"重新发送\",\n      \"moreReactions\": \"更多回应\",\n      \"fewerReactions\": \"收起回应\"\n    },\n    \"chatPinned\": {\n      \"label\": \"置顶消息\",\n      \"indexed\": \"置顶消息 #{index}\",\n      \"unpin\": \"取消置顶\"\n    },\n    \"chatRequest\": {\n      \"title\": \"消息请求\",\n      \"description\": \"{name} 想给你发消息。接受之前，对方看不到你是否已读。\",\n      \"accept\": \"接受\",\n      \"delete\": \"删除\",\n      \"block\": \"拉黑\",\n      \"report\": \"举报\"\n    },\n    \"chatService\": {\n      \"groupCreated\": \"{actor} 创建了群组\",\n      \"groupCreatedTitled\": \"{actor} 创建了群组「{title}」\",\n      \"membersAdded\": \"{actor} 邀请了 {users}\",\n      \"memberJoined\": \"{actor} 加入了群组\",\n      \"memberLeft\": \"{actor} 退出了群组\",\n      \"memberRemoved\": \"{actor} 将 {user} 移出了群组\",\n      \"titleChanged\": \"{actor} 将群名改为「{title}」\",\n      \"photoChanged\": \"{actor} 更换了群头像\",\n      \"messagePinned\": \"{actor} 置顶了「{text}」\",\n      \"messagePinnedMedia\": \"{actor} 置顶了一条消息\",\n      \"joinedByLink\": \"{actor} 通过邀请链接加入了群组\"\n    },\n    \"chatStatus\": {\n      \"sending\": \"发送中\",\n      \"sent\": \"已发送\",\n      \"read\": \"已读\",\n      \"failed\": \"发送失败，点击重试\"\n    },\n    \"chatTyping\": {\n      \"typing\": \"正在输入…\",\n      \"one\": \"{name} 正在输入…\",\n      \"several\": \"{names} 正在输入…\",\n      \"many\": \"{name} 等 {count} 人正在输入…\"\n    },\n    \"chip\": {\n      \"remove\": \"移除\"\n    },\n    \"commandPalette\": {\n      \"placeholder\": \"搜索…\",\n      \"empty\": \"输入关键字搜索\",\n      \"noResult\": \"无结果\",\n      \"loading\": \"加载中…\",\n      \"close\": \"关闭\",\n      \"hintSelect\": \"选择\",\n      \"hintOpen\": \"打开\",\n      \"hintClose\": \"关闭\",\n      \"resultCount\": \"{count} 条结果\",\n      \"remove\": \"移除\",\n      \"clear\": \"清除\"\n    },\n    \"copy\": {\n      \"copied\": \"已复制\",\n      \"success\": \"{text} 复制成功\",\n      \"failure\": \"{text} 复制失败! 请更换更现代的浏览器!\"\n    },\n    \"datePicker\": {\n      \"placeholderDay\": \"请选择日期\",\n      \"placeholderMonth\": \"请选择月份\",\n      \"placeholderYear\": \"请选择年份\",\n      \"clear\": \"清空\",\n      \"today\": \"今天\",\n      \"close\": \"关闭\",\n      \"prevYear\": \"上一年\",\n      \"nextYear\": \"下一年\",\n      \"prevPage\": \"上一{unit}\",\n      \"nextPage\": \"下一{unit}\",\n      \"zoomOut\": \"{label} — 返回上一级\",\n      \"unitMonth\": \"月\",\n      \"unitYear\": \"年\",\n      \"unitDecade\": \"个十年\",\n      \"monthCell\": \"{year}年{month}\"\n    },\n    \"drawer\": {\n      \"close\": \"关闭抽屉\"\n    },\n    \"fileInput\": {\n      \"trigger\": \"选择文件\",\n      \"selected\": \"已选 {count} 个文件\"\n    },\n    \"filePicker\": {\n      \"tooLarge\": \"{name} 超过大小限制 ({size})\"\n    },\n    \"input\": {\n      \"clear\": \"清除\",\n      \"reveal\": \"显示密码\",\n      \"hide\": \"隐藏密码\"\n    },\n    \"kbd\": {\n      \"control\": \"Ctrl\",\n      \"alt\": \"Alt\",\n      \"option\": \"Option\",\n      \"shift\": \"Shift\",\n      \"command\": \"Command\",\n      \"meta\": \"Windows 键\",\n      \"enter\": \"回车\",\n      \"escape\": \"Esc\",\n      \"backspace\": \"退格\",\n      \"delete\": \"删除\",\n      \"tab\": \"Tab\",\n      \"space\": \"空格\",\n      \"up\": \"上箭头\",\n      \"down\": \"下箭头\",\n      \"left\": \"左箭头\",\n      \"right\": \"右箭头\",\n      \"pageUp\": \"向上翻页\",\n      \"pageDown\": \"向下翻页\",\n      \"home\": \"Home\",\n      \"end\": \"End\",\n      \"plus\": \"加号\",\n      \"then\": \"然后\"\n    },\n    \"lightbox\": {\n      \"label\": \"图片查看器\",\n      \"close\": \"关闭\",\n      \"prev\": \"上一张\",\n      \"next\": \"下一张\",\n      \"goto\": \"跳转到第 {index} 张\",\n      \"zoomIn\": \"放大\",\n      \"zoomOut\": \"缩小\",\n      \"rotateLeft\": \"向左旋转 90°\",\n      \"rotateRight\": \"向右旋转 90°\",\n      \"reset\": \"重置缩放/旋转/位置\",\n      \"download\": \"下载\"\n    },\n    \"lightboxGallery\": {\n      \"view\": \"查看大图\"\n    },\n    \"loading\": {\n      \"description\": \"正在摸鱼中...咕咕咕\"\n    },\n    \"loli\": {\n      \"close\": \"关闭\"\n    },\n    \"message\": {\n      \"close\": \"关闭\"\n    },\n    \"modal\": {\n      \"close\": \"关闭\"\n    },\n    \"null\": {\n      \"description\": \"莲说这里什么都没有\"\n    },\n    \"numberInput\": {\n      \"decrement\": \"减少\",\n      \"increment\": \"增加\"\n    },\n    \"pagination\": {\n      \"nav\": \"分页导航\",\n      \"prev\": \"上一页\",\n      \"next\": \"下一页\",\n      \"page\": \"第 {page} 页\",\n      \"hintBefore\": \"您可以使用\",\n      \"hintAfter\": \"来进行快速翻页\",\n      \"jumpLabel\": \"跳转到页数\",\n      \"jump\": \"跳转\"\n    },\n    \"pinInput\": {\n      \"label\": \"验证码\",\n      \"digit\": \"{label} 第 {index} 位\"\n    },\n    \"reaction\": {\n      \"label\": \"点赞\"\n    },\n    \"select\": {\n      \"searchPlaceholder\": \"搜索…\",\n      \"noResult\": \"无匹配项\",\n      \"loading\": \"加载中…\",\n      \"clear\": \"清除\",\n      \"removeOption\": \"移除 {label}\"\n    },\n    \"splitPane\": {\n      \"handle\": \"调整分栏宽度\"\n    },\n    \"spoiler\": {\n      \"copyCode\": \"复制代码\",\n      \"reveal\": \"剧透内容,点击或按回车显示\"\n    },\n    \"steps\": {\n      \"completed\": \"已完成：{title}\",\n      \"current\": \"当前步骤：{title}\",\n      \"pending\": \"未开始：{title}\",\n      \"error\": \"出错：{title}\"\n    },\n    \"tagInput\": {\n      \"tag\": \"标签 {tag}\",\n      \"removeTag\": \"移除标签 {tag}\"\n    },\n    \"textSelection\": {\n      \"copy\": \"复制\",\n      \"cut\": \"剪切\",\n      \"paste\": \"粘贴\",\n      \"selectAll\": \"全选\",\n      \"share\": \"分享\",\n      \"lookUp\": \"查询\",\n      \"searchWeb\": \"搜索\"\n    },\n    \"upload\": {\n      \"imageAlt\": \"上传图片\",\n      \"cropTitle\": \"裁剪图片\",\n      \"cancel\": \"取消\",\n      \"confirm\": \"确定\"\n    }\n  }\n}\n","import raw from './zh-CN.json'\nimport type { KunMessageCatalog } from './types'\n\n// KunUI's built-in default. The strings are the ones the components used to\n// hold inline, reproduced verbatim, so adopting the locale system changed no\n// rendered output.\n//\n// The catalog is JSON rather than a TypeScript literal because one file feeds\n// both the web bundle and the generated kun_ui_messages pub package, and a\n// Node generator can read JSON without evaluating TypeScript. The annotation\n// below is what type-checks it: a key missing from KunMessages fails the build.\nexport const KUN_CATALOG_ZH_CN: KunMessageCatalog = raw\n","// Keyboard-shortcut display: the parser, the per-platform labels and the\n// modifier order behind KunKbd, KunTooltip's `shortcut` and the menu items'\n// `shortcut`. Display only — binding the key is the app's job.\n//\n// The grammar is aria-keyshortcuts' (`+` joins a chord, whitespace separates a\n// sequence) plus `Mod`, the key that is ⌘ on Apple and Ctrl everywhere else,\n// the same abstraction as tinykeys' `$mod`, ProseMirror's `Mod-` and GitHub\n// Primer's KeybindingHint. Names are case-insensitive and take the common\n// aliases, so `cmd+shift+p` and `Shift+Mod+P` resolve to the same chord.\n\nexport type KunShortcutPlatform = 'apple' | 'other'\n\n/** Keys whose spoken name comes from the locale (`kbd.<name>`) rather than\n *  from the label: a glyph such as ⌘ or ↑, or an abbreviation such as Esc. */\nexport type KunKbdKeyName =\n  | 'control'\n  | 'alt'\n  | 'option'\n  | 'shift'\n  | 'command'\n  | 'meta'\n  | 'enter'\n  | 'escape'\n  | 'backspace'\n  | 'delete'\n  | 'tab'\n  | 'space'\n  | 'up'\n  | 'down'\n  | 'left'\n  | 'right'\n  | 'pageUp'\n  | 'pageDown'\n  | 'home'\n  | 'end'\n  | 'plus'\n\nexport interface KunShortcutKey {\n  /** Canonical key: `Control`, `Alt`, `Shift`, `Meta`, `Enter`, `ArrowUp`, `K`, `+`… */\n  key: string\n  /** What the key shows on this platform: `⌘`, `Ctrl`, `K`. */\n  label: string\n  /** The locale key (under `kbd`) a screen reader hears instead of `label`;\n   *  null when the label reads as itself (a letter, a digit, F5). */\n  spoken: KunKbdKeyName | null\n}\n\nconst ALIASES: Record<string, string> = {\n  mod: 'Mod',\n  ctrl: 'Control',\n  control: 'Control',\n  alt: 'Alt',\n  option: 'Alt',\n  opt: 'Alt',\n  shift: 'Shift',\n  meta: 'Meta',\n  cmd: 'Meta',\n  command: 'Meta',\n  super: 'Meta',\n  win: 'Meta',\n  enter: 'Enter',\n  return: 'Enter',\n  esc: 'Escape',\n  escape: 'Escape',\n  backspace: 'Backspace',\n  del: 'Delete',\n  delete: 'Delete',\n  tab: 'Tab',\n  space: 'Space',\n  spacebar: 'Space',\n  up: 'ArrowUp',\n  arrowup: 'ArrowUp',\n  down: 'ArrowDown',\n  arrowdown: 'ArrowDown',\n  left: 'ArrowLeft',\n  arrowleft: 'ArrowLeft',\n  right: 'ArrowRight',\n  arrowright: 'ArrowRight',\n  pageup: 'PageUp',\n  pgup: 'PageUp',\n  pagedown: 'PageDown',\n  pgdn: 'PageDown',\n  home: 'Home',\n  end: 'End',\n  plus: '+',\n}\n\n// Apple's Human Interface Guidelines list modifiers as Control, Option, Shift,\n// Command (⌃⌥⇧⌘). Elsewhere this follows Primer's KeybindingHint: Ctrl, Win,\n// Alt, Shift. A chord is sorted into that order whatever order it was written\n// in, so one command table renders consistently.\nconst MODIFIER_ORDER: Record<KunShortcutPlatform, string[]> = {\n  apple: ['Control', 'Alt', 'Shift', 'Meta'],\n  other: ['Control', 'Meta', 'Alt', 'Shift'],\n}\n\ntype KeyDisplay = { apple: string; other: string; spoken: (p: KunShortcutPlatform) => KunKbdKeyName }\n\nconst NAMED: Record<string, KeyDisplay> = {\n  Control: { apple: '⌃', other: 'Ctrl', spoken: () => 'control' },\n  Alt: { apple: '⌥', other: 'Alt', spoken: (p) => (p === 'apple' ? 'option' : 'alt') },\n  Shift: { apple: '⇧', other: 'Shift', spoken: () => 'shift' },\n  Meta: { apple: '⌘', other: 'Win', spoken: (p) => (p === 'apple' ? 'command' : 'meta') },\n  Enter: { apple: '↩', other: 'Enter', spoken: () => 'enter' },\n  Escape: { apple: 'Esc', other: 'Esc', spoken: () => 'escape' },\n  Backspace: { apple: '⌫', other: 'Backspace', spoken: () => 'backspace' },\n  Delete: { apple: '⌦', other: 'Del', spoken: () => 'delete' },\n  Tab: { apple: '⇥', other: 'Tab', spoken: () => 'tab' },\n  Space: { apple: 'Space', other: 'Space', spoken: () => 'space' },\n  ArrowUp: { apple: '↑', other: '↑', spoken: () => 'up' },\n  ArrowDown: { apple: '↓', other: '↓', spoken: () => 'down' },\n  ArrowLeft: { apple: '←', other: '←', spoken: () => 'left' },\n  ArrowRight: { apple: '→', other: '→', spoken: () => 'right' },\n  PageUp: { apple: 'PgUp', other: 'PgUp', spoken: () => 'pageUp' },\n  PageDown: { apple: 'PgDn', other: 'PgDn', spoken: () => 'pageDown' },\n  Home: { apple: 'Home', other: 'Home', spoken: () => 'home' },\n  End: { apple: 'End', other: 'End', spoken: () => 'end' },\n  '+': { apple: '+', other: '+', spoken: () => 'plus' },\n}\n\nconst canonicalKey = (token: string): string => {\n  const alias = ALIASES[token.toLowerCase()]\n  if (alias) return alias\n  if (/^f\\d{1,2}$/i.test(token)) return token.toUpperCase()\n  return token.length === 1 ? token.toUpperCase() : token\n}\n\n// `Mod++` is Mod and the plus key, and a lone `+` is the plus key: a `+` that\n// has nothing after it is a key, not a joiner.\nconst splitChord = (chord: string): string[] => {\n  if (chord === '+') return ['+']\n  const plusKey = chord.endsWith('++')\n  const body = plusKey ? chord.slice(0, -2) : chord\n  const keys = body.split('+').filter(Boolean)\n  return plusKey ? [...keys, '+'] : keys\n}\n\n/** Parse a shortcut into its chords of canonical key names, `Mod` unresolved:\n *  `'Shift+cmd+Z'` → `[['Shift', 'Meta', 'Z']]`, `'G G'` → `[['G'], ['G']]`. */\nexport const parseKunShortcut = (keys: string): string[][] =>\n  keys\n    .trim()\n    .split(/\\s+/)\n    .filter(Boolean)\n    .map((chord) => splitChord(chord).map(canonicalKey))\n    .filter((chord) => chord.length > 0)\n\n/** Resolve a shortcut for one platform: `Mod` becomes Meta on Apple and\n *  Control elsewhere, repeated modifiers collapse, modifiers are sorted into\n *  the platform's order, and every key carries its label and spoken name. */\nexport const resolveKunShortcut = (\n  keys: string,\n  platform: KunShortcutPlatform\n): KunShortcutKey[][] => {\n  const order = MODIFIER_ORDER[platform]\n  return parseKunShortcut(keys).map((chord) => {\n    const resolved = chord.map((key) =>\n      key === 'Mod' ? (platform === 'apple' ? 'Meta' : 'Control') : key\n    )\n    const modifiers = order.filter((m) => resolved.includes(m))\n    const rest = resolved.filter((k, i) => !order.includes(k) && resolved.indexOf(k) === i)\n    return [...modifiers, ...rest].map((key) => {\n      const named = NAMED[key]\n      return named\n        ? { key, label: named[platform], spoken: named.spoken(platform) }\n        : { key, label: key, spoken: null }\n    })\n  })\n}\n\n/** One-line form, as a menu shows it: `⇧⌘Z` on Apple (no joiner, the macOS\n *  menu convention) and `Ctrl+Shift+Z` elsewhere; chords of a sequence are\n *  separated by a space. */\nexport const formatKunShortcut = (keys: string, platform: KunShortcutPlatform): string =>\n  resolveKunShortcut(keys, platform)\n    .map((chord) => chord.map((k) => k.label).join(platform === 'apple' ? '' : '+'))\n    .join(' ')\n\n/** What a screen reader should hear: `Command Shift Z`, chords of a sequence\n *  joined by the locale's \"then\". `name` maps a spoken key to its word. */\nexport const speakKunShortcut = (\n  sequence: KunShortcutKey[][],\n  name: (key: KunKbdKeyName) => string,\n  then: string\n): string =>\n  sequence\n    .map((chord) => chord.map((k) => (k.spoken ? name(k.spoken) : k.label)).join(' '))\n    .join(` ${then} `)\n","// The menu entry list behind KunContextMenu and KunDropdown, framework-free so\n// the Flutter port collapses separators the same way.\n\n/** Drop separators that would render as stray lines: leading, trailing, and\n *  all but the first of a run. An app filters one command table per context\n *  (no \"Delete\" for a post you do not own) and its separators have to follow;\n *  React Spectrum S2 hides the same three cases. */\nexport const normalizeKunMenuSeparators = <T extends { type?: string }>(\n  entries: readonly T[]\n): T[] => {\n  const out: T[] = []\n  for (const entry of entries) {\n    const last = out[out.length - 1]\n    if (entry.type === 'separator' && (!last || last.type === 'separator')) continue\n    out.push(entry)\n  }\n  while (out.length && out[out.length - 1]!.type === 'separator') out.pop()\n  return out\n}\n","// The width rule behind KunSplitPane's divider, framework-free so the Flutter\n// port snaps to the same widths.\n\nexport interface KunSplitSizeOptions {\n  min: number\n  max: number\n  /** Widths the divider is pulled to when it comes within `snapThreshold`. */\n  snapPoints?: readonly number[]\n  snapThreshold?: number\n  /** The width a keyboard step starts from. A snap may not cancel or reverse\n   *  that step: with a 5 px step inside an 8 px threshold, the divider would\n   *  otherwise never leave a snap point. A drag leaves it unset, so the\n   *  divider sticks to a snap point until the pointer pulls clear. */\n  from?: number\n}\n\n/** Clamp a requested width into [min, max], pull it to the nearest snap point\n *  within the threshold, and round it to a whole pixel. */\nexport const resolveKunSplitSize = (\n  raw: number,\n  { min, max, snapPoints = [], snapThreshold = 8, from }: KunSplitSizeOptions\n): number => {\n  const lo = Math.min(min, max)\n  const hi = Math.max(min, max)\n  const clamped = Math.min(Math.max(raw, lo), hi)\n  let best = clamped\n  let bestDistance = Infinity\n  for (const point of snapPoints) {\n    if (point < lo || point > hi) continue\n    const distance = Math.abs(point - clamped)\n    if (distance <= snapThreshold && distance < bestDistance) {\n      best = point\n      bestDistance = distance\n    }\n  }\n  if (from !== undefined && Math.sign(best - from) !== Math.sign(clamped - from)) best = clamped\n  return Math.round(best)\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n  Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n  try {\n    const decoded = decodeURIComponent(text)\n    return decoded !== text ? decoded : text\n  } catch {\n    return text\n  }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// The terminal avatar fallback, inlined as a base64 webp data URI (128x128,\n// 5318 B) so it needs ZERO consumer setup and makes NO network request — the\n// same no-fetch policy as the bundled icons and KunNull's mascot.\n//\n// This is what renders when the host has configured no avatar pool AND when a\n// pool URL itself fails to load. It is a data URI on purpose: the incident it\n// exists for is a CDN path that 404'd for every avatar-less account across\n// six sites at once, so the LAST fallback in the chain must not be reachable\n// over a network at all.\n//\n// Source: the first official KUN Galgame sticker (image hash d52ac5fb…), the\n// site's de-facto mascot.\n/* eslint-disable */\n/* prettier-ignore */\nexport const KUN_AVATAR_FALLBACK =\n  'data:image/webp;base64,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'\n","import { KUN_AVATAR_FALLBACK } from './avatarFallbackImage'\n\n// The predecessor of this file hardcoded `https://sticker.kungal.com` plus a\n// `/stickers/KUNgal{pack}/{n}.webp` path and a pack/per-pack count. That path\n// addressed a POSITION IN A MUTABLE COLLECTION on a site KunUI does not own,\n// so when that site stopped serving static files every avatar-less account\n// across six consumers 404'd at once. A URL that names another service does\n// not belong in a component library: the host supplies the pool\n// (`useKunUIConfig().avatarFallbackPool`), KunUI only chooses from it.\n\nconst hash = (value: string): number => {\n  let h = 0\n  for (let i = 0; i < value.length; i++) {\n    h = (Math.imul(h, 31) + value.charCodeAt(i)) >>> 0\n  }\n  return h\n}\n\n/**\n * Deterministically pick one image from an avatar fallback pool.\n *\n * The same `seed` always yields the same entry on server and client, so there\n * is no hydration mismatch and no framework state is needed.\n *\n * `pool` is treated as a FIXED-LENGTH array: the index is\n * `hash(seed) % pool.length`, so adding or removing an entry re-assigns every\n * seed, while replacing one entry in place moves only the seeds that land on\n * it. Pool providers should edit slots rather than resize.\n *\n * An empty pool returns the bundled data URI, which cannot fail to load.\n */\nexport const pickAvatarFallback = (seed = '', pool: readonly string[] = []): string =>\n  pool.length > 0 ? (pool[hash(seed) % pool.length] ?? KUN_AVATAR_FALLBACK) : KUN_AVATAR_FALLBACK\n\n/**\n * @deprecated Renamed to `pickAvatarFallback`, which takes the pool the host\n * configured. This alias no longer returns a sticker URL — it returns the\n * bundled fallback for any input, because the host it used to point at stopped\n * serving those files. Pass a pool, or read the resolved image off KunAvatar.\n */\nexport const getRandomSticker = (id = ''): string => pickAvatarFallback(id)\n","// Chat limits and timings shared with the server and the Flutter port.\n\n/** Longest message text, in UTF-16 code units (Telegram's value). */\nexport const KUN_CHAT_TEXT_LIMIT = 4096\n/** Most photos one album can hold. */\nexport const KUN_CHAT_ALBUM_LIMIT = 10\n/** A client sends at most one typing notification per this many ms. */\nexport const KUN_CHAT_TYPING_INTERVAL = 5000\n/** A typing notification not renewed within this many ms has expired. */\nexport const KUN_CHAT_TYPING_TIMEOUT = 6000\n","import type { KunChatEntity, KunChatEntityType } from './types.ts'\n\n// Entities → a render tree. This file is the specification the Flutter port\n// copies line for line, so every rule is spelled out and none depends on a\n// JavaScript quirk: offsets are UTF-16 code units, which is what both\n// `String.prototype.slice` and Dart's `String.substring` index.\n\nconst KNOWN_TYPES: ReadonlySet<string> = new Set<KunChatEntityType>([\n  'bold',\n  'italic',\n  'underline',\n  'strikethrough',\n  'spoiler',\n  'code',\n  'pre',\n  'blockquote',\n  'text_link',\n  'mention',\n  'url',\n])\n\n/** Types whose content is literal: nothing may nest inside them. */\nconst LEAF_TYPES: ReadonlySet<string> = new Set(['code', 'pre'])\n\n/** Types rendered as links. A link inside a link is invalid HTML (`<a>` in\n *  `<a>`), so the inner one is dropped. */\nconst LINK_TYPES: ReadonlySet<string> = new Set(['text_link', 'mention', 'url'])\n\n/** Types that break the line around themselves. */\nexport const KUN_CHAT_BLOCK_ENTITY_TYPES: ReadonlySet<string> = new Set([\n  'pre',\n  'blockquote',\n])\n\n// Tie-break for entities covering the exact same range: the earlier type is\n// the outer one. Blocks outermost, links outside formatting (a link keeps its\n// whole styled label clickable), code innermost.\nconst NESTING_ORDER: readonly KunChatEntityType[] = [\n  'blockquote',\n  'pre',\n  'text_link',\n  'mention',\n  'url',\n  'spoiler',\n  'bold',\n  'italic',\n  'underline',\n  'strikethrough',\n  'code',\n]\nconst rank = (type: string) => NESTING_ORDER.indexOf(type as KunChatEntityType)\n\nconst isHighSurrogate = (code: number) => code >= 0xd800 && code <= 0xdbff\nconst isLowSurrogate = (code: number) => code >= 0xdc00 && code <= 0xdfff\n\n/** Whether `index` falls between the two halves of a surrogate pair. */\nconst splitsPair = (text: string, index: number) =>\n  index > 0 &&\n  index < text.length &&\n  isHighSurrogate(text.charCodeAt(index - 1)) &&\n  isLowSurrogate(text.charCodeAt(index))\n\ninterface Range {\n  entity: KunChatEntity\n  start: number\n  end: number\n}\n\nconst compareRanges = (a: Range, b: Range) =>\n  a.start - b.start || b.end - a.end || rank(a.entity.type) - rank(b.entity.type)\n\nconst cleanEntity = (e: KunChatEntity, offset: number, length: number): KunChatEntity => {\n  const out: KunChatEntity = { type: e.type, offset, length }\n  if (e.type === 'mention') out.user_id = e.user_id\n  if (e.type === 'text_link') out.url = e.url\n  if (e.type === 'pre' && e.language) out.language = e.language\n  return out\n}\n\n/** Inline formatting: no link, no block, no literal content. Touching runs of\n *  one type are one run, and a line break at either end draws nothing. */\nconst FORMAT_TYPES: ReadonlySet<string> = new Set([\n  'bold',\n  'italic',\n  'underline',\n  'strikethrough',\n  'spoiler',\n])\n\nconst mergeTouching = (ranges: Range[]): Range[] => {\n  const out: Range[] = []\n  const last = new Map<string, Range>()\n  for (const r of [...ranges].sort(compareRanges)) {\n    const prev = FORMAT_TYPES.has(r.entity.type) ? last.get(r.entity.type) : undefined\n    if (prev && r.start <= prev.end) {\n      prev.end = Math.max(prev.end, r.end)\n      continue\n    }\n    out.push(r)\n    if (FORMAT_TYPES.has(r.entity.type)) last.set(r.entity.type, r)\n  }\n  return out\n}\n\n// A quote is a block, so it must sit outside every inline entity: anything\n// that straddles a quote boundary is cut there. `quotes` must be the quotes\n// that survive nesting: cutting at one that is later dropped leaves a cut\n// with no cause, which the next pass merges away.\nconst splitAtQuotes = (ranges: Range[], quotes: Range[]): Range[] => {\n  const cuts = quotes.flatMap((r) => [r.start, r.end])\n  return ranges.flatMap((r) => {\n    const inner = cuts.filter((c) => c > r.start && c < r.end).sort((a, b) => a - b)\n    const points = [r.start, ...new Set(inner), r.end]\n    return points.slice(1).map((end, i) => ({ entity: r.entity, start: points[i]!, end }))\n  })\n}\n\n/**\n * Make an entity list safe to render, without ever changing `text`:\n *\n * 1. Drop unknown types, non-integer or negative positions, empty ranges, a\n *    `text_link` without a `url` and a `mention` without a `user_id`; clamp\n *    the end to the text. Widen a range that would cut a surrogate pair (an\n *    emoji) in half. Pull a blockquote's end in over trailing line breaks.\n * 2. Merge touching or overlapping runs of one inline format (bold, italic,\n *    underline, strikethrough, spoiler).\n * 3. Settle the blockquotes among themselves (steps 5 and 6, quotes only),\n *    then cut every other entity at the boundaries of a quote that survived,\n *    so quotes are always outermost.\n * 4. Pull the ends of an inline format in over line breaks, which draw\n *    nothing there (a blockquote's end, before step 3).\n * 5. Order by start, then longer first, then by nesting order; split an\n *    entity that partially crosses another at the boundary, so every pair\n *    nests or is disjoint.\n * 6. Drop what cannot nest: anything inside `code`/`pre`, a type inside the\n *    same type, a link inside a link.\n *\n * The result is a fixed point: normalizing it again changes nothing. The\n * server already guarantees most of this; the client does it anyway so a bad\n * row renders instead of throwing.\n */\nexport const normalizeKunChatEntities = (\n  text: string,\n  entities: readonly KunChatEntity[] | null | undefined\n): KunChatEntity[] => {\n  if (!entities?.length || !text) return []\n\n  let ranges: Range[] = []\n  for (const e of entities) {\n    if (!e || !KNOWN_TYPES.has(e.type)) continue\n    if (!Number.isInteger(e.offset) || !Number.isInteger(e.length)) continue\n    if (e.offset < 0 || e.length <= 0) continue\n    if (e.type === 'text_link' && (typeof e.url !== 'string' || !e.url)) continue\n    if (e.type === 'mention' && (typeof e.user_id !== 'string' || !e.user_id)) continue\n    let start = e.offset\n    let end = Math.min(e.offset + e.length, text.length)\n    if (start >= end) continue\n    if (splitsPair(text, start)) start -= 1\n    if (splitsPair(text, end)) end += 1\n    // Before the cuts below, which must see the quote's final boundaries.\n    if (e.type === 'blockquote') while (end > start && text[end - 1] === '\\n') end--\n    if (start < end) ranges.push({ entity: e, start, end })\n  }\n\n  // Every piece made from here on, the crossing splits included, is trimmed,\n  // or normalizing twice would trim what the first pass left.\n  const trimmed = (r: Range) => {\n    if (FORMAT_TYPES.has(r.entity.type)) {\n      while (r.start < r.end && text[r.start] === '\\n') r.start++\n      while (r.end > r.start && text[r.end - 1] === '\\n') r.end--\n    }\n    return r.start < r.end\n  }\n  const nest = (ranges: Range[]): Range[] => {\n    const queue = ranges.filter(trimmed).sort(compareRanges)\n    const enqueue = (r: Range) => {\n      let i = 0\n      while (i < queue.length && compareRanges(queue[i]!, r) <= 0) i++\n      queue.splice(i, 0, r)\n    }\n\n    const out: Range[] = []\n    const stack: Range[] = []\n    while (queue.length) {\n      const r = queue.shift()!\n      while (stack.length && stack[stack.length - 1]!.end <= r.start) stack.pop()\n      const parent = stack[stack.length - 1]\n      if (parent && r.end > parent.end) {\n        // Crosses the parent's end: keep the part inside, requeue the rest.\n        const rest: Range = { entity: r.entity, start: parent.end, end: r.end }\n        if (trimmed(rest)) enqueue(rest)\n        r.end = parent.end\n        if (!trimmed(r)) continue\n        // Shorter now, it may sort after entities still waiting.\n        if (queue.length && compareRanges(r, queue[0]!) > 0) {\n          enqueue(r)\n          continue\n        }\n      }\n      const blocked = stack.some(\n        (a) =>\n          LEAF_TYPES.has(a.entity.type) ||\n          a.entity.type === r.entity.type ||\n          (LINK_TYPES.has(a.entity.type) && LINK_TYPES.has(r.entity.type))\n      )\n      if (blocked) continue\n      stack.push(r)\n      out.push(r)\n    }\n    return out\n  }\n\n  // Everything else is cut at the quotes' boundaries, so only a quote can\n  // hold a quote: nesting the quotes alone settles which ones survive.\n  const quotes = nest(ranges.filter((r) => r.entity.type === 'blockquote'))\n  const inline = mergeTouching(ranges.filter((r) => r.entity.type !== 'blockquote'))\n  const out = nest([...quotes, ...splitAtQuotes(inline, quotes)])\n\n  return out.map((r) => cleanEntity(r.entity, r.start, r.end - r.start))\n}\n\nexport interface KunChatTextLeaf {\n  kind: 'text'\n  text: string\n  /** Where `text` starts in the message text, in UTF-16 code units. */\n  offset: number\n}\n\nexport interface KunChatEntityNode {\n  kind: 'entity'\n  entity: KunChatEntity\n  children: KunChatTextNode[]\n}\n\nexport type KunChatTextNode = KunChatTextLeaf | KunChatEntityNode\n\nconst isBlock = (node: KunChatTextNode | undefined) =>\n  node?.kind === 'entity' && KUN_CHAT_BLOCK_ENTITY_TYPES.has(node.entity.type)\n\n// A block (pre, blockquote) already starts and ends a line, so the `\\n` that\n// separates it from the surrounding text would render as an extra blank line.\n// Drop exactly one line break on each side — the text keeps it; only the tree\n// omits it.\nconst trimAroundBlocks = (nodes: KunChatTextNode[]): KunChatTextNode[] => {\n  const out: KunChatTextNode[] = []\n  nodes.forEach((node, i) => {\n    if (node.kind === 'entity') {\n      out.push({ ...node, children: trimAroundBlocks(node.children) })\n      return\n    }\n    let { text, offset } = node\n    if (isBlock(nodes[i - 1]) && text.startsWith('\\n')) {\n      text = text.slice(1)\n      offset += 1\n    }\n    if (isBlock(nodes[i + 1]) && text.endsWith('\\n')) text = text.slice(0, -1)\n    if (text) out.push({ kind: 'text', text, offset })\n  })\n  return out\n}\n\n/**\n * Turn `text` + `entities` into a tree: entity nodes whose children are text\n * leaves and nested entity nodes, in document order. The entities are\n * normalized first (see `normalizeKunChatEntities`), so any input renders.\n */\nexport const buildKunChatEntityTree = (\n  text: string,\n  entities: readonly KunChatEntity[] | null | undefined\n): KunChatTextNode[] => {\n  const root: KunChatEntityNode = {\n    kind: 'entity',\n    entity: { type: 'bold', offset: 0, length: text.length },\n    children: [],\n  }\n  const stack: { node: KunChatEntityNode; end: number; cursor: number }[] = [\n    { node: root, end: text.length, cursor: 0 },\n  ]\n  const flushTo = (frame: (typeof stack)[number], to: number) => {\n    if (to > frame.cursor) {\n      frame.node.children.push({\n        kind: 'text',\n        text: text.slice(frame.cursor, to),\n        offset: frame.cursor,\n      })\n    }\n    frame.cursor = Math.max(frame.cursor, to)\n  }\n  const close = () => {\n    const frame = stack.pop()!\n    flushTo(frame, frame.end)\n    stack[stack.length - 1]!.cursor = frame.end\n  }\n\n  for (const entity of normalizeKunChatEntities(text, entities)) {\n    const start = entity.offset\n    while (stack.length > 1 && stack[stack.length - 1]!.end <= start) close()\n    const parent = stack[stack.length - 1]!\n    flushTo(parent, start)\n    const node: KunChatEntityNode = { kind: 'entity', entity, children: [] }\n    parent.node.children.push(node)\n    stack.push({ node, end: start + entity.length, cursor: start })\n  }\n  while (stack.length > 1) close()\n  flushTo(stack[0]!, text.length)\n\n  return trimAroundBlocks(root.children)\n}\n\n/** The plain text of a subtree, as rendered (block-adjacent breaks omitted). */\nexport const kunChatTreeText = (nodes: readonly KunChatTextNode[]): string =>\n  nodes\n    .map((n) => (n.kind === 'text' ? n.text : kunChatTreeText(n.children)))\n    .join('')\n\n/**\n * The part of a message from `start` to `end` (UTF-16 code units), with the\n * entities clipped to it and shifted to start at 0 — what a partial quote\n * carries. The range is widened rather than split through an emoji.\n */\nexport const sliceKunChatEntities = (\n  text: string,\n  entities: readonly KunChatEntity[] | null | undefined,\n  start: number,\n  end: number\n): { text: string; entities: KunChatEntity[] } => {\n  let from = Math.max(0, Math.min(start, text.length))\n  let to = Math.max(from, Math.min(end, text.length))\n  if (splitsPair(text, from)) from -= 1\n  if (splitsPair(text, to)) to += 1\n  const clipped = normalizeKunChatEntities(text, entities).flatMap((e) => {\n    const s = Math.max(e.offset, from)\n    const t = Math.min(e.offset + e.length, to)\n    return t > s ? [{ ...e, offset: s - from, length: t - s }] : []\n  })\n  const sliced = text.slice(from, to)\n  return { text: sliced, entities: normalizeKunChatEntities(sliced, clipped) }\n}\n","import type { KunChatEntity, KunChatFormattedText } from './types.ts'\nimport { normalizeKunChatEntities } from './entities.ts'\n\n// Composer shortcuts ↔ entities. The composer is a plain textarea: what the\n// user types is parsed into `{ text, entities }` on send, and editing a sent\n// message formats it back. `formatKunChatMarkdown` is the inverse of\n// `parseKunChatMarkdown` — `parse(format(m))` returns `m` — for every message\n// except the few shapes the syntax cannot spell, listed on `format` below.\n//\n// The syntax, all of it:\n//\n//   **bold**  __italic__  ++underline++  ~~strikethrough~~  ||spoiler||\n//   `code`    ```lang⏎ pre ⏎```    [label](https://…)    [label](mention:42)\n//   > quoted line (at the start of a line; consecutive lines form one quote)\n//\n// Markers work inside words — Chinese has no spaces to anchor them to — and\n// only need non-empty content. A marker is exactly two characters: `***` is\n// text, as in TDLib's parser. A marker without a partner stays literal text.\n//\n// Escaping. A run of k backslashes before a special character stands for\n// ⌊k/2⌋ backslashes, and escapes that character when k is odd. Before\n// anything else a backslash is literal. In text, ` [ ] are always special,\n// and * _ + ~ | are special only next to their own twin (backslashes in\n// between don't count) — a lone one can never be a marker, so `a\\_b`,\n// `C:\\Users` and `¯\\_(ツ)_/¯` keep their backslashes. Inside `code` and a pre\n// block the only special character is `, inside a link target it is ). A line\n// whose text starts with backslashes and then `>` loses one backslash: `\\>`\n// is how a line starts with a literal `>`.\n\nconst PAIRS: ReadonlyArray<readonly [string, KunChatEntity['type']]> = [\n  ['**', 'bold'],\n  ['__', 'italic'],\n  ['++', 'underline'],\n  ['~~', 'strikethrough'],\n  ['||', 'spoiler'],\n]\nconst PAIR_BY_TYPE = new Map(PAIRS.map(([m, t]) => [t, m]))\nconst PAIR_CHARS = new Set(['*', '_', '+', '~', '|'])\nconst TEXT_SPECIAL = new Set(['*', '_', '+', '~', '|', '`', '[', ']'])\nconst LANGUAGE = /^[A-Za-z0-9_+#.-]*$/\nconst MENTION = /^mention:(\\d+)$/\n\nconst backslashRun = (s: string, i: number, end: number) => {\n  let k = 0\n  while (i + k < end && s[i + k] === '\\\\') k++\n  return k\n}\n\n/** The nearest character from `i` in direction `step` that is not a\n *  backslash — the whole source, not just the current range, so a marker's\n *  neighbour counts. */\nconst nonBackslash = (s: string, i: number, step: 1 | -1) => {\n  while (i >= 0 && i < s.length && s[i] === '\\\\') i += step\n  return s[i]\n}\n\n/** At the backslash run starting at `i`: its length, and whether it is\n *  followed by a special character (and so escapes it when odd). The\n *  character after the run is read past `end`: a run that ends a range sits\n *  right before the range's closing marker, and the writer doubled it. */\nconst escapeAt = (s: string, i: number, end: number) => {\n  const k = backslashRun(s, i, end)\n  const j = i + k\n  const c = s[j] ?? ''\n  const special =\n    c === '`' || c === '[' || c === ']'\n      ? true\n      : PAIR_CHARS.has(c) && (nonBackslash(s, i - 1, -1) === c || nonBackslash(s, j + 1, 1) === c)\n  return { k, c, special }\n}\n\n/** Where scanning resumes after the backslash run at `i`. */\nconst skipEscape = (s: string, i: number, end: number) => {\n  const { k, special } = escapeAt(s, i, end)\n  return i + (special && k % 2 === 1 && i + k < end ? k + 1 : k)\n}\n\n\ninterface RawSpan {\n  /** Index just past the closing marker. */\n  end: number\n  contentStart: number\n  contentEnd: number\n  language?: string\n}\n\n/** The next unescaped `closer` at or after `from`, in a raw context whose\n *  only special character is `special`; -1 when there is none. */\nconst findRawCloser = (\n  s: string,\n  from: number,\n  end: number,\n  closer: string,\n  special: string\n): number => {\n  let p = from\n  while (p < end) {\n    if (s[p] === '\\\\') {\n      const k = backslashRun(s, p, end)\n      p += s[p + k] === special && k % 2 === 1 ? k + 1 : k\n      continue\n    }\n    if (p + closer.length <= end && s.startsWith(closer, p)) return p\n    p++\n  }\n  return -1\n}\n\n/** Undo raw-context escaping: backslash runs before `special` halve. A run\n *  at the very end counts as before `special` when the closer follows it. */\nconst unescapeRaw = (s: string, special: string, closerFollows: boolean): string => {\n  let out = ''\n  let p = 0\n  while (p < s.length) {\n    if (s[p] !== '\\\\') {\n      out += s[p]\n      p++\n      continue\n    }\n    const k = backslashRun(s, p, s.length)\n    const next = p + k < s.length ? s[p + k] : closerFollows ? special : ''\n    if (next !== special) {\n      out += '\\\\'.repeat(k)\n      p += k\n    } else if (k % 2 === 1) {\n      out += '\\\\'.repeat((k - 1) / 2) + special\n      p += k + 1\n    } else {\n      out += '\\\\'.repeat(k / 2)\n      p += k\n    }\n  }\n  return out\n}\n\nconst matchCode = (s: string, i: number, end: number): RawSpan | null => {\n  if (s[i] !== '`') return null\n  const close = findRawCloser(s, i + 1, end, '`', '`')\n  if (close <= i + 1) return null\n  return { end: close + 1, contentStart: i + 1, contentEnd: close }\n}\n\nconst matchPre = (s: string, i: number, end: number): RawSpan | null => {\n  if (!s.startsWith('```', i)) return null\n  const open = i + 3\n  const close = findRawCloser(s, open, end, '```', '`')\n  if (close < 0) return null\n  const trimEnd = (from: number) =>\n    close > from && s[close - 1] === '\\n' ? close - 1 : close\n  const nl = s.indexOf('\\n', open)\n  if (nl >= 0 && nl < close && LANGUAGE.test(s.slice(open, nl))) {\n    const contentEnd = trimEnd(nl + 1)\n    if (contentEnd > nl + 1) {\n      const language = s.slice(open, nl) || undefined\n      return { end: close + 3, contentStart: nl + 1, contentEnd, language }\n    }\n    // \"```go⏎```\" is a block whose one line is \"go\", not an empty Go block.\n  }\n  const contentEnd = trimEnd(open)\n  if (contentEnd <= open) return null\n  return { end: close + 3, contentStart: open, contentEnd }\n}\n\ninterface LinkSpan {\n  end: number\n  labelStart: number\n  labelEnd: number\n  target: string\n}\n\nconst matchLink = (s: string, i: number, end: number): LinkSpan | null => {\n  if (s[i] !== '[') return null\n  let p = i + 1\n  while (p < end) {\n    if (s[p] === '\\\\') {\n      p = skipEscape(s, p, end)\n      continue\n    }\n    // A later `[` owns the `](` we would find: this one is literal text.\n    if (s[p] === '[') return null\n    if (s[p] === ']' && s[p + 1] === '(') {\n      if (p === i + 1) return null\n      const close = findRawCloser(s, p + 2, end, ')', ')')\n      if (close <= p + 2) return null\n      return {\n        end: close + 1,\n        labelStart: i + 1,\n        labelEnd: p,\n        target: unescapeRaw(s.slice(p + 2, close), ')', true),\n      }\n    }\n    const raw = matchPre(s, p, end) ?? matchCode(s, p, end)\n    p = raw ? raw.end : p + 1\n  }\n  return null\n}\n\n/** Length of the run of `s[i]` starting at `i`. */\nconst charRun = (s: string, i: number, end: number) => {\n  let k = 1\n  while (i + k < end && s[i + k] === s[i]) k++\n  return k\n}\n\nconst findPairCloser = (s: string, from: number, end: number, marker: string) => {\n  let p = from\n  while (p < end) {\n    if (s[p] === '\\\\') {\n      p = skipEscape(s, p, end)\n      continue\n    }\n    if (PAIR_CHARS.has(s[p]!)) {\n      const run = charRun(s, p, end)\n      if (run === 2 && p > from && s.startsWith(marker, p)) return p\n      p += run\n      continue\n    }\n    // Code, pre blocks and links are opaque: a marker inside one of them\n    // cannot close a pair that started outside.\n    const atom = matchPre(s, p, end) ?? matchCode(s, p, end) ?? matchLink(s, p, end)\n    p = atom ? atom.end : p + 1\n  }\n  return -1\n}\n\n/**\n * Parse composer input into message text and entities. Never throws: input\n * that is not valid shortcut syntax stays literal text.\n */\nexport const parseKunChatMarkdown = (source: string): KunChatFormattedText => {\n  let text = ''\n  const entities: KunChatEntity[] = []\n  const quotedLines: [number, number][] = []\n  let atLineStart = true\n  let lineQuoted = false\n  let lineOffset = 0\n\n  const endLine = () => {\n    if (lineQuoted) quotedLines.push([lineOffset, text.length])\n  }\n\n  const parseRange = (start: number, end: number) => {\n    let i = start\n    while (i < end) {\n      if (atLineStart) {\n        atLineStart = false\n        lineOffset = text.length\n        lineQuoted = false\n        if (i + 2 <= end && source.startsWith('> ', i)) {\n          lineQuoted = true\n          i += 2\n        } else if (source[i] === '>' && (i + 1 === end || source[i + 1] === '\\n')) {\n          lineQuoted = true\n          i += 1\n        }\n        if (source[i] === '\\\\' && source[i + backslashRun(source, i, end)] === '>') i += 1\n        continue\n      }\n\n      const c = source[i]!\n      if (c === '\\\\') {\n        const { k, c: next, special } = escapeAt(source, i, end)\n        if (!special) {\n          text += '\\\\'.repeat(k)\n          i += k\n        } else if (k % 2 === 1 && i + k < end) {\n          text += '\\\\'.repeat((k - 1) / 2) + next\n          i += k + 1\n        } else {\n          text += '\\\\'.repeat(k / 2)\n          i += k\n        }\n        continue\n      }\n\n      if (c === '\\n') {\n        endLine()\n        text += '\\n'\n        atLineStart = true\n        i++\n        continue\n      }\n\n      const raw = matchPre(source, i, end)\n      const code = raw ? null : matchCode(source, i, end)\n      const span = raw ?? code\n      if (span) {\n        const offset = text.length\n        text += unescapeRaw(\n          source.slice(span.contentStart, span.contentEnd),\n          '`',\n          source[span.contentEnd] === '`'\n        )\n        const entity: KunChatEntity = {\n          type: raw ? 'pre' : 'code',\n          offset,\n          length: text.length - offset,\n        }\n        if (span.language) entity.language = span.language\n        entities.push(entity)\n        i = span.end\n        continue\n      }\n\n      const link = matchLink(source, i, end)\n      if (link) {\n        const offset = text.length\n        parseRange(link.labelStart, link.labelEnd)\n        const length = text.length - offset\n        const mention = link.target.match(MENTION)\n        if (length > 0) {\n          entities.push(\n            mention\n              ? { type: 'mention', offset, length, user_id: mention[1] }\n              : { type: 'text_link', offset, length, url: link.target }\n          )\n        }\n        i = link.end\n        continue\n      }\n\n      if (PAIR_CHARS.has(c)) {\n        // Exactly two: `***` or `****` is not a marker, it is text.\n        const run = charRun(source, i, end)\n        if (run !== 2) {\n          text += c.repeat(run)\n          i += run\n          continue\n        }\n        const [marker, type] = PAIRS.find(([m]) => m[0] === c)!\n        const close = findPairCloser(source, i + 2, end, marker)\n        if (close > i + 2) {\n          const offset = text.length\n          parseRange(i + 2, close)\n          const length = text.length - offset\n          if (length > 0) entities.push({ type, offset, length })\n          i = close + 2\n        } else {\n          text += marker\n          i += 2\n        }\n        continue\n      }\n\n      text += c\n      i++\n    }\n  }\n\n  parseRange(0, source.length)\n  endLine()\n\n  // Consecutive quoted lines form one quote, the line breaks between included.\n  for (let q = 0; q < quotedLines.length; q++) {\n    const start = quotedLines[q]![0]\n    let end = quotedLines[q]![1]\n    while (q + 1 < quotedLines.length && quotedLines[q + 1]![0] === end + 1) {\n      end = quotedLines[++q]![1]\n    }\n    if (end > start) entities.push({ type: 'blockquote', offset: start, length: end - start })\n  }\n\n  return { text, entities: normalizeKunChatEntities(text, entities) }\n}\n\n\ntype Context = 'text' | 'code' | 'pre' | 'url'\n\ninterface LitAtom {\n  kind: 'lit'\n  ch: string\n  ctx: Context\n  /** Inside a link label, where a literal `[` must be escaped. */\n  inLabel: boolean\n  escape: boolean\n}\ninterface MarkAtom {\n  kind: 'mark'\n  s: string\n  /** The parser jumps over it without a line-start check: a pair's closing\n   *  marker, and a link's `](`…`)` (whose target atoms are `url`). */\n  closer?: boolean\n}\ntype Atom = LitAtom | MarkAtom\n\ninterface FormatNode {\n  entity: KunChatEntity | null\n  start: number\n  end: number\n  children: FormatNode[]\n}\n\n/**\n * Turn message text + entities back into composer input — for editing a sent\n * message, or restoring a draft. Parsing the result gives back the same text\n * and (normalized) entities, except for what the syntax cannot spell:\n *\n * - `url` entities are dropped; the server detects links again on save.\n * - A blockquote is dropped unless it starts and ends at line breaks that\n *   are text — not inside a code span or pre block.\n * - Blockquotes on consecutive lines are written, and come back, as one.\n * - A `pre` language with characters outside `A-Z a-z 0-9 _ + # . -` is\n *   dropped, as is a `text_link` whose URL is itself `mention:<digits>`.\n */\nexport const formatKunChatMarkdown = (\n  text: string,\n  entities: readonly KunChatEntity[] | null | undefined\n): string => {\n  // A quote is spelled as `> ` lines, so it needs a line break on each side\n  // that the parser reads as text — not one inside a code span or pre block.\n  // Quotes that cannot be spelled go, and the rest is normalized again from\n  // the original entities, so whatever those quotes had cut apart joins up.\n  const withoutUrls = (entities ?? []).filter((e) => e.type !== 'url')\n  const first = normalizeKunChatEntities(text, withoutUrls)\n  const inRaw = (i: number) =>\n    first.some((r) => (r.type === 'code' || r.type === 'pre') && r.offset <= i && i < r.offset + r.length)\n  const breakAt = (i: number) => text[i] === '\\n' && !inRaw(i)\n  const quotes: KunChatEntity[] = []\n  for (const q of first) {\n    if (q.type !== 'blockquote') continue\n    const end = q.offset + q.length\n    if (!(q.offset === 0 || breakAt(q.offset - 1)) || !(end === text.length || breakAt(end))) continue\n    const prev = quotes[quotes.length - 1]\n    if (prev && prev.offset + prev.length + 1 === q.offset) prev.length = end - prev.offset\n    else quotes.push({ ...q })\n  }\n  const list = normalizeKunChatEntities(text, [\n    ...withoutUrls.filter((e) => e.type !== 'blockquote'),\n    ...quotes,\n  ])\n\n  const root: FormatNode = { entity: null, start: 0, end: text.length, children: [] }\n  const stack: FormatNode[] = [root]\n  for (const entity of list) {\n    const node: FormatNode = {\n      entity,\n      start: entity.offset,\n      end: entity.offset + entity.length,\n      children: [],\n    }\n    while (stack.length > 1 && stack[stack.length - 1]!.end <= node.start) stack.pop()\n    stack[stack.length - 1]!.children.push(node)\n    stack.push(node)\n  }\n\n  const atoms: Atom[] = []\n  const mark = (s: string, closer = false) => atoms.push({ kind: 'mark', s, closer })\n  const lit = (ch: string, ctx: Context, inLabel: boolean) =>\n    atoms.push({ kind: 'lit', ch, ctx, inLabel, escape: false })\n  let quoteDepth = 0\n\n  const emitText = (from: number, to: number, inLabel: boolean) => {\n    for (let i = from; i < to; i++) {\n      lit(text[i]!, 'text', inLabel)\n      // A normalized quote never ends in a line break, so every break inside\n      // one is followed by another quoted line.\n      if (text[i] === '\\n' && quoteDepth > 0) mark('> ')\n    }\n  }\n  const emitRaw = (from: number, to: number, ctx: Context) => {\n    for (let i = from; i < to; i++) lit(text[i]!, ctx, false)\n  }\n\n  const walk = (node: FormatNode, inLabel: boolean) => {\n    let cursor = node.start\n    for (const child of node.children) {\n      emitText(cursor, child.start, inLabel)\n      emitEntity(child, inLabel)\n      cursor = child.end\n    }\n    emitText(cursor, node.end, inLabel)\n  }\n\n  const emitEntity = (node: FormatNode, inLabel: boolean) => {\n    const e = node.entity!\n    const pair = PAIR_BY_TYPE.get(e.type)\n    if (pair) {\n      mark(pair)\n      walk(node, inLabel)\n      mark(pair, true)\n    } else if (e.type === 'code') {\n      mark('`')\n      emitRaw(node.start, node.end, 'code')\n      mark('`')\n    } else if (e.type === 'pre') {\n      const language = e.language && LANGUAGE.test(e.language) ? e.language : ''\n      mark(`\\`\\`\\`${language}\\n`)\n      emitRaw(node.start, node.end, 'pre')\n      mark('\\n```')\n    } else if (e.type === 'text_link' || e.type === 'mention') {\n      mark('[')\n      walk(node, true)\n      mark('](', true)\n      const target = e.type === 'mention' ? `mention:${e.user_id}` : e.url!\n      for (const ch of target) lit(ch, 'url', false)\n      mark(')', true)\n    } else if (e.type === 'blockquote') {\n      mark('> ')\n      quoteDepth++\n      walk(node, inLabel)\n      quoteDepth--\n    } else {\n      walk(node, inLabel)\n    }\n  }\n\n  walk(root, false)\n  return serialize(atoms)\n}\n\nconst isLit = (a: Atom | undefined, ch: string, ctx: Context): a is LitAtom =>\n  a?.kind === 'lit' && a.ch === ch && a.ctx === ctx\n\nconst firstChar = (a: Atom | undefined) =>\n  a === undefined ? undefined : a.kind === 'mark' ? a.s[0] : a.ch\n\n/** The first character after atom `from` that is not a backslash, as it\n *  will be written. */\nconst rawCharFrom = (atoms: Atom[], from: number): string | undefined => {\n  for (let i = from; i < atoms.length; i++) {\n    const a = atoms[i]!\n    if (a.kind === 'mark') {\n      const c = [...a.s].find((ch) => ch !== '\\\\')\n      if (c !== undefined) return c\n    } else if (a.escape || a.ch !== '\\\\') {\n      return a.ch\n    }\n  }\n  return undefined\n}\n\nconst lastNonBackslash = (out: string) => {\n  let i = out.length - 1\n  while (i >= 0 && out[i] === '\\\\') i--\n  return out[i]\n}\n\n/** Whether a backslash run written before atom `j` would be read as an\n *  escape — mirrors the parser's `escapeAt` — in which case it is doubled. */\nconst beforeSpecial = (atoms: Atom[], j: number, ctx: Context, out: string): boolean => {\n  const next = atoms[j]\n  if (next === undefined) return false\n  if (next.kind === 'lit' && next.escape) return true\n  const c = next.kind === 'mark' ? next.s[0]! : next.ch\n  if (ctx !== 'text') return c === (ctx === 'url' ? ')' : '`')\n  if (next.kind === 'mark') return TEXT_SPECIAL.has(c)\n  if (c === '`' || c === '[' || c === ']') return true\n  return PAIR_CHARS.has(c) && (lastNonBackslash(out) === c || rawCharFrom(atoms, j + 1) === c)\n}\n\nconst serialize = (atoms: Atom[]): string => {\n  // Which literals need a backslash.\n  atoms.forEach((a, i) => {\n    if (a.kind !== 'lit') return\n    const prev = atoms[i - 1]\n    const next = atoms[i + 1]\n    if (a.ctx === 'text') {\n      if (PAIR_CHARS.has(a.ch)) {\n        // No two active copies of a pair character may touch, or they would\n        // read as a marker.\n        const prevActive =\n          prev?.kind === 'mark'\n            ? prev.s.endsWith(a.ch)\n            : prev !== undefined && !prev.escape && prev.ch === a.ch\n        a.escape = prevActive || firstChar(next) === a.ch\n      } else if (a.ch === '`') {\n        a.escape = true\n      } else if (a.ch === '[') {\n        a.escape = a.inLabel\n      } else if (a.ch === ']') {\n        a.escape = next?.kind === 'lit' && next.ch === '('\n      }\n    } else if (a.ctx === 'code') {\n      a.escape = a.ch === '`'\n    } else if (a.ctx === 'url') {\n      a.escape = a.ch === ')'\n    } else if (a.ch === '`') {\n      // In a pre block only three backticks in a row can close it.\n      let s = i\n      while (isLit(atoms[s - 1], '`', 'pre')) s--\n      let e = i\n      while (isLit(atoms[e + 1], '`', 'pre')) e++\n      a.escape = e - s + 1 >= 3\n    }\n  })\n\n  // The parser's `atLineStart`, tracked over the atoms rather than read off\n  // the output: a line break that ends a link label is followed in the source\n  // by `](…)`, and the parser checks the line start after it. Reading the\n  // output lost the text after `[⏎](mention:12)` when it began `\\>` or `>`.\n  // After a `> ` prefix the parser checks only the very next character.\n  let lineStart = true\n  let afterPrefix = false\n  let out = ''\n  let i = 0\n  while (i < atoms.length) {\n    const a = atoms[i]!\n    const skipped = a.kind === 'mark' ? a.closer === true : a.ctx === 'url'\n    const checked = lineStart && !skipped\n    const leading = afterPrefix || checked\n    afterPrefix = false\n    if (!skipped) lineStart = false\n    if (a.kind === 'mark') {\n      out += a.s\n      afterPrefix = checked && a.s === '> '\n      i++\n      continue\n    }\n    if (a.ctx === 'text' && leading) {\n      let j = i\n      while (isLit(atoms[j], '\\\\', 'text')) j++\n      if (isLit(atoms[j], '>', 'text')) out += '\\\\'\n    }\n    if (a.ch === '\\\\') {\n      let j = i\n      while (isLit(atoms[j], '\\\\', a.ctx)) j++\n      out += '\\\\'.repeat(beforeSpecial(atoms, j, a.ctx, out) ? 2 * (j - i) : j - i)\n      i = j\n      continue\n    }\n    out += a.escape ? `\\\\${a.ch}` : a.ch\n    if (a.ctx === 'text' && a.ch === '\\n') lineStart = true\n    i++\n  }\n  return out\n}\n","// Telegram's album mosaic, ported from Telegram Desktop's grouped_layout.cpp\n// by way of tweb's groupedLayout.ts, constant for constant. Not telegram-tt's\n// copy: it passes a maxHeight into the 5+ case, so the 4/3 target height\n// never applies and five photos lay out differently from every other client.\n//\n// The output is in layout units; a renderer divides by `width` / `height` and\n// places each tile by percentage, so the mosaic scales to any bubble width\n// with no measuring.\n\nexport interface KunChatAlbumSize {\n  width: number\n  height: number\n}\n\n/** Which outer edges of the mosaic a tile touches — its rounded corners. */\nexport const KUN_CHAT_ALBUM_SIDE = {\n  top: 1,\n  right: 2,\n  bottom: 4,\n  left: 8,\n} as const\n\nexport interface KunChatAlbumTile {\n  x: number\n  y: number\n  width: number\n  height: number\n  /** Bitmask of `KUN_CHAT_ALBUM_SIDE`. */\n  sides: number\n}\n\nexport interface KunChatAlbumLayout {\n  width: number\n  height: number\n  tiles: KunChatAlbumTile[]\n}\n\nexport interface KunChatAlbumOptions {\n  /** Default 420, tweb's desktop bubble width. */\n  maxWidth?: number\n  /** Narrowest tile. Default 100. */\n  minWidth?: number\n  /** Gap between tiles. Default 2. */\n  spacing?: number\n}\n\nconst { top: T, right: R, bottom: B, left: L } = KUN_CHAT_ALBUM_SIDE\nconst sum = (xs: number[]) => xs.reduce((a, b) => a + b, 0)\nconst clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max)\n\nconst tile = (x: number, y: number, width: number, height: number, sides: number) => ({\n  x,\n  y,\n  width,\n  height,\n  sides,\n})\n\nconst layoutComplex = (\n  ratios: number[],\n  averageRatio: number,\n  maxWidth: number,\n  minWidth: number,\n  spacing: number\n): KunChatAlbumTile[] => {\n  const maxHeight = (maxWidth * 4) / 3\n  const cropped = ratios.map((r) =>\n    averageRatio > 1.1 ? clamp(r, 1, 2.75) : clamp(r, 0.6667, 1)\n  )\n  const count = cropped.length\n  const attempts: { counts: number[]; heights: number[] }[] = []\n  const push = (counts: number[]) => {\n    let offset = 0\n    const heights = counts.map((c) => {\n      const h = (maxWidth - (c - 1) * spacing) / sum(cropped.slice(offset, offset + c))\n      offset += c\n      return h\n    })\n    attempts.push({ counts, heights })\n  }\n\n  for (let first = 1; first !== count; first++) {\n    const second = count - first\n    if (first <= 3 && second <= 3) push([first, second])\n  }\n  for (let first = 1; first < count - 1; first++) {\n    for (let second = 1; second < count - first; second++) {\n      const third = count - first - second\n      if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n        push([first, second, third])\n      }\n    }\n  }\n  for (let first = 1; first < count - 1; first++) {\n    for (let second = 1; second < count - first; second++) {\n      for (let third = 1; third < count - first - second; third++) {\n        const fourth = count - first - second - third\n        if (first <= 3 && second <= 3 && third <= 3 && fourth <= 3) {\n          push([first, second, third, fourth])\n        }\n      }\n    }\n  }\n\n  // More than 12 photos leave no split of rows of at most three (tweb throws\n  // there). Albums hold 10, but a bad row must render: fall back to rows of\n  // three.\n  if (!attempts.length) {\n    push(Array.from({ length: Math.ceil(count / 3) }, (_, i) => Math.min(3, count - i * 3)))\n  }\n  let best = attempts[0]!\n  let bestDiff = Infinity\n  for (const attempt of attempts) {\n    const { counts, heights } = attempt\n    const total = sum(heights) + spacing * (counts.length - 1)\n    const tooShort = Math.min(...heights) < minWidth ? 1.5 : 1\n    const topHeavy = counts.some((c, i) => i > 0 && counts[i - 1]! > c) ? 1.5 : 1\n    const diff = Math.abs(total - maxHeight) * tooShort * topHeavy\n    if (diff < bestDiff) {\n      best = attempt\n      bestDiff = diff\n    }\n  }\n\n  const tiles: KunChatAlbumTile[] = []\n  let index = 0\n  let y = 0\n  best.counts.forEach((cols, row) => {\n    const lineHeight = best.heights[row]!\n    const height = Math.round(lineHeight)\n    let x = 0\n    for (let col = 0; col < cols; col++) {\n      const sides =\n        (row === 0 ? T : 0) |\n        (row === best.counts.length - 1 ? B : 0) |\n        (col === 0 ? L : 0) |\n        (col === cols - 1 ? R : 0)\n      const width =\n        col === cols - 1 ? maxWidth - x : Math.round(cropped[index]! * lineHeight)\n      tiles.push(tile(x, y, width, height, sides))\n      x += width + spacing\n      index++\n    }\n    y += height + spacing\n  })\n  return tiles\n}\n\n/**\n * Lay out an album of 1–10 photos as Telegram does. Sizes with a zero or\n * missing side are treated as square.\n */\nexport const layoutKunChatAlbum = (\n  sizes: readonly KunChatAlbumSize[],\n  options: KunChatAlbumOptions = {}\n): KunChatAlbumLayout => {\n  const maxWidth = options.maxWidth ?? 420\n  const minWidth = options.minWidth ?? 100\n  const s = options.spacing ?? 2\n  const maxHeight = maxWidth\n  const r = sizes.map((z) => (z.width > 0 && z.height > 0 ? z.width / z.height : 1))\n  const n = r.length\n  const shape = r.map((x) => (x > 1.2 ? 'w' : x < 0.8 ? 'n' : 'q')).join('')\n  // The `+ 1` is in Telegram Desktop too.\n  const averageRatio = (1 + sum(r)) / n\n  const maxSizeRatio = maxWidth / maxHeight\n\n  let tiles: KunChatAlbumTile[]\n  if (n === 0) {\n    tiles = []\n  } else if (n === 1) {\n    tiles = [tile(0, 0, maxWidth, maxWidth / r[0]!, T | R | B | L)]\n  } else if (n >= 5 || r.some((x) => x > 2)) {\n    tiles = layoutComplex(r, averageRatio, maxWidth, minWidth, s)\n  } else if (n === 2) {\n    const [r0, r1] = r as [number, number]\n    if (shape === 'ww' && averageRatio > 1.4 * maxSizeRatio && r1 - r0 < 0.2) {\n      const h = Math.round(Math.min(maxWidth / r0, maxWidth / r1, (maxHeight - s) / 2))\n      tiles = [tile(0, 0, maxWidth, h, L | T | R), tile(0, h + s, maxWidth, h, L | B | R)]\n    } else if (shape === 'ww' || shape === 'qq') {\n      const w = (maxWidth - s) / 2\n      const h = Math.round(Math.min(w / r0, w / r1, maxHeight))\n      tiles = [tile(0, 0, w, h, T | L | B), tile(w + s, 0, w, h, T | R | B)]\n    } else {\n      const w2 = Math.min(\n        Math.round(Math.max(0.4 * (maxWidth - s), (maxWidth - s) / r0 / (1 / r0 + 1 / r1))),\n        maxWidth - s - Math.round(minWidth * 1.5)\n      )\n      const w1 = maxWidth - w2 - s\n      const h = Math.min(maxHeight, Math.round(Math.min(w1 / r0, w2 / r1)))\n      tiles = [tile(0, 0, w1, h, T | L | B), tile(w1 + s, 0, w2, h, T | R | B)]\n    }\n  } else if (n === 3) {\n    const [r0, r1, r2] = r as [number, number, number]\n    if (shape[0] === 'n') {\n      const h0 = maxHeight\n      const h2 = Math.round(Math.min((maxHeight - s) / 2, (r1 * (maxWidth - s)) / (r2 + r1)))\n      const h1 = h0 - h2 - s\n      const wR = Math.max(minWidth, Math.round(Math.min((maxWidth - s) / 2, h2 * r2, h1 * r1)))\n      const wL = Math.min(Math.round(h0 * r0), maxWidth - s - wR)\n      tiles = [\n        tile(0, 0, wL, h0, T | L | B),\n        tile(wL + s, 0, wR, h1, T | R),\n        tile(wL + s, h1 + s, wR, h2, B | R),\n      ]\n    } else {\n      const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n      const w1 = (maxWidth - s) / 2\n      const h1 = Math.min(maxHeight - h0 - s, Math.round(Math.min(w1 / r1, w1 / r2)))\n      const w2 = maxWidth - w1 - s\n      tiles = [\n        tile(0, 0, maxWidth, h0, L | T | R),\n        tile(0, h0 + s, w1, h1, B | L),\n        tile(w1 + s, h0 + s, w2, h1, B | R),\n      ]\n    }\n  } else {\n    const [r0, r1, r2, r3] = r as [number, number, number, number]\n    if (shape[0] === 'w') {\n      const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n      const h = Math.round((maxWidth - 2 * s) / (r1 + r2 + r3))\n      const w0 = Math.max(minWidth, Math.round(Math.min((maxWidth - 2 * s) * 0.4, h * r1)))\n      const w2 = Math.round(Math.max(minWidth, (maxWidth - 2 * s) * 0.33, h * r3))\n      const w1 = maxWidth - w0 - w2 - 2 * s\n      const h1 = Math.min(maxHeight - h0 - s, h)\n      tiles = [\n        tile(0, 0, maxWidth, h0, L | T | R),\n        tile(0, h0 + s, w0, h1, B | L),\n        tile(w0 + s, h0 + s, w1, h1, B),\n        tile(w0 + s + w1 + s, h0 + s, w2, h1, R | B),\n      ]\n    } else {\n      const h = maxHeight\n      const w0 = Math.round(Math.min(h * r0, (maxWidth - s) * 0.6))\n      const w = Math.round((maxHeight - 2 * s) / (1 / r1 + 1 / r2 + 1 / r3))\n      const h0 = Math.round(w / r1)\n      const h1 = Math.round(w / r2)\n      const h2 = h - h0 - h1 - 2 * s\n      const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - s, w))\n      tiles = [\n        tile(0, 0, w0, h, T | L | B),\n        tile(w0 + s, 0, w1, h0, T | R),\n        tile(w0 + s, h0 + s, w1, h1, R),\n        tile(w0 + s, h0 + h1 + 2 * s, w1, h2, B | R),\n      ]\n    }\n  }\n\n  return {\n    width: Math.max(0, ...tiles.map((t) => t.x + t.width)),\n    height: Math.max(0, ...tiles.map((t) => t.y + t.height)),\n    tiles,\n  }\n}\n","import type { KunChatMessage } from './types.ts'\nimport { KUN_CHAT_ALBUM_LIMIT } from './constants.ts'\n\n// The message list's row model, as data: day sections, sender groups, albums\n// merged into one row, and the unread divider. The Vue list renders it, the\n// Flutter port computes the same rows from the same function.\n\n/** The row identity of a message: its `client_message_id` when it has one, so\n *  a pending message keeps its row when the server confirms it. */\nexport const kunChatMessageKey = (message: KunChatMessage): string =>\n  message.client_message_id ? `c:${message.client_message_id}` : `m:${message.id}`\n\nconst pad = (n: number) => String(n).padStart(2, '0')\n\nconst dayFormatters = new Map<string, Intl.DateTimeFormat>()\n\n/**\n * `YYYY-MM-DD` of an instant, in `timeZone` (an IANA name) or, when omitted,\n * the runtime's own zone. Keys sort chronologically as strings.\n */\nexport const kunChatDayKey = (date: Date, timeZone?: string): string => {\n  if (!timeZone) {\n    return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n  }\n  let fmt = dayFormatters.get(timeZone)\n  if (!fmt) {\n    fmt = new Intl.DateTimeFormat('en-CA', {\n      timeZone,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    })\n    dayFormatters.set(timeZone, fmt)\n  }\n  const parts = Object.fromEntries(fmt.formatToParts(date).map((p) => [p.type, p.value]))\n  return `${parts.year}-${parts.month}-${parts.day}`\n}\n\nexport type KunChatListRow =\n  | { type: 'unread'; key: string }\n  | { type: 'service'; key: string; message: KunChatMessage }\n  | {\n      type: 'message'\n      key: string\n      /** The message the row acts as: an album's first message with a\n       *  caption, else its first; the message itself otherwise. */\n      message: KunChatMessage\n      /** Every message the row shows — an album's photos, in order. */\n      messages: KunChatMessage[]\n      own: boolean\n      /** First of consecutive messages from one sender: the name goes here. */\n      groupStart: boolean\n      /** Last of the run: the avatar and the bubble tail go here. */\n      groupEnd: boolean\n    }\n\nexport interface KunChatDaySection {\n  /** `YYYY-MM-DD` in the list's time zone. */\n  key: string\n  /** The first message's instant, for formatting the date pill. */\n  date: Date\n  rows: KunChatListRow[]\n}\n\nexport interface KunChatGroupOptions {\n  currentUserId: string\n  /** The viewer's read cursor when the conversation was opened. The unread\n   *  divider goes above the first later message someone else sent. */\n  lastReadSeq?: number | null\n  /** Longest gap, in seconds, inside one sender group. Default 600\n   *  (telegram-tt's `GROUP_INTERVAL_SECONDS`). */\n  groupWindow?: number\n  /** IANA time zone for day boundaries; the runtime's zone when omitted. */\n  timeZone?: string\n}\n\nconst albumRepresentative = (messages: KunChatMessage[]) =>\n  messages.find((m) => m.text) ?? messages[0]!\n\n/**\n * Arrange messages — already in display order — into day sections and rows.\n * A sender group breaks on another sender, a new day, a gap longer than\n * `groupWindow`, the unread divider, and any service message.\n */\nexport const groupKunChatMessages = (\n  messages: readonly KunChatMessage[],\n  options: KunChatGroupOptions\n): KunChatDaySection[] => {\n  const windowMs = (options.groupWindow ?? 600) * 1000\n  const sections: KunChatDaySection[] = []\n  let dividerPlaced = options.lastReadSeq == null\n  let prev: { sender: string; at: number; row: Extract<KunChatListRow, { type: 'message' }> } | null =\n    null\n\n  const closeGroup = () => {\n    if (prev) prev.row.groupEnd = true\n    prev = null\n  }\n\n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i]!\n    const at = Date.parse(message.created_at)\n    const date = new Date(Number.isNaN(at) ? 0 : at)\n    const key = kunChatDayKey(date, options.timeZone)\n\n    let section = sections[sections.length - 1]\n    // Only ever forward: a pending message stamped by a slow local clock\n    // joins the current day instead of reopening an earlier one.\n    if (!section || key > section.key) {\n      closeGroup()\n      section = { key, date, rows: [] }\n      sections.push(section)\n    }\n\n    const own = message.sender_id === options.currentUserId\n    if (\n      !dividerPlaced &&\n      !own &&\n      message.seq > options.lastReadSeq! &&\n      message.seq > 0\n    ) {\n      closeGroup()\n      section.rows.push({ type: 'unread', key: 'unread' })\n      dividerPlaced = true\n    }\n\n    if (message.kind === 'service') {\n      closeGroup()\n      section.rows.push({ type: 'service', key: kunChatMessageKey(message), message })\n      continue\n    }\n\n    let group = [message]\n    if (message.media_group_id != null) {\n      while (\n        group.length < KUN_CHAT_ALBUM_LIMIT &&\n        i + 1 < messages.length &&\n        messages[i + 1]!.kind === 'message' &&\n        messages[i + 1]!.media_group_id === message.media_group_id &&\n        messages[i + 1]!.sender_id === message.sender_id\n      ) {\n        group = [...group, messages[++i]!]\n      }\n    }\n\n    const continues =\n      prev !== null && prev.sender === message.sender_id && at - prev.at <= windowMs\n    if (!continues) closeGroup()\n\n    const row: Extract<KunChatListRow, { type: 'message' }> = {\n      type: 'message',\n      key: kunChatMessageKey(message),\n      message: group.length > 1 ? albumRepresentative(group) : message,\n      messages: group,\n      own,\n      groupStart: !continues,\n      groupEnd: false,\n    }\n    section.rows.push(row)\n    const last = group[group.length - 1]!\n    const lastAt = Date.parse(last.created_at)\n    prev = { sender: message.sender_id, at: Number.isNaN(lastAt) ? at : lastAt, row }\n  }\n  closeGroup()\n  return sections\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n  \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n  \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n  \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n  \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n  \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n  \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n  \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n  \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n  \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n  \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n  \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n  \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n  \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n  \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n  \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n  \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n  \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n  \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n  \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n  \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n  \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n  \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n  \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n  \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n  \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n  \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n  \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n  \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n  \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n  \"lucide:filter\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M22 3H2l8 9.46V19l4 2v-8.54z\\\"/>\"},\n  \"lucide:heart\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676a.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\\\"/>\"},\n  \"lucide:clock\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 6v6l4 2\\\"/></g>\"},\n  \"lucide:check-check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L7 17l-5-5m20-2l-7.5 7.5L13 16\\\"/>\"},\n  \"lucide:circle-alert\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 8v4m0 4h.01\\\"/></g>\"},\n  \"lucide:reply\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M20 18v-2a4 4 0 0 0-4-4H4\\\"/><path d=\\\"m9 17l-5-5l5-5\\\"/></g>\"},\n  \"lucide:quote\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2zM5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\\\"/>\"},\n  \"lucide:pencil\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497zM15 5l4 4\\\"/>\"},\n  \"lucide:pin\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4a1 1 0 0 1 1 1z\\\"/>\"},\n  \"lucide:pin-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5m3-12.66V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H7.89M2 2l20 20M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11\\\"/>\"},\n  \"lucide:trash-2\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10 11v6m4-6v6m5-11v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"/>\"},\n  \"lucide:flag\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\\\"/>\"},\n  \"lucide:ban\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M4.929 4.929L19.07 19.071\\\"/></g>\"},\n  \"lucide:paperclip\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m16 6l-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\\\"/>\"},\n  \"lucide:send-horizontal\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904zM6 12h16\\\"/>\"},\n  \"lucide:smile-plus\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M22 11v1a10 10 0 1 1-9-10\\\"/><path d=\\\"M8 14s1.5 2 4 2s4-2 4-2M9 9h.01M15 9h.01M16 5h6m-3-3v6\\\"/></g>\"},\n  \"lucide:image\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"2\\\"/><path d=\\\"m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21\\\"/></g>\"},\n  \"lucide:at-sign\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"/><path d=\\\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\\\"/></g>\"},\n  \"lucide:bell\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0m-10.47-5.674A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\\\"/>\"},\n  \"lucide:bell-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742M2 2l20 20M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\\\"/>\"},\n  \"lucide:archive\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"20\\\" height=\\\"5\\\" x=\\\"2\\\" y=\\\"3\\\" rx=\\\"1\\\"/><path d=\\\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8m-10 4h4\\\"/></g>\"},\n  \"lucide:mail\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\\\"/><rect width=\\\"20\\\" height=\\\"16\\\" x=\\\"2\\\" y=\\\"4\\\" rx=\\\"2\\\"/></g>\"},\n  \"lucide:mail-open\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0z\\\"/><path d=\\\"m22 10l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10\\\"/></g>\"},\n  \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n  body: string\n  width?: number\n  height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n  registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n  icons: Record<string, KunIconData>\n): void => {\n  for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n  registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}