minerva-design 1.19.0 → 1.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/angular/fesm2022/minerva-angular.mjs +10 -14
  3. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  4. package/dist/angular/types/minerva-angular.d.ts +8 -2
  5. package/dist/core/decimal-places.d.cts +6 -0
  6. package/dist/core/decimal-places.d.ts +6 -0
  7. package/dist/core/index.cjs +21 -21
  8. package/dist/core/index.cjs.map +1 -1
  9. package/dist/core/index.js +590 -580
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/keyboard-navigation.d.cts +14 -0
  12. package/dist/core/keyboard-navigation.d.ts +14 -0
  13. package/dist/core/number-input.d.cts +4 -1
  14. package/dist/core/number-input.d.ts +4 -1
  15. package/dist/core/slider.d.cts +1 -1
  16. package/dist/core/slider.d.ts +1 -1
  17. package/dist/react/components/AutoComplete/AutoComplete.cjs +1 -1
  18. package/dist/react/components/AutoComplete/AutoComplete.cjs.map +1 -1
  19. package/dist/react/components/AutoComplete/AutoComplete.js +91 -90
  20. package/dist/react/components/AutoComplete/AutoComplete.js.map +1 -1
  21. package/dist/react/components/DatePicker/DatePicker.cjs +1 -1
  22. package/dist/react/components/DatePicker/DatePicker.cjs.map +1 -1
  23. package/dist/react/components/DatePicker/DatePicker.js +3 -2
  24. package/dist/react/components/DatePicker/DatePicker.js.map +1 -1
  25. package/dist/vue/components/AutoComplete/AutoComplete.vue.js.map +1 -1
  26. package/dist/vue/components/AutoComplete/AutoComplete.vue_vue_type_script_setup_true_lang.js +58 -57
  27. package/dist/vue/components/AutoComplete/AutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/weapp/controls.js +24 -12
  29. package/dist/web-components/cdn/minerva.js +532 -532
  30. package/dist/web-components/cdn/minerva.js.map +1 -1
  31. package/dist/web-components/components/autocomplete/autocomplete.d.ts +7 -1
  32. package/dist/web-components/components/autocomplete/autocomplete.js +29 -24
  33. package/dist/web-components/components/autocomplete/autocomplete.js.map +1 -1
  34. package/dist/web-components/components/date-picker/date-picker.js +11 -5
  35. package/dist/web-components/components/date-picker/date-picker.js.map +1 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["STANDARD","clamp","pxCss","paletteRules","diff","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","navTree","dashboard","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","enIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","dashboard","navTree","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","frIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","dashboard","navTree","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","jaIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","tag","messages","zhIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","counter","createId","prefix","createControllableState","options","controlled","stored","listeners","isControlled","get","emit","listener","value","prev","next","equals","onChange","current","DEV_MESSAGE_PREFIX","formatDevMessage","subject","message","UNSAFE_SCHEMES","IGNORED","isSafeUrl","normalized","url","scheme","sanitizeUrl","linkRel","rel","target","PALETTES","isThemeMode","isPalette","DENSITIES","RADIUS_SCALES","SHADOW_SCALES","FONT_SCALES","DESIGN_PRESETS","designPresets","includes","values","isDensity","isRadiusScale","isShadowScale","isFontScale","isDesignPreset","resolveDesign","preset","base","from","presetPalette","DESIGN_ATTRIBUTES","STANDARD$1","designAttributes","design","attributes","axis","all","ref","mix","rem","px","clamp$1","shadow","layers","transition","cubicBezier","x1","y1","x2","y2","mergeBlocks","blocks","lengthCss","toCss","layer","text","codeTokensLight","codeTokensDark","space","step","standardDensity","mediumRadiusTheme","mediumRadiusScale","standardFontSizes","densityTokens","radiusTokens","faded","amount","shadowTokens","smallFontSizes","largeFontSizes","fontSizeTokens","smallLineHeights","standardLineHeights","largeLineHeights","lineHeightTokens","fontScaleTokens","baseTokens","fg","bg","surface","shadowColor","semanticTokens","ROLE_COLORS","roleTokens","c","color","allRoleTokens","defaultThemeTokens","pickCss","out","key","keys","block","light","dark","githubDark","uniqueKeys","themes","theme","themeKeys","isThemeName","palettes","paletteAccents","spaceTokens","fontFamilyTokens","scaleTokens","reducedMotionTokens","forcedColorsTokens","NAMED","clamp","max","min","parseHex","hex","digits","d","channel","i","component","match","pct","parseRgbFunction","parts","args","p","r","g","b","v","splitTopLevel","depth","start","char","separator","mixArgument","trailing","leading","colorText","pctText","parseColor","fn","name","first","second","a","mixRgba","p1","p2","w1","w2","sum","multiplier","alpha","c1","c2","ALPHA_DECIMALS","hex2","formatColor","R","G","B","colorMix","ca","cb","mixed","amountB","normalizeColor","linear","gamma","relativeLuminance","contrastRatio","hi","lo","y","x","toOklab","l","m","s","fromOklab","L","A","STEPS","derivePrimaryDark","background","reaches","minContrast","at","t","mid","validColor","resolvePrimaryColor","pair","darkColor","invalidPrimaryColorMessage","refsOf","dependents","found","grew","PRIMARY_DERIVED_TOKENS","accentTokens","accentTokenNames","accentFollowsPrimary","tokens","accent","formula","primary","primaryColorTokens","withAccent","closingParen","open","substituteVars","index","end","rest","fallback","lookup","LengthParser","context","result","left","op","right","length","number","scale","rootFontSize","viewportWidth","viewportHeight","evaluateLength","round","noShadow","pxCss$1","evaluateShadow","layerText","inset","lengths","part","blur","spread","css","evaluateTransition","duration","EASINGS","evaluateEasing","points","FAMILIES","COLOR_FAMILY","family","test","tokenKind","tokenCascade","designOptions","chosen","palette","apply","mode","brand","primaryColor","overrides","reducedMotion","pxCss","evaluate","kind","easing","resolveTokens","substituted","visiting","raw","group","tokenDeclarations","map","serializeRules","pad","rules","selectors","declarations","property","mediaBlock","query","attr","doubleQuotes","ROOT","srOnly","paletteRules$1","designRules","generateTokensCss","onRoot","media","body","MINI_CLASS_PREFIX","MINI_ROOT_SELECTOR","SHADOW_STEPS","cls","miniColorClass","axisClass","STANDARD","miniTokenClassNames","resolved","classes","shadowVar","colorTokens","standard","subtle","entries","diff$1","variant","HEADER","stylesheet","shadowRef","baseRules","defaults","root","resolvedBlock","density","radius","fontScale","paletteRules","generateMiniTokensCss","generateMiniTokensFiles","en_default","\"default\"","\"group\"","\"groupWithMore\"","\"jumpPrev\"","\"jumpNext\"","\"prev\"","\"next\"","\"page\"","\"total\"","\"jumpTo\"","\"jumpToInput\"","\"pageSize\"","\"pageSizeOption\"","\"currentPage\"","\"nav\"","\"placeholder\"","\"clear\"","\"noResults\"","\"level\"","\"options\"","\"label\"","\"hours\"","\"minutes\"","\"seconds\"","\"period\"","\"loading\"","\"close\"","\"expand\"","\"collapse\"","\"icon\"","\"info\"","\"success\"","\"warning\"","\"danger\"","\"description\"","\"closeWithLabel\"","\"showPassword\"","\"hidePassword\"","data_default$3","\"empty\"","\"retry\"","\"scrollRegion\"","\"selectAll\"","\"selectRow\"","\"columnLabel_one\"","\"columnLabel_other\"","\"dragHint\"","\"lifted\"","\"over\"","\"dropped\"","\"cancelled\"","\"moveTo\"","\"moveUp\"","\"moveDown\"","\"unavailable\"","\"retryLabel\"","display_default$3","\"play\"","\"pause\"","\"skipBack_one\"","\"skipBack_other\"","\"skipForward_one\"","\"skipForward_other\"","\"seek\"","\"timeOf\"","\"mute\"","\"unmute\"","\"volume\"","\"playbackRate\"","\"fullscreen\"","\"exitFullscreen\"","\"pictureInPicture\"","\"exitPictureInPicture\"","\"captions\"","\"captionsOff\"","\"error\"","\"frontLabel\"","\"backLabel\"","\"hint\"","\"copy\"","\"copied\"","\"copyFailed\"","feedback_default$3","\"region\"","\"regionWithHotkey\"","\"scrollLeft\"","\"scrollRight\"","forms_default$3","\"minimum\"","\"maximum\"","\"increment\"","\"decrement\"","\"notANumber\"","\"belowMin\"","\"aboveMax\"","\"format\"","\"valid\"","\"invalid\"","\"key\"","\"value\"","\"add\"","\"remove\"","\"create\"","\"valueMissing\"","\"selectMissing\"","\"checkMissing\"","\"radioMissing\"","\"fileMissing\"","\"tooShort\"","\"tooLong\"","\"rangeUnderflow\"","\"rangeOverflow\"","\"badInput\"","\"patternMismatch\"","\"emailMismatch\"","general_default$3","\"summary\"","\"item\"","\"itemFlagged\"","\"status\"","\"unanswered\"","\"answered\"","\"correct\"","\"wrong\"","\"skipped\"","\"legend\"","\"flagged\"","\"select\"","\"uploading\"","\"done\"","\"failed\"","\"tooMany\"","\"invalidType\"","\"tooLarge\"","inputs_default$3","\"previousMonth\"","\"nextMonth\"","\"today\"","\"weekdays\"","\"mon\"","\"tue\"","\"wed\"","\"thu\"","\"fri\"","\"sat\"","\"sun\"","\"dayWithEvents_one\"","\"dayWithEvents_other\"","\"eventsLabel\"","\"noEvents\"","\"previousWeek\"","\"nextWeek\"","\"dayWithMarkers_one\"","\"dayWithMarkers_other\"","\"dayMarked\"","layout_default$3","\"navigation\"","\"enableFloating\"","\"disableFloating\"","\"openNavigation\"","\"closeNavigation\"","\"skipToContent\"","mobile_default$3","\"cancel\"","\"confirm\"","\"selected\"","\"column\"","\"back\"","\"pulling\"","\"loosing\"","\"actions\"","\"title\"","\"titleTime\"","\"year\"","\"month\"","\"day\"","\"hour\"","\"minute\"","\"monthTitle\"","\"rangeStart\"","\"rangeEnd\"","\"counter\"","\"submit\"","\"reset\"","\"required\"","\"pageOf\"","\"finish\"","\"process\"","\"wait\"","\"minerva\"","\"editorial\"","\"compact\"","\"touch\"","overlays_default$3","\"delete\"","\"results\"","\"enter\"","theme_default$3","\"light\"","\"dark\"","\"system\"","\"tech\"","\"graphite\"","\"cool\"","isObject","mergeMessages","sources","source","messages$4","messages$3","messages$2","messages$1","DEFAULT_FALLBACK_LANGUAGE","hasOwn","object","hasPluralRules","fallbackPluralCategory","count","language","pluralRulesCache","getPluralRules","getPluralCategory","node","tree","readValue","path","PLACEHOLDER","interpolate","template","languageChain","chain","fallbackLanguage","translate","lng","messages","defaultValue","createTranslator","config","SUPPORTED_LANGUAGES","DEFAULT_LANGUAGE","isSupportedLanguage","TOKEN_PATTERN","n","formatTime","hours24","date","hours12","format","token","parseTimeInput","strict","numbers","period","numericTokens","twelveHour","hours","minutes","seconds","startOfToday","VALUE_PATTERN","parseTimeValue","toTimeValue","withSeconds","secondsOfDay","formatHasSeconds","resolveTimeFormat","showSecond","normalizeShortcuts","shortcut","matchesShortcut","event","has","names","normalizeSearchText","commandSearchText","item","MODIFIER_KEYS","matchesHotkey","hotkey","formatHotkey","keyToMove","vertical","orientation","horizontal","dir","pageSize","scan","isDisabled","getNextIndex","move","currentIndex","loop","createTypeahead","buffer","lastTime","now","timeout","items","startOffset","numericWidth","width","computeFixedColumnLayout","leftOffsets","rightOffsets","leftAcc","col","columns","rightAcc","lastLeftFixedKey","firstRightFixedKey","isEmpty","collator","compareTableValues","getColumnCompare","nextSortState","order","PAGINATION_JUMP_SIZE","rangeOf","getPageRange","windowSize","totalPages","getCompactPageItems","boundary","siblings","leftSibling","page","rightSibling","showStartGap","showEndGap","clusterSize","ANSWER_SHEET_STATUSES","answerSheetStatus","status","answerSheetSections","list","known","groups","buckets","sections","bucket","entry","answerSheetSummary","answerSheetLegend","present","answerSheetMoveIndex","sizes","section","total","size","cols","offset","column","lastRow","prevStart","rowStart","localDate","year","month","day","dayKey","addDays","days","monthStart","sameMonth","weekStart","firstDayOfWeek","STRICT_DAY_KEY","LOOSE_DAY_KEY","parseDayKey","inferStepPrecision","dot","clampNumber","formatNumberValue","precision","parseNumberDraft","trimmed","input","resolveSpace","resolveSize","DASHBOARD_COLORS","DASHBOARD_COLUMN_WIDTH","DASHBOARD_GAP","dashboardAccent","dashboardAccentValue","custom","dashboardCount","dashboardLength","dashboardFind","layout","cardKey","dashboardSlots","columnKey","dashboardCardMove","slots","to","isDashboardNoop","dashboardInsertIndex","midpoints","position","dashboardKeyboardTarget","ok","accept","direction","dashboardKeyAction","rtl","moveDashboardCard","lists","keyOf","card","KANBAN_COLORS","KANBAN_COLUMN_WIDTH","KANBAN_GAP","kanbanAccent","kanbanAccentValue","kanbanCount","kanbanLength","kanbanFind","kanbanSlots","kanbanCardMove","isKanbanNoop","kanbanInsertIndex","kanbanKeyboardTarget","kanbanKeyAction","moveKanbanCard","getVirtualRange","itemHeight","extra","overscan","scrollTop","visibleCount","itemCount","matchesAccept","rule","file","type","DEFAULT_TAG_SEPARATORS","splitBySeparators","separators","pattern","sep","findCascaderPath","level","o","flattenCascaderOptions","option","roundRating","ratingDisplayStars","stars5","fullCount","fraction","half","ratingStarFill","displayed","DEFAULT_PLAYBACK_RATES","DEFAULT_SKIP_SECONDS","MEDIA_KEY_SEEK_STEP","MEDIA_KEY_VOLUME_STEP","AUDIO_EXTENSIONS","inferMediaType","mime","mimeType","src","ext","finite","formatMediaTime","secs","ss","clampMediaTime","mediaProgress","currentTime","clampVolume","volume","nextPlaybackRate","rates","formatPlaybackRate","rate","bufferedEnd","ranges","stop","MEDIA_ICON_PATHS","mediaKeyAction","modifiers","TIMING","parseCueTime","ENTITIES","cueText","code","line","parseBlocks","cues","lines","head","timing","content","parseVtt","parseSrt","parseCaptions","activeCueText","time","cue","isSrtSource","BASE64","decodeBase64","clean","bits","byte","decodeDataUrl","meta","loadCaptions","fetchText","MEDIA_CAPTIONS_STORAGE_KEY","captionsPreference","track","lang","pickCaptionsTrack","tracks","preference","wanted","readCaptionsPreference","storage","writeCaptionsPreference","toggledCaptionsTrack","previous","SLIDER_MAX_STEP_MARKS","sliderPrecision","exp","clampSliderValue","getSliderMarks","marks","closestMark","best","snapSliderValue","clamped","snapToMarks","snapped","sliderPercent","sliderRatioAt","ratio","reversed","sliderValueFromRatio","getSliderKeyValue","up","down","pageUp","pageDown","jump","unit","normalizeSliderValue","fix","range","sliderValues","setSliderThumb","closestSliderThumb","sliderValuesEqual","isSliderMarkActive","mark","append","cn","inputs","highlightTokenTypes","supportedCodeLanguages","SAMPLE_CHARS","SAMPLE_LINES","LINE_CHARS","THRESHOLD","CSS_TAGS","LINE_RULES","isProse","JSON_LINE","YAML_KEY_VALUE","YAML_KEY","YAML_ITEM","YAML_DOCUMENT","ORDER","sample","whole","cut","marker","detectCodeLanguage","decided","score","hits","nonBlank","jsonLines","yamlLines","yamlKeys","yamlItems","yamlDocuments","yamlNested","yamlParent","plus","minus","hunkLike","prose","cap","candidates","typed","bestScore","MAX_LENGTH","MAX_DEPTH","PUNCT","FN","PROP","STR","KW","VAR","NUM","CMT","OP","BUILTIN","ALIASES","normalizeCodeLanguage","codeLanguageLabel","splitHighlightLines","highlightCode","grammars","lex","stack","inner","last","solid","nl","grammar","pos","when","words","after","atLine","afterBlank","isPascal","word","closeBrace","ch","embed","close","exprStart","quoted","eq","blank","tag","h","attrs","js","json","html","bash","python","yaml","sql","diff","markdown","ts","keywords","globals","w","inBlock","variable","command","builtins","types","lower","e","indent","CODE_MARK_COLORS","CODE_MARK_DEFAULT_BACKGROUND","CODE_MARK_TINT","isHigh","isLow","clampCodeRange","applyCodeMarks","bounds","top","find","runs","interval","piece","splitCodeMarkLines","run","codeMarkBackground","resolveCodeMarkBackground","colors","shallowEqual","keysA","keysB","createStore","state","initial","defaultScheduler","callback","ms","handle","applyControlled","props","createMachine","definition","initialProps","normalize","store","project","partial","send","reduced","changedKey","settle","isDisclosurePresent","createDisclosureMachine","animated","phase","requested","engineScheduler","TOAST_DEFAULT_DURATION","TOAST_DEFAULT_EXIT_DURATION","getToastOverflow","toasts","createToastQueue","isClient","scheduler","defaultDuration","exitDuration","lifecycle","timers","idCounter","setToasts","notify","clearTimer","timer","id","schedule","dismiss","add","loading","updated","update","loadingChanged","previousDefault","closing","dismissAll","pause","resume","reset","isSelected","sameValues","createSelectionMachine","reduceValue","multiple","disabled","allowEmpty","locked","select","deselect","getTabsNavigationIndex","tabs","getTabsTabStop","tab","isTabDisabled","explicit","createTabsMachine","firstEnabled","getPickerColumns","getPickerSelectedOptions","resolve","samePath","createPickerMachine","choose","moved","selected","isEmptyFieldValue","lengthOf","EMAIL_RE","fieldValidators","flags","re","englishTranslator","toFieldError","isFieldInvalid","createFieldMachine","runSync","errors","validate","pending","machine","validateOn","dirty","inFlight","startAsync","results","getTotalPages","getPaginationVisibleRange","shown","canGoToPage","getPaginationKeyTarget","getPaginationItems","edge","hideEdges","pageItem","siblingCount","boundaryCount","compact","createPaginationMachine","goTo","RATING_STAR_COUNT","PAGE_STARS","getRatingKeyValue","allowHalf","pageStep","getRatingPickValue","getRatingDisplayStars","getRatingStarFills","createRatingMachine","setValue","stars","precisionOf","normalizeStepperValue","getNumberStepperText","canIncrementStepper","canDecrementStepper","createNumberStepperMachine","set","delta","parsed","rounded","getCheckboxAriaChecked","createCheckboxMachine","checked","createSwitchMachine","getRadioGroupTabStop","createRadioGroupMachine","isItemDisabled"],"sources":["../../../core/src/id.ts","../../../core/src/controllable.ts","../../../core/src/dev-message.ts","../../../core/src/url.ts","../../../core/src/theme/mode.ts","../../../core/src/theme/design.ts","../../../core/src/tokens/expr.ts","../../../core/src/tokens/code.ts","../../../core/src/tokens/design.ts","../../../core/src/tokens/default-theme.ts","../../../core/src/theme/themes.ts","../../../core/src/theme/palettes.ts","../../../core/src/theme/palette-accents.ts","../../../core/src/tokens/scales.ts","../../../core/src/tokens/accessibility.ts","../../../core/src/tokens/color.ts","../../../core/src/tokens/brand.ts","../../../core/src/tokens/values.ts","../../../core/src/tokens/resolve.ts","../../../core/src/tokens/css.ts","../../../core/src/tokens/mini.ts","../../../core/src/i18n/locales/en/index.json","../../../core/src/i18n/locales/en/groups/data.json","../../../core/src/i18n/locales/en/groups/display.json","../../../core/src/i18n/locales/en/groups/feedback.json","../../../core/src/i18n/locales/en/groups/forms.json","../../../core/src/i18n/locales/en/groups/general.json","../../../core/src/i18n/locales/en/groups/inputs.json","../../../core/src/i18n/locales/en/groups/layout.json","../../../core/src/i18n/locales/en/groups/mobile.json","../../../core/src/i18n/locales/en/groups/overlays.json","../../../core/src/i18n/locales/en/groups/theme.json","../../../core/src/i18n/merge.ts","../../../core/src/i18n/locales/en/index.ts","../../../core/src/i18n/locales/fr/index.json","../../../core/src/i18n/locales/fr/groups/data.json","../../../core/src/i18n/locales/fr/groups/display.json","../../../core/src/i18n/locales/fr/groups/feedback.json","../../../core/src/i18n/locales/fr/groups/forms.json","../../../core/src/i18n/locales/fr/groups/general.json","../../../core/src/i18n/locales/fr/groups/inputs.json","../../../core/src/i18n/locales/fr/groups/layout.json","../../../core/src/i18n/locales/fr/groups/mobile.json","../../../core/src/i18n/locales/fr/groups/overlays.json","../../../core/src/i18n/locales/fr/groups/theme.json","../../../core/src/i18n/locales/fr/index.ts","../../../core/src/i18n/locales/ja/index.json","../../../core/src/i18n/locales/ja/groups/data.json","../../../core/src/i18n/locales/ja/groups/display.json","../../../core/src/i18n/locales/ja/groups/feedback.json","../../../core/src/i18n/locales/ja/groups/forms.json","../../../core/src/i18n/locales/ja/groups/general.json","../../../core/src/i18n/locales/ja/groups/inputs.json","../../../core/src/i18n/locales/ja/groups/layout.json","../../../core/src/i18n/locales/ja/groups/mobile.json","../../../core/src/i18n/locales/ja/groups/overlays.json","../../../core/src/i18n/locales/ja/groups/theme.json","../../../core/src/i18n/locales/ja/index.ts","../../../core/src/i18n/locales/zh/index.json","../../../core/src/i18n/locales/zh/groups/data.json","../../../core/src/i18n/locales/zh/groups/display.json","../../../core/src/i18n/locales/zh/groups/feedback.json","../../../core/src/i18n/locales/zh/groups/forms.json","../../../core/src/i18n/locales/zh/groups/general.json","../../../core/src/i18n/locales/zh/groups/inputs.json","../../../core/src/i18n/locales/zh/groups/layout.json","../../../core/src/i18n/locales/zh/groups/mobile.json","../../../core/src/i18n/locales/zh/groups/overlays.json","../../../core/src/i18n/locales/zh/groups/theme.json","../../../core/src/i18n/locales/zh/index.ts","../../../core/src/i18n/translate.ts","../../../core/src/i18n/index.ts","../../../core/src/time.ts","../../../core/src/shortcuts.ts","../../../core/src/keyboard-navigation.ts","../../../core/src/typeahead.ts","../../../core/src/fixed-columns.ts","../../../core/src/table-sort.ts","../../../core/src/pagination.ts","../../../core/src/answer-sheet.ts","../../../core/src/calendar-date.ts","../../../core/src/number-input.ts","../../../core/src/spacing.ts","../../../core/src/dashboard-columns.ts","../../../core/src/virtual-range.ts","../../../core/src/file-accept.ts","../../../core/src/tag-separators.ts","../../../core/src/cascader-options.ts","../../../core/src/rating.ts","../../../core/src/media-player.ts","../../../core/src/media-captions.ts","../../../core/src/slider.ts","../../../core/src/cn.ts","../../../core/src/highlight/types.ts","../../../core/src/highlight/detect.ts","../../../core/src/highlight/highlight.ts","../../../core/src/highlight/marks.ts","../../../core/src/machines/store.ts","../../../core/src/machines/disclosure.ts","../../../core/src/machines/toast.ts","../../../core/src/machines/selection.ts","../../../core/src/machines/tabs.ts","../../../core/src/machines/picker.ts","../../../core/src/machines/field.ts","../../../core/src/machines/pagination.ts","../../../core/src/machines/rating.ts","../../../core/src/machines/number-stepper.ts","../../../core/src/machines/toggle.ts"],"sourcesContent":["let counter = 0;\n\n/**\n * Returns a new id that is unique for the lifetime of the page:\n * `\"<prefix>-<n>\"` with a monotonically increasing `n`.\n *\n * Intended for non-React consumers (vanilla JS, Web Components). React\n * adapters should prefer `React.useId()`, which is stable across server and\n * client renders; a module counter like this one is not SSR-hydration safe.\n *\n * @param prefix - Id prefix. @default \"minerva\"\n * @example\n * createId(); // \"minerva-1\"\n * createId(\"menu\"); // \"menu-2\"\n */\nexport function createId(prefix = \"minerva\"): string {\n counter += 1;\n return `${prefix}-${counter}`;\n}\n","/** A new value, or an updater receiving the current value. */\nexport type SetStateAction<T> = T | ((prev: T) => T);\n\nexport interface ControllableStateOptions<T> {\n /**\n * Controlled value. When not `undefined` the state is controlled: `set()`\n * only notifies `onChange` and the owner is expected to feed the new value\n * back through `setControlledValue()`.\n */\n value?: T;\n /** Initial value used while uncontrolled. */\n defaultValue: T;\n /** Called once per actual change (not when setting an equal value). */\n onChange?: (value: T) => void;\n /** Equality check used to skip no-op updates. @default Object.is */\n equals?: (a: T, b: T) => boolean;\n}\n\nexport interface ControllableState<T> {\n /** Current value (controlled value if controlled, else the stored one). */\n get(): T;\n /** Requests a change; fires `onChange` once if the value differs. */\n set(next: SetStateAction<T>): void;\n /**\n * Updates the controlled value (pass `undefined` to switch to uncontrolled\n * mode; the last controlled value then becomes the stored value).\n * Does NOT call `onChange` (the owner already knows), but notifies\n * subscribers when the visible value changes.\n */\n setControlledValue(value: T | undefined): void;\n /** Whether the state is currently controlled. */\n isControlled(): boolean;\n /**\n * Subscribes to visible value changes. Returns an unsubscribe function.\n * In controlled mode subscribers only fire on `setControlledValue`.\n */\n subscribe(listener: (value: T) => void): () => void;\n}\n\n/**\n * Framework-neutral \"controlled / uncontrolled\" state, the vanilla\n * equivalent of a `useControllableState` hook.\n *\n * - Uncontrolled: `set()` stores the value, notifies subscribers and calls\n * `onChange`.\n * - Controlled (`value !== undefined`): `set()` never stores, it only calls\n * `onChange` with the requested value; the owner decides whether to accept\n * it via `setControlledValue()`.\n *\n * @example\n * const open = createControllableState({ defaultValue: false, onChange: console.log });\n * open.set((v) => !v); // logs `true`\n */\nexport function createControllableState<T>(\n options: ControllableStateOptions<T>,\n): ControllableState<T> {\n const { onChange, equals = Object.is } = options;\n let controlled: T | undefined = options.value;\n let stored: T = options.defaultValue;\n const listeners = new Set<(value: T) => void>();\n\n const isControlled = () => controlled !== undefined;\n const get = (): T => (isControlled() ? (controlled as T) : stored);\n const emit = (value: T) => {\n for (const listener of [...listeners]) listener(value);\n };\n\n return {\n get,\n isControlled,\n set(next) {\n const prev = get();\n const value =\n typeof next === \"function\" ? (next as (prev: T) => T)(prev) : next;\n if (equals(prev, value)) return;\n if (!isControlled()) {\n stored = value;\n emit(value);\n }\n onChange?.(value);\n },\n setControlledValue(value) {\n const prev = get();\n if (value === undefined && controlled !== undefined) {\n // keep showing the last controlled value once uncontrolled\n stored = controlled;\n }\n controlled = value;\n const current = get();\n if (!equals(prev, current)) emit(current);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","/**\n * Shared format of the development-only diagnostics of every Minerva\n * library (`minerva-design` and `minerva-design/web-components`).\n *\n * Both libraries log them with `console.error` (React's convention for prop\n * warnings such as controlled / uncontrolled switches), once per message, as\n * `[minerva] <subject>: <message>` where `subject` is the React component\n * name (`Tabs`) or the custom element tag (`<minerva-tabs>`).\n */\n\n/** Prefix of every Minerva development message. */\nexport const DEV_MESSAGE_PREFIX = \"[minerva]\";\n\n/** `[minerva] <subject>: <message>` */\nexport function formatDevMessage(subject: string, message: string): string {\n return `${DEV_MESSAGE_PREFIX} ${subject}: ${message}`;\n}\n","/**\n * URL safety for links built from caller data (NavTree items, TextLink /\n * Card `href`...). React 19 already neutralises `javascript:` URLs in `href`,\n * Lit does not: both libraries run link URLs through `sanitizeUrl` so a\n * `javascript:` (or `vbscript:`) link never reaches the DOM.\n */\n\n/**\n * Schemes that run script in the page when a link is followed. Relative URLs,\n * fragments and every other scheme (`https:`, `mailto:`, `tel:`, `blob:`,\n * custom app schemes...) are allowed; `data:` stays allowed for `download`\n * links (browsers refuse top-level navigation to `data:` documents).\n */\nconst UNSAFE_SCHEMES = new Set([\"javascript\", \"vbscript\"]);\n\n/**\n * Browsers ignore leading / trailing C0 controls and spaces and strip tabs\n * and line breaks anywhere in a URL (`java\\tscript:` is `javascript:`), so the\n * scheme is read the same way before it is checked.\n */\n// eslint-disable-next-line no-control-regex -- matching control characters is the point\nconst IGNORED = /[\\x00-\\x20\\x7f]/g;\n\n/** Whether following `url` as a link is safe (no script-running scheme). */\nexport function isSafeUrl(url: string): boolean {\n const normalized = url.replace(IGNORED, \"\");\n const scheme = /^([a-z][a-z\\d+.-]*):/i.exec(normalized);\n return !scheme || !UNSAFE_SCHEMES.has(scheme[1].toLowerCase());\n}\n\n/**\n * `url` when it is safe to put in an `href`, otherwise `undefined` (the link\n * renders without a destination). `null` / `undefined` pass through as\n * `undefined`.\n */\nexport function sanitizeUrl(\n url: string | null | undefined,\n): string | undefined {\n if (url == null) return undefined;\n return isSafeUrl(url) ? url : undefined;\n}\n\n/**\n * `rel` of a link: the caller's value, or `\"noopener noreferrer\"` when the\n * link opens a new browsing context (`target=\"_blank\"`) without one.\n */\nexport function linkRel(\n target: string | null | undefined,\n rel: string | null | undefined,\n): string | undefined {\n if (rel != null) return rel;\n return target?.toLowerCase() === \"_blank\" ? \"noopener noreferrer\" : undefined;\n}\n","// Theme mode and palette names: the two orthogonal axes of the theme model,\n// shared by every renderer (web, React Native, mini-programs). Pure data and\n// guards; the web-only cookie helpers and no-flash init script live in\n// `@minerva/dom` (theme/cookies.ts).\n\n/** Color mode chosen by the user (\"system\" follows the OS). */\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** Color mode actually applied. */\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\n/** Built-in palettes (orthogonal to the light / dark mode). */\nexport const PALETTES = [\"editorial\", \"tech\", \"graphite\", \"cool\"] as const;\n\n/** A built-in palette name. */\nexport type Palette = (typeof PALETTES)[number];\n\nexport const isThemeMode = (value: unknown): value is ThemeMode =>\n value === \"light\" || value === \"dark\" || value === \"system\";\n\nexport const isPalette = (value: unknown): value is Palette =>\n typeof value === \"string\" && (PALETTES as readonly string[]).includes(value);\n","/**\n * Design axes: app-wide look switches, orthogonal to the color mode and the\n * palette. Each axis maps to a data attribute selecting a token block of\n * `tokens.css` (token data: `../tokens/design.ts`):\n *\n * density data-density control heights / paddings, row paddings,\n * minimum touch target (--touch-target-min)\n * radius data-radius --radius-sm ... --radius-2xl\n * shadow data-shadow --shadow-sm ... --shadow-xl\n * fontScale data-font-scale --font-size-* and line heights\n *\n * A preset is a named combination of the four axes plus a default palette;\n * explicit axes override the preset.\n *\n * Server-safe: no framework import, no DOM access at load time.\n */\nimport type { Palette } from \"./mode\";\n\nexport const DENSITIES = [\"compact\", \"standard\", \"comfortable\"] as const;\n/** Spacing density of controls and rows. */\nexport type Density = (typeof DENSITIES)[number];\n\nexport const RADIUS_SCALES = [\"none\", \"small\", \"medium\", \"large\"] as const;\n/** Corner radius scale. */\nexport type RadiusScale = (typeof RADIUS_SCALES)[number];\n\nexport const SHADOW_SCALES = [\"none\", \"subtle\", \"standard\"] as const;\n/** Elevation shadow scale (\"standard\" keeps the theme / palette shadows). */\nexport type ShadowScale = (typeof SHADOW_SCALES)[number];\n\nexport const FONT_SCALES = [\"small\", \"standard\", \"large\"] as const;\n/** Type scale (\"large\" is reading-oriented). */\nexport type FontScale = (typeof FONT_SCALES)[number];\n\nexport const DESIGN_PRESETS = [\n \"minerva\",\n \"editorial\",\n \"compact\",\n \"touch\",\n] as const;\n/** A built-in design preset. */\nexport type DesignPreset = (typeof DESIGN_PRESETS)[number];\n\n/** Design axes chosen by the app; unset axes come from the preset. */\nexport interface DesignOptions {\n /**\n * Named combination of the axes below and a default palette:\n * \"minerva\" (default look), \"editorial\" (restrained, reading-oriented),\n * \"compact\" (dense, data-heavy screens) or \"touch\" (consumer mobile apps:\n * comfortable density with 44px touch targets, large radius)\n * @default \"minerva\"\n */\n preset?: DesignPreset;\n /** Spacing density of controls and rows */\n density?: Density;\n /** Corner radius scale */\n radius?: RadiusScale;\n /** Elevation shadow scale */\n shadow?: ShadowScale;\n /** Type scale */\n fontScale?: FontScale;\n}\n\n/** Fully resolved design axes. */\nexport interface ResolvedDesign {\n preset: DesignPreset;\n density: Density;\n radius: RadiusScale;\n shadow: ShadowScale;\n fontScale: FontScale;\n}\n\n/** Axis values and default palette of a preset. */\nexport interface DesignPresetDefinition {\n density: Density;\n radius: RadiusScale;\n shadow: ShadowScale;\n fontScale: FontScale;\n /** Palette used when the app does not choose one (`null` = default look) */\n palette: Palette | null;\n}\n\nexport const designPresets: Record<DesignPreset, DesignPresetDefinition> = {\n minerva: {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n palette: null,\n },\n editorial: {\n density: \"comfortable\",\n radius: \"small\",\n shadow: \"subtle\",\n fontScale: \"large\",\n palette: \"editorial\",\n },\n compact: {\n density: \"compact\",\n radius: \"small\",\n shadow: \"standard\",\n fontScale: \"small\",\n palette: null,\n },\n // Consumer (toC) mobile apps: larger controls and rows, 44px minimum touch\n // targets (`--touch-target-min`, Apple HIG / WCAG 2.5.5), rounder corners\n touch: {\n density: \"comfortable\",\n radius: \"large\",\n shadow: \"standard\",\n fontScale: \"standard\",\n palette: null,\n },\n};\n\nconst includes = <T extends string>(\n values: readonly T[],\n value: unknown,\n): value is T =>\n typeof value === \"string\" && (values as readonly string[]).includes(value);\n\nexport const isDensity = (value: unknown): value is Density =>\n includes(DENSITIES, value);\nexport const isRadiusScale = (value: unknown): value is RadiusScale =>\n includes(RADIUS_SCALES, value);\nexport const isShadowScale = (value: unknown): value is ShadowScale =>\n includes(SHADOW_SCALES, value);\nexport const isFontScale = (value: unknown): value is FontScale =>\n includes(FONT_SCALES, value);\nexport const isDesignPreset = (value: unknown): value is DesignPreset =>\n includes(DESIGN_PRESETS, value);\n\n/**\n * Resolves the four axes: explicit (valid) values win, the others come from\n * the preset (default \"minerva\"). Invalid values are ignored.\n */\nexport function resolveDesign(\n options: DesignOptions = {},\n base?: ResolvedDesign,\n): ResolvedDesign {\n const preset = isDesignPreset(options.preset)\n ? options.preset\n : (base?.preset ?? \"minerva\");\n // A new preset resets the axes; otherwise unset axes follow `base`\n const from =\n base && !isDesignPreset(options.preset) ? base : designPresets[preset];\n return {\n preset,\n density: isDensity(options.density) ? options.density : from.density,\n radius: isRadiusScale(options.radius) ? options.radius : from.radius,\n shadow: isShadowScale(options.shadow) ? options.shadow : from.shadow,\n fontScale: isFontScale(options.fontScale)\n ? options.fontScale\n : from.fontScale,\n };\n}\n\n/** Default palette of a preset (`null` = Minerva's default look). */\nexport const presetPalette = (preset: DesignPreset | undefined) =>\n isDesignPreset(preset) ? designPresets[preset].palette : null;\n\n/** Data attribute of each axis. */\nexport const DESIGN_ATTRIBUTES = {\n density: \"data-density\",\n radius: \"data-radius\",\n shadow: \"data-shadow\",\n fontScale: \"data-font-scale\",\n} as const satisfies Record<Exclude<keyof ResolvedDesign, \"preset\">, string>;\n\n/** Value of each axis that matches the `:root` tokens (no attribute needed). */\nconst STANDARD = {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n} as const;\n\n/**\n * Data attributes for a design, e.g. to spread on `<html>` in a server\n * rendered root layout so the first paint has the right look:\n *\n * <html {...designAttributes({ preset: \"editorial\" })}>\n *\n * Standard values are omitted unless `all` is set (a nested scope must be\n * able to switch back to \"standard\").\n */\nexport function designAttributes(\n options: DesignOptions | ResolvedDesign = {},\n { all = false }: { all?: boolean } = {},\n): Record<string, string> {\n const design = resolveDesign(options);\n const attributes: Record<string, string> = {};\n for (const axis of Object.keys(DESIGN_ATTRIBUTES) as Array<\n keyof typeof DESIGN_ATTRIBUTES\n >) {\n if (all || design[axis] !== STANDARD[axis]) {\n attributes[DESIGN_ATTRIBUTES[axis]] = design[axis];\n }\n }\n return attributes;\n}\n","// Token values as data. A token is either a plain CSS value (string / number)\n// or a small formula object (a `var()` reference, an sRGB `color-mix()`, a\n// length, a shadow list, a transition...). Formulas serialize to exactly the\n// CSS text of `tokens.css` (`toCss`) and are evaluated by `resolveTokens` for\n// platforms without CSS variables / color-mix() (React Native, mini-programs).\n//\n// Platform-neutral: pure data and string building.\n\n/** `var(--name)`: the value of another token. */\nexport interface TokenRef {\n kind: \"ref\";\n /** Token name without the leading `--` */\n name: string;\n}\n\n/** `color-mix(in srgb, a p%, b)` */\nexport interface TokenMix {\n kind: \"mix\";\n a: TokenValue;\n /** Percentage of `a` (0-100); `b` gets the rest */\n amount: number;\n b: TokenValue;\n}\n\n/** A length: `0` (unitless zero), `<n>px` or `<n>rem`. */\nexport interface TokenLength {\n kind: \"length\";\n value: number;\n unit: \"px\" | \"rem\";\n}\n\n/** `clamp(min, <n>vw, max)`: a viewport-relative fluid length. */\nexport interface TokenClamp {\n kind: \"clamp\";\n min: TokenLength;\n /** Preferred value, in `vw` */\n vw: number;\n max: TokenLength;\n}\n\n/** One layer of a `box-shadow`. */\nexport interface TokenShadowLayer {\n x: number;\n y: number;\n blur: number;\n /** Written only when set (`0 1px 2px 0 <color>` vs `0 1px 2px <color>`) */\n spread?: number;\n color: TokenValue;\n}\n\n/** A `box-shadow` value (`none` when there is no layer). */\nexport interface TokenShadow {\n kind: \"shadow\";\n layers: TokenShadowLayer[];\n}\n\n/** `<duration>ms <easing>` */\nexport interface TokenTransition {\n kind: \"transition\";\n /** Milliseconds */\n duration: number;\n easing: string;\n}\n\n/** `cubic-bezier(x1, y1, x2, y2)` */\nexport interface TokenCubicBezier {\n kind: \"cubic-bezier\";\n points: readonly [number, number, number, number];\n}\n\n/** A token formula (data, not an opaque string). */\nexport type TokenFormula =\n | TokenRef\n | TokenMix\n | TokenLength\n | TokenClamp\n | TokenShadow\n | TokenTransition\n | TokenCubicBezier;\n\n/** A token value: plain CSS text, a number or a formula. */\nexport type TokenValue = string | number | TokenFormula;\n\n/** An ordered block of token declarations (`name` without `--`). */\nexport type TokenBlock = Readonly<Record<string, TokenValue>>;\n\n// ---- Constructors ----\n// Pure (`__NO_SIDE_EFFECTS__`): the token tables built with them at module\n// level are dropped by bundlers when unused.\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const ref = (name: string): TokenRef => ({ kind: \"ref\", name });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const mix = (\n a: TokenValue,\n amount: number,\n b: TokenValue,\n): TokenMix => ({\n kind: \"mix\",\n a,\n amount,\n b,\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const rem = (value: number): TokenLength => ({\n kind: \"length\",\n value,\n unit: \"rem\",\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const px = (value: number): TokenLength => ({\n kind: \"length\",\n value,\n unit: \"px\",\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const clamp = (\n min: TokenLength,\n vw: number,\n max: TokenLength,\n): TokenClamp => ({ kind: \"clamp\", min, vw, max });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const shadow = (...layers: TokenShadowLayer[]): TokenShadow => ({\n kind: \"shadow\",\n layers,\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const transition = (\n duration: number,\n easing: string,\n): TokenTransition => ({ kind: \"transition\", duration, easing });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const cubicBezier = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): TokenCubicBezier => ({ kind: \"cubic-bezier\", points: [x1, y1, x2, y2] });\n\n/**\n * Merges token blocks in order (later blocks win). Pure, unlike a module-level\n * object spread, which bundlers must keep (it could run getters).\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function mergeBlocks<T extends object>(...blocks: T[]): T {\n return Object.assign({}, ...blocks);\n}\n\n// ---- Serialization ----\n\nconst lengthCss = (value: number) => (value === 0 ? \"0\" : `${value}px`);\n\n/** CSS text of a token value, exactly as written in `tokens.css`. */\n/*#__NO_SIDE_EFFECTS__*/\nexport function toCss(value: TokenValue): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n switch (value.kind) {\n case \"ref\":\n return `var(--${value.name})`;\n case \"mix\":\n return `color-mix(in srgb, ${toCss(value.a)} ${value.amount}%, ${toCss(value.b)})`;\n case \"length\":\n return value.value === 0 ? \"0\" : `${value.value}${value.unit}`;\n case \"clamp\":\n return `clamp(${toCss(value.min)}, ${value.vw}vw, ${toCss(value.max)})`;\n case \"shadow\":\n return value.layers.length === 0\n ? \"none\"\n : value.layers\n .map((layer) =>\n [\n lengthCss(layer.x),\n lengthCss(layer.y),\n lengthCss(layer.blur),\n ...(layer.spread === undefined\n ? []\n : [lengthCss(layer.spread)]),\n toCss(layer.color),\n ].join(\" \"),\n )\n .join(\", \");\n case \"transition\":\n return `${value.duration}ms ${value.easing}`;\n case \"cubic-bezier\":\n return `cubic-bezier(${value.points.join(\", \")})`;\n }\n}\n","// Syntax highlighting colors of the code blocks: `--code-token-<type>-color`\n// for every token type of `highlightCode` (../highlight). GitHub-like\n// palettes: the light values are declared with the default theme (every\n// palette's light mode), the dark values for `[data-theme=dark]` (every\n// palette's dark mode; `resolveTokens({ mode: \"dark\" })` for React Native and\n// the mini-programs). Both keep a contrast of at least 4.5:1 on the code\n// block background (`--control-color`) of every palette (tokens test).\nimport type { HighlightTokenType } from \"../highlight/types\";\nimport { ref, type TokenBlock, type TokenValue } from \"./expr\";\n\ntype CodeTokens = Record<`code-token-${HighlightTokenType}-color`, TokenValue>;\n\nconst text = ref(\"text-color\");\n\n/** Light mode syntax colors (GitHub light). */\nexport const codeTokensLight = {\n \"code-token-comment-color\": \"#59636e\",\n \"code-token-keyword-color\": \"#b62324\",\n \"code-token-string-color\": \"#0a3069\",\n \"code-token-number-color\": \"#0550ae\",\n \"code-token-boolean-color\": \"#0550ae\",\n \"code-token-null-color\": \"#0550ae\",\n \"code-token-property-color\": \"#0550ae\",\n \"code-token-function-color\": \"#6639ba\",\n \"code-token-tag-color\": \"#116329\",\n \"code-token-attr-name-color\": \"#0550ae\",\n \"code-token-attr-value-color\": \"#0a3069\",\n \"code-token-punctuation-color\": text,\n \"code-token-operator-color\": \"#b62324\",\n \"code-token-regex-color\": \"#116329\",\n \"code-token-variable-color\": \"#953800\",\n \"code-token-builtin-color\": \"#953800\",\n \"code-token-inserted-color\": \"#116329\",\n \"code-token-deleted-color\": \"#82071e\",\n \"code-token-heading-color\": \"#0550ae\",\n} as const satisfies CodeTokens & TokenBlock;\n\n/** Dark mode syntax colors (GitHub dark). */\nexport const codeTokensDark = {\n \"code-token-comment-color\": \"#9ea6b0\",\n \"code-token-keyword-color\": \"#ff7b72\",\n \"code-token-string-color\": \"#a5d6ff\",\n \"code-token-number-color\": \"#79c0ff\",\n \"code-token-boolean-color\": \"#79c0ff\",\n \"code-token-null-color\": \"#79c0ff\",\n \"code-token-property-color\": \"#79c0ff\",\n \"code-token-function-color\": \"#d2a8ff\",\n \"code-token-tag-color\": \"#7ee787\",\n \"code-token-attr-name-color\": \"#79c0ff\",\n \"code-token-attr-value-color\": \"#a5d6ff\",\n \"code-token-punctuation-color\": text,\n \"code-token-operator-color\": \"#ff7b72\",\n \"code-token-regex-color\": \"#7ee787\",\n \"code-token-variable-color\": \"#ffa657\",\n \"code-token-builtin-color\": \"#ffa657\",\n \"code-token-inserted-color\": \"#7ee787\",\n \"code-token-deleted-color\": \"#ffa198\",\n \"code-token-heading-color\": \"#79c0ff\",\n} as const satisfies CodeTokens & TokenBlock;\n","// Design axes token blocks: the values selected by `data-density`,\n// `data-radius`, `data-shadow` and `data-font-scale` (see ../theme/design.ts\n// for the axes and presets). The `:root` scales use the \"standard\" /\n// \"medium\" values.\nimport type {\n Density,\n FontScale,\n RadiusScale,\n ShadowScale,\n} from \"../theme/design\";\nimport {\n mergeBlocks,\n mix,\n px,\n ref,\n rem,\n shadow,\n type TokenBlock,\n} from \"./expr\";\n\n/*#__NO_SIDE_EFFECTS__*/\nconst space = (step: string) => ref(`space-${step}`);\n\n/** \"standard\" density (also the `:root` values) */\nexport const standardDensity = {\n \"control-height-xs\": rem(1.5),\n \"control-height-sm\": rem(2),\n \"control-height-md\": rem(2.5),\n \"control-height-lg\": rem(3),\n \"control-height-xl\": rem(3.5),\n \"control-padding-x-xs\": space(\"2\"),\n \"control-padding-x-sm\": space(\"3\"),\n \"control-padding-x-md\": space(\"4\"),\n \"control-padding-x-lg\": space(\"5\"),\n \"control-padding-x-xl\": space(\"6\"),\n \"row-padding-y\": space(\"2\"),\n \"row-padding-x\": space(\"3\"),\n \"touch-target-min\": px(32),\n} as const satisfies TokenBlock;\n\n/**\n * \"medium\" radius scale, in the two halves `tokens.css` declares on `:root`:\n * sm / md / lg with the theme tokens, xl / 2xl with the scales.\n */\nexport const mediumRadiusTheme = {\n \"radius-sm\": px(4),\n \"radius-md\": px(6),\n \"radius-lg\": px(8),\n} as const satisfies TokenBlock;\nexport const mediumRadiusScale = {\n \"radius-xl\": px(12),\n \"radius-2xl\": px(16),\n} as const satisfies TokenBlock;\n\n/** \"standard\" font sizes (also the `:root` values) */\nexport const standardFontSizes = {\n \"font-size-xs\": rem(0.75),\n \"font-size-sm\": rem(0.8125),\n \"font-size-md\": rem(0.875),\n \"font-size-lg\": rem(1),\n \"font-size-xl\": rem(1.125),\n \"font-size-2xl\": rem(1.375),\n \"font-size-3xl\": rem(1.75),\n \"font-size-4xl\": rem(2.25),\n \"font-size-5xl\": rem(3),\n \"font-size-6xl\": rem(3.75),\n} as const satisfies TokenBlock;\n\n/** Density: control heights / paddings, row paddings, touch target. */\nexport const densityTokens: Record<Density, TokenBlock> = {\n standard: standardDensity,\n compact: {\n \"control-height-xs\": rem(1.25),\n \"control-height-sm\": rem(1.75),\n \"control-height-md\": rem(2),\n \"control-height-lg\": rem(2.5),\n \"control-height-xl\": rem(3),\n \"control-padding-x-xs\": space(\"1-5\"),\n \"control-padding-x-sm\": space(\"2\"),\n \"control-padding-x-md\": space(\"3\"),\n \"control-padding-x-lg\": space(\"4\"),\n \"control-padding-x-xl\": space(\"5\"),\n \"row-padding-y\": space(\"1\"),\n \"row-padding-x\": space(\"2\"),\n // WCAG 2.2 target size (minimum), 2.5.8\n \"touch-target-min\": px(24),\n },\n comfortable: {\n \"control-height-xs\": rem(1.75),\n \"control-height-sm\": rem(2.25),\n \"control-height-md\": rem(2.75),\n \"control-height-lg\": rem(3.25),\n \"control-height-xl\": rem(3.75),\n \"control-padding-x-xs\": space(\"2-5\"),\n \"control-padding-x-sm\": space(\"3\"),\n \"control-padding-x-md\": space(\"5\"),\n \"control-padding-x-lg\": space(\"6\"),\n \"control-padding-x-xl\": space(\"7\"),\n \"row-padding-y\": space(\"3\"),\n \"row-padding-x\": space(\"4\"),\n // Apple HIG / WCAG 2.5.5 target size (enhanced): the `touch` preset\n \"touch-target-min\": px(44),\n },\n};\n\n/** Corner radius scale. */\nexport const radiusTokens: Record<RadiusScale, TokenBlock> = {\n none: {\n \"radius-sm\": px(0),\n \"radius-md\": px(0),\n \"radius-lg\": px(0),\n \"radius-xl\": px(0),\n \"radius-2xl\": px(0),\n },\n small: {\n \"radius-sm\": px(2),\n \"radius-md\": px(3),\n \"radius-lg\": px(4),\n \"radius-xl\": px(6),\n \"radius-2xl\": px(8),\n },\n medium: mergeBlocks<TokenBlock>(mediumRadiusTheme, mediumRadiusScale),\n large: {\n \"radius-sm\": px(6),\n \"radius-md\": px(10),\n \"radius-lg\": px(14),\n \"radius-xl\": px(18),\n \"radius-2xl\": px(24),\n },\n};\n\n/*#__NO_SIDE_EFFECTS__*/\nconst faded = (amount: number) =>\n mix(ref(\"shadow-color\"), amount, \"transparent\");\n\n/** Shadow scale (\"standard\" keeps the theme / palette shadows: no block). */\nexport const shadowTokens: Record<\n Exclude<ShadowScale, \"standard\">,\n TokenBlock\n> = {\n none: {\n \"shadow-sm\": shadow(),\n \"shadow-md\": shadow(),\n \"shadow-lg\": shadow(),\n \"shadow-xl\": shadow(),\n },\n subtle: {\n \"shadow-sm\": shadow({ x: 0, y: 1, blur: 1, color: faded(45) }),\n \"shadow-md\": shadow({ x: 0, y: 2, blur: 6, color: faded(45) }),\n \"shadow-lg\": shadow({ x: 0, y: 6, blur: 16, color: faded(50) }),\n \"shadow-xl\": shadow({ x: 0, y: 10, blur: 24, color: faded(55) }),\n },\n};\n\nconst smallFontSizes = {\n \"font-size-xs\": rem(0.6875),\n \"font-size-sm\": rem(0.75),\n \"font-size-md\": rem(0.8125),\n \"font-size-lg\": rem(0.9375),\n \"font-size-xl\": rem(1.0625),\n \"font-size-2xl\": rem(1.25),\n \"font-size-3xl\": rem(1.5),\n \"font-size-4xl\": rem(2),\n \"font-size-5xl\": rem(2.625),\n \"font-size-6xl\": rem(3.25),\n} as const satisfies TokenBlock;\n\nconst largeFontSizes = {\n \"font-size-xs\": rem(0.8125),\n \"font-size-sm\": rem(0.875),\n \"font-size-md\": rem(1),\n \"font-size-lg\": rem(1.125),\n \"font-size-xl\": rem(1.25),\n \"font-size-2xl\": rem(1.5),\n \"font-size-3xl\": rem(2),\n \"font-size-4xl\": rem(2.5),\n \"font-size-5xl\": rem(3.25),\n \"font-size-6xl\": rem(4),\n} as const satisfies TokenBlock;\n\n/** Font sizes of each type scale. */\nexport const fontSizeTokens: Record<FontScale, TokenBlock> = {\n small: smallFontSizes,\n standard: standardFontSizes,\n large: largeFontSizes,\n};\n\nconst smallLineHeights = { \"line-height-base\": 1.45 } as const;\nconst standardLineHeights = {\n \"line-height-base\": 1.5,\n \"line-height-relaxed\": 1.7,\n} as const;\nconst largeLineHeights = {\n \"line-height-base\": 1.6,\n \"line-height-relaxed\": 1.8,\n} as const;\n\n/** Line heights of each type scale (\"small\" keeps the relaxed one). */\nexport const lineHeightTokens: Record<FontScale, TokenBlock> = {\n small: smallLineHeights,\n standard: standardLineHeights,\n large: largeLineHeights,\n};\n\n/** Type scale: font sizes and line heights. */\nexport const fontScaleTokens: Record<FontScale, TokenBlock> = {\n small: mergeBlocks<TokenBlock>(smallFontSizes, smallLineHeights),\n standard: mergeBlocks<TokenBlock>(standardFontSizes, standardLineHeights),\n large: mergeBlocks<TokenBlock>(largeFontSizes, largeLineHeights),\n};\n","// Default (light) color tokens: the `:root, [data-minerva-theme-scope]` block\n// of tokens.css.\n//\n// The base tokens are the `light` theme (../theme/themes.ts builds it from\n// them). Semantic tokens are formulas over the base tokens (`color-mix()`\n// in CSS), so they follow any theme automatically, custom ones included.\n// Themes may still set them explicitly (the built-in dark themes do for\n// surfaces and text).\n//\n// The scope elements of nested ConfigProviders (`[data-minerva-theme-scope]`)\n// redeclare every token: custom properties resolve their `var()` references\n// where they are declared, so the derived tokens must be recomputed from the\n// scope's own base tokens.\nimport type { ThemeProps } from \"../theme/types\";\nimport { codeTokensLight } from \"./code\";\nimport { mediumRadiusTheme } from \"./design\";\nimport {\n mergeBlocks,\n mix,\n ref,\n shadow,\n type TokenBlock,\n type TokenValue,\n} from \"./expr\";\n\n/** Base tokens (`ThemeProps`) of the default light theme. */\nexport const baseTokens = {\n \"primary-color\": \"#2563eb\",\n \"secondary-color\": \"#475569\",\n \"success-color\": \"#15803d\",\n \"danger-color\": \"#dc2626\",\n \"warning-color\": \"#b45309\",\n \"info-color\": \"#0e7490\",\n \"light-color\": \"#f7f7f7\",\n \"dark-color\": \"#4a4a4a\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#1f2937\",\n \"border-color\": \"#d9dde3\",\n \"text-gray\": \"#6b7280\",\n \"primary-gradient-start\": \"#6a11cb\",\n \"primary-gradient-end\": \"#2575fc\",\n \"secondary-gradient-start\": \"#42e695\",\n \"secondary-gradient-end\": \"#3bb2b8\",\n \"highlight-color\": \"#ffeb3b\",\n \"shadow-color\": \"rgba(15, 23, 42, 0.16)\",\n \"muted-color\": \"#64748b\",\n \"link-color\": \"#1d4ed8\",\n \"link-hover-color\": \"#1e40af\",\n \"link-active-color\": \"#1e3a8a\",\n \"link-visited-color\": \"#6d28d9\",\n} as const satisfies ThemeProps;\n\nconst fg = ref(\"foreground-color\");\nconst bg = ref(\"background-color\");\nconst surface = ref(\"surface-color\");\nconst shadowColor = ref(\"shadow-color\");\n\n/** Semantic tokens derived from the base tokens. */\nexport const semanticTokens = {\n // ---- Surfaces ----\n \"surface-color\": bg,\n \"surface-muted-color\": mix(fg, 6, bg),\n \"surface-elevated-color\": bg,\n \"surface-subtle-color\": mix(fg, 3, bg),\n \"canvas-color\": ref(\"surface-subtle-color\"),\n \"control-color\": ref(\"surface-subtle-color\"),\n \"hover-color\": ref(\"surface-muted-color\"),\n \"selected-color\": mix(ref(\"primary-color\"), 14, surface),\n \"overlay-color\": mix(\"#000000\", 45, \"transparent\"),\n // ---- Borders ----\n \"border-strong-color\": mix(fg, 35, bg),\n // ---- Text ----\n \"text-color\": fg,\n \"text-secondary-color\": mix(fg, 75, bg),\n \"text-muted-color\": mix(fg, 62, bg),\n \"text-disabled-color\": mix(fg, 45, bg),\n \"text-inverse-color\": \"#ffffff\",\n // ---- Misc ----\n \"focus-ring-color\": mix(ref(\"primary-color\"), 45, \"transparent\"),\n \"shadow-sm\": shadow({ x: 0, y: 1, blur: 2, color: shadowColor }),\n \"shadow-md\": shadow({ x: 0, y: 4, blur: 12, color: shadowColor }),\n \"shadow-lg\": shadow({ x: 0, y: 12, blur: 32, color: shadowColor }),\n \"shadow-xl\": shadow({ x: 0, y: 20, blur: 48, color: shadowColor }),\n \"accent-color\": ref(\"primary-color\"),\n} as const satisfies TokenBlock;\n\n/** Colors with hover / active / subtle / border / text role tokens. */\nexport const ROLE_COLORS = [\n \"primary\",\n \"secondary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"accent\",\n] as const;\n\n/** Role tokens of one color: `--<color>-color-<role>`. */\n/*#__NO_SIDE_EFFECTS__*/\nexport const roleTokens = (color: string): Record<string, TokenValue> => {\n const c = ref(`${color}-color`);\n return {\n [`${color}-color-hover`]: mix(c, 85, fg),\n [`${color}-color-active`]: mix(c, 72, fg),\n [`${color}-color-subtle`]: mix(c, 12, surface),\n [`${color}-color-border`]: mix(c, 40, surface),\n [`${color}-color-text`]: mix(c, 80, fg),\n };\n};\n\n/** Role tokens of every role color. */\n/*#__NO_SIDE_EFFECTS__*/\nfunction allRoleTokens(): Record<string, TokenValue> {\n return mergeBlocks({}, ...ROLE_COLORS.map(roleTokens));\n}\n\n/** The `:root, [data-minerva-theme-scope]` block (default light theme). */\nexport const defaultThemeTokens: TokenBlock = mergeBlocks<TokenBlock>(\n baseTokens,\n semanticTokens,\n // default radii, declared with the theme tokens\n mediumRadiusTheme,\n allRoleTokens(),\n // syntax highlighting (dark values: tokens/code.ts)\n codeTokensLight,\n);\n","import type { ComponentTheme, ThemeName } from \"./types\";\nimport { baseTokens, semanticTokens } from \"../tokens/default-theme\";\nimport { mergeBlocks, toCss, type TokenValue } from \"../tokens/expr\";\n\n/** CSS text of some tokens of a block. */\n/*#__NO_SIDE_EFFECTS__*/\nfunction pickCss<K extends string>(\n block: Record<K, TokenValue>,\n keys: readonly K[],\n): Record<K, string> {\n const out = {} as Record<K, string>;\n for (const key of keys) out[key] = toCss(block[key]);\n return out;\n}\n\n/**\n * Semantic token defaults, expressed in terms of the base tokens: the same\n * formulas as the `:root` block of `tokens.css` (../tokens/default-theme.ts).\n * The light theme uses them as-is so they keep following the base colors.\n */\nconst derivedSemantic = /* @__PURE__ */ pickCss(semanticTokens, [\n \"surface-color\",\n \"surface-muted-color\",\n \"surface-elevated-color\",\n \"overlay-color\",\n \"border-strong-color\",\n \"text-color\",\n \"text-secondary-color\",\n \"text-disabled-color\",\n \"text-inverse-color\",\n \"focus-ring-color\",\n] as const);\n\nexport const light: ComponentTheme = /* @__PURE__ */ mergeBlocks<\n Partial<ComponentTheme>\n>(baseTokens, derivedSemantic) as ComponentTheme;\n\nexport const dark: ComponentTheme = {\n \"primary-color\": \"#818cf8\",\n \"secondary-color\": \"#94a3b8\",\n \"success-color\": \"#4ade80\",\n \"danger-color\": \"#f87171\",\n \"warning-color\": \"#fbbf24\",\n \"info-color\": \"#22d3ee\",\n \"light-color\": \"#2d3748\",\n \"dark-color\": \"#f8f9fa\",\n \"background-color\": \"#1a202c\",\n \"foreground-color\": \"#f1f5f9\",\n \"border-color\": \"#3a4556\",\n \"text-gray\": \"#a0aec0\",\n \"primary-gradient-start\": \"#6a11cb\",\n \"primary-gradient-end\": \"#2575fc\",\n \"secondary-gradient-start\": \"#42e695\",\n \"secondary-gradient-end\": \"#3bb2b8\",\n \"highlight-color\": \"#ffeb3b\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#94a3b8\",\n \"link-color\": \"#63b3ed\",\n \"link-hover-color\": \"#90cdf4\",\n \"link-active-color\": \"#bee3f8\",\n \"link-visited-color\": \"#b794f4\",\n \"surface-color\": \"#212937\",\n \"surface-muted-color\": \"#2a3342\",\n \"surface-elevated-color\": \"#262f3e\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.6)\",\n \"border-strong-color\": \"#5a677d\",\n \"text-color\": \"#f1f5f9\",\n \"text-secondary-color\": \"#cbd5e0\",\n \"text-disabled-color\": \"#718096\",\n \"text-inverse-color\": \"#111827\",\n \"focus-ring-color\": \"rgba(129, 140, 248, 0.55)\",\n};\n\nexport const githubDark: ComponentTheme = {\n \"primary-color\": \"#58a6ff\",\n \"secondary-color\": \"#8b949e\",\n \"success-color\": \"#3fb950\",\n \"danger-color\": \"#f85149\",\n \"warning-color\": \"#d29922\",\n \"info-color\": \"#39c5cf\",\n \"light-color\": \"#161b22\",\n \"dark-color\": \"#e6edf3\",\n \"background-color\": \"#0d1117\",\n \"foreground-color\": \"#e6edf3\",\n \"border-color\": \"#30363d\",\n \"text-gray\": \"#8b949e\",\n \"primary-gradient-start\": \"#58a6ff\",\n \"primary-gradient-end\": \"#1f6feb\",\n \"secondary-gradient-start\": \"#1f6feb\",\n \"secondary-gradient-end\": \"#58a6ff\",\n \"highlight-color\": \"#bb800926\",\n \"shadow-color\": \"rgba(1, 4, 9, 0.8)\",\n \"muted-color\": \"#8b949e\",\n \"link-color\": \"#58a6ff\",\n \"link-hover-color\": \"#79c0ff\",\n \"link-active-color\": \"#a5d6ff\",\n \"link-visited-color\": \"#bc8cff\",\n \"surface-color\": \"#161b22\",\n \"surface-muted-color\": \"#21262d\",\n \"surface-elevated-color\": \"#1c2128\",\n \"overlay-color\": \"rgba(1, 4, 9, 0.7)\",\n \"border-strong-color\": \"#484f58\",\n \"text-color\": \"#e6edf3\",\n \"text-secondary-color\": \"#8b949e\",\n \"text-disabled-color\": \"#6e7681\",\n \"text-inverse-color\": \"#0d1117\",\n \"focus-ring-color\": \"rgba(31, 111, 235, 0.6)\",\n};\n\n/** Union of the keys of `themes` (pure: dropped when `themeKeys` is unused). */\nfunction uniqueKeys(...themes: object[]): string[] {\n const keys = new Set<string>();\n for (const theme of themes) for (const key in theme) keys.add(key);\n return Array.from(keys);\n}\n\n/**\n * Every CSS custom property name (without the leading `--`) that a built-in\n * theme may write. Used to clear stale inline variables when switching themes.\n */\nexport const themeKeys: readonly string[] = /* @__PURE__ */ uniqueKeys(\n light,\n dark,\n githubDark,\n);\n\n/**\n * Built-in themes, keyed by the name accepted by `ConfigProvider`'s `theme` prop.\n * This map is the single source of truth for theme name -> theme values.\n */\nexport const themes = {\n light,\n dark,\n \"github-dark\": githubDark,\n} as const satisfies Record<ThemeName, ComponentTheme>;\n\nexport const isThemeName = (value: unknown): value is ThemeName =>\n typeof value === \"string\" &&\n Object.prototype.hasOwnProperty.call(themes, value);\n","// Minerva's built-in palettes (palette x mode) as theme token values: the\n// source of the [data-palette][data-theme] blocks of `tokens.css`\n// (../tokens/css.ts), so the SSR init script can select a palette before\n// hydration without any JavaScript theme application, and of\n// `resolveTokens({ palette })` / the mini-program palette classes.\nimport type { ComponentTheme } from \"./types\";\nimport type { Palette, ResolvedThemeMode } from \"./mode\";\n\nexport const palettes = {\n editorial: {\n light: {\n \"primary-color\": \"#1e3a5f\",\n \"secondary-color\": \"#57534e\",\n \"success-color\": \"#5a7c2f\",\n \"danger-color\": \"#b53a2c\",\n \"warning-color\": \"#c47b1e\",\n \"info-color\": \"#3a7a92\",\n \"light-color\": \"#faf8f5\",\n \"dark-color\": \"#292524\",\n \"background-color\": \"#fdfbf6\",\n \"foreground-color\": \"#1c1917\",\n \"border-color\": \"#e7e2d4\",\n \"text-gray\": \"#57534e\",\n \"primary-gradient-start\": \"#4f7da9\",\n \"primary-gradient-end\": \"#16304f\",\n \"secondary-gradient-start\": \"#c5613a\",\n \"secondary-gradient-end\": \"#913e22\",\n \"highlight-color\": \"#fbf2dc\",\n \"shadow-color\": \"rgba(28, 25, 23, 0.16)\",\n \"muted-color\": \"#78716c\",\n \"link-color\": \"#1e3a5f\",\n \"link-hover-color\": \"#0f2742\",\n \"link-active-color\": \"#0a1d33\",\n \"link-visited-color\": \"#913e22\",\n \"surface-color\": \"#fdfbf6\",\n \"surface-subtle-color\": \"#f5f1e8\",\n \"surface-muted-color\": \"#ebe5d4\",\n \"surface-elevated-color\": \"#fdfbf6\",\n \"canvas-color\": \"#f5f1e8\",\n \"control-color\": \"#f5f1e8\",\n \"hover-color\": \"#ebe5d4\",\n \"selected-color\": \"color-mix(in srgb, #1e3a5f 14%, #fdfbf6)\",\n \"overlay-color\": \"rgba(28, 25, 23, 0.5)\",\n \"border-strong-color\": \"#c8bfac\",\n \"text-color\": \"#1c1917\",\n \"text-secondary-color\": \"#44403c\",\n \"text-muted-color\": \"#57534e\",\n \"text-disabled-color\": \"#a8a29e\",\n \"text-inverse-color\": \"#fdfbf6\",\n \"focus-ring-color\": \"color-mix(in srgb, #1e3a5f 45%, transparent)\",\n \"accent-color\": \"#b04e2b\",\n \"primary-color-hover\": \"#16304f\",\n \"primary-color-active\": \"#0f2742\",\n \"primary-color-subtle\": \"#eef3f8\",\n \"primary-color-border\": \"#a8bfd6\",\n \"primary-color-text\": \"#0f2742\",\n \"accent-color-hover\": \"#913e22\",\n \"accent-color-active\": \"#6f2e19\",\n \"accent-color-subtle\": \"#fbeae3\",\n \"accent-color-border\": \"#eaa180\",\n \"accent-color-text\": \"#6f2e19\",\n \"success-color-hover\": \"#466123\",\n \"success-color-active\": \"#34471a\",\n \"success-color-subtle\": \"#f0f5e8\",\n \"success-color-text\": \"#34471a\",\n \"warning-color-hover\": \"#a36215\",\n \"warning-color-active\": \"#804b0e\",\n \"warning-color-subtle\": \"#fbf2dc\",\n \"warning-color-text\": \"#804b0e\",\n \"danger-color-hover\": \"#952d20\",\n \"danger-color-active\": \"#732015\",\n \"danger-color-subtle\": \"#fbecea\",\n \"danger-color-text\": \"#732015\",\n \"info-color-hover\": \"#2c6075\",\n \"info-color-active\": \"#1f4858\",\n \"info-color-subtle\": \"#ecf3f5\",\n \"info-color-text\": \"#1f4858\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(28, 25, 23, 0.06)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(28, 25, 23, 0.08), 0 2px 4px -2px rgba(28, 25, 23, 0.05)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(28, 25, 23, 0.1), 0 4px 6px -4px rgba(28, 25, 23, 0.05)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(28, 25, 23, 0.12), 0 8px 10px -6px rgba(28, 25, 23, 0.06)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#7a9bc4\",\n \"secondary-color\": \"#c8bfac\",\n \"success-color\": \"#a3c971\",\n \"danger-color\": \"#e07a6c\",\n \"warning-color\": \"#e8a85a\",\n \"info-color\": \"#6ba8bd\",\n \"light-color\": \"#1c1917\",\n \"dark-color\": \"#f0ece4\",\n \"background-color\": \"#1a1612\",\n \"foreground-color\": \"#f5f1e8\",\n \"border-color\": \"#3a342d\",\n \"text-gray\": \"#a8a29e\",\n \"primary-gradient-start\": \"#4d7faf\",\n \"primary-gradient-end\": \"#9bb5d4\",\n \"secondary-gradient-start\": \"#d97c52\",\n \"secondary-gradient-end\": \"#f5cfb9\",\n \"highlight-color\": \"#3a2406\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#a8a29e\",\n \"link-color\": \"#7a9bc4\",\n \"link-hover-color\": \"#bdcde3\",\n \"link-active-color\": \"#d8e3ee\",\n \"link-visited-color\": \"#f5cfb9\",\n \"surface-color\": \"#1a1612\",\n \"surface-subtle-color\": \"#221d18\",\n \"surface-muted-color\": \"#2a241e\",\n \"surface-elevated-color\": \"#1a1612\",\n \"canvas-color\": \"#221d18\",\n \"control-color\": \"#221d18\",\n \"hover-color\": \"#2a241e\",\n \"selected-color\": \"color-mix(in srgb, #7a9bc4 14%, #1a1612)\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.7)\",\n \"border-strong-color\": \"#52483e\",\n \"text-color\": \"#f5f1e8\",\n \"text-secondary-color\": \"#c8bfac\",\n \"text-muted-color\": \"#a8a29e\",\n \"text-disabled-color\": \"#78716c\",\n \"text-inverse-color\": \"#1c1917\",\n \"focus-ring-color\": \"color-mix(in srgb, #7a9bc4 45%, transparent)\",\n \"accent-color\": \"#eaa180\",\n \"primary-color-hover\": \"#9bb5d4\",\n \"primary-color-active\": \"#bdcde3\",\n \"primary-color-subtle\": \"#061425\",\n \"primary-color-border\": \"#0f2742\",\n \"primary-color-text\": \"#bdcde3\",\n \"accent-color-hover\": \"#f5cfb9\",\n \"accent-color-active\": \"#fbeae3\",\n \"accent-color-subtle\": \"#6f2e19\",\n \"accent-color-border\": \"#b04e2b\",\n \"accent-color-text\": \"#fbeae3\",\n \"success-color-hover\": \"#b8d68c\",\n \"success-color-active\": \"#cee0a8\",\n \"success-color-subtle\": \"#1f3010\",\n \"success-color-text\": \"#cee0a8\",\n \"warning-color-hover\": \"#f0bb7d\",\n \"warning-color-active\": \"#f5cda0\",\n \"warning-color-subtle\": \"#3a2406\",\n \"warning-color-text\": \"#f5cda0\",\n \"danger-color-hover\": \"#ea968a\",\n \"danger-color-active\": \"#f3b3a8\",\n \"danger-color-subtle\": \"#3a0f0a\",\n \"danger-color-text\": \"#f3b3a8\",\n \"info-color-hover\": \"#88bdce\",\n \"info-color-active\": \"#a8d2df\",\n \"info-color-subtle\": \"#0e2530\",\n \"info-color-text\": \"#a8d2df\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.4)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.4)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n tech: {\n light: {\n \"primary-color\": \"#2364c4\",\n \"secondary-color\": \"#424c5c\",\n \"success-color\": \"#10b981\",\n \"danger-color\": \"#ef4444\",\n \"warning-color\": \"#f59e0b\",\n \"info-color\": \"#06b6d4\",\n \"light-color\": \"#f7f8fa\",\n \"dark-color\": \"#1f2630\",\n \"background-color\": \"#fafbfc\",\n \"foreground-color\": \"#131820\",\n \"border-color\": \"#dee0e3\",\n \"text-gray\": \"#5d6877\",\n \"primary-gradient-start\": \"#3479d8\",\n \"primary-gradient-end\": \"#1a4f9e\",\n \"secondary-gradient-start\": \"#3479d8\",\n \"secondary-gradient-end\": \"#1a4f9e\",\n \"highlight-color\": \"#fffbeb\",\n \"shadow-color\": \"rgba(15, 23, 42, 0.16)\",\n \"muted-color\": \"#5d6877\",\n \"link-color\": \"#2364c4\",\n \"link-hover-color\": \"#143d7a\",\n \"link-active-color\": \"#0f2c5b\",\n \"link-visited-color\": \"#1a4f9e\",\n \"surface-color\": \"#fafbfc\",\n \"surface-subtle-color\": \"#f1f3f5\",\n \"surface-muted-color\": \"#e6e8eb\",\n \"surface-elevated-color\": \"#fafbfc\",\n \"canvas-color\": \"#f1f3f5\",\n \"control-color\": \"#f1f3f5\",\n \"hover-color\": \"#e6e8eb\",\n \"selected-color\": \"color-mix(in srgb, #2364c4 14%, #fafbfc)\",\n \"overlay-color\": \"rgba(15, 23, 42, 0.5)\",\n \"border-strong-color\": \"#b8c0cc\",\n \"text-color\": \"#131820\",\n \"text-secondary-color\": \"#2f3845\",\n \"text-muted-color\": \"#5d6877\",\n \"text-disabled-color\": \"#8a94a3\",\n \"text-inverse-color\": \"#fafbfc\",\n \"focus-ring-color\": \"color-mix(in srgb, #2364c4 45%, transparent)\",\n \"accent-color\": \"#2364c4\",\n \"primary-color-hover\": \"#1a4f9e\",\n \"primary-color-active\": \"#143d7a\",\n \"primary-color-subtle\": \"#eaf2fe\",\n \"primary-color-border\": \"#91bcf8\",\n \"primary-color-text\": \"#143d7a\",\n \"accent-color-hover\": \"#1a4f9e\",\n \"accent-color-active\": \"#143d7a\",\n \"accent-color-subtle\": \"#eaf2fe\",\n \"accent-color-border\": \"#91bcf8\",\n \"accent-color-text\": \"#143d7a\",\n \"success-color-hover\": \"#059669\",\n \"success-color-active\": \"#047857\",\n \"success-color-subtle\": \"#ecfdf5\",\n \"success-color-text\": \"#047857\",\n \"warning-color-hover\": \"#d97706\",\n \"warning-color-active\": \"#b45309\",\n \"warning-color-subtle\": \"#fffbeb\",\n \"warning-color-text\": \"#b45309\",\n \"danger-color-hover\": \"#dc2626\",\n \"danger-color-active\": \"#b91c1c\",\n \"danger-color-subtle\": \"#fef2f2\",\n \"danger-color-text\": \"#b91c1c\",\n \"info-color-hover\": \"#0891b2\",\n \"info-color-active\": \"#0e7490\",\n \"info-color-subtle\": \"#ecfeff\",\n \"info-color-text\": \"#0e7490\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(15, 23, 42, 0.05)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(15, 23, 42, 0.08), 0 2px 4px -2px rgba(15, 23, 42, 0.05)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(15, 23, 42, 0.1), 0 4px 6px -4px rgba(15, 23, 42, 0.05)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(15, 23, 42, 0.12), 0 8px 10px -6px rgba(15, 23, 42, 0.06)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Inter', system-ui, -apple-system, 'PingFang SC', sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#5c8ee6\",\n \"secondary-color\": \"#b8c0cc\",\n \"success-color\": \"#34d399\",\n \"danger-color\": \"#f87171\",\n \"warning-color\": \"#fbbf24\",\n \"info-color\": \"#22d3ee\",\n \"light-color\": \"#131820\",\n \"dark-color\": \"#eef0f4\",\n \"background-color\": \"#08090d\",\n \"foreground-color\": \"#f5f7fa\",\n \"border-color\": \"#1e242e\",\n \"text-gray\": \"#7a838e\",\n \"primary-gradient-start\": \"#2364c4\",\n \"primary-gradient-end\": \"#7ba5ed\",\n \"secondary-gradient-start\": \"#2364c4\",\n \"secondary-gradient-end\": \"#7ba5ed\",\n \"highlight-color\": \"#422006\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#8a94a3\",\n \"link-color\": \"#5c8ee6\",\n \"link-hover-color\": \"#9bbcf2\",\n \"link-active-color\": \"#c0d3f7\",\n \"link-visited-color\": \"#7ba5ed\",\n \"surface-color\": \"#08090d\",\n \"surface-subtle-color\": \"#11141a\",\n \"surface-muted-color\": \"#1a1f28\",\n \"surface-elevated-color\": \"#08090d\",\n \"canvas-color\": \"#11141a\",\n \"control-color\": \"#11141a\",\n \"hover-color\": \"#1a1f28\",\n \"selected-color\": \"color-mix(in srgb, #5c8ee6 14%, #08090d)\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.7)\",\n \"border-strong-color\": \"#2e3744\",\n \"text-color\": \"#f5f7fa\",\n \"text-secondary-color\": \"#c1c8d0\",\n \"text-muted-color\": \"#7a838e\",\n \"text-disabled-color\": \"#4a5360\",\n \"text-inverse-color\": \"#131820\",\n \"focus-ring-color\": \"color-mix(in srgb, #5c8ee6 45%, transparent)\",\n \"accent-color\": \"#5c8ee6\",\n \"primary-color-hover\": \"#7ba5ed\",\n \"primary-color-active\": \"#9bbcf2\",\n \"primary-color-subtle\": \"#091d3c\",\n \"primary-color-border\": \"#143d7a\",\n \"primary-color-text\": \"#9bbcf2\",\n \"accent-color-hover\": \"#7ba5ed\",\n \"accent-color-active\": \"#9bbcf2\",\n \"accent-color-subtle\": \"#091d3c\",\n \"accent-color-border\": \"#143d7a\",\n \"accent-color-text\": \"#9bbcf2\",\n \"success-color-hover\": \"#6ee7b7\",\n \"success-color-active\": \"#a7f3d0\",\n \"success-color-subtle\": \"#022c22\",\n \"success-color-text\": \"#a7f3d0\",\n \"warning-color-hover\": \"#fcd34d\",\n \"warning-color-active\": \"#fde68a\",\n \"warning-color-subtle\": \"#422006\",\n \"warning-color-text\": \"#fde68a\",\n \"danger-color-hover\": \"#fca5a5\",\n \"danger-color-active\": \"#fecaca\",\n \"danger-color-subtle\": \"#450a0a\",\n \"danger-color-text\": \"#fecaca\",\n \"info-color-hover\": \"#67e8f9\",\n \"info-color-active\": \"#a5f3fc\",\n \"info-color-subtle\": \"#022c30\",\n \"info-color-text\": \"#a5f3fc\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.4)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.4)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n graphite: {\n light: {\n \"primary-color\": \"#315fce\",\n \"secondary-color\": \"#505761\",\n \"success-color\": \"#25865a\",\n \"danger-color\": \"#c24141\",\n \"warning-color\": \"#a86618\",\n \"info-color\": \"#327da3\",\n \"light-color\": \"#f7f7f8\",\n \"dark-color\": \"#292d32\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#1f2328\",\n \"border-color\": \"#dfe2e6\",\n \"text-gray\": \"#606873\",\n \"primary-gradient-start\": \"#6486e3\",\n \"primary-gradient-end\": \"#294eaa\",\n \"secondary-gradient-start\": \"#6486e3\",\n \"secondary-gradient-end\": \"#294eaa\",\n \"highlight-color\": \"#fff7e6\",\n \"shadow-color\": \"rgba(31, 35, 40, 0.16)\",\n \"muted-color\": \"#6f7680\",\n \"link-color\": \"#315fce\",\n \"link-hover-color\": \"#223f87\",\n \"link-active-color\": \"#1b326b\",\n \"link-visited-color\": \"#294eaa\",\n \"surface-color\": \"#ffffff\",\n \"surface-subtle-color\": \"#f5f6f7\",\n \"surface-muted-color\": \"#eceef1\",\n \"surface-elevated-color\": \"#ffffff\",\n \"canvas-color\": \"#f5f6f7\",\n \"control-color\": \"#f0f1f3\",\n \"hover-color\": \"#e8eaed\",\n \"selected-color\": \"#e5ecff\",\n \"overlay-color\": \"rgba(31, 35, 40, 0.52)\",\n \"border-strong-color\": \"#b7bdc5\",\n \"text-color\": \"#1f2328\",\n \"text-secondary-color\": \"#3b4149\",\n \"text-muted-color\": \"#606873\",\n \"text-disabled-color\": \"#9ca1aa\",\n \"text-inverse-color\": \"#ffffff\",\n \"focus-ring-color\": \"color-mix(in srgb, #315fce 45%, transparent)\",\n \"accent-color\": \"#315fce\",\n \"primary-color-hover\": \"#294eaa\",\n \"primary-color-active\": \"#223f87\",\n \"primary-color-subtle\": \"#eef3ff\",\n \"primary-color-border\": \"#bdceff\",\n \"primary-color-text\": \"#223f87\",\n \"accent-color-hover\": \"#294eaa\",\n \"accent-color-active\": \"#223f87\",\n \"accent-color-subtle\": \"#eef3ff\",\n \"accent-color-border\": \"#bdceff\",\n \"accent-color-text\": \"#223f87\",\n \"success-color-hover\": \"#1e704b\",\n \"success-color-active\": \"#195a3e\",\n \"success-color-subtle\": \"#edf8f1\",\n \"success-color-text\": \"#195a3e\",\n \"warning-color-hover\": \"#8b5313\",\n \"warning-color-active\": \"#70420f\",\n \"warning-color-subtle\": \"#fff7e6\",\n \"warning-color-text\": \"#70420f\",\n \"danger-color-hover\": \"#a63333\",\n \"danger-color-active\": \"#852828\",\n \"danger-color-subtle\": \"#fff0f0\",\n \"danger-color-text\": \"#852828\",\n \"info-color-hover\": \"#286687\",\n \"info-color-active\": \"#20516c\",\n \"info-color-subtle\": \"#edf6fb\",\n \"info-color-text\": \"#20516c\",\n \"shadow-sm\": \"0 1px 2px rgba(31, 35, 40, 0.06)\",\n \"shadow-md\": \"0 4px 12px rgba(31, 35, 40, 0.09)\",\n \"shadow-lg\": \"0 12px 28px rgba(31, 35, 40, 0.12)\",\n \"shadow-xl\": \"0 20px 42px rgba(31, 35, 40, 0.16)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#7b9cff\",\n \"secondary-color\": \"#a7adb7\",\n \"success-color\": \"#65c18c\",\n \"danger-color\": \"#e47b7b\",\n \"warning-color\": \"#e4ad5f\",\n \"info-color\": \"#6cb6d9\",\n \"light-color\": \"#17181b\",\n \"dark-color\": \"#e0e3e8\",\n \"background-color\": \"#1e2024\",\n \"foreground-color\": \"#f2f4f7\",\n \"border-color\": \"#34383f\",\n \"text-gray\": \"#a7adb7\",\n \"primary-gradient-start\": \"#587bd2\",\n \"primary-gradient-end\": \"#99b2ff\",\n \"secondary-gradient-start\": \"#587bd2\",\n \"secondary-gradient-end\": \"#99b2ff\",\n \"highlight-color\": \"#382b18\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#6f7680\",\n \"link-color\": \"#7b9cff\",\n \"link-hover-color\": \"#b7c8ff\",\n \"link-active-color\": \"#d5deff\",\n \"link-visited-color\": \"#99b2ff\",\n \"surface-color\": \"#1e2024\",\n \"surface-subtle-color\": \"#17181b\",\n \"surface-muted-color\": \"#25282d\",\n \"surface-elevated-color\": \"#1e2024\",\n \"canvas-color\": \"#17181b\",\n \"control-color\": \"#292d33\",\n \"hover-color\": \"#30343a\",\n \"selected-color\": \"#29334d\",\n \"overlay-color\": \"rgba(10, 11, 13, 0.7)\",\n \"border-strong-color\": \"#494f59\",\n \"text-color\": \"#f2f4f7\",\n \"text-secondary-color\": \"#c7ccd3\",\n \"text-muted-color\": \"#a7adb7\",\n \"text-disabled-color\": \"#6f7680\",\n \"text-inverse-color\": \"#17181b\",\n \"focus-ring-color\": \"color-mix(in srgb, #7b9cff 45%, transparent)\",\n \"accent-color\": \"#7b9cff\",\n \"primary-color-hover\": \"#99b2ff\",\n \"primary-color-active\": \"#b7c8ff\",\n \"primary-color-subtle\": \"#17213a\",\n \"primary-color-border\": \"#2d4270\",\n \"primary-color-text\": \"#b7c8ff\",\n \"accent-color-hover\": \"#99b2ff\",\n \"accent-color-active\": \"#b7c8ff\",\n \"accent-color-subtle\": \"#17213a\",\n \"accent-color-border\": \"#2d4270\",\n \"accent-color-text\": \"#b7c8ff\",\n \"success-color-hover\": \"#83d3a3\",\n \"success-color-active\": \"#a7e2bc\",\n \"success-color-subtle\": \"#183126\",\n \"success-color-text\": \"#a7e2bc\",\n \"warning-color-hover\": \"#efc27f\",\n \"warning-color-active\": \"#f4d39f\",\n \"warning-color-subtle\": \"#382b18\",\n \"warning-color-text\": \"#f4d39f\",\n \"danger-color-hover\": \"#ee9999\",\n \"danger-color-active\": \"#f4b8b8\",\n \"danger-color-subtle\": \"#3a2022\",\n \"danger-color-text\": \"#f4b8b8\",\n \"info-color-hover\": \"#8bc8e3\",\n \"info-color-active\": \"#add9eb\",\n \"info-color-subtle\": \"#1b2e38\",\n \"info-color-text\": \"#add9eb\",\n \"shadow-sm\": \"0 1px 2px rgba(0, 0, 0, 0.24)\",\n \"shadow-md\": \"0 5px 16px rgba(0, 0, 0, 0.28)\",\n \"shadow-lg\": \"0 14px 34px rgba(0, 0, 0, 0.34)\",\n \"shadow-xl\": \"0 24px 52px rgba(0, 0, 0, 0.4)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n cool: {\n light: {\n \"primary-color\": \"#2864c7\",\n \"secondary-color\": \"#485a6b\",\n \"success-color\": \"#23845a\",\n \"danger-color\": \"#c43f4e\",\n \"warning-color\": \"#a76717\",\n \"info-color\": \"#287f9e\",\n \"light-color\": \"#f5f8fb\",\n \"dark-color\": \"#24323f\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#17202b\",\n \"border-color\": \"#d8e1e9\",\n \"text-gray\": \"#5e7081\",\n \"primary-gradient-start\": \"#568cde\",\n \"primary-gradient-end\": \"#2253a6\",\n \"secondary-gradient-start\": \"#568cde\",\n \"secondary-gradient-end\": \"#2253a6\",\n \"highlight-color\": \"#fff7e8\",\n \"shadow-color\": \"rgba(23, 32, 43, 0.16)\",\n \"muted-color\": \"#647687\",\n \"link-color\": \"#2864c7\",\n \"link-hover-color\": \"#1c4385\",\n \"link-active-color\": \"#17366b\",\n \"link-visited-color\": \"#2253a6\",\n \"surface-color\": \"#ffffff\",\n \"surface-subtle-color\": \"#f3f6f9\",\n \"surface-muted-color\": \"#e8eef4\",\n \"surface-elevated-color\": \"#ffffff\",\n \"canvas-color\": \"#f3f6f9\",\n \"control-color\": \"#edf2f6\",\n \"hover-color\": \"#e3eaf1\",\n \"selected-color\": \"#dfebff\",\n \"overlay-color\": \"rgba(23, 32, 43, 0.54)\",\n \"border-strong-color\": \"#afbdca\",\n \"text-color\": \"#17202b\",\n \"text-secondary-color\": \"#344554\",\n \"text-muted-color\": \"#5e7081\",\n \"text-disabled-color\": \"#8fa0b0\",\n \"text-inverse-color\": \"#ffffff\",\n \"focus-ring-color\": \"color-mix(in srgb, #2864c7 45%, transparent)\",\n \"accent-color\": \"#2864c7\",\n \"primary-color-hover\": \"#2253a6\",\n \"primary-color-active\": \"#1c4385\",\n \"primary-color-subtle\": \"#edf4ff\",\n \"primary-color-border\": \"#b6d1ff\",\n \"primary-color-text\": \"#1c4385\",\n \"accent-color-hover\": \"#2253a6\",\n \"accent-color-active\": \"#1c4385\",\n \"accent-color-subtle\": \"#edf4ff\",\n \"accent-color-border\": \"#b6d1ff\",\n \"accent-color-text\": \"#1c4385\",\n \"success-color-hover\": \"#1d6e4b\",\n \"success-color-active\": \"#17583d\",\n \"success-color-subtle\": \"#edf9f3\",\n \"success-color-text\": \"#17583d\",\n \"warning-color-hover\": \"#8b5413\",\n \"warning-color-active\": \"#70420f\",\n \"warning-color-subtle\": \"#fff7e8\",\n \"warning-color-text\": \"#70420f\",\n \"danger-color-hover\": \"#a6313f\",\n \"danger-color-active\": \"#862732\",\n \"danger-color-subtle\": \"#fff0f1\",\n \"danger-color-text\": \"#862732\",\n \"info-color-hover\": \"#216883\",\n \"info-color-active\": \"#1a5369\",\n \"info-color-subtle\": \"#eaf7fb\",\n \"info-color-text\": \"#1a5369\",\n \"shadow-sm\": \"0 1px 2px rgba(23, 32, 43, 0.06)\",\n \"shadow-md\": \"0 4px 12px rgba(23, 32, 43, 0.09)\",\n \"shadow-lg\": \"0 12px 28px rgba(23, 32, 43, 0.13)\",\n \"shadow-xl\": \"0 20px 42px rgba(23, 32, 43, 0.17)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#79a9ff\",\n \"secondary-color\": \"#a2afbd\",\n \"success-color\": \"#62c28e\",\n \"danger-color\": \"#e37b88\",\n \"warning-color\": \"#e4ad5e\",\n \"info-color\": \"#65bad5\",\n \"light-color\": \"#151a21\",\n \"dark-color\": \"#dce4eb\",\n \"background-color\": \"#1b222c\",\n \"foreground-color\": \"#eef3f8\",\n \"border-color\": \"#344354\",\n \"text-gray\": \"#a2afbd\",\n \"primary-gradient-start\": \"#5483c3\",\n \"primary-gradient-end\": \"#98bcff\",\n \"secondary-gradient-start\": \"#5483c3\",\n \"secondary-gradient-end\": \"#98bcff\",\n \"highlight-color\": \"#392c19\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#708397\",\n \"link-color\": \"#79a9ff\",\n \"link-hover-color\": \"#b7d0ff\",\n \"link-active-color\": \"#d4e2ff\",\n \"link-visited-color\": \"#98bcff\",\n \"surface-color\": \"#1b222c\",\n \"surface-subtle-color\": \"#151a21\",\n \"surface-muted-color\": \"#222c38\",\n \"surface-elevated-color\": \"#1b222c\",\n \"canvas-color\": \"#151a21\",\n \"control-color\": \"#273341\",\n \"hover-color\": \"#2e3c4c\",\n \"selected-color\": \"#263a57\",\n \"overlay-color\": \"rgba(7, 11, 16, 0.72)\",\n \"border-strong-color\": \"#4a5d72\",\n \"text-color\": \"#eef3f8\",\n \"text-secondary-color\": \"#c5ced7\",\n \"text-muted-color\": \"#a2afbd\",\n \"text-disabled-color\": \"#708397\",\n \"text-inverse-color\": \"#151a21\",\n \"focus-ring-color\": \"color-mix(in srgb, #79a9ff 45%, transparent)\",\n \"accent-color\": \"#79a9ff\",\n \"primary-color-hover\": \"#98bcff\",\n \"primary-color-active\": \"#b7d0ff\",\n \"primary-color-subtle\": \"#172943\",\n \"primary-color-border\": \"#294a75\",\n \"primary-color-text\": \"#b7d0ff\",\n \"accent-color-hover\": \"#98bcff\",\n \"accent-color-active\": \"#b7d0ff\",\n \"accent-color-subtle\": \"#172943\",\n \"accent-color-border\": \"#294a75\",\n \"accent-color-text\": \"#b7d0ff\",\n \"success-color-hover\": \"#81d4a5\",\n \"success-color-active\": \"#a5e3bd\",\n \"success-color-subtle\": \"#183328\",\n \"success-color-text\": \"#a5e3bd\",\n \"warning-color-hover\": \"#efc17d\",\n \"warning-color-active\": \"#f5d39e\",\n \"warning-color-subtle\": \"#392c19\",\n \"warning-color-text\": \"#f5d39e\",\n \"danger-color-hover\": \"#ed9aa4\",\n \"danger-color-active\": \"#f4b9c0\",\n \"danger-color-subtle\": \"#3b2026\",\n \"danger-color-text\": \"#f4b9c0\",\n \"info-color-hover\": \"#85cce1\",\n \"info-color-active\": \"#a8ddeb\",\n \"info-color-subtle\": \"#17313c\",\n \"info-color-text\": \"#a8ddeb\",\n \"shadow-sm\": \"0 1px 2px rgba(0, 0, 0, 0.25)\",\n \"shadow-md\": \"0 5px 16px rgba(0, 0, 0, 0.3)\",\n \"shadow-lg\": \"0 14px 34px rgba(0, 0, 0, 0.36)\",\n \"shadow-xl\": \"0 24px 52px rgba(0, 0, 0, 0.42)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n} as const satisfies Record<Palette, Record<ResolvedThemeMode, ComponentTheme>>;\n","// The primary / accent colors of each built-in palette: the base\n// `primaryColorTokens` / `accentFollowsPrimary` need, without the full\n// `palettes` token tables (~25 kB minified) for renderers under a size\n// budget (the `<minerva-config>` element). Kept equal to `palettes` by\n// palette-accents.test.ts.\nimport type { Palette, ResolvedThemeMode } from \"./mode\";\n\n/** Primary and accent color of a palette in one mode. */\nexport interface PaletteAccent {\n \"primary-color\": string;\n \"accent-color\": string;\n}\n\n/** Primary and accent color of each built-in palette, per mode. */\nexport const paletteAccents: Readonly<\n Record<Palette, Readonly<Record<ResolvedThemeMode, PaletteAccent>>>\n> = {\n editorial: {\n light: { \"primary-color\": \"#1e3a5f\", \"accent-color\": \"#b04e2b\" },\n dark: { \"primary-color\": \"#7a9bc4\", \"accent-color\": \"#eaa180\" },\n },\n tech: {\n light: { \"primary-color\": \"#2364c4\", \"accent-color\": \"#2364c4\" },\n dark: { \"primary-color\": \"#5c8ee6\", \"accent-color\": \"#5c8ee6\" },\n },\n graphite: {\n light: { \"primary-color\": \"#315fce\", \"accent-color\": \"#315fce\" },\n dark: { \"primary-color\": \"#7b9cff\", \"accent-color\": \"#7b9cff\" },\n },\n cool: {\n light: { \"primary-color\": \"#2864c7\", \"accent-color\": \"#2864c7\" },\n dark: { \"primary-color\": \"#79a9ff\", \"accent-color\": \"#79a9ff\" },\n },\n};\n","// Scale tokens: spacing, radius, typography, layering, motion, rhythm,\n// controls and focus (the second `:root` block of tokens.css).\n//\n// Unlike the color tokens these do not change with the theme (palettes may\n// override the font families; the design axes switch the control, radius,\n// shadow and type values). Components consume them as CSS variables; numeric\n// `gap` / `padding` props resolve to `var(--space-<n>)`.\nimport {\n clamp,\n cubicBezier,\n mergeBlocks,\n px,\n ref,\n rem,\n transition,\n type TokenBlock,\n} from \"./expr\";\nimport {\n mediumRadiusScale,\n standardDensity,\n standardFontSizes,\n} from \"./design\";\n\n/** Spacing steps (rem; fractional keys use \"-\": `0-5` = 0.5). */\nexport const spaceTokens = {\n \"space-0\": rem(0),\n \"space-0-5\": rem(0.125),\n \"space-1\": rem(0.25),\n \"space-1-5\": rem(0.375),\n \"space-2\": rem(0.5),\n \"space-2-5\": rem(0.625),\n \"space-3\": rem(0.75),\n \"space-4\": rem(1),\n \"space-5\": rem(1.25),\n \"space-6\": rem(1.5),\n \"space-7\": rem(1.75),\n \"space-8\": rem(2),\n \"space-10\": rem(2.5),\n \"space-12\": rem(3),\n \"space-14\": rem(3.5),\n \"space-16\": rem(4),\n \"space-20\": rem(5),\n \"space-24\": rem(6),\n} as const satisfies TokenBlock;\n\n/** Font family stacks of the default look (palettes override them). */\nexport const fontFamilyTokens = {\n \"font-family-sans\":\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n \"font-family-display\": ref(\"font-family-sans\"),\n \"font-family-mono\":\n 'ui-monospace, \"SF Mono\", \"JetBrains Mono\", Menlo, Consolas, monospace',\n} as const satisfies TokenBlock;\n\n/** The scales `:root` block. */\nexport const scaleTokens: TokenBlock = mergeBlocks<TokenBlock>(\n spaceTokens,\n // ---- Radius (sm / md / lg live with the theme tokens) ----\n { \"radius-none\": px(0) },\n mediumRadiusScale,\n { \"radius-full\": px(9999) },\n // ---- Typography ----\n fontFamilyTokens,\n standardFontSizes,\n {\n \"font-weight-regular\": 400,\n \"font-weight-medium\": 500,\n \"font-weight-semibold\": 600,\n \"font-weight-bold\": 700,\n \"line-height-tight\": 1.2,\n \"line-height-base\": 1.5,\n \"line-height-relaxed\": 1.7,\n // ---- Layering ----\n \"z-base\": 0,\n \"z-raised\": 10,\n \"z-dropdown\": 1000,\n \"z-sticky\": 1100,\n \"z-overlay\": 1300,\n \"z-modal\": 1400,\n \"z-popover\": 1500,\n \"z-toast\": 1700,\n // ---- Motion ----\n \"transition-fast\": transition(120, \"ease-out\"),\n \"transition-base\": transition(200, \"ease-out\"),\n \"transition-slow\": transition(360, \"ease-out\"),\n \"ease-out\": cubicBezier(0.22, 1, 0.36, 1),\n \"ease-spring\": cubicBezier(0.34, 1.56, 0.64, 1),\n \"ease-in\": cubicBezier(0.5, 0, 0.75, 0),\n // ---- Rhythm & elevation ----\n \"rhythm-section\": clamp(rem(3), 6, rem(5)),\n \"rhythm-block\": clamp(rem(1.5), 3, rem(2.5)),\n \"rhythm-tight\": rem(0.75),\n \"elevation-flat\": \"none\",\n \"elevation-subtle\": ref(\"shadow-sm\"),\n \"elevation-raised\": ref(\"shadow-md\"),\n \"elevation-floating\": ref(\"shadow-lg\"),\n },\n // ---- Controls & rows (density) ----\n standardDensity,\n {\n // ---- Focus ----\n \"focus-ring-width\": px(2),\n \"focus-ring-offset\": px(2),\n },\n);\n","// User preferences that apply to every component (media-query blocks of\n// tokens.css).\nimport type { TokenBlock } from \"./expr\";\n\n/**\n * `prefers-reduced-motion: reduce`: transitions become instant. Components\n * additionally stop their keyframe animations (spinners slow down instead of\n * stopping, so a pending state stays perceivable).\n */\nexport const reducedMotionTokens = {\n \"transition-fast\": \"0s\",\n \"transition-base\": \"0s\",\n \"transition-slow\": \"0s\",\n} as const satisfies TokenBlock;\n\n/**\n * `forced-colors: active` (Windows high contrast): the system palette replaces\n * colors, so the focus ring must not rely on a mixed color.\n */\nexport const forcedColorsTokens = {\n \"focus-ring-color\": \"Highlight\",\n} as const satisfies TokenBlock;\n","// sRGB colors for platforms without CSS color functions: parsing of the color\n// syntaxes used by the tokens, `color-mix(in srgb, ...)` per CSS Color 5, and\n// serialization to hex / rgba() strings (React Native, mini-programs).\n\n/** An sRGB color: channels 0-255 (unrounded), alpha 0-1. */\nexport interface Rgba {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/** CSS basic named colors (+ `transparent`) */\nconst NAMED: Record<string, string> = {\n black: \"#000000\",\n silver: \"#c0c0c0\",\n gray: \"#808080\",\n grey: \"#808080\",\n white: \"#ffffff\",\n maroon: \"#800000\",\n red: \"#ff0000\",\n purple: \"#800080\",\n fuchsia: \"#ff00ff\",\n magenta: \"#ff00ff\",\n green: \"#008000\",\n lime: \"#00ff00\",\n olive: \"#808000\",\n yellow: \"#ffff00\",\n navy: \"#000080\",\n blue: \"#0000ff\",\n teal: \"#008080\",\n aqua: \"#00ffff\",\n cyan: \"#00ffff\",\n orange: \"#ffa500\",\n transparent: \"#00000000\",\n};\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\nfunction parseHex(hex: string): Rgba | undefined {\n if (!/^[\\da-f]+$/i.test(hex)) return undefined;\n const digits =\n hex.length === 3 || hex.length === 4\n ? hex.replace(/./g, (d) => d + d)\n : hex;\n if (digits.length !== 6 && digits.length !== 8) return undefined;\n const channel = (i: number) => parseInt(digits.slice(i, i + 2), 16);\n return {\n r: channel(0),\n g: channel(2),\n b: channel(4),\n a: digits.length === 8 ? channel(6) / 255 : 1,\n };\n}\n\n/** A number or percentage component (`pct` = value of 100%). */\nfunction component(text: string, pct: number): number | undefined {\n const match = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(%?)$/.exec(text);\n if (!match) return undefined;\n const value = Number(match[1]);\n return match[2] ? (value / 100) * pct : value;\n}\n\nfunction parseRgbFunction(args: string): Rgba | undefined {\n // rgb(r, g, b[, a]) or rgb(r g b[ / a])\n const parts = args.includes(\",\")\n ? args.split(\",\").map((p) => p.trim())\n : args\n .replace(\"/\", \" / \")\n .trim()\n .split(/\\s+/)\n .filter((p) => p !== \"/\");\n if (parts.length !== 3 && parts.length !== 4) return undefined;\n const [r, g, b] = parts.slice(0, 3).map((p) => component(p, 255));\n const a = parts.length === 4 ? component(parts[3], 1) : 1;\n if ([r, g, b, a].some((v) => v === undefined || Number.isNaN(v))) {\n return undefined;\n }\n return {\n r: clamp(r!, 0, 255),\n g: clamp(g!, 0, 255),\n b: clamp(b!, 0, 255),\n a: clamp(a!, 0, 1),\n };\n}\n\n/** Splits `text` on top-level commas (outside parentheses). */\nexport function splitTopLevel(text: string, separator = \",\"): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"(\") depth++;\n else if (char === \")\") depth--;\n else if (depth === 0 && char === separator) {\n parts.push(text.slice(start, i).trim());\n start = i + 1;\n }\n }\n parts.push(text.slice(start).trim());\n return parts;\n}\n\n/** `<color> [<percentage>]` of a color-mix() argument */\nfunction mixArgument(\n text: string,\n): { color: Rgba; pct: number | undefined } | undefined {\n const trailing = /^(.+?)\\s+(-?[\\d.]+)%$/s.exec(text);\n const leading = /^(-?[\\d.]+)%\\s+(.+)$/s.exec(text);\n const [colorText, pctText] = trailing\n ? [trailing[1], trailing[2]]\n : leading\n ? [leading[2], leading[1]]\n : [text, undefined];\n const color = parseColor(colorText);\n if (!color) return undefined;\n return { color, pct: pctText === undefined ? undefined : Number(pctText) };\n}\n\n/**\n * Parses a CSS color: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` /\n * `rgba()` (legacy comma or modern space syntax), the basic named colors,\n * `transparent` and `color-mix(in srgb, ...)` (nested mixes included).\n * Returns `undefined` for anything else (system colors, other color spaces).\n */\nexport function parseColor(text: string): Rgba | undefined {\n const value = text.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value.slice(1));\n if (value in NAMED) return parseHex(NAMED[value].slice(1));\n const fn = /^([a-z-]+)\\((.*)\\)$/s.exec(value);\n if (!fn) return undefined;\n const [, name, args] = fn;\n if (name === \"rgb\" || name === \"rgba\") return parseRgbFunction(args);\n if (name !== \"color-mix\") return undefined;\n const [space, first, second] = splitTopLevel(args);\n if (space !== \"in srgb\" || first === undefined || second === undefined) {\n return undefined;\n }\n const a = mixArgument(first);\n const b = mixArgument(second);\n if (!a || !b) return undefined;\n return mixRgba(a.color, b.color, a.pct, b.pct);\n}\n\n/**\n * `color-mix(in srgb, a p1%, b p2%)` on parsed colors, per CSS Color 5:\n *\n * - percentages: both omitted = 50 / 50; one omitted = 100 minus the other;\n * both given and summing to 0 = invalid (`undefined`); a sum other than 100\n * is scaled to 100, and a sum below 100 also multiplies the result alpha by\n * `sum / 100`;\n * - channels are interpolated premultiplied by alpha (so `transparent` adds\n * no color, only transparency), then un-premultiplied.\n *\n * Channels are not rounded (see `formatColor`).\n */\nexport function mixRgba(\n a: Rgba,\n b: Rgba,\n p1?: number,\n p2?: number,\n): Rgba | undefined {\n if ([p1, p2].some((p) => p !== undefined && (p < 0 || p > 100))) {\n return undefined;\n }\n let w1 = p1 ?? (p2 === undefined ? 50 : 100 - p2);\n let w2 = p2 ?? 100 - w1;\n const sum = w1 + w2;\n if (sum === 0) return undefined;\n const multiplier = sum < 100 ? sum / 100 : 1;\n w1 /= sum;\n w2 /= sum;\n const alpha = a.a * w1 + b.a * w2;\n const channel = (c1: number, c2: number) =>\n alpha === 0 ? 0 : (c1 * a.a * w1 + c2 * b.a * w2) / alpha;\n return {\n r: channel(a.r, b.r),\n g: channel(a.g, b.g),\n b: channel(a.b, b.b),\n a: alpha * multiplier,\n };\n}\n\nconst ALPHA_DECIMALS = 1000;\n\nconst hex2 = (value: number) => value.toString(16).padStart(2, \"0\");\n\n/**\n * Serializes a color: `#rrggbb` (lowercase) when opaque, `rgba(r, g, b, a)`\n * otherwise. Channels are rounded half up to integers (127.5 -> 128) and\n * clamped to 0-255; alpha is rounded to 3 decimals (an alpha that rounds to 1\n * is opaque).\n */\nexport function formatColor({ r, g, b, a }: Rgba): string {\n const [R, G, B] = [r, g, b].map((c) => clamp(Math.round(c), 0, 255));\n const alpha = Math.round(clamp(a, 0, 1) * ALPHA_DECIMALS) / ALPHA_DECIMALS;\n return alpha === 1\n ? `#${hex2(R)}${hex2(G)}${hex2(B)}`\n : `rgba(${R}, ${G}, ${B}, ${alpha})`;\n}\n\n/**\n * `color-mix(in srgb, a <amount>%, b)` as a hex / rgba() string (see\n * `mixRgba` for the mixing rules and `formatColor` for the rounding).\n * `amountB` sets the second percentage explicitly. Returns `undefined` when a\n * color cannot be parsed or the percentages are invalid.\n */\nexport function colorMix(\n a: string,\n b: string,\n amount?: number,\n amountB?: number,\n): string | undefined {\n const ca = parseColor(a);\n const cb = parseColor(b);\n const mixed = ca && cb ? mixRgba(ca, cb, amount, amountB) : undefined;\n return mixed && formatColor(mixed);\n}\n\n/** Normalizes any supported color to `formatColor` output. */\nexport function normalizeColor(text: string): string | undefined {\n const color = parseColor(text);\n return color && formatColor(color);\n}\n","// Brand (primary) color: the `primaryColor` option of the theme providers.\n//\n// - `resolvePrimaryColor` validates / normalizes the option to a light / dark\n// pair; a single color gets its dark-mode value from `derivePrimaryDark`.\n// - `primaryColorTokens` is the token block a brand color sets: the primary\n// color and every token the default theme derives from it, with the same\n// formulas as `tokens.css` (default-theme.ts), so the web renderers can\n// write it as CSS variables and the native ones evaluate it\n// (`resolveTokens({ primaryColor })`).\n//\n// Platform-neutral: pure functions, no DOM.\nimport { dark } from \"../theme/themes\";\n\nimport { formatColor, parseColor, type Rgba } from \"./color\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport type { TokenValue } from \"./expr\";\n\n/** Brand color per color mode. */\nexport interface PrimaryColorPair {\n light: string;\n dark: string;\n}\n\n/**\n * Brand color: one CSS color for both modes (the dark-mode value is derived\n * with `derivePrimaryDark`), or one per mode.\n */\nexport type PrimaryColor = string | PrimaryColorPair;\n\n// ---- Contrast (WCAG 2.x) ----\n\nconst linear = (channel: number) => {\n const c = channel / 255;\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n};\n\nconst gamma = (c: number) =>\n 255 * (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\n/** WCAG relative luminance of an sRGB color (alpha ignored), 0-1. */\nexport function relativeLuminance({ r, g, b }: Rgba): number {\n return 0.2126 * linear(r) + 0.7152 * linear(g) + 0.0722 * linear(b);\n}\n\n/**\n * WCAG contrast ratio (1-21) of two colors (any `parseColor` syntax; alpha\n * ignored). `undefined` when a color cannot be parsed.\n */\nexport function contrastRatio(a: string, b: string): number | undefined {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return undefined;\n const [hi, lo] = [relativeLuminance(ca), relativeLuminance(cb)].sort(\n (x, y) => y - x,\n );\n return (hi + 0.05) / (lo + 0.05);\n}\n\n// ---- OKLab (Björn Ottosson) ----\n\ntype Lab = [l: number, a: number, b: number];\n\nfunction toOklab({ r, g, b }: Rgba): Lab {\n const [R, G, B] = [linear(r), linear(g), linear(b)];\n const l = Math.cbrt(0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B);\n const m = Math.cbrt(0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B);\n const s = Math.cbrt(0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\nfunction fromOklab([L, A, B]: Lab, alpha: number): Rgba {\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n const channel = (c: number) => Math.min(255, Math.max(0, gamma(c)));\n return {\n r: channel(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n g: channel(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n b: channel(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n a: alpha,\n };\n}\n\n/** Options of `derivePrimaryDark`. */\nexport interface DerivePrimaryDarkOptions {\n /**\n * Dark surface the color must stand out on\n * @default the dark theme's `surface-color` (\"#212937\")\n */\n background?: string;\n /**\n * Minimum WCAG contrast ratio against `background`\n * @default 4.5\n */\n minContrast?: number;\n}\n\n/** Bisection steps of `derivePrimaryDark` (precision 2^-20 of the mix). */\nconst STEPS = 20;\n\n/**\n * Dark-mode variant of a brand color: the color mixed toward white in OKLab\n * (lightness up, chroma down proportionally, hue kept) by the smallest amount\n * that reaches `minContrast` (WCAG, 4.5:1 by default) against the dark\n * theme's surface, so it stays readable as text and links and keeps the dark\n * `--text-inverse-color` readable on filled controls. A color that already\n * reaches it is returned unchanged (normalized). Deterministic; alpha is\n * kept. `undefined` when the color cannot be parsed.\n *\n * derivePrimaryDark(\"#4f46e5\"); // \"#7b85f2\"\n */\nexport function derivePrimaryDark(\n color: string,\n {\n background = dark[\"surface-color\"]!,\n minContrast = 4.5,\n }: DerivePrimaryDarkOptions = {},\n): string | undefined {\n const base = parseColor(color);\n const surface = parseColor(background);\n if (!base || !surface) return undefined;\n const target = relativeLuminance(surface);\n const reaches = (c: Rgba) => {\n const y = relativeLuminance(c);\n return (\n (Math.max(y, target) + 0.05) / (Math.min(y, target) + 0.05) >= minContrast\n );\n };\n // rounded like the serialized result, so the check holds for the output\n const at = (t: number): Rgba => {\n const [l, a, b] = toOklab(base);\n const mixed = fromOklab(\n [l + (1 - l) * t, a * (1 - t), b * (1 - t)],\n base.a,\n );\n return {\n ...mixed,\n r: Math.round(mixed.r),\n g: Math.round(mixed.g),\n b: Math.round(mixed.b),\n };\n };\n if (reaches(base)) return formatColor(base);\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < STEPS; i++) {\n const mid = (lo + hi) / 2;\n if (reaches(at(mid))) hi = mid;\n else lo = mid;\n }\n return formatColor(at(hi));\n}\n\n// ---- Validation ----\n\n/** Normalized color, `undefined` when it is not a supported CSS color. */\nconst validColor = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n const color = parseColor(value);\n return color && formatColor(color);\n};\n\n/**\n * Validates and normalizes a `primaryColor` option to a light / dark pair:\n * a single color applies to light mode and gets its dark value from\n * `derivePrimaryDark`; a `{ light, dark }` pair is used as-is. Colors are\n * normalized (`#rrggbb` / `rgba()`). Supported syntaxes: hex, `rgb()` /\n * `rgba()`, the basic named colors and `color-mix(in srgb, ...)`.\n * Returns `null` for `null` / `undefined` (no brand color) and `undefined`\n * for an invalid value (renderers ignore it with a development warning,\n * see `invalidPrimaryColorMessage`).\n */\nexport function resolvePrimaryColor(\n value: unknown,\n): PrimaryColorPair | null | undefined {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") {\n const light = validColor(value);\n return light === undefined\n ? undefined\n : { light, dark: derivePrimaryDark(light)! };\n }\n if (typeof value === \"object\") {\n const pair = value as Partial<PrimaryColorPair>;\n const light = validColor(pair.light);\n const darkColor = validColor(pair.dark);\n return light !== undefined && darkColor !== undefined\n ? { light, dark: darkColor }\n : undefined;\n }\n return undefined;\n}\n\n/** Message of the development warning for an invalid `primaryColor`. */\nexport function invalidPrimaryColorMessage(value: unknown): string {\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return `ignored an invalid primaryColor (${text}): expected a CSS color (hex, rgb() / rgba(), a basic named color) or a { light, dark } pair of them.`;\n}\n\n// ---- Tokens ----\n\n/** Names of the tokens a formula references (`var(--x)`). */\nfunction refsOf(value: TokenValue): string[] {\n if (typeof value !== \"object\") return [];\n switch (value.kind) {\n case \"ref\":\n return [value.name];\n case \"mix\":\n return [...refsOf(value.a), ...refsOf(value.b)];\n case \"shadow\":\n return value.layers.flatMap((layer) => refsOf(layer.color));\n default:\n return [];\n }\n}\n\n/** Tokens of `block` that depend on `name`, directly or transitively. */\nfunction dependents(\n block: Readonly<Record<string, TokenValue>>,\n name: string,\n): string[] {\n const found = new Set([name]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const [key, value] of Object.entries(block)) {\n if (!found.has(key) && refsOf(value).some((ref) => found.has(ref))) {\n found.add(key);\n grew = true;\n }\n }\n }\n found.delete(name);\n return Object.keys(block).filter((key) => found.has(key));\n}\n\n/**\n * Every token the default theme derives from `--primary-color` (directly or\n * through `--accent-color`): the `primary` and `accent` role tokens (hover,\n * active, subtle, border, text), `selected-color`, `focus-ring-color` and\n * `accent-color`. Computed from the token formulas of `tokens.css`.\n */\nexport const PRIMARY_DERIVED_TOKENS: readonly string[] =\n /* @__PURE__ */ dependents(defaultThemeTokens, \"primary-color\");\n\nlet accentTokens: ReadonlySet<string> | undefined;\n\n/**\n * `accent-color` and the tokens derived from it. Computed on first use: a\n * module-level `new Set([...spread])` is not tree-shakable.\n */\nfunction accentTokenNames(): ReadonlySet<string> {\n accentTokens ??= new Set([\n \"accent-color\",\n ...dependents(defaultThemeTokens, \"accent-color\"),\n ]);\n return accentTokens;\n}\n\n/**\n * Whether a theme / palette lets its accent follow the primary color (the\n * default): its `accent-color` is unset, `var(--primary-color)` or the same\n * color as its `primary-color`. Palettes with a distinct accent (e.g.\n * \"editorial\") keep it when a brand color is set.\n */\nexport function accentFollowsPrimary(theme?: object | null): boolean {\n const tokens = (theme ?? {}) as Readonly<Record<string, unknown>>;\n const accent = tokens[\"accent-color\"];\n if (accent === undefined || accent === null) return true;\n if (typeof accent === \"object\") {\n const formula = accent as { kind?: string; name?: string };\n return formula.kind === \"ref\" && formula.name === \"primary-color\";\n }\n const text = String(accent).replace(/\\s+/g, \"\");\n if (text === \"var(--primary-color)\") return true;\n const primary = tokens[\"primary-color\"];\n if (typeof primary !== \"string\") return false;\n const a = parseColor(String(accent));\n const p = parseColor(primary);\n return !!a && !!p && formatColor(a) === formatColor(p);\n}\n\n/**\n * Token block of a brand color (names without `--`): `primary-color` and\n * every token derived from it (`PRIMARY_DERIVED_TOKENS`), with the formulas\n * of the default theme (e.g. `--primary-color-hover` is\n * `color-mix(in srgb, var(--primary-color) 85%, var(--foreground-color))`),\n * so the derived values follow the surface / foreground of the mode or\n * palette they are applied in. The accent tokens are included only when\n * `theme` (the theme or palette the block is applied over) lets its accent\n * follow the primary color (`accentFollowsPrimary`).\n *\n * Web: write `tokenToCss(value)` as `--<name>` CSS variables. Native /\n * mini-programs: evaluate with `resolveTokens({ primaryColor })` (or pass\n * the block as `overrides`).\n */\nexport function primaryColorTokens(\n color: string,\n theme?: object | null,\n): Record<string, TokenValue> {\n const withAccent = accentFollowsPrimary(theme);\n const block: Record<string, TokenValue> = { \"primary-color\": color };\n for (const name of PRIMARY_DERIVED_TOKENS) {\n if (!withAccent && accentTokenNames().has(name)) continue;\n block[name] = defaultThemeTokens[name];\n }\n return block;\n}\n","// Evaluation of the CSS values used by the tokens, without a CSS engine:\n// `var()` substitution, lengths (px / rem / em / vw / vh, calc(), min(),\n// max(), clamp()), box-shadow lists, transitions and easing curves.\nimport { formatColor, parseColor, splitTopLevel } from \"./color\";\n\n/** Context of length evaluation. */\nexport interface LengthContext {\n /** px per rem / em */\n rootFontSize: number;\n /** px per 100vw */\n viewportWidth: number;\n /** px per 100vh */\n viewportHeight: number;\n}\n\n/** Index of the `)` closing the `(` at `open`, or -1. */\nfunction closingParen(text: string, open: number): number {\n let depth = 0;\n for (let i = open; i < text.length; i++) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\" && --depth === 0) return i;\n }\n return -1;\n}\n\n/**\n * Replaces every `var(--name[, fallback])` of `text` using `lookup` (which\n * returns the substituted value of a token, or `undefined`). Returns\n * `undefined` when a reference cannot be resolved and has no fallback (the\n * CSS \"guaranteed-invalid\" value).\n */\nexport function substituteVars(\n text: string,\n lookup: (name: string) => string | undefined,\n): string | undefined {\n let out = \"\";\n let index = 0;\n for (;;) {\n const start = text.indexOf(\"var(\", index);\n if (start < 0) return out + text.slice(index);\n const end = closingParen(text, start + 3);\n if (end < 0) return undefined;\n const [name, ...rest] = splitTopLevel(text.slice(start + 4, end));\n const fallback = rest.length ? rest.join(\",\") : undefined;\n const value =\n (name.startsWith(\"--\") ? lookup(name.slice(2)) : undefined) ??\n (fallback === undefined ? undefined : substituteVars(fallback, lookup));\n if (value === undefined) return undefined;\n out += text.slice(index, start) + value;\n index = end + 1;\n }\n}\n\n// ---- Lengths ----\n\ntype Num = { value: number; length: boolean };\n\n/** Tiny recursive-descent evaluator of length expressions. */\nclass LengthParser {\n private i = 0;\n constructor(\n private readonly text: string,\n private readonly context: LengthContext,\n ) {}\n\n parse(): number | undefined {\n const result = this.sum();\n this.space();\n if (!result || this.i !== this.text.length) return undefined;\n // a unitless number is a length only when it is 0\n return result.length || result.value === 0 ? result.value : undefined;\n }\n\n private space() {\n while (/\\s/.test(this.text[this.i] ?? \"\")) this.i++;\n }\n\n private sum(): Num | undefined {\n let left = this.product();\n for (;;) {\n this.space();\n const op = this.text[this.i];\n if (!left || (op !== \"+\" && op !== \"-\")) return left;\n this.i++;\n const right = this.product();\n if (!right || right.length !== left.length) return undefined;\n left = {\n value: op === \"+\" ? left.value + right.value : left.value - right.value,\n length: left.length,\n };\n }\n }\n\n private product(): Num | undefined {\n let left = this.atom();\n for (;;) {\n this.space();\n const op = this.text[this.i];\n if (!left || (op !== \"*\" && op !== \"/\")) return left;\n this.i++;\n const right = this.atom();\n if (!right) return undefined;\n if (op === \"*\") {\n if (left.length && right.length) return undefined;\n left = {\n value: left.value * right.value,\n length: left.length || right.length,\n };\n } else {\n if (right.length || right.value === 0) return undefined;\n left = { value: left.value / right.value, length: left.length };\n }\n }\n }\n\n private args(): Num[] | undefined {\n const values: Num[] = [];\n for (;;) {\n const value = this.sum();\n if (!value) return undefined;\n values.push(value);\n this.space();\n const char = this.text[this.i++];\n if (char === \")\") return values;\n if (char !== \",\") return undefined;\n }\n }\n\n private atom(): Num | undefined {\n this.space();\n const rest = this.text.slice(this.i);\n const fn = /^(calc|min|max|clamp)?\\(/.exec(rest);\n if (fn) {\n this.i += fn[0].length;\n const args = this.args();\n if (!args || args.some((a) => a.length !== args[0].length)) {\n return undefined;\n }\n const values = args.map((a) => a.value);\n const length = args[0].length;\n switch (fn[1]) {\n case \"min\":\n return { value: Math.min(...values), length };\n case \"max\":\n return { value: Math.max(...values), length };\n case \"clamp\":\n return values.length === 3\n ? {\n value: Math.max(values[0], Math.min(values[1], values[2])),\n length,\n }\n : undefined;\n default:\n return values.length === 1 ? args[0] : undefined;\n }\n }\n const number = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(px|rem|em|vw|vh)?/.exec(rest);\n if (!number) return undefined;\n this.i += number[0].length;\n const value = Number(number[1]);\n const { rootFontSize, viewportWidth, viewportHeight } = this.context;\n const scale = {\n px: 1,\n rem: rootFontSize,\n em: rootFontSize,\n vw: viewportWidth / 100,\n vh: viewportHeight / 100,\n };\n return number[2]\n ? { value: value * scale[number[2] as keyof typeof scale], length: true }\n : { value, length: false };\n }\n}\n\n/**\n * A length in px: `0`, `<n>px|rem|em|vw|vh` and `calc()` / `min()` / `max()`\n * / `clamp()` of those. `undefined` when not a length.\n */\nexport const evaluateLength = (\n text: string,\n context: LengthContext,\n): number | undefined => new LengthParser(text.trim(), context).parse();\n\n/** Rounds to 4 decimals (removes floating point noise). */\nexport const round = (value: number) => Math.round(value * 1e4) / 1e4;\n\n// ---- Shadows ----\n\n/** One resolved `box-shadow` layer (px, normalized color). */\nexport interface ResolvedShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset: boolean;\n}\n\n/**\n * A resolved shadow: the layers, the CSS text and React Native's shadow props\n * (from the first layer): `color` is opaque and `opacity` carries its alpha,\n * `radius` is half the blur, `elevation` (Android) the rounded half blur.\n */\nexport interface ResolvedShadow {\n css: string;\n layers: ResolvedShadowLayer[];\n color: string;\n offset: { width: number; height: number };\n opacity: number;\n radius: number;\n elevation: number;\n}\n\nconst noShadow = (): ResolvedShadow => ({\n css: \"none\",\n layers: [],\n color: \"#000000\",\n offset: { width: 0, height: 0 },\n opacity: 0,\n radius: 0,\n elevation: 0,\n});\n\nconst pxCss = (value: number) => `${round(value)}px`;\n\n/** Parses a `box-shadow` value (`undefined` when invalid). */\nexport function evaluateShadow(\n text: string,\n context: LengthContext,\n): ResolvedShadow | undefined {\n if (text.trim() === \"none\") return noShadow();\n const layers: ResolvedShadowLayer[] = [];\n for (const layerText of splitTopLevel(text)) {\n const parts = splitTopLevel(layerText.replace(/\\s+/g, \" \"), \" \");\n const inset = parts.includes(\"inset\");\n const lengths: number[] = [];\n const rest: string[] = [];\n for (const part of parts) {\n if (part === \"inset\") continue;\n const length = rest.length ? undefined : evaluateLength(part, context);\n if (length === undefined) rest.push(part);\n else lengths.push(length);\n }\n const color = parseColor(rest.length ? rest.join(\" \") : \"black\");\n if (lengths.length < 2 || lengths.length > 4 || !color) return undefined;\n const [x, y, blur = 0, spread = 0] = lengths;\n layers.push({ x, y, blur, spread, color: formatColor(color), inset });\n }\n const css = layers\n .map((l) =>\n [\n ...(l.inset ? [\"inset\"] : []),\n pxCss(l.x),\n pxCss(l.y),\n pxCss(l.blur),\n ...(l.spread ? [pxCss(l.spread)] : []),\n l.color,\n ].join(\" \"),\n )\n .join(\", \");\n const first = layers[0];\n const color = parseColor(first.color)!;\n return {\n css,\n layers,\n color: formatColor({ ...color, a: 1 }),\n offset: { width: first.x, height: first.y },\n opacity: round(color.a),\n radius: round(first.blur / 2),\n elevation: Math.round(first.blur / 2),\n };\n}\n\n// ---- Motion ----\n\n/** A resolved transition shorthand (`120ms ease-out`). */\nexport interface ResolvedTransition {\n css: string;\n /** Milliseconds */\n duration: number;\n easing: string;\n}\n\n/** Parses `<duration> [<easing>]` (`undefined` when invalid). */\nexport function evaluateTransition(\n text: string,\n): ResolvedTransition | undefined {\n const match = /^(\\d*\\.?\\d+)(ms|s)(?:\\s+(.+))?$/.exec(text.trim());\n if (!match) return undefined;\n const duration = Number(match[1]) * (match[2] === \"s\" ? 1000 : 1);\n return { css: text.trim(), duration, easing: match[3] ?? \"ease\" };\n}\n\n/** Control points of the CSS easing keywords. */\nconst EASINGS: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n ease: [0.25, 0.1, 0.25, 1],\n \"ease-in\": [0.42, 0, 1, 1],\n \"ease-out\": [0, 0, 0.58, 1],\n \"ease-in-out\": [0.42, 0, 0.58, 1],\n};\n\n/** Control points of a `cubic-bezier()` or easing keyword. */\nexport function evaluateEasing(\n text: string,\n): [number, number, number, number] | undefined {\n const value = text.trim();\n if (value in EASINGS) return [...EASINGS[value]];\n const match = /^cubic-bezier\\((.*)\\)$/.exec(value);\n const points = match?.[1].split(\",\").map(Number);\n return points?.length === 4 && points.every(Number.isFinite)\n ? (points as [number, number, number, number])\n : undefined;\n}\n","// Concrete token values for platforms without CSS variables / color-mix()\n// (React Native, mini-programs, canvas / native drawing): applies the same\n// cascade as tokens.css for a mode x palette x design, substitutes `var()`\n// references and evaluates colors, lengths, shadows and motion.\nimport {\n presetPalette,\n resolveDesign,\n type DesignOptions,\n type ResolvedDesign,\n} from \"../theme/design\";\nimport type { Palette, ResolvedThemeMode } from \"../theme/mode\";\nimport { palettes } from \"../theme/palettes\";\nimport { dark } from \"../theme/themes\";\nimport type { ComponentTheme } from \"../theme/types\";\nimport { reducedMotionTokens } from \"./accessibility\";\nimport {\n primaryColorTokens,\n resolvePrimaryColor,\n type PrimaryColor,\n} from \"./brand\";\nimport { formatColor, parseColor } from \"./color\";\nimport { codeTokensDark } from \"./code\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport {\n densityTokens,\n fontScaleTokens,\n radiusTokens,\n shadowTokens,\n} from \"./design\";\nimport { toCss, type TokenValue } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\nimport {\n evaluateEasing,\n evaluateLength,\n evaluateShadow,\n evaluateTransition,\n round,\n substituteVars,\n type LengthContext,\n type ResolvedShadow,\n type ResolvedTransition,\n} from \"./values\";\n\n/** Options of `resolveTokens`. */\nexport interface ResolveTokensOptions {\n /** @default \"light\" */\n mode?: ResolvedThemeMode;\n /**\n * Built-in palette (`null`: Minerva's default look). Defaults to the\n * preset's palette.\n */\n palette?: Palette | null;\n /** Design preset and axes (see `resolveDesign`) */\n design?: DesignOptions | ResolvedDesign;\n /**\n * Token overrides (name without `--`, e.g. a custom theme object), applied\n * last like the inline variables of `applyThemeStyles`. Values may\n * reference other tokens (`var(--x)`) and use `color-mix()` / `calc()`.\n */\n overrides?:\n Readonly<Record<string, TokenValue | undefined>> | Partial<ComponentTheme>;\n /**\n * Brand color (see `resolvePrimaryColor`): sets `primary-color` for the\n * mode and recomputes every token derived from it\n * (`primaryColorTokens`). Wins over the palette / dark theme; `overrides`\n * still win over it. An invalid color is ignored.\n */\n primaryColor?: PrimaryColor | null;\n /** Applies the `prefers-reduced-motion` tokens (instant transitions) */\n reducedMotion?: boolean;\n /** px per rem @default 16 */\n rootFontSize?: number;\n /** Viewport width in px (for `vw` / `clamp()` tokens) @default 375 */\n viewportWidth?: number;\n /** Viewport height in px (for `vh`) @default 667 */\n viewportHeight?: number;\n}\n\n/**\n * Every token as a concrete value. Scale groups are keyed without their\n * prefix (`space[\"1-5\"]` is `--space-1-5`, `radius.sm` is `--radius-sm`);\n * `colors` and `sizes` keep the full token name.\n */\nexport interface ResolvedTokens {\n mode: ResolvedThemeMode;\n palette: Palette | null;\n design: ResolvedDesign;\n /** Colors as `#rrggbb` or `rgba(r, g, b, a)` (see `formatColor`) */\n colors: Record<string, string>;\n /** `--space-*` in px */\n space: Record<string, number>;\n /** `--radius-*` in px */\n radius: Record<string, number>;\n /** `--font-size-*` in px */\n fontSize: Record<string, number>;\n /** `--line-height-*` (unitless multipliers) */\n lineHeight: Record<string, number>;\n /** `--font-weight-*` */\n fontWeight: Record<string, number>;\n /** `--font-family-*` (CSS font stacks) */\n fontFamily: Record<string, string>;\n /** `--z-*` */\n zIndex: Record<string, number>;\n /** `--shadow-*` */\n shadows: Record<string, ResolvedShadow>;\n /** `--elevation-*` */\n elevation: Record<string, ResolvedShadow>;\n /** `--transition-*` */\n transitions: Record<string, ResolvedTransition>;\n /** `--ease-*`: cubic-bezier control points */\n easings: Record<string, [number, number, number, number]>;\n /** Other lengths in px: control heights / paddings, rows, rhythm, focus ring, touch target */\n sizes: Record<string, number>;\n /** `--touch-target-min` in px: minimum size of a touch target */\n touchTargetMin: number;\n /**\n * Every token as CSS text without `var()` / `color-mix()`: lengths in px,\n * normalized colors, resolved shadows (what `tokens.mini.css` declares)\n */\n css: Record<string, string>;\n /** Tokens that could not be evaluated (cycle, unknown syntax) */\n unresolved: string[];\n}\n\ntype Kind =\n \"color\" | \"length\" | \"number\" | \"string\" | \"shadow\" | \"transition\" | \"easing\";\n\ntype Group = Exclude<\n {\n [K in keyof ResolvedTokens]: ResolvedTokens[K] extends Record<\n string,\n unknown\n >\n ? K\n : never;\n }[keyof ResolvedTokens],\n \"css\" | \"design\" | \"unresolved\"\n>;\n\n/**\n * Token families: kind, result group and the prefix stripped from the group\n * keys (first match wins; anything else is a color).\n */\nconst FAMILIES: ReadonlyArray<\n readonly [test: RegExp, kind: Kind, group: Group, prefix: string]\n> = [\n [/^space-/, \"length\", \"space\", \"space-\"],\n [/^radius-/, \"length\", \"radius\", \"radius-\"],\n [/^font-size-/, \"length\", \"fontSize\", \"font-size-\"],\n [/^line-height-/, \"number\", \"lineHeight\", \"line-height-\"],\n [/^font-weight-/, \"number\", \"fontWeight\", \"font-weight-\"],\n [/^font-family-/, \"string\", \"fontFamily\", \"font-family-\"],\n [/^z-/, \"number\", \"zIndex\", \"z-\"],\n [/^shadow-color$/, \"color\", \"colors\", \"\"],\n [/^shadow-/, \"shadow\", \"shadows\", \"shadow-\"],\n [/^elevation-/, \"shadow\", \"elevation\", \"elevation-\"],\n [/^transition-/, \"transition\", \"transitions\", \"transition-\"],\n [/^ease-/, \"easing\", \"easings\", \"ease-\"],\n [\n /^(control-(height|padding)-|row-padding-|rhythm-|focus-ring-(width|offset)$|touch-target-)/,\n \"length\",\n \"sizes\",\n \"\",\n ],\n];\n\nconst COLOR_FAMILY = [/./, \"color\", \"colors\", \"\"] as const;\n\nconst family = (name: string) =>\n FAMILIES.find(([test]) => test.test(name)) ?? COLOR_FAMILY;\n\n/** Kind of a token, from its name (anything not a scale is a color). */\nexport const tokenKind = (name: string): Kind => family(name)[1];\n\n/** The cascade of token blocks for a mode x palette x design (CSS text). */\nexport function tokenCascade({\n mode = \"light\",\n palette,\n design: designOptions,\n overrides = {},\n primaryColor,\n reducedMotion = false,\n}: ResolveTokensOptions = {}): {\n values: Map<string, string>;\n palette: Palette | null;\n design: ResolvedDesign;\n} {\n const design = resolveDesign(designOptions);\n const chosen = palette === undefined ? presetPalette(design.preset) : palette;\n const values = new Map<string, string>();\n const apply = (block: object) => {\n for (const [name, value] of Object.entries(\n block as Record<string, TokenValue | undefined>,\n )) {\n if (value !== undefined) values.set(name, toCss(value));\n }\n };\n apply(defaultThemeTokens);\n apply(scaleTokens);\n const base = chosen\n ? palettes[chosen][mode]\n : mode === \"dark\"\n ? dark\n : undefined;\n if (base) apply(base);\n // `[data-theme=dark]` syntax highlighting block of tokens.css\n if (mode === \"dark\") apply(codeTokensDark);\n const brand = resolvePrimaryColor(primaryColor);\n if (brand) {\n apply(primaryColorTokens(brand[mode], { ...base, ...overrides }));\n }\n apply(densityTokens[design.density]);\n apply(radiusTokens[design.radius]);\n if (design.shadow !== \"standard\") apply(shadowTokens[design.shadow]);\n apply(fontScaleTokens[design.fontScale]);\n if (reducedMotion) apply(reducedMotionTokens);\n apply(overrides);\n return { values, palette: chosen, design };\n}\n\nconst pxCss = (value: number) => `${round(value)}px`;\n\n/** Value of one token of a kind, and its CSS text. */\nfunction evaluate(\n kind: Kind,\n text: string,\n context: LengthContext,\n): { value: unknown; css: string } | undefined {\n switch (kind) {\n case \"color\": {\n const color = parseColor(text);\n if (!color) return undefined;\n const css = formatColor(color);\n return { value: css, css };\n }\n case \"length\": {\n const length = evaluateLength(text, context);\n return length === undefined\n ? undefined\n : { value: round(length), css: pxCss(length) };\n }\n case \"number\": {\n const number = text.trim() === \"\" ? NaN : Number(text);\n return Number.isFinite(number)\n ? { value: number, css: String(number) }\n : undefined;\n }\n case \"string\": {\n // font stacks: double quotes, like tokens.css\n const css = text.trim().replace(/'/g, '\"');\n return { value: css, css };\n }\n case \"shadow\": {\n const shadow = evaluateShadow(text, context);\n return shadow && { value: shadow, css: shadow.css };\n }\n case \"transition\": {\n const transition = evaluateTransition(text);\n return transition && { value: transition, css: transition.css };\n }\n case \"easing\": {\n const easing = evaluateEasing(text);\n return easing && { value: easing, css: text.trim() };\n }\n }\n}\n\n/**\n * Concrete design token values for a color mode, palette and design: what a\n * browser computes from `tokens.css`, for renderers that have no CSS\n * variables or `color-mix()` (React Native, mini-programs).\n *\n * const t = resolveTokens({ mode: \"dark\", palette: \"tech\", design: { preset: \"touch\" } });\n * t.colors[\"primary-color\"]; // \"#5c8ee6\"\n * t.space[\"4\"]; // 16\n * t.shadows.md; // { css, color, offset, opacity, radius, elevation, layers }\n */\nexport function resolveTokens(\n options: ResolveTokensOptions = {},\n): ResolvedTokens {\n const { mode = \"light\" } = options;\n const context: LengthContext = {\n rootFontSize: options.rootFontSize ?? 16,\n viewportWidth: options.viewportWidth ?? 375,\n viewportHeight: options.viewportHeight ?? 667,\n };\n const { values, palette, design } = tokenCascade(options);\n\n // var() substitution with cycle detection (a cycle is guaranteed-invalid)\n const substituted = new Map<string, string | undefined>();\n const visiting = new Set<string>();\n const lookup = (name: string): string | undefined => {\n if (substituted.has(name)) return substituted.get(name);\n const raw = values.get(name);\n if (raw === undefined || visiting.has(name)) return undefined;\n visiting.add(name);\n const value = substituteVars(raw, lookup);\n visiting.delete(name);\n substituted.set(name, value);\n return value;\n };\n\n const out: ResolvedTokens = {\n mode,\n palette,\n design,\n colors: {},\n space: {},\n radius: {},\n fontSize: {},\n lineHeight: {},\n fontWeight: {},\n fontFamily: {},\n zIndex: {},\n shadows: {},\n elevation: {},\n transitions: {},\n easings: {},\n sizes: {},\n touchTargetMin: 0,\n css: {},\n unresolved: [],\n };\n for (const name of values.keys()) {\n const text = lookup(name);\n const [, kind, group, prefix] = family(name);\n const value =\n text === undefined ? undefined : evaluate(kind, text, context);\n if (value === undefined) {\n out.unresolved.push(name);\n continue;\n }\n (out[group] as Record<string, unknown>)[name.slice(prefix.length)] =\n value.value;\n out.css[name] = value.css;\n }\n out.touchTargetMin = out.sizes[\"touch-target-min\"] ?? 0;\n return out;\n}\n","// `tokens.css` (published as `minerva-design/tokens.css`), generated from the\n// token data. The output is byte-identical to what the former Sass sources\n// compiled to (`tokens.golden.css` test).\n//\n// Order matters: default (light) color tokens, scale tokens, then the palette\n// blocks ([data-palette] x [data-theme]), which must come after :root, then\n// the design axes ([data-density] / [data-radius] / [data-shadow] /\n// [data-font-scale]), which win over both, and the user preference media\n// queries.\nimport { DESIGN_ATTRIBUTES } from \"../theme/design\";\nimport { PALETTES } from \"../theme/mode\";\nimport { palettes } from \"../theme/palettes\";\nimport { dark } from \"../theme/themes\";\nimport type { ComponentTheme } from \"../theme/types\";\nimport { forcedColorsTokens, reducedMotionTokens } from \"./accessibility\";\nimport { codeTokensDark } from \"./code\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport {\n densityTokens,\n fontScaleTokens,\n radiusTokens,\n shadowTokens,\n} from \"./design\";\nimport { toCss, type TokenBlock } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\n\n/** One style rule: selectors and `property: value` declarations. */\nexport interface CssRule {\n selectors: readonly string[];\n declarations: ReadonlyArray<readonly [property: string, value: string]>;\n}\n\n/** Declarations of a token block (`--name: value`). */\nexport const tokenDeclarations = (\n /** A token block or a theme object */\n block: TokenBlock | ComponentTheme,\n /** Rewrites each value (e.g. quote normalization) */\n map: (css: string) => string = (css) => css,\n): CssRule[\"declarations\"] =>\n Object.entries(block as TokenBlock).map(([name, value]) => [\n `--${name}`,\n map(toCss(value)),\n ]);\n\n/** Serializes rules in the expanded style (`depth` = nesting depth). */\nexport function serializeRules(rules: readonly CssRule[], depth = 0): string[] {\n const pad = \" \".repeat(depth);\n return rules.map(\n ({ selectors, declarations }) =>\n `${pad}${selectors.join(`,\\n${pad}`)} {\\n${declarations\n .map(([property, value]) => `${pad} ${property}: ${value};`)\n .join(\"\\n\")}\\n${pad}}`,\n );\n}\n\n/** `@media <query> { <rules> }` */\nconst mediaBlock = (query: string, rules: readonly CssRule[]) =>\n `@media ${query} {\\n${serializeRules(rules, 1).join(\"\\n\\n\")}\\n}`;\n\n/** `[name=value]` (unquoted: every value is an identifier) */\nconst attr = (name: string, value?: string) =>\n value === undefined ? `[${name}]` : `[${name}=${value}]`;\n\n/** Font stacks are written with double quotes in the stylesheet. */\nconst doubleQuotes = (css: string) => css.replace(/'/g, '\"');\n\nconst ROOT = [\":root\", \"[data-minerva-theme-scope]\"];\n\n/** Visually hidden but available to assistive technology. */\nconst srOnly = (): CssRule => ({\n selectors: [\".minerva-sr-only\"],\n declarations: (\n [\n [\"position\", \"absolute\"],\n [\"width\", \"1px\"],\n [\"height\", \"1px\"],\n [\"padding\", \"0\"],\n [\"margin\", \"-1px\"],\n [\"overflow\", \"hidden\"],\n [\"clip\", \"rect(0, 0, 0, 0)\"],\n [\"white-space\", \"nowrap\"],\n [\"border\", \"0\"],\n ] as const\n ).map(([property, value]) => [property, `${value} !important`] as const),\n});\n\n/** Palette blocks: light (also the default mode) and dark of each palette. */\nfunction paletteRules(): CssRule[] {\n const theme = attr.bind(null, \"data-theme\");\n return PALETTES.flatMap((name) => {\n const palette = attr(\"data-palette\", name);\n return [\n {\n selectors: [\n `${palette}${theme(\"light\")}`,\n `${palette}:not(${theme(\"dark\")})`,\n ],\n declarations: tokenDeclarations(palettes[name].light, doubleQuotes),\n },\n {\n selectors: [`${palette}${theme(\"dark\")}`],\n declarations: tokenDeclarations(palettes[name].dark, doubleQuotes),\n },\n ];\n });\n}\n\n/** Design axes blocks; selectors doubled to outrank the palette blocks. */\nfunction designRules(): CssRule[] {\n const axes: Array<\n [keyof typeof DESIGN_ATTRIBUTES, Record<string, TokenBlock>]\n > = [\n [\"density\", densityTokens],\n [\"radius\", radiusTokens],\n [\"shadow\", shadowTokens],\n [\"fontScale\", fontScaleTokens],\n ];\n return axes.flatMap(([axis, blocks]) => {\n const name = DESIGN_ATTRIBUTES[axis];\n return Object.entries(blocks).map(([value, block]) => ({\n selectors: [`${attr(name, value)}${attr(name)}`],\n declarations: tokenDeclarations(block),\n }));\n });\n}\n\n/** Options of `generateTokensCss`. */\nexport interface GenerateTokensCssOptions {\n /**\n * Cascade layer wrapping the stylesheet (`false`: unlayered, as consumed by\n * bundlers that layer the CSS themselves)\n * @default \"minerva\"\n */\n layer?: string | false;\n}\n\n/**\n * The design tokens stylesheet (`minerva-design/tokens.css`), ending with a\n * newline.\n */\nexport function generateTokensCss({\n layer = \"minerva\",\n}: GenerateTokensCssOptions = {}): string {\n const rules: CssRule[] = [\n { selectors: ROOT, declarations: tokenDeclarations(defaultThemeTokens) },\n { selectors: [\":root\"], declarations: tokenDeclarations(scaleTokens) },\n srOnly(),\n ...paletteRules(),\n // Minerva's own dark mode without a palette: lets the init script (which\n // only sets data-theme) render the dark theme before hydration.\n {\n selectors: [`${attr(\"data-theme\", \"dark\")}:not(${attr(\"data-palette\")})`],\n declarations: tokenDeclarations(dark),\n },\n // Syntax highlighting in dark mode, any palette (after the :root block).\n {\n selectors: [attr(\"data-theme\", \"dark\")],\n declarations: tokenDeclarations(codeTokensDark),\n },\n ...designRules(),\n ];\n const onRoot = (block: TokenBlock): CssRule[] => [\n { selectors: [\":root\"], declarations: tokenDeclarations(block) },\n ];\n const media = [\n mediaBlock(\"(prefers-reduced-motion: reduce)\", onRoot(reducedMotionTokens)),\n mediaBlock(\"(forced-colors: active)\", onRoot(forcedColorsTokens)),\n ].join(\"\\n\");\n const body = [...serializeRules(rules), media].join(\"\\n\\n\");\n return layer ? `@layer ${layer} {\\n${body}\\n}\\n` : `${body}\\n`;\n}\n","// Design tokens for mini-programs (WeChat / Taro / uni-app): `tokens.mini.css`.\n//\n// Mini-program style engines (WXSS, Skyline) support CSS variables but not\n// attribute selectors, `color-mix()`, `@layer` or `:where()` / `:is()`, and\n// `rem` is not tied to a configurable root size. So the tokens are scoped by\n// classes and pre-resolved with `resolveTokens` (colors as hex / rgba, lengths\n// in px):\n//\n// page, .mn-root defaults (light, standard design)\n// .mn-theme-dark Minerva's dark mode (no palette)\n// .mn-palette-<p> palette <p>, light\n// .mn-palette-<p>-dark palette <p>, dark\n// .mn-density-<v> .mn-radius-<v> .mn-shadow-<v> .mn-font-scale-<v>\n//\n// One color class at a time (`miniTokenClassNames` builds the list); every\n// class goes on an element that also carries `mn-root` (the tokens are\n// recomputed there, like `[data-minerva-theme-scope]` on the web).\n//\n// Color classes only declare what differs from the defaults and never touch\n// the tokens of the design axes: the shadows of a palette are declared as\n// `--mn-shadow-standard-*` / `--mn-shadow-subtle-*`, which the shadow axis\n// selects (`--shadow-sm: var(--mn-shadow-standard-sm)`). So the palette files\n// can be loaded after the base file in any order without specificity tricks.\nimport {\n DENSITIES,\n FONT_SCALES,\n RADIUS_SCALES,\n SHADOW_SCALES,\n resolveDesign,\n type DesignOptions,\n type ResolvedDesign,\n} from \"../theme/design\";\nimport { PALETTES, type Palette, type ResolvedThemeMode } from \"../theme/mode\";\nimport { serializeRules, type CssRule } from \"./css\";\nimport { densityTokens, fontScaleTokens, radiusTokens } from \"./design\";\nimport { toCss } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\nimport { resolveTokens, tokenKind, type ResolveTokensOptions } from \"./resolve\";\n\n/** Class prefix of the mini-program tokens. */\nexport const MINI_CLASS_PREFIX = \"mn-\";\n\n/** Selector of the default tokens. */\nexport const MINI_ROOT_SELECTOR = `page, .${MINI_CLASS_PREFIX}root`;\n\nconst SHADOW_STEPS = [\"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nconst cls = (...parts: string[]) => `${MINI_CLASS_PREFIX}${parts.join(\"-\")}`;\n\n/** Class of a mode x palette (`null` palette: Minerva's default colors). */\nexport const miniColorClass = (\n mode: ResolvedThemeMode,\n palette: Palette | null,\n): string | null =>\n palette\n ? cls(\"palette\", palette, ...(mode === \"dark\" ? [\"dark\"] : []))\n : mode === \"dark\"\n ? cls(\"theme\", \"dark\")\n : null;\n\n/** Kebab-case class segment of an axis (`fontScale` -> `font-scale`). */\nconst axisClass = (axis: keyof Omit<ResolvedDesign, \"preset\">, value: string) =>\n cls(axis === \"fontScale\" ? \"font-scale\" : axis, value);\n\n/** Standard axis values (declared by the root block: no class needed). */\nconst STANDARD: Omit<ResolvedDesign, \"preset\"> = {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n};\n\n/**\n * Class list of a mini-program token scope, e.g. for the root `<view>` of a\n * page: `mn-root` plus the color class and the non-standard design axes.\n *\n * miniTokenClassNames({ mode: \"dark\", palette: \"tech\", design: { preset: \"touch\" } })\n * // \"mn-root mn-palette-tech-dark mn-density-comfortable mn-radius-large\"\n */\nexport function miniTokenClassNames({\n mode = \"light\",\n palette,\n design,\n}: Pick<ResolveTokensOptions, \"mode\" | \"palette\"> & {\n design?: DesignOptions | ResolvedDesign;\n} = {}): string {\n const resolved = resolveDesign(design);\n const chosen =\n palette === undefined\n ? resolveTokens({ design: resolved }).palette\n : palette;\n const classes = [cls(\"root\")];\n const color = miniColorClass(mode, chosen);\n if (color) classes.push(color);\n for (const axis of Object.keys(STANDARD) as Array<keyof typeof STANDARD>) {\n if (resolved[axis] !== STANDARD[axis]) {\n classes.push(axisClass(axis, resolved[axis]));\n }\n }\n return classes.join(\" \");\n}\n\nconst shadowVar = (scale: \"standard\" | \"subtle\", step: string) =>\n `mn-shadow-${scale}-${step}`;\n\n/**\n * The tokens that vary with the mode x palette (colors, font stacks and the\n * standard / subtle shadows), resolved.\n */\nfunction colorTokens(\n mode: ResolvedThemeMode,\n palette: Palette | null,\n): Map<string, string> {\n const standard = resolveTokens({ mode, palette });\n const subtle = resolveTokens({ mode, palette, design: { shadow: \"subtle\" } });\n const out = new Map<string, string>();\n for (const [name, css] of Object.entries(standard.css)) {\n const kind = tokenKind(name);\n if (kind === \"color\" || name.startsWith(\"font-family-\")) out.set(name, css);\n }\n for (const step of SHADOW_STEPS) {\n out.set(shadowVar(\"standard\", step), standard.css[`shadow-${step}`]);\n out.set(shadowVar(\"subtle\", step), subtle.css[`shadow-${step}`]);\n }\n return out;\n}\n\nconst declarations = (\n entries: Iterable<readonly [string, string]>,\n): CssRule[\"declarations\"] =>\n [...entries].map(([name, value]) => [`--${name}`, value] as const);\n\n/** Entries of `variant` that differ from `base`. */\nconst diff = (variant: Map<string, string>, base: Map<string, string>) =>\n [...variant].filter(([name, value]) => base.get(name) !== value);\n\nconst HEADER = \"/* Minerva design tokens for mini-programs (generated) */\";\n\nconst stylesheet = (rules: CssRule[]) =>\n `${HEADER}\\n${serializeRules(rules).join(\"\\n\\n\")}\\n`;\n\n/** `var(--shadow-*)` when a scale token references a shadow token. */\nfunction shadowRef(name: string): string | undefined {\n const value = scaleTokens[name];\n return typeof value === \"object\" &&\n value.kind === \"ref\" &&\n value.name.startsWith(\"shadow-\")\n ? toCss(value)\n : undefined;\n}\n\n/** Rules of the base file: defaults, dark mode, design axes. */\nfunction baseRules(): CssRule[] {\n const defaults = resolveTokens();\n const light = colorTokens(\"light\", null);\n const root = new Map<string, string>();\n for (const [name, css] of Object.entries(defaults.css)) {\n if (/^shadow-(sm|md|lg|xl)$/.test(name)) {\n root.set(name, `var(--${shadowVar(\"standard\", name.slice(7))})`);\n } else if (shadowRef(name)) {\n // `--elevation-*: var(--shadow-*)` follows the shadow axis\n root.set(name, shadowRef(name)!);\n } else {\n root.set(name, css);\n }\n }\n for (const [name, css] of light) root.set(name, css);\n\n const axis = <V extends string>(\n name: keyof typeof STANDARD,\n values: readonly V[],\n tokens: (value: V) => Map<string, string>,\n ): CssRule[] =>\n values.map((value) => ({\n selectors: [`.${axisClass(name, value)}`],\n declarations: declarations(tokens(value)),\n }));\n const resolvedBlock = (\n block: Record<string, unknown>,\n design: DesignOptions,\n ) => {\n const { css } = resolveTokens({ design });\n return new Map(Object.keys(block).map((name) => [name, css[name]]));\n };\n\n return [\n { selectors: [MINI_ROOT_SELECTOR], declarations: declarations(root) },\n {\n selectors: [`.${miniColorClass(\"dark\", null)}`],\n declarations: declarations(diff(colorTokens(\"dark\", null), light)),\n },\n ...axis(\"density\", DENSITIES, (density) =>\n resolvedBlock(densityTokens[density], { density }),\n ),\n ...axis(\"radius\", RADIUS_SCALES, (radius) =>\n resolvedBlock(radiusTokens[radius], { radius }),\n ),\n ...axis(\n \"shadow\",\n SHADOW_SCALES,\n (shadow) =>\n new Map(\n SHADOW_STEPS.map((step) => [\n `shadow-${step}`,\n shadow === \"none\" ? \"none\" : `var(--${shadowVar(shadow, step)})`,\n ]),\n ),\n ),\n ...axis(\"fontScale\", FONT_SCALES, (fontScale) =>\n resolvedBlock(fontScaleTokens[fontScale], { fontScale }),\n ),\n ];\n}\n\n/** Rules of a palette file: the light and dark color classes. */\nfunction paletteRules(palette: Palette): CssRule[] {\n const light = colorTokens(\"light\", null);\n return ([\"light\", \"dark\"] as const).map((mode) => ({\n selectors: [`.${miniColorClass(mode, palette)}`],\n declarations: declarations(diff(colorTokens(mode, palette), light)),\n }));\n}\n\n/** Options of `generateMiniTokensCss`. */\nexport interface GenerateMiniTokensCssOptions {\n /** Palettes to include (default: all) */\n palettes?: readonly Palette[];\n}\n\n/**\n * `tokens.mini.css`: the class-scoped, pre-resolved tokens for\n * mini-programs (base + the chosen palettes).\n */\nexport function generateMiniTokensCss({\n palettes = PALETTES,\n}: GenerateMiniTokensCssOptions = {}): string {\n return stylesheet([...baseRules(), ...palettes.flatMap(paletteRules)]);\n}\n\n/**\n * The mini-program token files, split for package size budgets:\n *\n * tokens.mini.css everything (base + every palette)\n * tokens.mini.base.css defaults, dark mode, design axes\n * tokens.mini.palette-<name>.css one palette (light + dark); load after\n * the base file\n */\nexport function generateMiniTokensFiles(): Record<string, string> {\n return {\n \"tokens.mini.css\": generateMiniTokensCss(),\n \"tokens.mini.base.css\": generateMiniTokensCss({ palettes: [] }),\n ...Object.fromEntries(\n PALETTES.map((palette) => [\n `tokens.mini.palette-${palette}.css`,\n stylesheet(paletteRules(palette)),\n ]),\n ),\n };\n}\n","{\n \"avatar\": {\n \"default\": \"avatar\",\n \"group\": \"Avatar group\",\n \"groupWithMore\": \"Avatar group with {{count}} more\"\n },\n \"pagination\": {\n \"jumpPrev\": \"Previous 5 pages\",\n \"jumpNext\": \"Next 5 pages\",\n \"prev\": \"Previous page\",\n \"next\": \"Next page\",\n \"page\": \"Page {{page}}\",\n \"total\": \"Total {{total}} items\",\n \"jumpTo\": \"Go to\",\n \"jumpToInput\": \"Jump to page\",\n \"pageSize\": \"Items per page\",\n \"pageSizeOption\": \"{{size}} / page\",\n \"currentPage\": \"Current page\",\n \"nav\": \"Pagination\"\n },\n \"cascader\": {\n \"placeholder\": \"Please select\",\n \"clear\": \"Clear selection\",\n \"noResults\": \"No results found\",\n \"level\": \"{{label}}, level {{level}}\",\n \"options\": \"Options\"\n },\n \"timePicker\": {\n \"placeholder\": \"Select time\",\n \"label\": \"Time\",\n \"clear\": \"Clear time\",\n \"hours\": \"Hours\",\n \"minutes\": \"Minutes\",\n \"seconds\": \"Seconds\",\n \"period\": \"AM/PM\"\n },\n \"common\": {\n \"loading\": \"Loading\"\n },\n \"alert\": {\n \"close\": \"Close\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"icon\": {\n \"info\": \"info icon\",\n \"success\": \"success icon\",\n \"warning\": \"warning icon\",\n \"danger\": \"danger icon\"\n }\n },\n \"badge\": {\n \"default\": \"Badge\"\n },\n \"empty\": {\n \"description\": \"No Data\"\n },\n \"tag\": {\n \"close\": \"Close\",\n \"closeWithLabel\": \"Remove {{label}}\"\n },\n \"input\": {\n \"clear\": \"Clear\",\n \"showPassword\": \"Show password\",\n \"hidePassword\": \"Hide password\"\n },\n \"iconButton\": {\n \"default\": \"icon button\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"No data\",\n \"retry\": \"Retry\",\n \"scrollRegion\": \"Scrollable table\",\n \"selectAll\": \"Select all rows\",\n \"selectRow\": \"Select row {{row}}\"\n },\n \"navTree\": {\n \"label\": \"Navigation\"\n },\n \"dashboard\": {\n \"label\": \"Board\",\n \"empty\": \"No items\",\n \"columnLabel_one\": \"{{title}}, {{count}} item\",\n \"columnLabel_other\": \"{{title}}, {{count}} items\",\n \"dragHint\": \"Press Space or Enter to pick up the card, the arrow keys to move it, Space or Enter to drop it and Escape to cancel.\",\n \"lifted\": \"Picked up {{card}}: position {{position}} of {{total}} in {{column}}.\",\n \"over\": \"{{card}}: position {{position}} of {{total}} in {{column}}.\",\n \"dropped\": \"Dropped {{card}} at position {{position}} of {{total}} in {{column}}.\",\n \"cancelled\": \"Move cancelled: {{card}} stays in {{column}}.\",\n \"moveTo\": \"Move to {{column}}\",\n \"moveUp\": \"Move up\",\n \"moveDown\": \"Move down\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"The editor is unavailable\",\n \"retry\": \"Retry\",\n \"retryLabel\": \"Retry editor\",\n \"loading\": \"Loading editor\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"Media player\",\n \"play\": \"Play\",\n \"pause\": \"Pause\",\n \"skipBack_one\": \"Back {{count}} second\",\n \"skipBack_other\": \"Back {{count}} seconds\",\n \"skipForward_one\": \"Forward {{count}} second\",\n \"skipForward_other\": \"Forward {{count}} seconds\",\n \"seek\": \"Seek\",\n \"timeOf\": \"{{current}} of {{duration}}\",\n \"mute\": \"Mute\",\n \"unmute\": \"Unmute\",\n \"volume\": \"Volume\",\n \"playbackRate\": \"Playback speed {{rate}}\",\n \"fullscreen\": \"Full screen\",\n \"exitFullscreen\": \"Exit full screen\",\n \"pictureInPicture\": \"Picture in picture\",\n \"exitPictureInPicture\": \"Exit picture in picture\",\n \"captions\": \"Captions\",\n \"captionsOff\": \"Off\",\n \"loading\": \"Loading\",\n \"error\": \"This media can't be played\"\n },\n \"flashcard\": {\n \"frontLabel\": \"Question\",\n \"backLabel\": \"Answer\",\n \"hint\": \"Click or press Space to flip\",\n \"label\": \"Flashcard, showing {{face}}\"\n },\n \"loadingState\": {\n \"label\": \"Loading...\"\n },\n \"codeBlock\": {\n \"label\": \"Code\",\n \"copy\": \"Copy code\",\n \"copied\": \"Copied\",\n \"copyFailed\": \"Copy failed\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"Notifications\",\n \"close\": \"Close\",\n \"regionWithHotkey\": \"Notifications ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"Scroll pages left\",\n \"scrollRight\": \"Scroll pages right\",\n \"close\": \"Close {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"Slider\",\n \"minimum\": \"Minimum\",\n \"maximum\": \"Maximum\"\n },\n \"numberInput\": {\n \"increment\": \"Increase\",\n \"decrement\": \"Decrease\",\n \"notANumber\": \"Enter a number\",\n \"belowMin\": \"Minimum {{min}}\",\n \"aboveMax\": \"Maximum {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"Format JSON\",\n \"valid\": \"Valid JSON\",\n \"invalid\": \"Invalid JSON\"\n },\n \"keyValueEditor\": {\n \"key\": \"Key\",\n \"value\": \"Value\",\n \"add\": \"Add entry\",\n \"remove\": \"Remove entry\"\n },\n \"tagInput\": {\n \"add\": \"Add tag\",\n \"clear\": \"Clear tags\",\n \"remove\": \"Remove {{tag}}\",\n \"create\": \"Add \\\"{{tag}}\\\"\",\n \"empty\": \"No matches\"\n },\n \"validation\": {\n \"valueMissing\": \"Please fill out this field.\",\n \"selectMissing\": \"Please select an item in the list.\",\n \"checkMissing\": \"Please check this box if you want to proceed.\",\n \"radioMissing\": \"Please select one of these options.\",\n \"fileMissing\": \"Please select a file.\",\n \"tooShort\": \"Please use at least {{min}} characters.\",\n \"tooLong\": \"Please use at most {{max}} characters.\",\n \"rangeUnderflow\": \"Value must be {{min}} or more.\",\n \"rangeOverflow\": \"Value must be {{max}} or less.\",\n \"badInput\": \"Please enter a valid value.\",\n \"patternMismatch\": \"Please match the requested format.\",\n \"emailMismatch\": \"Please enter a valid email address.\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"Questions\",\n \"summary\": \"{{answered}} / {{total}} answered\",\n \"item\": \"Question {{number}}, {{status}}\",\n \"itemFlagged\": \"Question {{number}}, {{status}}, flagged\",\n \"status\": {\n \"unanswered\": \"unanswered\",\n \"answered\": \"answered\",\n \"correct\": \"correct\",\n \"wrong\": \"wrong\",\n \"skipped\": \"skipped\"\n },\n \"legend\": {\n \"unanswered\": \"Unanswered\",\n \"answered\": \"Answered\",\n \"correct\": \"Correct\",\n \"wrong\": \"Wrong\",\n \"skipped\": \"Skipped\",\n \"flagged\": \"Flagged\"\n }\n },\n \"steps\": {\n \"label\": \"Steps\"\n },\n \"upload\": {\n \"select\": \"Select files\",\n \"uploading\": \"Uploading\",\n \"done\": \"Uploaded\",\n \"failed\": \"Upload failed\",\n \"tooMany\": \"You can select up to {{count}} files\",\n \"invalidType\": \"{{name}}: unsupported file type\",\n \"tooLarge\": \"{{name}}: file exceeds the size limit\",\n \"retry\": \"Retry {{name}}\",\n \"remove\": \"Remove {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"Month calendar\",\n \"previousMonth\": \"Previous month\",\n \"nextMonth\": \"Next month\",\n \"today\": \"Today\",\n \"weekdays\": {\n \"mon\": \"Mon\",\n \"tue\": \"Tue\",\n \"wed\": \"Wed\",\n \"thu\": \"Thu\",\n \"fri\": \"Fri\",\n \"sat\": \"Sat\",\n \"sun\": \"Sun\"\n },\n \"dayWithEvents_one\": \"{{date}}, {{count}} event\",\n \"dayWithEvents_other\": \"{{date}}, {{count}} events\",\n \"eventsLabel\": \"Events on {{date}}\",\n \"noEvents\": \"No events\"\n },\n \"weekStrip\": {\n \"label\": \"Week\",\n \"previousWeek\": \"Previous week\",\n \"nextWeek\": \"Next week\",\n \"dayWithMarkers_one\": \"{{date}}, {{count}} item\",\n \"dayWithMarkers_other\": \"{{date}}, {{count}} items\",\n \"dayMarked\": \"{{date}}, marked\"\n },\n \"datePicker\": {\n \"placeholder\": \"Select date\",\n \"label\": \"Date\",\n \"clear\": \"Clear date\",\n \"today\": \"Today\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"Navigation\",\n \"expand\": \"Expand sidebar\",\n \"collapse\": \"Collapse sidebar\",\n \"enableFloating\": \"Enable floating sidebar\",\n \"disableFloating\": \"Disable floating sidebar\",\n \"openNavigation\": \"Open navigation\",\n \"closeNavigation\": \"Close navigation\",\n \"skipToContent\": \"Skip to content\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"Cancel\" },\n \"picker\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"placeholder\": \"Please select\",\n \"selected\": \"{{label}}, selected\",\n \"column\": \"Column {{index}}\"\n },\n \"searchBar\": {\n \"label\": \"Search\",\n \"placeholder\": \"Search\",\n \"cancel\": \"Cancel\",\n \"clear\": \"Clear search\"\n },\n \"navBar\": { \"back\": \"Back\" },\n \"tabBar\": { \"label\": \"Tab bar\" },\n \"pullRefresh\": {\n \"pulling\": \"Pull to refresh\",\n \"loosing\": \"Release to refresh\",\n \"loading\": \"Refreshing...\",\n \"success\": \"Refreshed\"\n },\n \"swipeCell\": { \"actions\": \"More actions\" },\n \"datetimePicker\": {\n \"title\": \"Select date\",\n \"titleTime\": \"Select time\",\n \"year\": \"Year\",\n \"month\": \"Month\",\n \"day\": \"Day\",\n \"hour\": \"Hour\",\n \"minute\": \"Minute\"\n },\n \"calendar\": {\n \"title\": \"Select date\",\n \"confirm\": \"Confirm\",\n \"monthTitle\": \"{{month}}/{{year}}\",\n \"rangeStart\": \"Start\",\n \"rangeEnd\": \"End\"\n },\n \"imagePreview\": {\n \"label\": \"Image preview\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"Close preview\"\n },\n \"collapse\": { \"expand\": \"Expand\", \"collapse\": \"Collapse\" },\n \"rating\": { \"label\": \"Rating\", \"value\": \"{{value}} of {{max}}\" },\n \"progress\": { \"label\": \"Progress\" },\n \"form\": { \"submit\": \"Submit\", \"reset\": \"Reset\", \"required\": \"required\" },\n \"paginationSimple\": { \"pageOf\": \"Page {{page}} of {{total}}\" },\n \"stepStatus\": { \"finish\": \"Completed\", \"process\": \"In progress\", \"wait\": \"Waiting\", \"error\": \"Error\" },\n \"presetToggle\": { \"label\": \"Current preset {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"Editorial\", \"compact\": \"Compact\", \"touch\": \"Touch\" }\n}\n","{\n \"modal\": {\n \"close\": \"Close\"\n },\n \"drawer\": {\n \"close\": \"Close\",\n \"description\": \"Drawer content\"\n },\n \"confirm\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"delete\": \"Delete\"\n },\n \"command\": {\n \"title\": \"Command palette\",\n \"description\": \"Search and jump to modules, settings pages or actions.\",\n \"placeholder\": \"Search commands, paths or keywords\",\n \"empty\": \"No matching results\",\n \"results\": \"Command results\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"Current theme {{theme}}\",\n \"light\": \"Light\",\n \"dark\": \"Dark\",\n \"system\": \"System\"\n },\n \"paletteToggle\": {\n \"label\": \"Current palette {{palette}}\",\n \"default\": \"Default\",\n \"editorial\": \"Editorial\",\n \"tech\": \"Tech\",\n \"graphite\": \"Graphite\",\n \"cool\": \"Cool\"\n }\n}\n","/**\n * A tree of translated strings: nested namespaces whose leaves are message\n * strings (may contain `{{placeholder}}` interpolations).\n */\nexport type Messages = { [key: string]: Messages | string };\n\nconst isObject = (value: unknown): value is Messages =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/** Deep-merge translation objects (later sources win). */\nexport function mergeMessages<T extends object>(\n base: T,\n ...sources: object[]\n): T {\n const out: Messages = { ...(base as Messages) };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source as Messages)) {\n const prev = out[key];\n out[key] =\n isObject(prev) && isObject(value) ? mergeMessages(prev, value) : value;\n }\n }\n return out as T;\n}\n","import enIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n enIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"avatar\",\n \"group\": \"Groupe d'avatars\",\n \"groupWithMore\": \"Groupe d'avatars, {{count}} de plus\"\n },\n \"pagination\": {\n \"jumpPrev\": \"5 pages précédentes\",\n \"jumpNext\": \"5 pages suivantes\",\n \"prev\": \"Page précédente\",\n \"next\": \"Page suivante\",\n \"page\": \"Page {{page}}\",\n \"total\": \"Total : {{total}} éléments\",\n \"jumpTo\": \"Aller à\",\n \"jumpToInput\": \"Aller à la page\",\n \"pageSize\": \"Éléments par page\",\n \"pageSizeOption\": \"{{size}} / page\",\n \"currentPage\": \"Page actuelle\",\n \"nav\": \"Pagination\"\n },\n \"cascader\": {\n \"placeholder\": \"Veuillez choisir\",\n \"clear\": \"Effacer la sélection\",\n \"noResults\": \"Aucun résultat\",\n \"level\": \"{{label}}, niveau {{level}}\",\n \"options\": \"Options\"\n },\n \"timePicker\": {\n \"placeholder\": \"Choisir l'heure\",\n \"label\": \"Heure\",\n \"clear\": \"Effacer l'heure\",\n \"hours\": \"Heures\",\n \"minutes\": \"Minutes\",\n \"seconds\": \"Secondes\",\n \"period\": \"AM/PM\"\n },\n \"common\": {\n \"loading\": \"Chargement\"\n },\n \"alert\": {\n \"close\": \"Fermer\",\n \"expand\": \"Développer\",\n \"collapse\": \"Réduire\",\n \"icon\": {\n \"info\": \"icône d'information\",\n \"success\": \"icône de succès\",\n \"warning\": \"icône d'avertissement\",\n \"danger\": \"icône d'erreur\"\n }\n },\n \"badge\": {\n \"default\": \"Badge\"\n },\n \"empty\": {\n \"description\": \"Aucune donnée\"\n },\n \"tag\": {\n \"close\": \"Fermer\",\n \"closeWithLabel\": \"Supprimer {{label}}\"\n },\n \"input\": {\n \"clear\": \"Effacer\",\n \"showPassword\": \"Afficher le mot de passe\",\n \"hidePassword\": \"Masquer le mot de passe\"\n },\n \"iconButton\": {\n \"default\": \"bouton icône\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"Aucune donnée\",\n \"retry\": \"Réessayer\",\n \"scrollRegion\": \"Tableau défilant\",\n \"selectAll\": \"Sélectionner toutes les lignes\",\n \"selectRow\": \"Sélectionner la ligne {{row}}\"\n },\n \"dashboard\": {\n \"label\": \"Tableau\",\n \"empty\": \"Aucun élément\",\n \"columnLabel_one\": \"{{title}}, {{count}} élément\",\n \"columnLabel_other\": \"{{title}}, {{count}} éléments\",\n \"dragHint\": \"Appuyez sur Espace ou Entrée pour saisir la carte, sur les flèches pour la déplacer, sur Espace ou Entrée pour la déposer et sur Échap pour annuler.\",\n \"lifted\": \"{{card}} saisie : position {{position}} sur {{total}} dans {{column}}.\",\n \"over\": \"{{card}} : position {{position}} sur {{total}} dans {{column}}.\",\n \"dropped\": \"{{card}} déposée en position {{position}} sur {{total}} dans {{column}}.\",\n \"cancelled\": \"Déplacement annulé : {{card}} reste dans {{column}}.\",\n \"moveTo\": \"Déplacer vers {{column}}\",\n \"moveUp\": \"Monter\",\n \"moveDown\": \"Descendre\"\n },\n \"navTree\": {\n \"label\": \"Navigation\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"L'éditeur est indisponible\",\n \"retry\": \"Réessayer\",\n \"retryLabel\": \"Réessayer l'éditeur\",\n \"loading\": \"Chargement de l'éditeur\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"Lecteur multimédia\",\n \"play\": \"Lecture\",\n \"pause\": \"Pause\",\n \"skipBack_one\": \"Reculer de {{count}} seconde\",\n \"skipBack_other\": \"Reculer de {{count}} secondes\",\n \"skipForward_one\": \"Avancer de {{count}} seconde\",\n \"skipForward_other\": \"Avancer de {{count}} secondes\",\n \"seek\": \"Position de lecture\",\n \"timeOf\": \"{{current}} sur {{duration}}\",\n \"mute\": \"Couper le son\",\n \"unmute\": \"Rétablir le son\",\n \"volume\": \"Volume\",\n \"playbackRate\": \"Vitesse de lecture {{rate}}\",\n \"fullscreen\": \"Plein écran\",\n \"exitFullscreen\": \"Quitter le plein écran\",\n \"pictureInPicture\": \"Image dans l’image\",\n \"exitPictureInPicture\": \"Quitter l’image dans l’image\",\n \"captions\": \"Sous-titres\",\n \"captionsOff\": \"Désactivés\",\n \"loading\": \"Chargement\",\n \"error\": \"Ce média ne peut pas être lu\"\n },\n \"flashcard\": {\n \"frontLabel\": \"Question\",\n \"backLabel\": \"Réponse\",\n \"hint\": \"Cliquez ou appuyez sur Espace pour retourner\",\n \"label\": \"Carte mémoire, {{face}} affichée\"\n },\n \"loadingState\": {\n \"label\": \"Chargement...\"\n },\n \"codeBlock\": {\n \"label\": \"Code\",\n \"copy\": \"Copier le code\",\n \"copied\": \"Copié\",\n \"copyFailed\": \"Échec de la copie\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"Notifications\",\n \"close\": \"Fermer\",\n \"regionWithHotkey\": \"Notifications ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"Faire défiler les pages vers la gauche\",\n \"scrollRight\": \"Faire défiler les pages vers la droite\",\n \"close\": \"Fermer {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"Curseur\",\n \"minimum\": \"Minimum\",\n \"maximum\": \"Maximum\"\n },\n \"numberInput\": {\n \"increment\": \"Augmenter\",\n \"decrement\": \"Diminuer\",\n \"notANumber\": \"Saisissez un nombre\",\n \"belowMin\": \"Minimum {{min}}\",\n \"aboveMax\": \"Maximum {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"Formater le JSON\",\n \"valid\": \"JSON valide\",\n \"invalid\": \"JSON invalide\"\n },\n \"keyValueEditor\": {\n \"key\": \"Clé\",\n \"value\": \"Valeur\",\n \"add\": \"Ajouter une entrée\",\n \"remove\": \"Supprimer l’entrée\"\n },\n \"tagInput\": {\n \"add\": \"Ajouter une étiquette\",\n \"clear\": \"Effacer les étiquettes\",\n \"remove\": \"Retirer {{tag}}\",\n \"create\": \"Ajouter « {{tag}} »\",\n \"empty\": \"Aucun résultat\"\n },\n \"validation\": {\n \"valueMissing\": \"Veuillez renseigner ce champ.\",\n \"selectMissing\": \"Veuillez sélectionner un élément de la liste.\",\n \"checkMissing\": \"Veuillez cocher cette case pour continuer.\",\n \"radioMissing\": \"Veuillez sélectionner l’une de ces options.\",\n \"fileMissing\": \"Veuillez sélectionner un fichier.\",\n \"tooShort\": \"Veuillez utiliser au moins {{min}} caractères.\",\n \"tooLong\": \"Veuillez utiliser au plus {{max}} caractères.\",\n \"rangeUnderflow\": \"La valeur doit être supérieure ou égale à {{min}}.\",\n \"rangeOverflow\": \"La valeur doit être inférieure ou égale à {{max}}.\",\n \"badInput\": \"Veuillez saisir une valeur valide.\",\n \"patternMismatch\": \"Veuillez respecter le format requis.\",\n \"emailMismatch\": \"Veuillez saisir une adresse e-mail valide.\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"Questions\",\n \"summary\": \"{{answered}} / {{total}} répondues\",\n \"item\": \"Question {{number}}, {{status}}\",\n \"itemFlagged\": \"Question {{number}}, {{status}}, marquée\",\n \"status\": {\n \"unanswered\": \"sans réponse\",\n \"answered\": \"répondue\",\n \"correct\": \"correcte\",\n \"wrong\": \"incorrecte\",\n \"skipped\": \"passée\"\n },\n \"legend\": {\n \"unanswered\": \"Sans réponse\",\n \"answered\": \"Répondue\",\n \"correct\": \"Correcte\",\n \"wrong\": \"Incorrecte\",\n \"skipped\": \"Passée\",\n \"flagged\": \"Marquée\"\n }\n },\n \"steps\": {\n \"label\": \"Étapes\"\n },\n \"upload\": {\n \"select\": \"Choisir des fichiers\",\n \"uploading\": \"Envoi en cours\",\n \"done\": \"Envoyé\",\n \"failed\": \"Échec de l’envoi\",\n \"tooMany\": \"Vous pouvez choisir au maximum {{count}} fichiers\",\n \"invalidType\": \"{{name}} : type de fichier non pris en charge\",\n \"tooLarge\": \"{{name}} : le fichier dépasse la taille maximale\",\n \"retry\": \"Réessayer {{name}}\",\n \"remove\": \"Retirer {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"Calendrier mensuel\",\n \"previousMonth\": \"Mois précédent\",\n \"nextMonth\": \"Mois suivant\",\n \"today\": \"Aujourd’hui\",\n \"weekdays\": {\n \"mon\": \"lun.\",\n \"tue\": \"mar.\",\n \"wed\": \"mer.\",\n \"thu\": \"jeu.\",\n \"fri\": \"ven.\",\n \"sat\": \"sam.\",\n \"sun\": \"dim.\"\n },\n \"dayWithEvents_one\": \"{{date}}, {{count}} événement\",\n \"dayWithEvents_other\": \"{{date}}, {{count}} événements\",\n \"eventsLabel\": \"Événements du {{date}}\",\n \"noEvents\": \"Aucun événement\"\n },\n \"weekStrip\": {\n \"label\": \"Semaine\",\n \"previousWeek\": \"Semaine précédente\",\n \"nextWeek\": \"Semaine suivante\",\n \"dayWithMarkers_one\": \"{{date}}, {{count}} élément\",\n \"dayWithMarkers_other\": \"{{date}}, {{count}} éléments\",\n \"dayMarked\": \"{{date}}, marqué\"\n },\n \"datePicker\": {\n \"placeholder\": \"Choisir une date\",\n \"label\": \"Date\",\n \"clear\": \"Effacer la date\",\n \"today\": \"Aujourd’hui\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"Navigation\",\n \"expand\": \"Déplier la barre latérale\",\n \"collapse\": \"Replier la barre latérale\",\n \"enableFloating\": \"Activer la barre latérale flottante\",\n \"disableFloating\": \"Désactiver la barre latérale flottante\",\n \"openNavigation\": \"Ouvrir la navigation\",\n \"closeNavigation\": \"Fermer la navigation\",\n \"skipToContent\": \"Aller au contenu\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"Annuler\" },\n \"picker\": {\n \"confirm\": \"Confirmer\",\n \"cancel\": \"Annuler\",\n \"placeholder\": \"Veuillez sélectionner\",\n \"selected\": \"{{label}}, sélectionné\",\n \"column\": \"Colonne {{index}}\"\n },\n \"searchBar\": {\n \"label\": \"Rechercher\",\n \"placeholder\": \"Rechercher\",\n \"cancel\": \"Annuler\",\n \"clear\": \"Effacer la recherche\"\n },\n \"navBar\": { \"back\": \"Retour\" },\n \"tabBar\": { \"label\": \"Barre d'onglets\" },\n \"pullRefresh\": {\n \"pulling\": \"Tirer pour actualiser\",\n \"loosing\": \"Relâcher pour actualiser\",\n \"loading\": \"Actualisation...\",\n \"success\": \"Actualisé\"\n },\n \"swipeCell\": { \"actions\": \"Plus d'actions\" },\n \"datetimePicker\": {\n \"title\": \"Choisir une date\",\n \"titleTime\": \"Choisir une heure\",\n \"year\": \"Année\",\n \"month\": \"Mois\",\n \"day\": \"Jour\",\n \"hour\": \"Heure\",\n \"minute\": \"Minute\"\n },\n \"calendar\": {\n \"title\": \"Choisir une date\",\n \"confirm\": \"Confirmer\",\n \"monthTitle\": \"{{month}}/{{year}}\",\n \"rangeStart\": \"Début\",\n \"rangeEnd\": \"Fin\"\n },\n \"imagePreview\": {\n \"label\": \"Aperçu de l'image\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"Fermer l'aperçu\"\n },\n \"collapse\": { \"expand\": \"Déplier\", \"collapse\": \"Replier\" },\n \"rating\": { \"label\": \"Note\", \"value\": \"{{value}} sur {{max}}\" },\n \"progress\": { \"label\": \"Progression\" },\n \"form\": { \"submit\": \"Envoyer\", \"reset\": \"Réinitialiser\", \"required\": \"obligatoire\" },\n \"paginationSimple\": { \"pageOf\": \"Page {{page}} sur {{total}}\" },\n \"stepStatus\": { \"finish\": \"Terminé\", \"process\": \"En cours\", \"wait\": \"En attente\", \"error\": \"Erreur\" },\n \"presetToggle\": { \"label\": \"Préréglage actuel {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"Éditorial\", \"compact\": \"Compact\", \"touch\": \"Tactile\" }\n}\n","{\n \"modal\": {\n \"close\": \"Fermer\"\n },\n \"drawer\": {\n \"close\": \"Fermer\",\n \"description\": \"Contenu du tiroir\"\n },\n \"confirm\": {\n \"confirm\": \"Confirmer\",\n \"cancel\": \"Annuler\",\n \"delete\": \"Supprimer\"\n },\n \"command\": {\n \"title\": \"Palette de commandes\",\n \"description\": \"Recherchez et accédez aux modules, pages de réglages ou actions.\",\n \"placeholder\": \"Rechercher des commandes, chemins ou mots-clés\",\n \"empty\": \"Aucun résultat correspondant\",\n \"results\": \"Résultats des commandes\",\n \"enter\": \"Entrée\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"Thème actuel {{theme}}\",\n \"light\": \"Clair\",\n \"dark\": \"Sombre\",\n \"system\": \"Système\"\n },\n \"paletteToggle\": {\n \"label\": \"Palette actuelle {{palette}}\",\n \"default\": \"Par défaut\",\n \"editorial\": \"Éditorial\",\n \"tech\": \"Tech\",\n \"graphite\": \"Graphite\",\n \"cool\": \"Froid\"\n }\n}\n","import frIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n frIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"アバター\",\n \"group\": \"アバターグループ\",\n \"groupWithMore\": \"アバターグループ(ほか {{count}} 人)\"\n },\n \"pagination\": {\n \"jumpPrev\": \"前の 5 ページ\",\n \"jumpNext\": \"次の 5 ページ\",\n \"prev\": \"前のページ\",\n \"next\": \"次のページ\",\n \"page\": \"{{page}} ページ\",\n \"total\": \"全 {{total}} 件\",\n \"jumpTo\": \"移動\",\n \"jumpToInput\": \"ページを指定して移動\",\n \"pageSize\": \"1 ページあたりの件数\",\n \"pageSizeOption\": \"{{size}} 件 / ページ\",\n \"currentPage\": \"現在のページ\",\n \"nav\": \"ページネーション\"\n },\n \"cascader\": {\n \"placeholder\": \"選択してください\",\n \"clear\": \"選択をクリア\",\n \"noResults\": \"該当する項目がありません\",\n \"level\": \"{{label}}、レベル {{level}}\",\n \"options\": \"選択肢\"\n },\n \"timePicker\": {\n \"placeholder\": \"時刻を選択\",\n \"label\": \"時刻\",\n \"clear\": \"時刻をクリア\",\n \"hours\": \"時\",\n \"minutes\": \"分\",\n \"seconds\": \"秒\",\n \"period\": \"午前/午後\"\n },\n \"common\": {\n \"loading\": \"読み込み中\"\n },\n \"alert\": {\n \"close\": \"閉じる\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"icon\": {\n \"info\": \"情報アイコン\",\n \"success\": \"成功アイコン\",\n \"warning\": \"警告アイコン\",\n \"danger\": \"エラーアイコン\"\n }\n },\n \"badge\": {\n \"default\": \"バッジ\"\n },\n \"empty\": {\n \"description\": \"データがありません\"\n },\n \"tag\": {\n \"close\": \"閉じる\",\n \"closeWithLabel\": \"{{label}} を削除\"\n },\n \"input\": {\n \"clear\": \"クリア\",\n \"showPassword\": \"パスワードを表示\",\n \"hidePassword\": \"パスワードを隠す\"\n },\n \"iconButton\": {\n \"default\": \"アイコンボタン\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"データがありません\",\n \"retry\": \"再試行\",\n \"scrollRegion\": \"スクロール可能な表\",\n \"selectAll\": \"すべての行を選択\",\n \"selectRow\": \"行 {{row}} を選択\"\n },\n \"dashboard\": {\n \"label\": \"ボード\",\n \"empty\": \"項目はありません\",\n \"columnLabel_one\": \"{{title}}、{{count}} 件\",\n \"columnLabel_other\": \"{{title}}、{{count}} 件\",\n \"dragHint\": \"Space キーまたは Enter キーでカードを持ち上げ、矢印キーで移動し、Space キーまたは Enter キーで置きます。Escape キーで取り消します。\",\n \"lifted\": \"{{card}} を持ち上げました:{{column}} の {{total}} 件中 {{position}} 番目。\",\n \"over\": \"{{card}}:{{column}} の {{total}} 件中 {{position}} 番目。\",\n \"dropped\": \"{{card}} を {{column}} の {{total}} 件中 {{position}} 番目に置きました。\",\n \"cancelled\": \"移動を取り消しました:{{card}} は {{column}} のままです。\",\n \"moveTo\": \"{{column}} に移動\",\n \"moveUp\": \"上へ移動\",\n \"moveDown\": \"下へ移動\"\n },\n \"navTree\": {\n \"label\": \"ナビゲーション\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"エディターを利用できません\",\n \"retry\": \"再試行\",\n \"retryLabel\": \"エディターを再読み込み\",\n \"loading\": \"エディターを読み込み中\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"メディアプレーヤー\",\n \"play\": \"再生\",\n \"pause\": \"一時停止\",\n \"skipBack_one\": \"{{count}} 秒戻る\",\n \"skipBack_other\": \"{{count}} 秒戻る\",\n \"skipForward_one\": \"{{count}} 秒進む\",\n \"skipForward_other\": \"{{count}} 秒進む\",\n \"seek\": \"再生位置\",\n \"timeOf\": \"{{current}} / {{duration}}\",\n \"mute\": \"ミュート\",\n \"unmute\": \"ミュート解除\",\n \"volume\": \"音量\",\n \"playbackRate\": \"再生速度 {{rate}}\",\n \"fullscreen\": \"全画面表示\",\n \"exitFullscreen\": \"全画面表示を終了\",\n \"pictureInPicture\": \"ピクチャーインピクチャー\",\n \"exitPictureInPicture\": \"ピクチャーインピクチャーを終了\",\n \"captions\": \"字幕\",\n \"captionsOff\": \"オフ\",\n \"loading\": \"読み込み中\",\n \"error\": \"このメディアは再生できません\"\n },\n \"flashcard\": {\n \"frontLabel\": \"問題\",\n \"backLabel\": \"解答\",\n \"hint\": \"クリックまたはスペースキーで裏返す\",\n \"label\": \"フラッシュカード、{{face}}を表示中\"\n },\n \"loadingState\": {\n \"label\": \"読み込み中...\"\n },\n \"codeBlock\": {\n \"label\": \"コード\",\n \"copy\": \"コードをコピー\",\n \"copied\": \"コピーしました\",\n \"copyFailed\": \"コピーに失敗しました\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"通知\",\n \"close\": \"閉じる\",\n \"regionWithHotkey\": \"通知 ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"ページタブを左へスクロール\",\n \"scrollRight\": \"ページタブを右へスクロール\",\n \"close\": \"{{label}} を閉じる\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"スライダー\",\n \"minimum\": \"最小値\",\n \"maximum\": \"最大値\"\n },\n \"numberInput\": {\n \"increment\": \"増やす\",\n \"decrement\": \"減らす\",\n \"notANumber\": \"数値を入力してください\",\n \"belowMin\": \"最小値 {{min}}\",\n \"aboveMax\": \"最大値 {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"JSON を整形\",\n \"valid\": \"有効な JSON\",\n \"invalid\": \"無効な JSON\"\n },\n \"keyValueEditor\": {\n \"key\": \"キー\",\n \"value\": \"値\",\n \"add\": \"項目を追加\",\n \"remove\": \"項目を削除\"\n },\n \"tagInput\": {\n \"add\": \"タグを追加\",\n \"clear\": \"タグをクリア\",\n \"remove\": \"{{tag}} を削除\",\n \"create\": \"「{{tag}}」を追加\",\n \"empty\": \"一致する項目がありません\"\n },\n \"validation\": {\n \"valueMissing\": \"このフィールドを入力してください。\",\n \"selectMissing\": \"リストから項目を選択してください。\",\n \"checkMissing\": \"続行するにはこのボックスをオンにしてください。\",\n \"radioMissing\": \"いずれかのオプションを選択してください。\",\n \"fileMissing\": \"ファイルを選択してください。\",\n \"tooShort\": \"{{min}} 文字以上で入力してください。\",\n \"tooLong\": \"{{max}} 文字以内で入力してください。\",\n \"rangeUnderflow\": \"{{min}} 以上の値を入力してください。\",\n \"rangeOverflow\": \"{{max}} 以下の値を入力してください。\",\n \"badInput\": \"有効な値を入力してください。\",\n \"patternMismatch\": \"指定されている形式で入力してください。\",\n \"emailMismatch\": \"有効なメールアドレスを入力してください。\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"問題\",\n \"summary\": \"{{answered}} / {{total}} 問回答済み\",\n \"item\": \"問題 {{number}}、{{status}}\",\n \"itemFlagged\": \"問題 {{number}}、{{status}}、フラグ付き\",\n \"status\": {\n \"unanswered\": \"未回答\",\n \"answered\": \"回答済み\",\n \"correct\": \"正解\",\n \"wrong\": \"不正解\",\n \"skipped\": \"スキップ\"\n },\n \"legend\": {\n \"unanswered\": \"未回答\",\n \"answered\": \"回答済み\",\n \"correct\": \"正解\",\n \"wrong\": \"不正解\",\n \"skipped\": \"スキップ\",\n \"flagged\": \"フラグ付き\"\n }\n },\n \"steps\": {\n \"label\": \"ステップ\"\n },\n \"upload\": {\n \"select\": \"ファイルを選択\",\n \"uploading\": \"アップロード中\",\n \"done\": \"アップロード完了\",\n \"failed\": \"アップロード失敗\",\n \"tooMany\": \"選択できるファイルは最大 {{count}} 個です\",\n \"invalidType\": \"{{name}}:対応していないファイル形式です\",\n \"tooLarge\": \"{{name}}:ファイルサイズが上限を超えています\",\n \"retry\": \"{{name}} を再試行\",\n \"remove\": \"{{name}} を削除\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"月間カレンダー\",\n \"previousMonth\": \"前の月\",\n \"nextMonth\": \"次の月\",\n \"today\": \"今日\",\n \"weekdays\": {\n \"mon\": \"月\",\n \"tue\": \"火\",\n \"wed\": \"水\",\n \"thu\": \"木\",\n \"fri\": \"金\",\n \"sat\": \"土\",\n \"sun\": \"日\"\n },\n \"dayWithEvents_one\": \"{{date}}、予定 {{count}} 件\",\n \"dayWithEvents_other\": \"{{date}}、予定 {{count}} 件\",\n \"eventsLabel\": \"{{date}} の予定\",\n \"noEvents\": \"予定はありません\"\n },\n \"weekStrip\": {\n \"label\": \"週\",\n \"previousWeek\": \"前の週\",\n \"nextWeek\": \"次の週\",\n \"dayWithMarkers_one\": \"{{date}}、{{count}} 件\",\n \"dayWithMarkers_other\": \"{{date}}、{{count}} 件\",\n \"dayMarked\": \"{{date}}、マークあり\"\n },\n \"datePicker\": {\n \"placeholder\": \"日付を選択\",\n \"label\": \"日付\",\n \"clear\": \"日付をクリア\",\n \"today\": \"今日\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"ナビゲーション\",\n \"expand\": \"サイドバーを展開\",\n \"collapse\": \"サイドバーを折りたたむ\",\n \"enableFloating\": \"フローティングサイドバーを有効にする\",\n \"disableFloating\": \"フローティングサイドバーを無効にする\",\n \"openNavigation\": \"ナビゲーションを開く\",\n \"closeNavigation\": \"ナビゲーションを閉じる\",\n \"skipToContent\": \"コンテンツへスキップ\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"キャンセル\" },\n \"picker\": {\n \"confirm\": \"確定\",\n \"cancel\": \"キャンセル\",\n \"placeholder\": \"選択してください\",\n \"selected\": \"{{label}}、選択済み\",\n \"column\": \"{{index}} 列目\"\n },\n \"searchBar\": {\n \"label\": \"検索\",\n \"placeholder\": \"検索\",\n \"cancel\": \"キャンセル\",\n \"clear\": \"検索をクリア\"\n },\n \"navBar\": { \"back\": \"戻る\" },\n \"tabBar\": { \"label\": \"タブバー\" },\n \"pullRefresh\": {\n \"pulling\": \"引っ張って更新\",\n \"loosing\": \"離して更新\",\n \"loading\": \"更新中...\",\n \"success\": \"更新しました\"\n },\n \"swipeCell\": { \"actions\": \"その他の操作\" },\n \"datetimePicker\": {\n \"title\": \"日付を選択\",\n \"titleTime\": \"時刻を選択\",\n \"year\": \"年\",\n \"month\": \"月\",\n \"day\": \"日\",\n \"hour\": \"時\",\n \"minute\": \"分\"\n },\n \"calendar\": {\n \"title\": \"日付を選択\",\n \"confirm\": \"確定\",\n \"monthTitle\": \"{{year}}年{{month}}月\",\n \"rangeStart\": \"開始\",\n \"rangeEnd\": \"終了\"\n },\n \"imagePreview\": {\n \"label\": \"画像プレビュー\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"プレビューを閉じる\"\n },\n \"collapse\": { \"expand\": \"展開\", \"collapse\": \"折りたたむ\" },\n \"rating\": { \"label\": \"評価\", \"value\": \"{{max}} 中 {{value}}\" },\n \"progress\": { \"label\": \"進捗\" },\n \"form\": { \"submit\": \"送信\", \"reset\": \"リセット\", \"required\": \"必須\" },\n \"paginationSimple\": { \"pageOf\": \"{{total}} ページ中 {{page}} ページ\" },\n \"stepStatus\": { \"finish\": \"完了\", \"process\": \"進行中\", \"wait\": \"待機中\", \"error\": \"エラー\" },\n \"presetToggle\": { \"label\": \"現在のプリセット {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"エディトリアル\", \"compact\": \"コンパクト\", \"touch\": \"タッチ\" }\n}\n","{\n \"modal\": {\n \"close\": \"閉じる\"\n },\n \"drawer\": {\n \"close\": \"閉じる\",\n \"description\": \"ドロワーの内容\"\n },\n \"confirm\": {\n \"confirm\": \"確認\",\n \"cancel\": \"キャンセル\",\n \"delete\": \"削除\"\n },\n \"command\": {\n \"title\": \"コマンドパレット\",\n \"description\": \"モジュール、設定ページ、操作を検索して移動します。\",\n \"placeholder\": \"コマンド、パス、キーワードを検索\",\n \"empty\": \"一致する結果がありません\",\n \"results\": \"コマンドの結果\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"現在のテーマ {{theme}}\",\n \"light\": \"ライト\",\n \"dark\": \"ダーク\",\n \"system\": \"システム\"\n },\n \"paletteToggle\": {\n \"label\": \"現在のパレット {{palette}}\",\n \"default\": \"デフォルト\",\n \"editorial\": \"エディトリアル\",\n \"tech\": \"テック\",\n \"graphite\": \"グラファイト\",\n \"cool\": \"クール\"\n }\n}\n","import jaIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n jaIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"头像\",\n \"group\": \"头像组\",\n \"groupWithMore\": \"头像组,另有 {{count}} 位\"\n },\n \"pagination\": {\n \"jumpPrev\": \"向前 5 页\",\n \"jumpNext\": \"向后 5 页\",\n \"prev\": \"上一页\",\n \"next\": \"下一页\",\n \"page\": \"第 {{page}} 页\",\n \"total\": \"共 {{total}} 条\",\n \"jumpTo\": \"跳至\",\n \"jumpToInput\": \"跳转到指定页\",\n \"pageSize\": \"每页条数\",\n \"pageSizeOption\": \"{{size}} 条/页\",\n \"currentPage\": \"当前页\",\n \"nav\": \"分页\"\n },\n \"cascader\": {\n \"placeholder\": \"请选择\",\n \"clear\": \"清除选择\",\n \"noResults\": \"无匹配结果\",\n \"level\": \"{{label}},第 {{level}} 级\",\n \"options\": \"选项\"\n },\n \"timePicker\": {\n \"placeholder\": \"选择时间\",\n \"label\": \"时间\",\n \"clear\": \"清除时间\",\n \"hours\": \"时\",\n \"minutes\": \"分\",\n \"seconds\": \"秒\",\n \"period\": \"上午/下午\"\n },\n \"common\": {\n \"loading\": \"加载中\"\n },\n \"alert\": {\n \"close\": \"关闭\",\n \"expand\": \"展开\",\n \"collapse\": \"收起\",\n \"icon\": {\n \"info\": \"信息图标\",\n \"success\": \"成功图标\",\n \"warning\": \"警告图标\",\n \"danger\": \"错误图标\"\n }\n },\n \"badge\": {\n \"default\": \"徽标\"\n },\n \"empty\": {\n \"description\": \"暂无数据\"\n },\n \"tag\": {\n \"close\": \"关闭\",\n \"closeWithLabel\": \"移除 {{label}}\"\n },\n \"input\": {\n \"clear\": \"清除\",\n \"showPassword\": \"显示密码\",\n \"hidePassword\": \"隐藏密码\"\n },\n \"iconButton\": {\n \"default\": \"图标按钮\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"暂无数据\",\n \"retry\": \"重试\",\n \"scrollRegion\": \"可滚动表格\",\n \"selectAll\": \"选择所有行\",\n \"selectRow\": \"选择行 {{row}}\"\n },\n \"dashboard\": {\n \"label\": \"分栏面板\",\n \"empty\": \"暂无项目\",\n \"columnLabel_one\": \"{{title}},{{count}} 项\",\n \"columnLabel_other\": \"{{title}},{{count}} 项\",\n \"dragHint\": \"按空格键或回车键拿起卡片,用方向键移动,再按空格键或回车键放下,按 Esc 键取消。\",\n \"lifted\": \"已拿起 {{card}}:位于 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"over\": \"{{card}}:位于 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"dropped\": \"已将 {{card}} 放到 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"cancelled\": \"已取消移动:{{card}} 仍在 {{column}}。\",\n \"moveTo\": \"移到 {{column}}\",\n \"moveUp\": \"上移\",\n \"moveDown\": \"下移\"\n },\n \"navTree\": {\n \"label\": \"导航\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"编辑器暂不可用\",\n \"retry\": \"重试\",\n \"retryLabel\": \"重试编辑器\",\n \"loading\": \"加载编辑器\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"媒体播放器\",\n \"play\": \"播放\",\n \"pause\": \"暂停\",\n \"skipBack_one\": \"后退 {{count}} 秒\",\n \"skipBack_other\": \"后退 {{count}} 秒\",\n \"skipForward_one\": \"快进 {{count}} 秒\",\n \"skipForward_other\": \"快进 {{count}} 秒\",\n \"seek\": \"播放进度\",\n \"timeOf\": \"{{current}} / {{duration}}\",\n \"mute\": \"静音\",\n \"unmute\": \"取消静音\",\n \"volume\": \"音量\",\n \"playbackRate\": \"播放速度 {{rate}}\",\n \"fullscreen\": \"全屏\",\n \"exitFullscreen\": \"退出全屏\",\n \"pictureInPicture\": \"画中画\",\n \"exitPictureInPicture\": \"退出画中画\",\n \"captions\": \"字幕\",\n \"captionsOff\": \"关闭\",\n \"loading\": \"加载中\",\n \"error\": \"无法播放此媒体\"\n },\n \"flashcard\": {\n \"frontLabel\": \"问题\",\n \"backLabel\": \"答案\",\n \"hint\": \"点击或按空格键翻转\",\n \"label\": \"抽认卡,当前为{{face}}\"\n },\n \"loadingState\": {\n \"label\": \"加载中...\"\n },\n \"codeBlock\": {\n \"label\": \"代码\",\n \"copy\": \"复制代码\",\n \"copied\": \"已复制\",\n \"copyFailed\": \"复制失败\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"通知\",\n \"close\": \"关闭\",\n \"regionWithHotkey\": \"通知({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"向左滚动页面\",\n \"scrollRight\": \"向右滚动页面\",\n \"close\": \"关闭 {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"滑块\",\n \"minimum\": \"最小值\",\n \"maximum\": \"最大值\"\n },\n \"numberInput\": {\n \"increment\": \"增加\",\n \"decrement\": \"减少\",\n \"notANumber\": \"请输入数字\",\n \"belowMin\": \"最小值 {{min}}\",\n \"aboveMax\": \"最大值 {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"格式化 JSON\",\n \"valid\": \"JSON 语法正确\",\n \"invalid\": \"JSON 语法错误\"\n },\n \"keyValueEditor\": {\n \"key\": \"键\",\n \"value\": \"值\",\n \"add\": \"添加条目\",\n \"remove\": \"删除条目\"\n },\n \"tagInput\": {\n \"add\": \"添加标签\",\n \"clear\": \"清空标签\",\n \"remove\": \"移除 {{tag}}\",\n \"create\": \"添加“{{tag}}”\",\n \"empty\": \"无匹配项\"\n },\n \"validation\": {\n \"valueMissing\": \"请填写此字段。\",\n \"selectMissing\": \"请在列表中选择一项。\",\n \"checkMissing\": \"如要继续,请勾选此复选框。\",\n \"radioMissing\": \"请选择其中一个选项。\",\n \"fileMissing\": \"请选择文件。\",\n \"tooShort\": \"请至少输入 {{min}} 个字符。\",\n \"tooLong\": \"最多只能输入 {{max}} 个字符。\",\n \"rangeUnderflow\": \"值必须大于或等于 {{min}}。\",\n \"rangeOverflow\": \"值必须小于或等于 {{max}}。\",\n \"badInput\": \"请输入有效的值。\",\n \"patternMismatch\": \"请与所请求的格式保持一致。\",\n \"emailMismatch\": \"请输入有效的电子邮件地址。\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"题目\",\n \"summary\": \"已答 {{answered}} / {{total}}\",\n \"item\": \"第 {{number}} 题,{{status}}\",\n \"itemFlagged\": \"第 {{number}} 题,{{status}},已标记\",\n \"status\": {\n \"unanswered\": \"未作答\",\n \"answered\": \"已作答\",\n \"correct\": \"正确\",\n \"wrong\": \"错误\",\n \"skipped\": \"已跳过\"\n },\n \"legend\": {\n \"unanswered\": \"未作答\",\n \"answered\": \"已作答\",\n \"correct\": \"正确\",\n \"wrong\": \"错误\",\n \"skipped\": \"已跳过\",\n \"flagged\": \"已标记\"\n }\n },\n \"steps\": {\n \"label\": \"步骤\"\n },\n \"upload\": {\n \"select\": \"选择文件\",\n \"uploading\": \"上传中\",\n \"done\": \"已上传\",\n \"failed\": \"上传失败\",\n \"tooMany\": \"最多选择 {{count}} 个文件\",\n \"invalidType\": \"{{name}}:不支持此文件类型\",\n \"tooLarge\": \"{{name}}:文件大小超过限制\",\n \"retry\": \"重试 {{name}}\",\n \"remove\": \"移除 {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"月历\",\n \"previousMonth\": \"上个月\",\n \"nextMonth\": \"下个月\",\n \"today\": \"今天\",\n \"weekdays\": {\n \"mon\": \"一\",\n \"tue\": \"二\",\n \"wed\": \"三\",\n \"thu\": \"四\",\n \"fri\": \"五\",\n \"sat\": \"六\",\n \"sun\": \"日\"\n },\n \"dayWithEvents_one\": \"{{date}},{{count}} 项日程\",\n \"dayWithEvents_other\": \"{{date}},{{count}} 项日程\",\n \"eventsLabel\": \"{{date}} 日程\",\n \"noEvents\": \"暂无日程\"\n },\n \"weekStrip\": {\n \"label\": \"周\",\n \"previousWeek\": \"上一周\",\n \"nextWeek\": \"下一周\",\n \"dayWithMarkers_one\": \"{{date}},{{count}} 项\",\n \"dayWithMarkers_other\": \"{{date}},{{count}} 项\",\n \"dayMarked\": \"{{date}},有标记\"\n },\n \"datePicker\": {\n \"placeholder\": \"选择日期\",\n \"label\": \"日期\",\n \"clear\": \"清除日期\",\n \"today\": \"今天\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"导航\",\n \"expand\": \"展开侧边栏\",\n \"collapse\": \"收起侧边栏\",\n \"enableFloating\": \"启用浮动侧边栏\",\n \"disableFloating\": \"停用浮动侧边栏\",\n \"openNavigation\": \"打开导航\",\n \"closeNavigation\": \"关闭导航\",\n \"skipToContent\": \"跳到主要内容\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"取消\" },\n \"picker\": {\n \"confirm\": \"确认\",\n \"cancel\": \"取消\",\n \"placeholder\": \"请选择\",\n \"selected\": \"{{label}},已选中\",\n \"column\": \"第 {{index}} 列\"\n },\n \"searchBar\": {\n \"label\": \"搜索\",\n \"placeholder\": \"搜索\",\n \"cancel\": \"取消\",\n \"clear\": \"清除搜索\"\n },\n \"navBar\": { \"back\": \"返回\" },\n \"tabBar\": { \"label\": \"标签栏\" },\n \"pullRefresh\": {\n \"pulling\": \"下拉即可刷新\",\n \"loosing\": \"释放即可刷新\",\n \"loading\": \"加载中...\",\n \"success\": \"刷新成功\"\n },\n \"swipeCell\": { \"actions\": \"更多操作\" },\n \"datetimePicker\": {\n \"title\": \"选择日期\",\n \"titleTime\": \"选择时间\",\n \"year\": \"年\",\n \"month\": \"月\",\n \"day\": \"日\",\n \"hour\": \"时\",\n \"minute\": \"分\"\n },\n \"calendar\": {\n \"title\": \"选择日期\",\n \"confirm\": \"确定\",\n \"monthTitle\": \"{{year}}年{{month}}月\",\n \"rangeStart\": \"开始\",\n \"rangeEnd\": \"结束\"\n },\n \"imagePreview\": {\n \"label\": \"图片预览\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"关闭预览\"\n },\n \"collapse\": { \"expand\": \"展开\", \"collapse\": \"收起\" },\n \"rating\": { \"label\": \"评分\", \"value\": \"{{value}} / {{max}}\" },\n \"progress\": { \"label\": \"进度\" },\n \"form\": { \"submit\": \"提交\", \"reset\": \"重置\", \"required\": \"必填\" },\n \"paginationSimple\": { \"pageOf\": \"第 {{page}} 页,共 {{total}} 页\" },\n \"stepStatus\": { \"finish\": \"已完成\", \"process\": \"进行中\", \"wait\": \"等待中\", \"error\": \"错误\" },\n \"presetToggle\": { \"label\": \"当前预设 {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"文学\", \"compact\": \"紧凑\", \"touch\": \"触控\" }\n}\n","{\n \"modal\": {\n \"close\": \"关闭\"\n },\n \"drawer\": {\n \"close\": \"关闭\",\n \"description\": \"抽屉内容\"\n },\n \"confirm\": {\n \"confirm\": \"确定\",\n \"cancel\": \"取消\",\n \"delete\": \"删除\"\n },\n \"command\": {\n \"title\": \"命令面板\",\n \"description\": \"搜索并跳转到后台模块、配置页或操作入口。\",\n \"placeholder\": \"搜索命令、路径或关键字\",\n \"empty\": \"没有匹配结果\",\n \"results\": \"命令结果\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"当前主题 {{theme}}\",\n \"light\": \"亮\",\n \"dark\": \"暗\",\n \"system\": \"跟随\"\n },\n \"paletteToggle\": {\n \"label\": \"当前色身 {{palette}}\",\n \"default\": \"默认\",\n \"editorial\": \"文学\",\n \"tech\": \"科技\",\n \"graphite\": \"石墨灰\",\n \"cool\": \"冷灰蓝\"\n }\n}\n","import zhIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n zhIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","// A tiny, framework-agnostic translator for Minerva's message bundles:\n// nested keys (\"a.b.c\"), `{{name}}` interpolation, plurals selected by `count`\n// through `Intl.PluralRules` (`key_one`, `key_other`, ...; built-in rules\n// when the engine has no `Intl.PluralRules`), and fallbacks\n// (base language -> fallback language -> `defaultValue` -> the key itself).\n// Pure functions only: no DOM access and nothing mutated at import time.\nimport type { Messages } from \"./merge\";\n\n/** Options of a single translation */\nexport type TranslateOptions = {\n /** Selects the plural form (`key_one`, `key_other`...) and fills `{{count}}` */\n count?: number;\n /** Returned (interpolated) when the key is missing in every language */\n defaultValue?: string;\n /** Interpolation values (`{{name}}`) */\n [name: string]: unknown;\n};\n\n/** Translates `key` (dot-separated path into the message tree) */\nexport type TranslateFunction = (\n key: string,\n options?: TranslateOptions,\n) => string;\n\nexport interface TranslatorConfig {\n /** Message tree per language */\n messages: Readonly<Partial<Record<string, Messages>>>;\n /** Language to translate to (e.g. \"fr\", \"en-US\") */\n language: string;\n /** Language used for keys missing in `language` (default \"en\") */\n fallbackLanguage?: string;\n}\n\nconst DEFAULT_FALLBACK_LANGUAGE = \"en\";\n\nconst hasOwn = (object: object, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(object, key);\n\n/** Whether the engine implements `Intl.PluralRules` (Hermes without Intl and\n * some mini-program JS engines do not). Read lazily: tests and polyfills may\n * install it after this module loaded. */\nconst hasPluralRules = (): boolean =>\n typeof Intl !== \"undefined\" && typeof Intl.PluralRules === \"function\";\n\n/**\n * CLDR cardinal plural rules of the built-in languages (and English-like\n * \"one / other\" for any other language), used when `Intl.PluralRules` is\n * missing:\n * - zh, ja, ko, vi, th, id, ms: always \"other\"\n * - fr (and pt): \"one\" for 0 <= n < 2, \"many\" for non-zero multiples of\n * 1 000 000, else \"other\"\n * - everything else: \"one\" for exactly 1, else \"other\"\n */\nexport const fallbackPluralCategory = (\n language: string,\n count: number,\n): Intl.LDMLPluralRule => {\n const n = Math.abs(count);\n switch (language.toLowerCase().split(\"-\")[0]) {\n case \"zh\":\n case \"ja\":\n case \"ko\":\n case \"vi\":\n case \"th\":\n case \"id\":\n case \"ms\":\n return \"other\";\n case \"fr\":\n case \"pt\":\n if (n < 2) return \"one\";\n return Number.isInteger(n) && n % 1_000_000 === 0 ? \"many\" : \"other\";\n default:\n return n === 1 ? \"one\" : \"other\";\n }\n};\n\n// Plural rules are costly to build: one instance per language, created lazily.\nconst pluralRulesCache = new Map<string, Intl.PluralRules | null>();\n\nconst getPluralRules = (language: string): Intl.PluralRules | null => {\n let rules = pluralRulesCache.get(language);\n if (rules === undefined) {\n try {\n rules = new Intl.PluralRules(language);\n } catch {\n // Invalid language tag\n rules = null;\n }\n pluralRulesCache.set(language, rules);\n }\n return rules;\n};\n\n/**\n * CLDR plural category of `count` in `language` (\"zero\", \"one\", \"two\", \"few\",\n * \"many\" or \"other\"). Unknown / invalid languages give \"other\". Without\n * `Intl.PluralRules` (Hermes, mini-program engines) the built-in rules of\n * {@link fallbackPluralCategory} apply.\n */\nexport const getPluralCategory = (\n language: string,\n count: number,\n): Intl.LDMLPluralRule =>\n hasPluralRules()\n ? (getPluralRules(language)?.select(count) ?? \"other\")\n : fallbackPluralCategory(language, count);\n\n/** Message string at the dot-separated `key` of `tree`, if any */\nconst lookup = (\n tree: Messages | undefined,\n key: string,\n): string | undefined => {\n let node: Messages | string | undefined = tree;\n for (const part of key.split(\".\")) {\n if (typeof node !== \"object\" || !hasOwn(node, part)) {\n return undefined;\n }\n node = node[part];\n }\n return typeof node === \"string\" ? node : undefined;\n};\n\n/** Value at the (possibly dotted) interpolation `path` of `values` */\nconst readValue = (values: Record<string, unknown>, path: string): unknown => {\n if (hasOwn(values, path)) return values[path];\n let node: unknown = values;\n for (const part of path.split(\".\")) {\n if (typeof node !== \"object\" || node === null || !hasOwn(node, part)) {\n return undefined;\n }\n node = (node as Record<string, unknown>)[part];\n }\n return node;\n};\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Replaces `{{name}}` placeholders of `template` with `values`. Placeholders\n * without a value are kept as is. No HTML escaping (renderers escape).\n */\nexport const interpolate = (\n template: string,\n values: Record<string, unknown> = {},\n): string =>\n template.replace(PLACEHOLDER, (match, path: string) => {\n const value = readValue(values, path);\n return value === undefined || value === null ? match : String(value);\n });\n\n/** Languages to look a key up in: \"fr-CA\" -> [\"fr-CA\", \"fr\", fallback] */\nconst languageChain = (language: string, fallbackLanguage: string) => {\n const chain = [language];\n const base = language.split(\"-\")[0];\n if (base) chain.push(base);\n chain.push(fallbackLanguage);\n return [...new Set(chain)];\n};\n\n/** Translates `key` with the given configuration (see `createTranslator`). */\nexport const translate = (\n {\n messages,\n language,\n fallbackLanguage = DEFAULT_FALLBACK_LANGUAGE,\n }: TranslatorConfig,\n key: string,\n options: TranslateOptions = {},\n): string => {\n const { count, defaultValue } = options;\n for (const lng of languageChain(language, fallbackLanguage)) {\n const tree = messages[lng];\n if (!tree) continue;\n const message =\n (typeof count === \"number\"\n ? lookup(tree, `${key}_${getPluralCategory(lng, count)}`)\n : undefined) ?? lookup(tree, key);\n if (message !== undefined) return interpolate(message, options);\n }\n return defaultValue !== undefined ? interpolate(defaultValue, options) : key;\n};\n\n/**\n * Creates a translate function bound to `messages` and `language`.\n *\n * @example\n * const t = createTranslator({ messages, language: \"fr\" });\n * t(\"pagination.page\", { page: 2 }); // \"Page 2\"\n * t(\"monthCalendar.dayWithEvents\", { date, count: 3 }); // uses `_other`\n */\nexport const createTranslator = (\n config: TranslatorConfig,\n): TranslateFunction => {\n const resolved = { ...config };\n return (key, options) => translate(resolved, key, options);\n};\n","// Framework-agnostic i18n: the built-in message bundles of every supported\n// language (plain data) and a tiny translator (`createTranslator` /\n// `translate`) that adapters such as `minerva-design` build on.\nimport en from \"./locales/en\";\nimport fr from \"./locales/fr\";\nimport ja from \"./locales/ja\";\nimport zh from \"./locales/zh\";\nimport type { Messages } from \"./merge\";\nimport type { SupportedLanguage } from \"./types\";\n\nexport type { SupportedLanguage } from \"./types\";\nexport { mergeMessages, type Messages } from \"./merge\";\nexport {\n createTranslator,\n fallbackPluralCategory,\n getPluralCategory,\n interpolate,\n translate,\n type TranslateFunction,\n type TranslateOptions,\n type TranslatorConfig,\n} from \"./translate\";\n\n/** Every language Minerva ships translations for */\nexport const SUPPORTED_LANGUAGES: readonly SupportedLanguage[] = [\n \"en\",\n \"zh\",\n \"ja\",\n \"fr\",\n];\n\n/** Language used when none is set (and as the fallback for missing keys) */\nexport const DEFAULT_LANGUAGE: SupportedLanguage = \"en\";\n\n/** Built-in messages per language (one merged message tree each) */\nexport const messages: Readonly<Record<SupportedLanguage, Messages>> = {\n en,\n zh,\n ja,\n fr,\n};\n\n/** Whether `value` is one of the `SUPPORTED_LANGUAGES` */\nexport const isSupportedLanguage = (\n value: unknown,\n): value is SupportedLanguage =>\n typeof value === \"string\" &&\n (SUPPORTED_LANGUAGES as readonly string[]).includes(value);\n","// Time-of-day formatting and parsing shared by the TimePicker of\n// minerva-design and <minerva-time-picker> of minerva-design/web-components.\n\nconst TOKEN_PATTERN = /(HH|H|hh|h|mm|m|ss|s|a)/g;\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/** Format a time with tokens HH / H / hh / h / mm / m / ss / s / a */\nexport const formatTime = (date: Date, format: string): string => {\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 || 12;\n const values: Record<string, string> = {\n HH: pad(hours24),\n H: String(hours24),\n hh: pad(hours12),\n h: String(hours12),\n mm: pad(date.getMinutes()),\n m: String(date.getMinutes()),\n ss: pad(date.getSeconds()),\n s: String(date.getSeconds()),\n a: hours24 >= 12 ? \"PM\" : \"AM\",\n };\n return format.replace(TOKEN_PATTERN, (token) => values[token]);\n};\n\n/**\n * Parse text typed into the picker.\n * - strict: the text must match the format exactly (used while typing, so a\n * half-typed \"12:3\" is not committed as 12:03)\n * - lenient: numbers may omit leading zeros (\"1:2:3\"), used on blur\n * Returns `undefined` when the text is not a valid time. The date part of the\n * result is `base` (defaults to today).\n */\nexport const parseTimeInput = (\n text: string,\n format: string,\n { strict, base }: { strict: boolean; base?: Date },\n): Date | undefined => {\n const value = text.trim();\n if (!value) return undefined;\n const tokens: string[] = format.match(TOKEN_PATTERN) ?? [];\n if (strict) {\n const source = format\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(TOKEN_PATTERN, (token) =>\n token === \"a\"\n ? \"\\\\s*([AaPp][Mm])\"\n : `(\\\\d{${token.length === 2 ? 2 : \"1,2\"}})`,\n );\n if (!new RegExp(`^${source}$`).test(value)) return undefined;\n }\n const numbers = value.match(/\\d+/g) ?? [];\n const period = value.match(/[AaPp][Mm]/)?.[0]?.toUpperCase();\n const numericTokens = tokens.filter((t) => t !== \"a\");\n if (numbers.length !== numericTokens.length) return undefined;\n const twelveHour = numericTokens.some((t) => t.startsWith(\"h\"));\n if (twelveHour && tokens.includes(\"a\") && !period) return undefined;\n\n let hours = 0;\n let minutes = 0;\n let seconds = 0;\n numericTokens.forEach((token, i) => {\n const n = Number(numbers[i]);\n if (token.startsWith(\"H\") || token.startsWith(\"h\")) hours = n;\n else if (token.startsWith(\"m\")) minutes = n;\n else seconds = n;\n });\n if (twelveHour) {\n if (hours < 1 || hours > 12) return undefined;\n if (period === \"PM\" && hours < 12) hours += 12;\n if (period === \"AM\" && hours === 12) hours = 0;\n }\n if (hours > 23 || minutes > 59 || seconds > 59) return undefined;\n const date = new Date(base ?? new Date());\n date.setHours(hours, minutes, seconds, 0);\n return date;\n};\n\n/** Today at 00:00:00, the base for times picked without a value */\nexport const startOfToday = (): Date => {\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst VALUE_PATTERN = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/;\n\n/**\n * Parses a value / min / max string: 24-hour `HH:mm` or `HH:mm:ss` (the\n * format of `<input type=\"time\">`). `null` for an empty or invalid string.\n */\nexport const parseTimeValue = (\n text: string | null | undefined,\n): Date | null => {\n const match = VALUE_PATTERN.exec((text ?? \"\").trim());\n if (!match) return null;\n const [hours, minutes, seconds] = [match[1], match[2], match[3] ?? \"0\"].map(\n Number,\n );\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n const date = startOfToday();\n date.setHours(hours, minutes, seconds, 0);\n return date;\n};\n\n/** The value string of `date`: `HH:mm:ss`, or `HH:mm` without seconds. */\nexport const toTimeValue = (date: Date, withSeconds: boolean): string =>\n formatTime(date, withSeconds ? \"HH:mm:ss\" : \"HH:mm\");\n\n/** Seconds since midnight (compares times of day). */\nexport const secondsOfDay = (date: Date): number =>\n date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();\n\n/** Whether a display format contains a seconds token (`ss` / `s`) */\nexport const formatHasSeconds = (format: string): boolean =>\n /(^|[^a-zA-Z])s{1,2}([^a-zA-Z]|$)/.test(format);\n\n/**\n * The single source of truth of the seconds column: the format actually\n * used. Hiding seconds (`showSecond={false}` / `hide-second`) removes the\n * seconds token (and its separator) from the format, so the column, the\n * displayed text, parsing and the value always agree:\n * `\"HH:mm:ss\"` -> `\"HH:mm\"`, `\"hh:mm:ss a\"` -> `\"hh:mm a\"`.\n */\nexport const resolveTimeFormat = (format: string, showSecond: boolean) =>\n showSecond ? format : format.replace(/[:.\\s]?s{1,2}(?![a-zA-Z])/, \"\");\n","// Keyboard shortcut helpers shared by the command palettes (shortcut strings\n// such as \"mod+k\") and the toast regions (hotkey key lists such as [\"F8\"]).\n\n/**\n * Key event fields every platform provides (a DOM `KeyboardEvent`, a React\n * Native hardware key event mapped to this shape...).\n */\ninterface KeyFields {\n key: string;\n code: string;\n metaKey: boolean;\n ctrlKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n}\n\n/** Keyboard event fields read by `matchesShortcut`. */\nexport type ShortcutEvent = Pick<\n KeyFields,\n \"key\" | \"metaKey\" | \"ctrlKey\" | \"shiftKey\" | \"altKey\"\n>;\n\n/** Drops empty / non-string shortcut values (runtime safety for untyped callers). */\nexport function normalizeShortcuts(\n shortcut: string | readonly string[] | undefined | null,\n): string[] {\n const values = Array.isArray(shortcut) ? shortcut : [shortcut];\n return values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim() !== \"\",\n );\n}\n\n/**\n * Whether a keyboard event matches a shortcut such as \"mod+k\" or\n * \"ctrl+shift+p\". `mod` accepts Cmd (macOS) or Ctrl. Non-string shortcuts\n * never match.\n */\nexport function matchesShortcut(\n event: ShortcutEvent,\n shortcut: unknown,\n): boolean {\n if (typeof shortcut !== \"string\") return false;\n const parts = shortcut\n .trim()\n .toLowerCase()\n .split(\"+\")\n .map((part) => part.trim())\n .filter(Boolean);\n const key = parts[parts.length - 1];\n if (!key || String(event.key ?? \"\").toLowerCase() !== key) return false;\n const has = (...names: string[]) => names.some((n) => parts.includes(n));\n if (has(\"mod\") && !event.metaKey && !event.ctrlKey) return false;\n if (has(\"ctrl\") && !event.ctrlKey) return false;\n if (has(\"meta\", \"cmd\") && !event.metaKey) return false;\n if (has(\"shift\") && !event.shiftKey) return false;\n if (has(\"alt\", \"option\") && !event.altKey) return false;\n return true;\n}\n\n/** Fields of a command item that the palette search matches. */\nexport interface CommandSearchFields {\n title: string;\n description?: string;\n group?: string;\n keywords?: string;\n}\n\n/** Lower-cases and trims a search query or haystack. */\nexport const normalizeSearchText = (value: string): string =>\n value.trim().toLowerCase();\n\n/** The text a command palette search runs against (group, title, description, keywords). */\nexport const commandSearchText = (item: CommandSearchFields): string =>\n `${item.group ?? \"\"} ${item.title} ${item.description ?? \"\"} ${item.keywords ?? \"\"}`;\n\nconst MODIFIER_KEYS = [\"altKey\", \"ctrlKey\", \"metaKey\", \"shiftKey\"] as const;\ntype ModifierKey = (typeof MODIFIER_KEYS)[number];\n\n/** Keyboard event fields read by `matchesHotkey`. */\nexport type HotkeyEvent = Pick<KeyFields, \"code\" | \"key\" | ModifierKey>;\n\n/**\n * Whether `event` matches every entry of `hotkey`: modifier names\n * (\"altKey\", \"ctrlKey\", \"metaKey\", \"shiftKey\") or a `code` / `key` value.\n * An empty hotkey never matches.\n */\nexport const matchesHotkey = (\n event: HotkeyEvent,\n hotkey: readonly string[],\n): boolean =>\n hotkey.length > 0 &&\n hotkey.every((key) =>\n (MODIFIER_KEYS as readonly string[]).includes(key)\n ? event[key as ModifierKey]\n : event.code === key || event.key === key,\n );\n\n/** Human readable hotkey, e.g. `[\"altKey\", \"KeyT\"]` -> `\"Alt+T\"`. */\nexport const formatHotkey = (hotkey: readonly string[]): string =>\n hotkey\n .map((key) =>\n key\n .replace(/Key$/, \"\")\n .replace(/^Key(?=.)/, \"\")\n .replace(/^Digit/, \"\")\n .replace(/^./, (c) => c.toUpperCase()),\n )\n .join(\"+\");\n","// Pure keyboard navigation over an indexed collection (lists, menus, tabs,\n// radio groups, pickers...): the index math behind the DOM roving focus\n// controller of @minerva/dom, reusable by renderers without a DOM.\n\nexport type Orientation = \"horizontal\" | \"vertical\" | \"both\";\nexport type Direction = \"ltr\" | \"rtl\";\n\nexport interface GetNextIndexOptions {\n /** Index of the current item (`-1` when none). */\n currentIndex: number;\n /** Number of items. */\n count: number;\n /** `KeyboardEvent.key`. */\n key: string;\n /** Which arrow keys move. @default \"vertical\" */\n orientation?: Orientation;\n /** Reading direction; `\"rtl\"` swaps ArrowLeft / ArrowRight. @default \"ltr\" */\n dir?: Direction;\n /** Wrap around at both ends. @default true */\n loop?: boolean;\n /** Disabled items are skipped. */\n isDisabled?: (index: number) => boolean;\n /** Enables PageUp / PageDown, moving by this many items. */\n pageSize?: number;\n}\n\ntype Move = \"next\" | \"prev\" | \"first\" | \"last\" | \"pageNext\" | \"pagePrev\";\n\nfunction keyToMove(\n key: string,\n orientation: Orientation,\n dir: Direction,\n pageSize: number | undefined,\n): Move | null {\n const vertical = orientation !== \"horizontal\";\n const horizontal = orientation !== \"vertical\";\n switch (key) {\n case \"ArrowDown\":\n return vertical ? \"next\" : null;\n case \"ArrowUp\":\n return vertical ? \"prev\" : null;\n case \"ArrowRight\":\n return horizontal ? (dir === \"rtl\" ? \"prev\" : \"next\") : null;\n case \"ArrowLeft\":\n return horizontal ? (dir === \"rtl\" ? \"next\" : \"prev\") : null;\n case \"Home\":\n return \"first\";\n case \"End\":\n return \"last\";\n case \"PageDown\":\n return pageSize ? \"pageNext\" : null;\n case \"PageUp\":\n return pageSize ? \"pagePrev\" : null;\n default:\n return null;\n }\n}\n\n/** First enabled index scanning from `start` by `step`, within bounds. */\nfunction scan(\n start: number,\n step: 1 | -1,\n count: number,\n isDisabled: (index: number) => boolean,\n): number | null {\n for (let i = start; i >= 0 && i < count; i += step) {\n if (!isDisabled(i)) return i;\n }\n return null;\n}\n\n/**\n * Pure keyboard navigation for lists, menus, tabs, radio groups...\n *\n * Returns the index to move to for `key`, or `null` when the key is not a\n * navigation key for this orientation, or there is nowhere to go (edge\n * reached without `loop`, or every other item disabled).\n *\n * - ArrowUp / ArrowDown: vertical and both orientations.\n * - ArrowLeft / ArrowRight: horizontal and both (swapped in RTL).\n * - Home / End: first / last enabled item.\n * - PageUp / PageDown: only with `pageSize` (clamped, never wraps).\n */\nexport function getNextIndex({\n currentIndex,\n count,\n key,\n orientation = \"vertical\",\n dir = \"ltr\",\n loop = true,\n isDisabled = () => false,\n pageSize,\n}: GetNextIndexOptions): number | null {\n if (count <= 0) return null;\n const move = keyToMove(key, orientation, dir, pageSize);\n if (!move) return null;\n\n switch (move) {\n case \"first\":\n return scan(0, 1, count, isDisabled);\n case \"last\":\n return scan(count - 1, -1, count, isDisabled);\n case \"pageNext\":\n case \"pagePrev\": {\n const step = move === \"pageNext\" ? 1 : -1;\n const from = currentIndex < 0 ? (step === 1 ? -1 : count) : currentIndex;\n const target = Math.min(\n count - 1,\n Math.max(0, from + step * (pageSize as number)),\n );\n const found =\n scan(target, step === 1 ? -1 : 1, count, isDisabled) ??\n scan(target, step, count, isDisabled);\n return found === currentIndex ? null : found;\n }\n default: {\n const step = move === \"next\" ? 1 : -1;\n if (currentIndex < 0 || currentIndex >= count) {\n return scan(step === 1 ? 0 : count - 1, step, count, isDisabled);\n }\n for (let n = 1; n < count; n++) {\n let i = currentIndex + step * n;\n if (i < 0 || i >= count) {\n if (!loop) return null;\n i = (i + count) % count;\n }\n if (!isDisabled(i)) return i;\n }\n return null;\n }\n }\n}\n","// Typeahead (\"type to select\") matching, shared by the DOM roving focus\n// controller and every renderer. Pure: no DOM, timers read through Date.now().\n\nexport interface TypeaheadItem {\n /** Text matched against the typed characters. */\n text: string;\n /** Disabled items are never matched. */\n disabled?: boolean;\n}\n\nexport interface TypeaheadOptions {\n /** Idle time (ms) after which the typed buffer resets. @default 500 */\n timeout?: number;\n}\n\nexport interface Typeahead {\n /**\n * Feeds a key and returns the matching index, or `-1` (non-printable key,\n * or no match).\n */\n search(key: string, items: TypeaheadItem[], currentIndex: number): number;\n /** Clears the typed buffer. */\n reset(): void;\n /** Current typed buffer (lower case). */\n getBuffer(): string;\n}\n\n/**\n * Typeahead (\"type to select\") for menus, listboxes and selects.\n *\n * - Characters typed within `timeout` ms accumulate (\"ap\" -> \"apple\"),\n * matched case-insensitively against the start of each item's text,\n * starting from the current item.\n * - Repeating the same character (\"a\", \"a\", \"a\") cycles through the items\n * starting with it, starting after the current item.\n * - Space only counts while a search is in progress (otherwise it is left\n * for activation).\n */\nexport function createTypeahead(options: TypeaheadOptions = {}): Typeahead {\n const { timeout = 500 } = options;\n let buffer = \"\";\n let lastTime = 0;\n\n return {\n search(key, items, currentIndex) {\n if (key.length !== 1) return -1;\n const now = Date.now();\n if (now - lastTime > timeout) buffer = \"\";\n if (key === \" \" && buffer === \"\") return -1;\n lastTime = now;\n buffer += key.toLowerCase();\n\n const isRepeated =\n buffer.length > 1 && buffer.split(\"\").every((c) => c === buffer[0]);\n const query = isRepeated ? buffer[0] : buffer;\n const count = items.length;\n // single character: start after the current item; otherwise include it\n const startOffset = query.length === 1 ? 1 : 0;\n const start = currentIndex < 0 ? 0 : currentIndex + startOffset;\n for (let n = 0; n < count; n++) {\n const i = (start + n) % count;\n const item = items[i];\n if (item.disabled) continue;\n if (query.length === 1 && i === currentIndex) continue;\n if (item.text.trim().toLowerCase().startsWith(query)) return i;\n }\n return -1;\n },\n reset() {\n buffer = \"\";\n lastTime = 0;\n },\n getBuffer() {\n return buffer;\n },\n };\n}\n","// Sticky offsets of the fixed (left / right) columns of a table, shared by\n// the React library's Table and <minerva-data-table>.\n\n/** The column fields the layout reads */\nexport interface FixedColumnLike {\n key: string;\n width?: string | number;\n fixed?: \"left\" | \"right\";\n}\n\n/** Sticky offsets of the fixed columns */\nexport interface FixedColumnLayout {\n /** Left offset (px) of each left-fixed column */\n leftOffsets: Record<string, number>;\n /** Right offset (px) of each right-fixed column */\n rightOffsets: Record<string, number>;\n /** Key of the last left-fixed column (gets the boundary shadow) */\n lastLeftFixedKey: string | undefined;\n /** Key of the first right-fixed column (gets the boundary shadow) */\n firstRightFixedKey: string | undefined;\n}\n\nconst numericWidth = (width: string | number | undefined): number => {\n if (typeof width === \"number\") return width;\n if (typeof width === \"string\") {\n const n = parseFloat(width);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n};\n\n/**\n * Sticky offsets of the fixed columns of a table (pure function).\n *\n * Left-fixed columns accumulate the widths of the previous left-fixed columns,\n * right-fixed columns the widths of the following right-fixed ones. Fixed\n * columns are expected to be declared contiguously at the start / end of\n * `columns`; the edge keys stop at the first non-fixed column.\n */\nexport function computeFixedColumnLayout(\n columns: readonly FixedColumnLike[],\n): FixedColumnLayout {\n const leftOffsets: Record<string, number> = {};\n const rightOffsets: Record<string, number> = {};\n let leftAcc = 0;\n for (const col of columns) {\n if (col.fixed === \"left\") {\n leftOffsets[col.key] = leftAcc;\n leftAcc += numericWidth(col.width);\n }\n }\n let rightAcc = 0;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.fixed === \"right\") {\n rightOffsets[col.key] = rightAcc;\n rightAcc += numericWidth(col.width);\n }\n }\n let lastLeftFixedKey: string | undefined;\n for (const col of columns) {\n if (col.fixed === \"left\") lastLeftFixedKey = col.key;\n else if (lastLeftFixedKey !== undefined) break;\n }\n let firstRightFixedKey: string | undefined;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.fixed === \"right\") firstRightFixedKey = col.key;\n else if (firstRightFixedKey !== undefined) break;\n }\n return { leftOffsets, rightOffsets, lastLeftFixedKey, firstRightFixedKey };\n}\n","// Default sorting of table columns, shared by the React library's Table and\n// <minerva-data-table>: value comparison, per-column comparator and the\n// ascending -> descending -> unsorted header cycle.\n\n/** Sort direction of a column. */\nexport type TableSortOrder = \"ascend\" | \"descend\";\n\n/** Sorted column and direction; `order: null` means unsorted. */\nexport interface TableSortState {\n /** Key of the sorted column */\n key: string;\n /** Sort direction; `null` means unsorted */\n order: TableSortOrder | null;\n}\n\n/** The column fields read by `getColumnCompare`. */\nexport interface SortableColumnLike<T> {\n key: string;\n sortable?: boolean | ((a: T, b: T) => number);\n}\n\nconst isEmpty = (value: unknown): boolean =>\n value === null || value === undefined || value === \"\";\n\n// Created on first use so importing the module stays free of Intl work.\nlet collator: Intl.Collator | null = null;\n\n/**\n * Default ascending comparison of two cell values: numbers, dates and\n * booleans by value, everything else as text (numeric-aware, case and\n * accent insensitive). Empty values (`null`, `undefined`, `\"\"`) sort last.\n */\nexport function compareTableValues(a: unknown, b: unknown): number {\n if (isEmpty(a) || isEmpty(b)) return isEmpty(a) ? (isEmpty(b) ? 0 : 1) : -1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"boolean\" && typeof b === \"boolean\")\n return Number(a) - Number(b);\n collator ??= new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n return collator.compare(String(a), String(b));\n}\n\n/**\n * Ascending comparator of a column: its own `sortable` function, the\n * default comparison of `row[key]` when `sortable` is `true`, else `null`.\n */\nexport function getColumnCompare<T>(\n col: SortableColumnLike<T>,\n): ((a: T, b: T) => number) | null {\n if (typeof col.sortable === \"function\") return col.sortable;\n if (col.sortable)\n return (a, b) =>\n compareTableValues(\n (a as Record<string, unknown>)[col.key],\n (b as Record<string, unknown>)[col.key],\n );\n return null;\n}\n\n/** Next state of the ascending -> descending -> unsorted cycle of `key`. */\nexport function nextSortState(\n current: TableSortState | null | undefined,\n key: string,\n): TableSortState {\n const order = current?.key === key ? current.order : null;\n return {\n key,\n order: order === null ? \"ascend\" : order === \"ascend\" ? \"descend\" : null,\n };\n}\n","// Page number lists of the paginations of the React library and the web components.\n\n/** Pages skipped by the jump-prev / jump-next items of a pagination. */\nexport const PAGINATION_JUMP_SIZE = 5;\n\nconst rangeOf = (start: number, end: number): number[] => {\n const out: number[] = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n};\n\n/**\n * Window of `windowSize` consecutive page numbers centered on `current`,\n * clamped to `[1, totalPages]`.\n */\nexport function getPageRange(\n current: number,\n totalPages: number,\n windowSize = 5,\n): number[] {\n let start = Math.max(1, current - Math.floor(windowSize / 2));\n const end = Math.min(totalPages, start + windowSize - 1);\n if (end - start + 1 < windowSize) start = Math.max(1, end - windowSize + 1);\n return rangeOf(start, end);\n}\n\n/** An entry of `getCompactPageItems`: a page number or a \"…\" gap. */\nexport type CompactPageItem = number | \"ellipsis-start\" | \"ellipsis-end\";\n\n/**\n * Compact page list: `boundary` pages at each end, `siblings` pages on each\n * side of the current `page` and \"…\" gaps. Every page is listed when they\n * fit; a gap of a single page shows that page instead.\n */\nexport function getCompactPageItems(\n totalPages: number,\n page: number,\n siblings: number,\n boundary: number,\n): CompactPageItem[] {\n // boundaries + current and its siblings + two gap slots\n const totalSlots = boundary * 2 + siblings * 2 + 3;\n if (totalPages <= totalSlots) return rangeOf(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, boundary + 1);\n const rightSibling = Math.min(page + siblings, totalPages - boundary);\n const showStartGap = leftSibling > boundary + 2;\n const showEndGap = rightSibling < totalPages - boundary - 1;\n const clusterSize = boundary + siblings * 2 + 2;\n\n if (!showStartGap) {\n return [\n ...rangeOf(1, clusterSize),\n \"ellipsis-end\",\n ...rangeOf(totalPages - boundary + 1, totalPages),\n ];\n }\n if (!showEndGap) {\n return [\n ...rangeOf(1, boundary),\n \"ellipsis-start\",\n ...rangeOf(totalPages - clusterSize + 1, totalPages),\n ];\n }\n return [\n ...rangeOf(1, boundary),\n \"ellipsis-start\",\n ...rangeOf(leftSibling, rightSibling),\n \"ellipsis-end\",\n ...rangeOf(totalPages - boundary + 1, totalPages),\n ];\n}\n","// Section layout, counts and grid navigation of the AnswerSheet (question\n// navigator) of every renderer.\n\n/** Statuses of an AnswerSheet question, in legend order. */\nexport const ANSWER_SHEET_STATUSES = [\n \"unanswered\",\n \"answered\",\n \"correct\",\n \"wrong\",\n \"skipped\",\n] as const;\n\n/** Status of an AnswerSheet question. */\nexport type AnswerSheetItemStatus = (typeof ANSWER_SHEET_STATUSES)[number];\n\n/** The fields of an AnswerSheet item the helpers read. */\nexport interface AnswerSheetItemLike {\n key: string;\n label?: string;\n status?: string;\n flagged?: boolean;\n disabled?: boolean;\n group?: string;\n}\n\n/** A titled section of an AnswerSheet. */\nexport interface AnswerSheetGroupLike {\n key: string;\n title: string;\n}\n\n/** An item placed in a section, with its display index across the sheet. */\nexport interface AnswerSheetEntry<T extends AnswerSheetItemLike> {\n item: T;\n /** Display index across every section (its default label is index + 1) */\n index: number;\n /** Normalized status */\n status: AnswerSheetItemStatus;\n /** Visible label */\n label: string;\n}\n\n/** A section of an AnswerSheet: untitled (no group) or a group. */\nexport interface AnswerSheetSection<T extends AnswerSheetItemLike> {\n /** \"\" for the untitled section, else the group key */\n key: string;\n title?: string;\n entries: AnswerSheetEntry<T>[];\n}\n\n/** A known status, else \"unanswered\". */\nexport const answerSheetStatus = (status?: string): AnswerSheetItemStatus =>\n (ANSWER_SHEET_STATUSES as readonly string[]).includes(status ?? \"\")\n ? (status as AnswerSheetItemStatus)\n : \"unanswered\";\n\n/**\n * The sections of an AnswerSheet: the items without a known group first (an\n * untitled section), then each group in `groups` order; items keep their\n * order. Empty sections are dropped. Display indexes run across sections.\n */\nexport function answerSheetSections<T extends AnswerSheetItemLike>(\n items: readonly T[] | null | undefined,\n groups?: readonly AnswerSheetGroupLike[] | null,\n): AnswerSheetSection<T>[] {\n const list = Array.isArray(items) ? items : [];\n const known = new Set((groups ?? []).map((group) => group.key));\n const buckets: { key: string; title?: string; items: T[] }[] = [\n {\n key: \"\",\n items: list.filter((item) => !item.group || !known.has(item.group)),\n },\n ...(groups ?? []).map((group) => ({\n key: group.key,\n title: group.title,\n items: list.filter((item) => item.group === group.key),\n })),\n ];\n let index = 0;\n const sections: AnswerSheetSection<T>[] = [];\n for (const bucket of buckets) {\n if (!bucket.items.length) continue;\n sections.push({\n key: bucket.key,\n title: bucket.title,\n entries: bucket.items.map((item) => {\n const entry = {\n item,\n index,\n status: answerSheetStatus(item.status),\n label: item.label ?? String(index + 1),\n };\n index += 1;\n return entry;\n }),\n });\n }\n return sections;\n}\n\n/** Answered questions (answered, correct or wrong) and the total. */\nexport function answerSheetSummary(\n items: readonly AnswerSheetItemLike[] | null | undefined,\n): { answered: number; total: number } {\n const list = Array.isArray(items) ? items : [];\n const answered = list.filter((item) =>\n [\"answered\", \"correct\", \"wrong\"].includes(answerSheetStatus(item.status)),\n ).length;\n return { answered, total: list.length };\n}\n\n/**\n * The legend entries of an AnswerSheet: the statuses present (in\n * ANSWER_SHEET_STATUSES order), then \"flagged\" when an item is flagged.\n */\nexport function answerSheetLegend(\n items: readonly AnswerSheetItemLike[] | null | undefined,\n): (AnswerSheetItemStatus | \"flagged\")[] {\n const list = Array.isArray(items) ? items : [];\n const present = new Set(list.map((item) => answerSheetStatus(item.status)));\n const out: (AnswerSheetItemStatus | \"flagged\")[] =\n ANSWER_SHEET_STATUSES.filter((status) => present.has(status));\n if (list.some((item) => item.flagged)) out.push(\"flagged\");\n return out;\n}\n\n/** A keyboard move of an AnswerSheet. */\nexport type AnswerSheetMove =\n \"previous\" | \"next\" | \"first\" | \"last\" | \"up\" | \"down\";\n\n/**\n * The display index reached from `index` by a keyboard move: previous / next\n * in display order, first / last, and up / down by a row when the sheet has\n * fixed `columns` (rows restart in each section; moving past a section goes\n * to the nearest row of the next / previous one, same column, clamped).\n * Returns null when there is nowhere to go (up / down without columns).\n */\nexport function answerSheetMoveIndex(\n sections: readonly { entries: readonly unknown[] }[],\n index: number,\n move: AnswerSheetMove,\n columns?: number,\n): number | null {\n const sizes = sections.map((section) => section.entries.length);\n const total = sizes.reduce((sum, size) => sum + size, 0);\n if (!total) return null;\n const clamp = (next: number) => Math.min(total - 1, Math.max(0, next));\n switch (move) {\n case \"previous\":\n return clamp(index - 1);\n case \"next\":\n return clamp(index + 1);\n case \"first\":\n return 0;\n case \"last\":\n return total - 1;\n }\n const cols = columns && columns > 0 ? Math.floor(columns) : 0;\n if (!cols) return null;\n // locate the section of the index\n let start = 0;\n let section = 0;\n while (section < sizes.length && index >= start + sizes[section]) {\n start += sizes[section];\n section += 1;\n }\n if (section >= sizes.length) return clamp(index);\n const offset = index - start;\n const column = offset % cols;\n if (move === \"down\") {\n if (offset + cols < sizes[section]) return index + cols;\n // a shorter last row below: its last item\n const lastRow = Math.floor((sizes[section] - 1) / cols);\n if (Math.floor(offset / cols) < lastRow) return start + sizes[section] - 1;\n if (section + 1 >= sizes.length) return index;\n return start + sizes[section] + Math.min(column, sizes[section + 1] - 1);\n }\n if (offset - cols >= 0) return index - cols;\n if (section === 0) return index;\n const size = sizes[section - 1];\n const prevStart = start - size;\n const rowStart = Math.floor((size - 1) / cols) * cols;\n return prevStart + Math.min(rowStart + column, size - 1);\n}\n","// Local calendar-day math of the month calendars (no time of day, no\n// timezone): every date returned is local midnight.\n\n/**\n * Local midnight of `year` / `month` (0-based) / `day`. Out-of-range months\n * and days roll over like `Date`; years below 100 are kept as is (the `Date`\n * constructor would map them to 19xx).\n */\nexport function localDate(year: number, month: number, day: number): Date {\n const date = new Date(0);\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\n/** The local day of `date` as `\"YYYY-MM-DD\"`. */\nexport function dayKey(date: Date): string {\n return `${String(date.getFullYear()).padStart(4, \"0\")}-${String(\n date.getMonth() + 1,\n ).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\n/** Local midnight `days` days after (or before, when negative) `date`. */\nexport function addDays(date: Date, days: number): Date {\n return localDate(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** First day of the month of `date`, shifted by `offset` months. */\nexport function monthStart(date: Date, offset = 0): Date {\n return localDate(date.getFullYear(), date.getMonth() + offset, 1);\n}\n\n/** Whether `a` and `b` fall in the same month of the same year. */\nexport function sameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\n/**\n * First day (local midnight) of the week containing `date`, for weeks that\n * start on `firstDayOfWeek` (0 = Sunday ... 6 = Saturday; anything else\n * falls back to Monday).\n */\nexport function weekStart(date: Date, firstDayOfWeek = 1): Date {\n const first =\n Number.isInteger(firstDayOfWeek) &&\n firstDayOfWeek >= 0 &&\n firstDayOfWeek <= 6\n ? firstDayOfWeek\n : 1;\n return addDays(date, -((date.getDay() - first + 7) % 7));\n}\n\nconst STRICT_DAY_KEY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst LOOSE_DAY_KEY = /^\\s*(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s*$/;\n\n/**\n * Parses a `\"YYYY-MM-DD\"` string (or `\"YYYY-M-D\"` when `strict` is `false`)\n * into local midnight, rejecting out-of-range months and days (e.g. Feb 30).\n */\nexport function parseDayKey(text: string, strict = true): Date | null {\n const match = (strict ? STRICT_DAY_KEY : LOOSE_DAY_KEY).exec(text);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const date = localDate(year, month - 1, day);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return null;\n }\n return date;\n}\n","// Value helpers of the number inputs (React NumberInput and\n// <minerva-number-input>).\n\n/** Decimal places of `step` (`0.05` -> 2); `0` for whole or missing steps. */\nexport function inferStepPrecision(step?: number): number {\n if (!step || step >= 1) return 0;\n const s = String(step);\n const dot = s.indexOf(\".\");\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\n/** `n` limited to `[min, max]`; a missing bound does not limit. */\nexport function clampNumber(n: number, min?: number, max?: number): number {\n let v = n;\n if (min !== undefined) v = Math.max(min, v);\n if (max !== undefined) v = Math.min(max, v);\n return v;\n}\n\n/** Display text of a value with `precision` decimals; `\"\"` for empty / NaN. */\nexport function formatNumberValue(\n v: number | null | undefined,\n precision: number,\n): string {\n if (v === null || v === undefined || Number.isNaN(v)) return \"\";\n return v.toFixed(precision);\n}\n\n/**\n * Parses the text typed into a number input: digits with an optional\n * leading \"-\" and one \".\" (no exponent, a typing trap). `null` otherwise.\n */\nexport function parseNumberDraft(input: string): number | null {\n const trimmed = input.trim();\n if (!trimmed || !/^-?\\d*(\\.\\d*)?$/.test(trimmed)) return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n}\n","// Spacing and size values of the layout components (Box, Stack, grids...).\n\n/**\n * Resolves a spacing value to CSS. Numbers and numeric strings select the\n * spacing scale (`2` -> `var(--space-2)`, `\"0.5\"` -> `var(--space-0-5)`);\n * any other string is a CSS value used as is (`\"12px\"`, `\"auto\"`,\n * `\"var(--x)\"`). Strings are trimmed.\n */\nexport function resolveSpace(value: string | number): string {\n const text = String(value).trim();\n if (typeof value !== \"number\" && !/^\\d+(\\.\\d+)?$/.test(text)) return text;\n return `var(--space-${text.replace(\".\", \"-\")})`;\n}\n\n/**\n * Resolves a size value to CSS: numbers and numeric strings are pixels\n * (`100` / `\"100\"` -> `\"100px\"`), other strings CSS lengths used as is.\n * Strings are trimmed.\n */\nexport function resolveSize(value: string | number): string {\n const text = String(value).trim();\n return typeof value === \"number\" || /^-?\\d+(\\.\\d+)?$/.test(text)\n ? `${text}px`\n : text;\n}\n","// Shared logic of DashboardColumns / DashboardColumn (every renderer).\nimport { resolveSize } from \"./spacing\";\nimport type { ColorScheme } from \"./theme/types\";\n\n/** Theme colors a DashboardColumn accent can name (`data-color` / classes) */\nexport const DASHBOARD_COLORS: readonly ColorScheme[] = [\n \"primary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"neutral\",\n];\n\n/** Default width of a dashboard column */\nexport const DASHBOARD_COLUMN_WIDTH = \"18rem\";\n\n/** Default space between dashboard columns */\nexport const DASHBOARD_GAP = \"0.75rem\";\n\n/**\n * The accent of a column: `scheme` for a theme color, `custom` for any other\n * CSS color (set as `--dashboard-column-color`), neither when unset / blank.\n */\nexport function dashboardAccent(color: string | null | undefined): {\n scheme?: ColorScheme;\n custom?: string;\n} {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return {};\n if ((DASHBOARD_COLORS as readonly string[]).includes(value))\n return { scheme: value as ColorScheme };\n return { custom: value };\n}\n\n/** CSS value of the theme color of an accent (`var(--success-color)`) */\nexport function dashboardAccentValue(color: string | null | undefined): string {\n const { scheme, custom } = dashboardAccent(color);\n if (custom) return custom;\n if (scheme === \"neutral\") return \"var(--text-muted-color)\";\n return scheme ? `var(--${scheme}-color)` : \"\";\n}\n\n/**\n * The count badge of a column: a non-negative integer, `undefined` (hidden)\n * for a missing, negative or non-finite count.\n */\nexport function dashboardCount(count: unknown): number | undefined {\n const value = typeof count === \"string\" && count.trim() ? +count : count;\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : undefined;\n}\n\n/** A board length (number: pixels) as CSS, `undefined` when unset / blank */\nexport function dashboardLength(\n value: string | number | null | undefined,\n): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"number\" && !Number.isFinite(value)) return undefined;\n const text = resolveSize(value);\n return text ? text : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Drag and drop of cards (every renderer). The board is controlled: it never\n// reorders anything, it reports a `DashboardCardMove` and the app updates its\n// data (`moveDashboardCard` applies a move to plain lists).\n\n/**\n * A card move reported by a draggable DashboardColumns (`onCardMove`,\n * `card-move`, `minerva-card-move`, `cardMove`).\n */\nexport interface DashboardCardMove {\n /** `value` of the moved DashboardCard */\n cardKey: string;\n /** `value` of the column the card comes from */\n fromColumn: string;\n /** Index of the card in its column before the move */\n fromIndex: number;\n /** `value` of the column the card goes to (may be `fromColumn`) */\n toColumn: string;\n /**\n * Index of the card in `toColumn` after the move, i.e. counted without\n * the card itself (remove it from `fromColumn`, then insert it at\n * `toIndex`)\n */\n toIndex: number;\n}\n\n/** A column of a board as the drag logic sees it: its key and its cards */\nexport interface DashboardLayoutColumn {\n /** `value` of the column */\n key: string;\n /** `value` of its cards, in order */\n cards: readonly string[];\n}\n\n/** Where a card is, or would land: a column key and an index in it */\nexport interface DashboardPosition {\n column: string;\n /** Index in the column, the dragged card excluded */\n index: number;\n}\n\n/** A keyboard (or accessibility action) move of a picked-up card */\nexport type DashboardDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\n/** Where `cardKey` is in `layout` (`undefined` when it is not there) */\nexport function dashboardFind(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n): DashboardPosition | undefined {\n for (const column of layout) {\n const index = column.cards.indexOf(cardKey);\n if (index >= 0) return { column: column.key, index };\n }\n return undefined;\n}\n\n/**\n * Number of positions a dragged card can take in `columnKey`: its cards\n * without the dragged one, plus one (0 for an unknown column)\n */\nexport function dashboardSlots(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n columnKey: string,\n): number {\n const column = layout.find((entry) => entry.key === columnKey);\n if (!column) return 0;\n return column.cards.filter((key) => key !== cardKey).length + 1;\n}\n\n/**\n * The move of `cardKey` to `to` (the index is clamped to the column), or\n * `undefined` when the card or the column is unknown\n */\nexport function dashboardCardMove(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n to: DashboardPosition,\n): DashboardCardMove | undefined {\n const from = dashboardFind(layout, cardKey);\n const slots = dashboardSlots(layout, cardKey, to.column);\n if (!from || slots === 0) return undefined;\n return {\n cardKey,\n fromColumn: from.column,\n fromIndex: from.index,\n toColumn: to.column,\n toIndex: Math.min(Math.max(0, Math.floor(to.index)), slots - 1),\n };\n}\n\n/** Whether a move leaves the card where it was */\nexport function isDashboardNoop(move: DashboardCardMove): boolean {\n return move.fromColumn === move.toColumn && move.fromIndex === move.toIndex;\n}\n\n/**\n * Insertion index of a dragged card from the pointer position along the\n * column (`position`) and the midpoints of the other cards of the column\n * (same axis, in order, the dragged card excluded): the number of cards\n * whose midpoint is before the pointer.\n */\nexport function dashboardInsertIndex(\n midpoints: readonly number[],\n position: number,\n): number {\n let index = 0;\n while (index < midpoints.length && midpoints[index]! < position) index++;\n return index;\n}\n\n/**\n * The next position of a picked-up card for a keyboard arrow (or an\n * accessibility action): `up` / `down` within the column, `left` / `right`\n * to the adjacent column at the same index (clamped). Positions `accept`\n * rejects are skipped (the original position is always accepted); returns\n * `undefined` at the edges.\n */\nexport function dashboardKeyboardTarget(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n current: DashboardPosition,\n direction: DashboardDirection,\n accept?: (move: DashboardCardMove) => boolean,\n): DashboardPosition | undefined {\n const ok = (position: DashboardPosition) => {\n const move = dashboardCardMove(layout, cardKey, position);\n if (!move) return false;\n return isDashboardNoop(move) || !accept || accept(move);\n };\n if (direction === \"up\" || direction === \"down\") {\n const step = direction === \"up\" ? -1 : 1;\n const slots = dashboardSlots(layout, cardKey, current.column);\n for (\n let index = current.index + step;\n index >= 0 && index < slots;\n index += step\n ) {\n const position = { column: current.column, index };\n if (ok(position)) return position;\n }\n return undefined;\n }\n const step = direction === \"left\" ? -1 : 1;\n const start = layout.findIndex((column) => column.key === current.column);\n if (start < 0) return undefined;\n for (\n let index = start + step;\n index >= 0 && index < layout.length;\n index += step\n ) {\n const column = layout[index]!.key;\n const slots = dashboardSlots(layout, cardKey, column);\n const position = { column, index: Math.min(current.index, slots - 1) };\n if (ok(position)) return position;\n }\n return undefined;\n}\n\n/**\n * Keyboard action of a key on a card of a draggable board: `toggle` picks\n * up / drops (Space, Enter), `cancel` (Escape), or an arrow direction\n * (Left / Right swapped in right-to-left boards)\n */\nexport function dashboardKeyAction(\n key: string,\n rtl = false,\n): DashboardDirection | \"toggle\" | \"cancel\" | undefined {\n switch (key) {\n case \" \":\n case \"Spacebar\":\n case \"Enter\":\n return \"toggle\";\n case \"Escape\":\n case \"Esc\":\n return \"cancel\";\n case \"ArrowUp\":\n return \"up\";\n case \"ArrowDown\":\n return \"down\";\n case \"ArrowLeft\":\n return rtl ? \"right\" : \"left\";\n case \"ArrowRight\":\n return rtl ? \"left\" : \"right\";\n default:\n return undefined;\n }\n}\n\n/**\n * Applies a move to the lists of a board (column key -> items): returns new\n * lists (the input is not mutated); `keyOf` reads the card key of an item.\n * Lists without the card are returned unchanged.\n */\nexport function moveDashboardCard<T>(\n lists: Readonly<Record<string, readonly T[]>>,\n move: DashboardCardMove,\n keyOf: (item: T) => string | number,\n): Record<string, T[]> {\n const next: Record<string, T[]> = {};\n for (const [key, items] of Object.entries(lists)) next[key] = [...items];\n const source = next[move.fromColumn];\n const target = next[move.toColumn];\n if (!source || !target) return next;\n const index = source.findIndex(\n (item) => String(keyOf(item)) === move.cardKey,\n );\n if (index < 0) return next;\n const [card] = source.splice(index, 1);\n target.splice(Math.min(Math.max(0, move.toIndex), target.length), 0, card!);\n return next;\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated aliases (the component was called KanbanBoard): kept for one\n// minor release cycle, not documented.\n\n/** @deprecated Use `DASHBOARD_COLORS` */\nexport const KANBAN_COLORS = DASHBOARD_COLORS;\n/** @deprecated Use `DASHBOARD_COLUMN_WIDTH` */\nexport const KANBAN_COLUMN_WIDTH = DASHBOARD_COLUMN_WIDTH;\n/** @deprecated Use `DASHBOARD_GAP` */\nexport const KANBAN_GAP = DASHBOARD_GAP;\n/** @deprecated Use `dashboardAccent` */\nexport const kanbanAccent = dashboardAccent;\n/** @deprecated Use `dashboardAccentValue` */\nexport const kanbanAccentValue = dashboardAccentValue;\n/** @deprecated Use `dashboardCount` */\nexport const kanbanCount = dashboardCount;\n/** @deprecated Use `dashboardLength` */\nexport const kanbanLength = dashboardLength;\n/** @deprecated Use `DashboardCardMove` */\nexport type KanbanCardMove = DashboardCardMove;\n/** @deprecated Use `DashboardLayoutColumn` */\nexport type KanbanLayoutColumn = DashboardLayoutColumn;\n/** @deprecated Use `DashboardPosition` */\nexport type KanbanPosition = DashboardPosition;\n/** @deprecated Use `DashboardDirection` */\nexport type KanbanDirection = DashboardDirection;\n/** @deprecated Use `dashboardFind` */\nexport const kanbanFind = dashboardFind;\n/** @deprecated Use `dashboardSlots` */\nexport const kanbanSlots = dashboardSlots;\n/** @deprecated Use `dashboardCardMove` */\nexport const kanbanCardMove = dashboardCardMove;\n/** @deprecated Use `isDashboardNoop` */\nexport const isKanbanNoop = isDashboardNoop;\n/** @deprecated Use `dashboardInsertIndex` */\nexport const kanbanInsertIndex = dashboardInsertIndex;\n/** @deprecated Use `dashboardKeyboardTarget` */\nexport const kanbanKeyboardTarget = dashboardKeyboardTarget;\n/** @deprecated Use `dashboardKeyAction` */\nexport const kanbanKeyAction = dashboardKeyAction;\n/** @deprecated Use `moveDashboardCard` */\nexport const moveKanbanCard = moveDashboardCard;\n","// Visible window of a fixed-row-height virtual list.\n\n/** Inputs of `getVirtualRange`. */\nexport interface VirtualRangeInput {\n /** Scroll offset of the viewport (px) */\n scrollTop: number;\n /** Height of the viewport (px) */\n viewportHeight: number;\n /** Height of one row (px); `0` or less renders nothing */\n itemHeight: number;\n /** Number of rows */\n itemCount: number;\n /** Rows rendered above and below the viewport; negative or NaN means 0 */\n overscan?: number;\n}\n\n/** Rows to render: indexes `[start, end)`. */\nexport interface VirtualRange {\n start: number;\n end: number;\n /** Rows the window holds (viewport rows plus both overscans) */\n visibleCount: number;\n}\n\n/** The rows of a virtual list to render for the current scroll position. */\nexport function getVirtualRange({\n scrollTop,\n viewportHeight,\n itemHeight,\n itemCount,\n overscan = 0,\n}: VirtualRangeInput): VirtualRange {\n if (!(itemHeight > 0)) return { start: 0, end: 0, visibleCount: 0 };\n const extra = Math.max(0, overscan || 0);\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - extra);\n const visibleCount = Math.ceil(viewportHeight / itemHeight) + 2 * extra;\n const end = Math.min(itemCount, start + visibleCount);\n return { start, end, visibleCount };\n}\n","/** The file fields read by `matchesAccept`. */\nexport interface AcceptFileLike {\n name: string;\n type: string;\n}\n\n/**\n * Whether a file matches an `<input accept>` list: comma-separated\n * extensions (`.png`), MIME types (`image/png`) and wildcards (`image/*`,\n * `*`), case-insensitive. An empty list (or entry) accepts everything.\n */\nexport function matchesAccept(file: AcceptFileLike, accept: string): boolean {\n return accept.split(\",\").some((part) => {\n const rule = part.trim().toLowerCase();\n if (!rule || rule === \"*\" || rule === \"*/*\") return true;\n if (rule.startsWith(\".\")) return file.name.toLowerCase().endsWith(rule);\n const type = file.type.toLowerCase();\n return rule.endsWith(\"/*\")\n ? type.startsWith(rule.slice(0, -1))\n : type === rule;\n });\n}\n","// Separators of the tag inputs: typed or pasted text is split into tags.\n\n/** Default separators of a tag input: a comma and the Enter key. */\nexport const DEFAULT_TAG_SEPARATORS: readonly string[] = [\",\", \"Enter\"];\n\n/**\n * Splits `text` on any of the literal `separators` (longest first, so\n * `\"::\"` wins over `\":\"`). No separators returns `[text]`.\n */\nexport function splitBySeparators(\n text: string,\n separators: readonly string[],\n): string[] {\n if (separators.length === 0) return [text];\n const pattern = [...separators]\n .sort((a, b) => b.length - a.length)\n .map((sep) => sep.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\"|\");\n return text.split(new RegExp(pattern));\n}\n","// Option tree helpers of the cascaders (React Cascader and\n// <minerva-cascader>).\n\n/** The option fields read by the cascader helpers. */\nexport interface CascaderOptionLike<T> {\n value: string | number;\n disabled?: boolean;\n children?: readonly T[];\n}\n\n/** An option of the tree together with the chain of options leading to it. */\nexport interface CascaderSearchEntry<T> {\n option: T;\n /** Options from the root level down to (and including) `option` */\n path: T[];\n}\n\n/**\n * Resolves the option chain of a value path (one value per level). Stops\n * at the first value not found, so the result may be shorter than `values`.\n */\nexport function findCascaderPath<T extends CascaderOptionLike<T>>(\n options: readonly T[],\n values: readonly (string | number)[],\n): T[] {\n const result: T[] = [];\n let level: readonly T[] | undefined = options;\n for (const value of values) {\n const found: T | undefined = level?.find((o) => o.value === value);\n if (!found) break;\n result.push(found);\n level = found.children;\n }\n return result;\n}\n\n/**\n * Every enabled option of the tree (depth first) with its path. Disabled\n * options are skipped together with their descendants.\n */\nexport function flattenCascaderOptions<T extends CascaderOptionLike<T>>(\n options: readonly T[],\n path: T[] = [],\n): CascaderSearchEntry<T>[] {\n return options.flatMap((option) => {\n if (option.disabled) return [];\n const current = [...path, option];\n return [\n { option, path: current },\n ...(option.children\n ? flattenCascaderOptions(option.children, current)\n : []),\n ];\n });\n}\n","// Star math of the ratings (React Rating and <minerva-rating>): scores\n// on a 0..max scale shown as five stars with half stars.\n\n/** Fill of one star. */\nexport type RatingStarFill = \"full\" | \"half\" | \"empty\";\n\n/** Rounds a score to one decimal (`3.14` -> `3.1`). */\nexport const roundRating = (n: number): number => Math.round(n * 10) / 10;\n\n/**\n * Stars shown for `value` on a `0..max` scale, normalized to five stars in\n * half-star steps: fractions in 0.25..0.75 give a half star, larger ones\n * round up, smaller ones down. A `max` of 0 or less (or NaN) shows 0 stars.\n */\nexport function ratingDisplayStars(value: number, max: number): number {\n const stars5 = max > 0 ? (value / max) * 5 : 0;\n const fullCount = Math.floor(stars5);\n const fraction = stars5 - fullCount;\n const half = fraction >= 0.25 && fraction < 0.75;\n const roundedFull = fraction >= 0.75 ? fullCount + 1 : fullCount;\n return roundedFull + (half ? 0.5 : 0);\n}\n\n/** Fill of the star at `index` (0-based) when `displayed` stars are shown. */\nexport const ratingStarFill = (\n index: number,\n displayed: number,\n): RatingStarFill =>\n index < Math.floor(displayed) ? \"full\" : index < displayed ? \"half\" : \"empty\";\n","// Platform-neutral helpers of the media players (React / Vue / Angular\n// MediaPlayer, <minerva-media-player>, the mini-program players and the\n// React Native MediaControls): time formatting, media type inference,\n// playback rates and the keyboard map.\n\n/** Kind of media a player renders. */\nexport type MediaKind = \"audio\" | \"video\";\n\n/** Default playback rates of the speed button. */\nexport const DEFAULT_PLAYBACK_RATES: readonly number[] = [\n 0.5, 0.75, 1, 1.25, 1.5, 2,\n];\n\n/** Default skip step of the back / forward buttons (seconds). */\nexport const DEFAULT_SKIP_SECONDS = 10;\n\n/** Seek step of the arrow keys (seconds). */\nexport const MEDIA_KEY_SEEK_STEP = 5;\n\n/** Volume step of the arrow keys (0..1). */\nexport const MEDIA_KEY_VOLUME_STEP = 0.1;\n\nconst AUDIO_EXTENSIONS = new Set([\n \"mp3\",\n \"m4a\",\n \"aac\",\n \"wav\",\n \"oga\",\n \"ogg\",\n \"opus\",\n \"flac\",\n \"weba\",\n]);\n\n/**\n * Kind of media from an explicit `type`, a MIME type (`audio/mpeg`) or the\n * file extension of `src` (query and hash ignored). Defaults to video.\n */\nexport function inferMediaType(\n src?: string | null,\n mimeType?: string | null,\n type?: MediaKind | null,\n): MediaKind {\n if (type === \"audio\" || type === \"video\") return type;\n const mime = mimeType?.trim().toLowerCase();\n if (mime?.startsWith(\"audio/\")) return \"audio\";\n if (mime?.startsWith(\"video/\")) return \"video\";\n const path = (src ?? \"\").split(/[?#]/)[0] ?? \"\";\n const dot = path.lastIndexOf(\".\");\n const ext = dot >= 0 ? path.slice(dot + 1).toLowerCase() : \"\";\n return AUDIO_EXTENSIONS.has(ext) ? \"audio\" : \"video\";\n}\n\nconst finite = (n: number | null | undefined): number =>\n typeof n === \"number\" && Number.isFinite(n) && n > 0 ? n : 0;\n\n/**\n * `m:ss`, or `h:mm:ss` when the time (or the `duration` it is shown next\n * to) reaches an hour. Negative, NaN and infinite values show `0:00`.\n */\nexport function formatMediaTime(seconds: number, duration?: number): string {\n const total = Math.floor(finite(seconds));\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n const ss = String(secs).padStart(2, \"0\");\n if (hours > 0 || finite(duration) >= 3600) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${ss}`;\n }\n return `${minutes}:${ss}`;\n}\n\n/** Clamps a seek target to `0..duration` (no upper bound while unknown). */\nexport function clampMediaTime(seconds: number, duration?: number): number {\n const value = Number.isFinite(seconds) ? Math.max(0, seconds) : 0;\n const max = finite(duration);\n return max > 0 ? Math.min(value, max) : value;\n}\n\n/** Played fraction (0..1) of the media. */\nexport const mediaProgress = (currentTime: number, duration: number): number =>\n finite(duration) > 0\n ? Math.min(1, Math.max(0, finite(currentTime) / duration))\n : 0;\n\n/** Clamps a volume to 0..1 (rounded to two decimals). */\nexport const clampVolume = (volume: number): number =>\n Number.isFinite(volume)\n ? Math.round(Math.min(1, Math.max(0, volume)) * 100) / 100\n : 1;\n\n/** The rate after `current` in `rates` (wraps around; first when unknown). */\nexport function nextPlaybackRate(\n current: number,\n rates: readonly number[] = DEFAULT_PLAYBACK_RATES,\n): number {\n if (rates.length === 0) return current;\n const index = rates.indexOf(current);\n return rates[(index + 1) % rates.length] ?? current;\n}\n\n/** `1.25` -> `1.25×`, `1` -> `1×`. */\nexport const formatPlaybackRate = (rate: number): string =>\n `${Number(rate.toFixed(2))}×`;\n\n/** Minimal `TimeRanges` shape (DOM media `buffered`). */\nexport interface MediaTimeRanges {\n readonly length: number;\n start(index: number): number;\n end(index: number): number;\n}\n\n/**\n * End of the buffered range that contains `currentTime` (or of the last range\n * before it): what the seek bar shows as loaded.\n */\nexport function bufferedEnd(\n ranges: MediaTimeRanges | null | undefined,\n currentTime: number,\n): number {\n if (!ranges || ranges.length === 0) return 0;\n let end = 0;\n for (let i = 0; i < ranges.length; i++) {\n const start = ranges.start(i);\n const stop = ranges.end(i);\n if (currentTime >= start && currentTime <= stop) return stop;\n if (stop <= currentTime) end = stop;\n }\n return end;\n}\n\n/**\n * Icons of the control bar: SVG path data on a 24×24 box, filled with\n * `currentColor` (Material Symbols shapes, Apache-2.0).\n */\nexport const MEDIA_ICON_PATHS = {\n play: \"M8 5.14v13.72a1 1 0 0 0 1.52.85l10.6-6.86a1 1 0 0 0 0-1.7L9.52 4.3A1 1 0 0 0 8 5.14z\",\n pause: \"M7 5h3.5v14H7zm6.5 0H17v14h-3.5z\",\n skipBack:\n \"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\",\n skipForward:\n \"M12 5V1l5 5-5 5V7c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6h2c0 4.42-3.58 8-8 8s-8-3.58-8-8 3.58-8 8-8z\",\n volume:\n \"M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05A4.47 4.47 0 0 0 16.5 12zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\",\n muted:\n \"M16.5 12A4.5 4.5 0 0 0 14 7.97v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.8 8.8 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4 9.91 6.09 12 8.18V4z\",\n fullscreen:\n \"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\",\n exitFullscreen:\n \"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\",\n pictureInPicture:\n \"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z\",\n captions:\n \"M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\",\n} as const;\n\n/** Name of a control bar icon. */\nexport type MediaIconName = keyof typeof MEDIA_ICON_PATHS;\n\n/** What a key does when the player has the focus. */\nexport type MediaKeyAction =\n | { type: \"toggle\" }\n | { type: \"seek\"; delta: number }\n | { type: \"volume\"; delta: number }\n | { type: \"mute\" }\n | { type: \"fullscreen\" }\n | { type: \"captions\" };\n\n/**\n * Space / K play-pause, ← / → seek by 5 s, ↑ / ↓ volume, M mute,\n * F fullscreen, C captions on / off. `null` for other keys (and modified\n * keys).\n */\nexport function mediaKeyAction(\n key: string,\n modifiers: { ctrlKey?: boolean; metaKey?: boolean; altKey?: boolean } = {},\n): MediaKeyAction | null {\n if (modifiers.ctrlKey || modifiers.metaKey || modifiers.altKey) return null;\n switch (key) {\n case \" \":\n case \"Spacebar\":\n case \"k\":\n case \"K\":\n return { type: \"toggle\" };\n case \"ArrowLeft\":\n return { type: \"seek\", delta: -MEDIA_KEY_SEEK_STEP };\n case \"ArrowRight\":\n return { type: \"seek\", delta: MEDIA_KEY_SEEK_STEP };\n case \"ArrowUp\":\n return { type: \"volume\", delta: MEDIA_KEY_VOLUME_STEP };\n case \"ArrowDown\":\n return { type: \"volume\", delta: -MEDIA_KEY_VOLUME_STEP };\n case \"m\":\n case \"M\":\n return { type: \"mute\" };\n case \"f\":\n case \"F\":\n return { type: \"fullscreen\" };\n case \"c\":\n case \"C\":\n return { type: \"captions\" };\n default:\n return null;\n }\n}\n","// Captions / subtitles of the media players: a small WebVTT + SRT parser, the\n// active cue at a playback time, data: URL decoding and the remembered track\n// choice. Platform-neutral: no DOM, no `fetch`, no storage globals (callers\n// inject them).\n\n/** A captions / subtitles file of a media player. */\nexport interface MediaTrack {\n /** URL of the WebVTT (`.vtt`) or SubRip (`.srt`) file (data: URLs work). */\n src: string;\n /** BCP 47 language of the track (`en`, `fr-CA`). */\n srclang?: string;\n /** Name shown in the captions menu. */\n label: string;\n /** `subtitles` (translation, default) or `captions` (transcription + sounds). */\n kind?: \"subtitles\" | \"captions\";\n /** Selected when the user has not chosen a track yet. */\n default?: boolean;\n}\n\n/** A parsed cue: shown from `start` (inclusive) to `end` (exclusive), seconds. */\nexport interface MediaCue {\n start: number;\n end: number;\n text: string;\n}\n\n/** What the players emit when the captions choice changes (`-1` = off). */\nexport interface MediaTrackChange {\n index: number;\n track: MediaTrack | null;\n}\n\nconst TIMING =\n /^\\s*((?:\\d+:)?\\d{1,2}:\\d{1,2}(?:[.,]\\d{1,3})?)\\s*-->\\s*((?:\\d+:)?\\d{1,2}:\\d{1,2}(?:[.,]\\d{1,3})?)/;\n\n/** `01:02:03.500`, `02:03,5` -> seconds (NaN when malformed). */\nexport function parseCueTime(value: string): number {\n const parts = value.trim().replace(\",\", \".\").split(\":\");\n if (parts.length < 2 || parts.length > 3) return Number.NaN;\n let seconds = 0;\n for (const part of parts) {\n if (!/^\\d+(?:\\.\\d+)?$/.test(part)) return Number.NaN;\n seconds = seconds * 60 + Number(part);\n }\n return seconds;\n}\n\nconst ENTITIES: Record<string, string> = {\n amp: \"&\",\n lt: \"<\",\n gt: \">\",\n quot: '\"',\n apos: \"'\",\n nbsp: \"\\u00a0\",\n lrm: \"\\u200e\",\n rlm: \"\\u200f\",\n};\n\n/**\n * Plain text of a cue payload: strips WebVTT / SRT markup (`<v Name>`, `<b>`,\n * `<i>`, `<c.class>`, `<00:01.000>` timestamps, `<font>`, `{\\an8}`) and\n * decodes the character references.\n */\nexport function cueText(raw: string): string {\n return raw\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/\\{\\\\[^}]*\\}/g, \"\")\n .replace(/<[^>\\n]*>/g, \"\")\n .replace(/&(#x[0-9a-f]+|#\\d+|[a-z]+);/gi, (match, name: string) => {\n if (name[0] === \"#\") {\n const code =\n name[1] === \"x\" || name[1] === \"X\"\n ? Number.parseInt(name.slice(2), 16)\n : Number.parseInt(name.slice(1), 10);\n return Number.isFinite(code) && code > 0 && code <= 0x10ffff\n ? String.fromCodePoint(code)\n : match;\n }\n return ENTITIES[name.toLowerCase()] ?? match;\n })\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction parseBlocks(text: string): MediaCue[] {\n const cues: MediaCue[] = [];\n const blocks = text\n .replace(/^\\uFEFF/, \"\")\n .replace(/\\r\\n?/g, \"\\n\")\n .split(/\\n[ \\t]*\\n/);\n for (const block of blocks) {\n const lines = block.split(\"\\n\");\n const at = lines.findIndex((line) => line.includes(\"-->\"));\n if (at < 0) continue;\n const head = lines[0]?.trim() ?? \"\";\n // WebVTT NOTE / STYLE / REGION blocks never carry cues.\n if (/^(NOTE|STYLE|REGION)(\\s|$)/.test(head) && at !== 0) continue;\n const timing = TIMING.exec(lines[at] ?? \"\");\n if (!timing) continue;\n const start = parseCueTime(timing[1] ?? \"\");\n const end = parseCueTime(timing[2] ?? \"\");\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n continue;\n }\n const content = cueText(lines.slice(at + 1).join(\"\\n\"));\n if (content) cues.push({ start, end, text: content });\n }\n return cues.sort((a, b) => a.start - b.start || a.end - b.end);\n}\n\n/** Cues of a WebVTT file (header, NOTE / STYLE / REGION blocks skipped). */\nexport function parseVtt(text: string): MediaCue[] {\n return parseBlocks(text.replace(/^\\uFEFF?WEBVTT[^\\n]*(\\n|$)/, \"\\n\"));\n}\n\n/** Cues of a SubRip (SRT) file. */\nexport const parseSrt = (text: string): MediaCue[] => parseBlocks(text);\n\n/** Cues of a WebVTT or SRT file (detected from the `WEBVTT` header). */\nexport function parseCaptions(text: string): MediaCue[] {\n return /^\\uFEFF?WEBVTT/.test(text) ? parseVtt(text) : parseSrt(text);\n}\n\n/** Text of the cues shown at `time` (overlapping cues on separate lines). */\nexport function activeCueText(cues: readonly MediaCue[], time: number): string {\n if (!Number.isFinite(time)) return \"\";\n const lines: string[] = [];\n for (const cue of cues) {\n if (cue.start > time) break;\n if (time < cue.end) lines.push(cue.text);\n }\n return lines.join(\"\\n\");\n}\n\n/** Whether `src` names a SubRip file (`.srt`, or an `application/x-subrip` data: URL). */\nexport function isSrtSource(src: string): boolean {\n if (/^data:/i.test(src)) return /^data:[^,;]*(subrip|srt)/i.test(src);\n const path = src.split(/[?#]/)[0] ?? \"\";\n return /\\.srt$/i.test(path);\n}\n\nconst BASE64 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nfunction decodeBase64(value: string): string {\n const clean = value.replace(/[^A-Za-z0-9+/]/g, \"\");\n let hex = \"\";\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n buffer = (buffer << 6) | BASE64.indexOf(char);\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n hex += `%${((buffer >> bits) & 0xff).toString(16).padStart(2, \"0\")}`;\n }\n }\n try {\n return decodeURIComponent(hex);\n } catch {\n // Not UTF-8: read the bytes as Latin-1.\n return hex.replace(/%([0-9a-f]{2})/g, (_, byte: string) =>\n String.fromCharCode(Number.parseInt(byte, 16)),\n );\n }\n}\n\n/** Text of a `data:` URL (percent-encoded or base64), `null` for other URLs. */\nexport function decodeDataUrl(src: string): string | null {\n const match = /^data:([^,]*),([\\s\\S]*)$/i.exec(src.trim());\n if (!match) return null;\n const meta = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n if (/;base64$/i.test(meta)) return decodeBase64(body);\n try {\n return decodeURIComponent(body);\n } catch {\n return body;\n }\n}\n\n/**\n * Cues of a captions file: decodes data: URLs in place, otherwise reads the\n * text with `fetchText` (`fetch`, `Taro.request`, `uni.request`…).\n */\nexport async function loadCaptions(\n src: string,\n fetchText: (url: string) => Promise<string>,\n): Promise<MediaCue[]> {\n const inline = decodeDataUrl(src);\n const text = inline ?? (await fetchText(src));\n return isSrtSource(src) ? parseSrt(text) : parseCaptions(text);\n}\n\n/** Storage key of the remembered captions choice. */\nexport const MEDIA_CAPTIONS_STORAGE_KEY = \"minerva-media-player-captions\";\n\n/** Remembered form of a choice: `\"off\"`, or the track language (label when none). */\nexport const captionsPreference = (track: MediaTrack | null): string =>\n track ? track.srclang || track.label : \"off\";\n\nconst primary = (lang: string) => lang.toLowerCase().split(/[-_]/)[0] ?? \"\";\n\n/**\n * Index of the track to show (`-1` = off): the remembered choice (`\"off\"`,\n * a language — exact, then primary subtag — or a label), else the first\n * `default` track, else off.\n */\nexport function pickCaptionsTrack(\n tracks: readonly MediaTrack[],\n preference?: string | null,\n): number {\n if (tracks.length === 0) return -1;\n if (preference === \"off\") return -1;\n if (preference) {\n const wanted = preference.toLowerCase();\n let index = tracks.findIndex((t) => t.srclang?.toLowerCase() === wanted);\n if (index < 0) {\n index = tracks.findIndex(\n (t) => !!t.srclang && primary(t.srclang) === primary(wanted),\n );\n }\n if (index < 0) {\n index = tracks.findIndex((t) => t.label.toLowerCase() === wanted);\n }\n if (index >= 0) return index;\n }\n return tracks.findIndex((t) => t.default);\n}\n\n/** Minimal synchronous key-value storage (`localStorage`, mini-program storage). */\nexport interface CaptionsStorage {\n getItem(key: string): string | null | undefined;\n setItem(key: string, value: string): void;\n}\n\n/** The remembered captions choice (`null` when none or storage fails). */\nexport function readCaptionsPreference(\n storage?: CaptionsStorage | null,\n): string | null {\n try {\n const value = storage?.getItem(MEDIA_CAPTIONS_STORAGE_KEY);\n return typeof value === \"string\" && value ? value : null;\n } catch {\n return null;\n }\n}\n\n/** Remembers a captions choice (storage failures ignored). */\nexport function writeCaptionsPreference(\n storage: CaptionsStorage | null | undefined,\n track: MediaTrack | null,\n): void {\n try {\n storage?.setItem(MEDIA_CAPTIONS_STORAGE_KEY, captionsPreference(track));\n } catch {\n // Private mode, quota, sandboxed frame: the choice is not remembered.\n }\n}\n\n/**\n * Track the captions key (C) switches to: off when one is shown, else the\n * last used one (`previous`), else the first track. `null` without tracks.\n */\nexport function toggledCaptionsTrack(\n tracks: readonly MediaTrack[],\n current: number,\n previous: number,\n): number | null {\n if (tracks.length === 0) return null;\n if (current >= 0) return -1;\n return previous >= 0 && previous < tracks.length ? previous : 0;\n}\n","// Value helpers of the sliders (every renderer): clamping, snapping to the\n// step or to the marks, keyboard stepping, two-thumb ranges.\n\n/** A slider value: one number, or `[start, end]` for a range slider */\nexport type SliderValue = number | [number, number];\n\n/** A mark of the slider scale */\nexport interface SliderMark {\n /** Position of the mark (between min and max) */\n value: number;\n /** Text shown under the mark */\n label?: string;\n}\n\n/** Scale of a slider */\nexport interface SliderScale {\n min: number;\n max: number;\n /** Step between two values; `null` snaps to the marks only */\n step: number | null;\n /** Marks of the scale (already resolved, see `getSliderMarks`) */\n marks?: readonly SliderMark[];\n /** Snap to the closest mark (instead of the step) */\n snapToMarks?: boolean;\n}\n\n/** Most step ticks drawn by `marks: true` (denser scales draw none). */\nexport const SLIDER_MAX_STEP_MARKS = 101;\n\n/** Decimal places of a step (`0.05` -> 2). */\nexport function sliderPrecision(step?: number | null): number {\n if (!step || !Number.isFinite(step)) return 0;\n const s = String(step);\n const exp = s.match(/e-(\\d+)$/);\n if (exp) return Number(exp[1]);\n const dot = s.indexOf(\".\");\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\n/** `v` limited to `[min, max]`. */\nexport function clampSliderValue(v: number, min: number, max: number): number {\n if (Number.isNaN(v)) return min;\n return Math.min(max, Math.max(min, v));\n}\n\n/**\n * Marks of a slider: `true` draws one tick per step (none when there would\n * be more than `SLIDER_MAX_STEP_MARKS`), an array keeps the marks within\n * `[min, max]`, sorted.\n */\nexport function getSliderMarks(\n marks: readonly SliderMark[] | boolean | undefined | null,\n min: number,\n max: number,\n step: number | null = 1,\n): SliderMark[] {\n if (!marks || max <= min) return [];\n if (marks === true) {\n if (!step || step <= 0) return [];\n const count = Math.floor((max - min) / step + 1e-9) + 1;\n if (count > SLIDER_MAX_STEP_MARKS) return [];\n const precision = sliderPrecision(step);\n return Array.from({ length: count }, (_, i) => ({\n value: Number((min + i * step).toFixed(precision)),\n }));\n }\n return marks\n .filter((m) => Number.isFinite(m.value) && m.value >= min && m.value <= max)\n .slice()\n .sort((a, b) => a.value - b.value);\n}\n\n/** The mark closest to `v` (`undefined` without marks). */\nfunction closestMark(\n v: number,\n marks: readonly SliderMark[] | undefined,\n): number | undefined {\n if (!marks?.length) return undefined;\n let best = marks[0].value;\n for (const m of marks) {\n if (Math.abs(m.value - v) < Math.abs(best - v)) best = m.value;\n }\n return best;\n}\n\n/**\n * `v` snapped to the scale: to the closest mark with `snapToMarks` (or a\n * `null` step), otherwise to the closest step from `min`; always clamped.\n */\nexport function snapSliderValue(v: number, scale: SliderScale): number {\n const { min, max, step, marks, snapToMarks } = scale;\n const clamped = clampSliderValue(v, min, max);\n if (snapToMarks || step === null) {\n return closestMark(clamped, marks) ?? clamped;\n }\n if (!step || step <= 0) return clamped;\n const snapped = min + Math.round((clamped - min) / step) * step;\n const precision = Math.max(sliderPrecision(step), sliderPrecision(min));\n // A last step shorter than `step` can overshoot `max`: clamp again.\n return clampSliderValue(Number(snapped.toFixed(precision)), min, max);\n}\n\n/** Position of `v` on the scale, in percent (0..100). */\nexport function sliderPercent(v: number, min: number, max: number): number {\n if (max <= min) return 0;\n return ((clampSliderValue(v, min, max) - min) / (max - min)) * 100;\n}\n\n/**\n * Ratio (0..1 from the min end, unclamped) of a pointer `position` on a\n * track whose measured axis starts at `start` and is `length` long.\n * `reversed` tracks have their min at the far end of the axis: vertical\n * sliders (min at the bottom, the y axis grows downwards) and horizontal RTL\n * sliders. `0` while the track is not measured.\n */\nexport function sliderRatioAt(\n position: number,\n start: number,\n length: number,\n reversed = false,\n): number {\n if (!length) return 0;\n const ratio = (position - start) / length;\n return reversed ? 1 - ratio : ratio;\n}\n\n/**\n * The snapped value at `ratio` (0..1, from the start of the track) of the\n * track. Renderers flip the ratio for RTL / vertical sliders (see\n * `sliderRatioAt`).\n */\nexport function sliderValueFromRatio(\n ratio: number,\n scale: SliderScale,\n): number {\n const r = Math.min(1, Math.max(0, Number.isFinite(ratio) ? ratio : 0));\n return snapSliderValue(scale.min + r * (scale.max - scale.min), scale);\n}\n\n/**\n * The value after a key press: ArrowRight / ArrowUp add one step, ArrowLeft\n * / ArrowDown remove one, PageUp / PageDown move by 10% of the scale (at\n * least one step), Home / End jump to the bounds. Marks-only sliders move\n * to the next / previous mark. `null` for other keys. Keys are logical:\n * renderers swap the horizontal arrows in RTL.\n */\nexport function getSliderKeyValue(\n key: string,\n value: number,\n scale: SliderScale,\n): number | null {\n const { min, max, step, marks, snapToMarks } = scale;\n if (key === \"Home\") return snapSliderValue(min, scale);\n if (key === \"End\") return snapSliderValue(max, scale);\n const up = key === \"ArrowRight\" || key === \"ArrowUp\";\n const down = key === \"ArrowLeft\" || key === \"ArrowDown\";\n const pageUp = key === \"PageUp\";\n const pageDown = key === \"PageDown\";\n if (!up && !down && !pageUp && !pageDown) return null;\n const direction = up || pageUp ? 1 : -1;\n if ((snapToMarks || step === null) && marks?.length) {\n const values = marks.map((m) => m.value);\n if (pageUp || pageDown) {\n const jump = Math.max(1, Math.round(values.length / 10));\n const index = values.indexOf(closestMark(value, marks) as number);\n const next = Math.min(\n values.length - 1,\n Math.max(0, index + direction * jump),\n );\n return values[next];\n }\n const next =\n direction > 0\n ? values.find((v) => v > value)\n : [...values].reverse().find((v) => v < value);\n return next ?? value;\n }\n const unit = step && step > 0 ? step : (max - min) / 100;\n const delta = pageUp || pageDown ? Math.max(unit, (max - min) / 10) : unit;\n return snapSliderValue(value + direction * delta, scale);\n}\n\n/**\n * A value made valid for the slider: a clamped (and snapped) number, or for\n * a range two clamped values in order. Missing values fall back to the\n * bounds.\n */\nexport function normalizeSliderValue(\n value: SliderValue | null | undefined,\n range: boolean,\n scale: SliderScale,\n): SliderValue {\n const fix = (v: unknown, fallback: number) =>\n typeof v === \"number\" && Number.isFinite(v)\n ? snapSliderValue(v, scale)\n : fallback;\n if (range) {\n const pair = Array.isArray(value)\n ? value\n : typeof value === \"number\"\n ? [scale.min, value]\n : [scale.min, scale.max];\n const a = fix(pair[0], scale.min);\n const b = fix(pair[1], scale.max);\n return a <= b ? [a, b] : [b, a];\n }\n return fix(Array.isArray(value) ? value[0] : value, scale.min);\n}\n\n/** The values of a slider value as a list (one or two thumbs). */\nexport function sliderValues(value: SliderValue): number[] {\n return Array.isArray(value) ? [value[0], value[1]] : [value];\n}\n\n/**\n * The value with thumb `index` moved to `next`. Range thumbs cannot cross:\n * the start stops at the end and the end at the start.\n */\nexport function setSliderThumb(\n value: SliderValue,\n index: number,\n next: number,\n): SliderValue {\n if (!Array.isArray(value)) return next;\n if (index === 0) return [Math.min(next, value[1]), value[1]];\n return [value[0], Math.max(next, value[0])];\n}\n\n/** Index of the thumb closest to `v` (ties go to the end thumb when past it). */\nexport function closestSliderThumb(value: SliderValue, v: number): number {\n if (!Array.isArray(value)) return 0;\n const [a, b] = value;\n if (a === b) return v > b ? 1 : 0;\n return Math.abs(v - a) <= Math.abs(v - b) ? 0 : 1;\n}\n\n/** Whether two slider values are equal. */\nexport function sliderValuesEqual(a: SliderValue, b: SliderValue): boolean {\n if (Array.isArray(a) && Array.isArray(b))\n return a[0] === b[0] && a[1] === b[1];\n return a === b;\n}\n\n/** Whether a mark lies inside the filled part of the track. */\nexport function isSliderMarkActive(mark: number, value: SliderValue): boolean {\n if (Array.isArray(value)) return mark >= value[0] && mark <= value[1];\n return mark <= value;\n}\n","/**\n * A value accepted by {@link cn}: strings / numbers are kept, falsy values are\n * skipped, arrays are flattened and objects contribute their truthy keys.\n */\nexport type ClassValue =\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | ClassDictionary\n | ClassValue[];\n\n/** `{ \"is-active\": isActive }` — keys whose value is truthy are kept. */\nexport type ClassDictionary = Record<string, unknown>;\n\nconst append = (out: string[], value: ClassValue): void => {\n if (!value || value === true) return;\n if (typeof value === \"string\" || typeof value === \"number\") {\n out.push(String(value));\n } else if (typeof value === \"bigint\") {\n out.push(value.toString());\n } else if (Array.isArray(value)) {\n for (const item of value) append(out, item);\n } else {\n for (const key of Object.keys(value)) {\n if (key && value[key]) out.push(key);\n }\n }\n};\n\n/**\n * Join class names, skipping falsy values (a dependency-free `classnames`).\n *\n * cn(\"btn\", isActive && \"btn-active\", { \"btn-disabled\": disabled }, className)\n */\nexport function cn(...inputs: ClassValue[]): string {\n const out: string[] = [];\n for (const input of inputs) append(out, input);\n return out.join(\" \");\n}\n","// Vocabulary of the code highlighter, kept apart from the tokenizer so the\n// theme tokens (../tokens/code.ts) can list the token types without loading\n// the grammars.\n\n/**\n * Token types produced by `highlightCode`. Each one has a color token,\n * `--code-token-<type>-color` (light and dark values in `tokens.css`,\n * resolved by `resolveTokens` for React Native and the mini-programs).\n */\nexport const highlightTokenTypes = [\n \"comment\",\n \"keyword\",\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"property\",\n \"function\",\n \"tag\",\n \"attr-name\",\n \"attr-value\",\n \"punctuation\",\n \"operator\",\n \"regex\",\n \"variable\",\n \"builtin\",\n \"inserted\",\n \"deleted\",\n \"heading\",\n] as const;\n\n/** Type of a highlighted token (see `highlightTokenTypes`). */\nexport type HighlightTokenType = (typeof highlightTokenTypes)[number];\n\n/**\n * A run of source text. `type` is `null` for plain text. The texts of the\n * tokens returned by `highlightCode` concatenate to the input exactly.\n */\nexport interface HighlightToken {\n type: HighlightTokenType | null;\n text: string;\n}\n\n/** Canonical names of the languages `highlightCode` understands. */\nexport const supportedCodeLanguages = [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"css\",\n \"html\",\n \"bash\",\n \"python\",\n \"yaml\",\n \"sql\",\n \"diff\",\n \"markdown\",\n \"plain\",\n] as const;\n\n/** A canonical language name (see `normalizeCodeLanguage` for the aliases). */\nexport type CodeLanguage = (typeof supportedCodeLanguages)[number];\n","// Language detection of unlabelled code (EPUB `<pre>` without a class,\n// Markdown fences without an info string, HTML extracts…).\n//\n// `detectCodeLanguage(code)` scores the first ~4 KB / 200 lines against\n// hand-picked features of each supported language (a line rule adds its\n// points for each matching line, up to a few lines, so no single feature\n// dominates) and returns the best one, or \"plain\" when no score reaches the\n// threshold. Unambiguous markers (a shebang, a doctype, valid JSON) decide\n// directly. Pure, deterministic (ties follow a fixed order) and roughly\n// linear: every regular expression is tried on one line of at most 400\n// characters, without nested quantifiers.\nimport type { CodeLanguage } from \"./types\";\n\nconst SAMPLE_CHARS = 4096;\nconst SAMPLE_LINES = 200;\nconst LINE_CHARS = 400;\n/** Lowest winning score: below it the code stays plain */\nconst THRESHOLD = 3;\n\ntype Bucket =\n | \"js\"\n | \"ts\"\n | \"jsx\"\n | \"json\"\n | \"css\"\n | \"html\"\n | \"bash\"\n | \"python\"\n | \"yaml\"\n | \"sql\"\n | \"diff\"\n | \"markdown\";\n\n/** Points added for each matching line, for at most `cap` lines (default 4) */\ntype LineRule = readonly [\n bucket: Bucket,\n pattern: RegExp,\n points: number,\n cap?: number,\n];\n\nconst CSS_TAGS =\n \"html|body|main|header|footer|nav|section|article|aside|div|span|a|p|h[1-6]|ul|ol|li|dl|dt|dd|img|button|input|select|textarea|label|form|fieldset|table|thead|tbody|tr|td|th|pre|code|blockquote|figure|figcaption|strong|em|small|svg|canvas|video|audio|iframe|hr\";\nconst CSS_PROPS =\n \"color|background(-color|-image|-size|-position|-repeat)?|margin(-top|-right|-bottom|-left|-inline|-block)?|padding(-top|-right|-bottom|-left|-inline|-block)?|display|position|top|right|bottom|left|inset|width|height|min-width|min-height|max-width|max-height|border(-top|-right|-bottom|-left|-radius|-color|-width|-style)?|outline|font(-family|-size|-weight|-style)?|line-height|letter-spacing|text-(align|decoration|transform|overflow|shadow)|white-space|word-break|overflow(-x|-y|-wrap)?|z-index|opacity|transform|transition|animation|box-shadow|box-sizing|cursor|flex(-direction|-wrap|-grow|-shrink|-basis)?|justify-content|align-(items|self|content)|gap|grid(-template-columns|-template-rows|-area|-column|-row)?|content|visibility|vertical-align|list-style|filter|fill|stroke\";\nconst SHELL_COMMANDS =\n \"apt|apt-get|brew|npm|npx|pnpm|yarn|bun|pip|pip3|git|cd|ls|mkdir|rm|cp|mv|curl|wget|chmod|chown|echo|source|docker|kubectl|cat|grep|sed|awk|tar|make|ssh|scp|touch|unzip|systemctl|cargo|rustup|python|python3|node|deno|sudo\";\n\nconst LINE_RULES: readonly LineRule[] = [\n // JavaScript (shared by TypeScript / JSX / TSX)\n [\"js\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$[{][^=]*=[^=>]/, 3],\n [\"js\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$[{][^=]*$/, 2],\n [\"js\", /=>/, 1.5],\n [\"js\", /\\bfunction\\b\\s*\\*?\\s*[\\w$]*\\s*\\(/, 2.5],\n [\"js\", /\\brequire\\(\\s*['\"]/, 3],\n [\"js\", /^\\s*import\\s+[\\w$*{][^'\"]*\\s+from\\s+['\"][^'\"]+['\"]/, 3],\n [\"js\", /^\\s*import\\s+['\"][^'\"]+['\"]\\s*;/, 2],\n [\"js\", /\\b(module\\.exports|exports\\.[\\w$]+)\\s*=/, 3],\n [\"js\", /^\\s*export\\s+(default\\b|async\\b|function\\b|class\\b|\\{|\\*)/, 2.5],\n [\"js\", /\\bconsole\\.(log|error|warn|info|debug)\\(/, 3],\n [\"js\", /[!=]==/, 1.5],\n [\"js\", /\\b(document|window|globalThis)\\.\\w/, 2],\n [\"js\", /\\bawait\\s+[\\w$.]+\\(|\\basync\\s*(\\(|function\\b|[\\w$]+\\s*=>)/, 1.5],\n [\"js\", /\\bnew\\s+[A-Z][\\w$]*\\(/, 1],\n [\"js\", /\\bthis\\.[\\w$]/, 1.5],\n [\"js\", /`[^`]*\\$\\{/, 1.5],\n [\"js\", /^\\s*(if|for|while|switch)\\s*\\(.*\\)\\s*\\{\\s*$/, 1],\n [\"js\", /^\\s*\\}\\s*(else|catch|finally)\\b/, 1.5],\n [\"js\", /;\\s*$/, 0.25, 8],\n [\"js\", /(^|\\s)\\/\\/\\s/, 0.5],\n // TypeScript (on top of JavaScript)\n [\n \"ts\",\n /^\\s*(export\\s+)?(declare\\s+)?(interface|type)\\s+[A-Z][\\w$]*\\s*(<[^>]*>)?\\s*(=|\\{|extends\\b)/,\n 5,\n 3,\n ],\n [\"ts\", /^\\s*(export\\s+)?(declare\\s+)?(const\\s+)?enum\\s+[A-Z][\\w$]*\\s*\\{/, 5],\n [\"ts\", /\\bas\\s+const\\b/, 4],\n [\"ts\", /^\\s*import\\s+type\\b/, 4],\n // not at the line end: `type: string` is YAML too\n [\n \"ts\",\n /[\\w$?)\\]]\\s*:\\s*(string|number|boolean|void|any|unknown|never|bigint)(\\[\\])?\\s*[;,)=|>{}\\]]/,\n 2.5,\n ],\n [\n \"ts\",\n /\\)\\s*:\\s*(Promise\\b|[A-Z][\\w$]*|string|number|boolean|void)[^{=;]*(\\{|=>)\\s*$/,\n 3,\n ],\n [\"ts\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$]+\\s*:\\s*[\\w$<[{(]/, 3],\n [\"ts\", /\\b(private|public|protected|readonly)\\s+[\\w$]+\\s*[:;=(?]/, 2],\n [\n \"ts\",\n /\\b(implements\\s+[A-Z]|keyof\\s|satisfies\\s|abstract\\s+class\\b|declare\\s+(module|global|const|function))/,\n 2,\n ],\n [\"ts\", /[\\w$]<\\s*[A-Z][\\w$]*(\\[\\])?(\\s*,\\s*[A-Z][\\w$]*(\\[\\])?)*\\s*>\\s*\\(/, 2],\n // JSX (markup inside JavaScript)\n [\"jsx\", /(\\breturn|=>|[=(?:,&|])\\s*\\(?\\s*<([A-Za-z][\\w.]*|>)[\\s/>]/, 3],\n // not after an identifier: `Promise<Book>` is a generic\n [\"jsx\", /(^|[^\\w$.])<\\/?[A-Z][\\w.]*[\\s/>]/, 1.5],\n [\"jsx\", /\\s(className|htmlFor|on[A-Z]\\w*)=/, 2],\n [\"jsx\", /\\s[\\w-]+=\\{/, 2],\n [\"jsx\", /<>|<\\/>/, 3],\n // HTML / XML\n [\"html\", /<\\/[a-zA-Z][\\w:-]*\\s*>/, 1.5, 6],\n [\n \"html\",\n /(^|[^\\w$.])<[a-zA-Z][\\w:-]*(\\s+[\\w:@.-]+(\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/,\n 1,\n 6,\n ],\n [\"html\", /<!--/, 2, 2],\n [\"html\", /<\\/?(script|style|head|body|meta|link)\\b/i, 2, 2],\n [\"html\", /&([a-z]+|#\\d+);/, 1, 2],\n // CSS\n [\n \"css\",\n /^\\s*@(media|supports|font-face|keyframes|import|layer|container|page|charset)\\b/,\n 3,\n 3,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*([.#][\\\\w-]+|[*&]|::?[\\\\w-]+|\\\\[[\\\\w-]+|(${CSS_TAGS})\\\\b)[^{};=]*\\\\{\\\\s*$`,\n ),\n 2,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*([.#][\\\\w-]+|::?[\\\\w-]+|(${CSS_TAGS})\\\\b)[^{};=]*\\\\{[^{}]*:[^{}]*\\\\}\\\\s*$`,\n ),\n 3,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*(--[\\\\w-]+|-(webkit|moz|ms)-[\\\\w-]+|${CSS_PROPS})\\\\s*:\\\\s*[^;{}]+;\\\\s*$`,\n ),\n 1.5,\n 8,\n ],\n [\n \"css\",\n /^\\s*[a-z-]+\\s*:[^;{}]*(\\d(px|rem|em|vh|vw|ms|deg|fr)\\b|#[0-9a-fA-F]{3,8}\\b|\\b(rgba?|hsla?|var|calc)\\()[^;{}]*;\\s*$/,\n 1.5,\n ],\n [\"css\", /!important\\s*;/, 1, 2],\n // Python\n [\"python\", /^\\s*(async\\s+)?def\\s+\\w+\\s*\\(.*\\)\\s*(->[^:]+)?:\\s*(#.*)?$/, 4, 3],\n [\"python\", /^>>> /, 3],\n [\"python\", /^\\s*class\\s+\\w+(\\s*\\(.*\\))?\\s*:\\s*$/, 4, 2],\n [\n \"python\",\n /^\\s*(import\\s+[\\w.]+(\\s+as\\s+\\w+)?(\\s*,\\s*[\\w.]+)*|from\\s+[.\\w]+\\s+import\\s+(\\(|\\*|[\\w, ]+))\\s*$/,\n 3,\n 3,\n ],\n [\"python\", /\\bself\\.\\w/, 1.5, 3],\n [\"python\", /^\\s*elif\\b.*:\\s*$/, 3, 1],\n [\n \"python\",\n /^\\s*(if|for|while|with|try|except|else|finally)\\b[^{};]*:\\s*(#.*)?$/,\n 1.5,\n ],\n [\"python\", /^\\s*print\\(/, 1, 2],\n [\"python\", /\\b(None|True|False)\\b/, 1, 2],\n [\"python\", /__\\w+__/, 2, 2],\n [\n \"python\",\n /\\b(lambda\\s|nonlocal\\s|yield\\s+from\\b|not\\s+in\\b|is\\s+not\\b|is\\s+None\\b)/,\n 1.5,\n ],\n [\"python\", /^\\s*(pass|raise\\b.*)\\s*$/, 1.5, 2],\n [\"python\", /\\bf\"[^\"]*\\{|\\bf'[^']*\\{/, 1, 2],\n [\"python\", /^\\s*@[\\w.]+(\\(.*\\))?\\s*$/, 0.5, 2],\n // Bash / shell sessions\n [\"bash\", /^\\s*\\$\\s+\\S/, 3],\n [\n \"bash\",\n new RegExp(\n `^\\\\s*(\\\\$\\\\s+)?(sudo\\\\s+)?(${SHELL_COMMANDS})(\\\\s+[^\\\\s=:(.]|\\\\s*$)`,\n ),\n 3,\n 5,\n ],\n [\n \"bash\",\n /^\\s*(\\$\\s+)?(sudo\\s+)?(npm|pnpm|yarn|npx|pip3?|brew|apt(-get)?|git|docker|cargo|gem|composer|kubectl)\\s+(install|i|add|run|exec|init|clone|commit|push|pull|checkout|build|test|start|get|update|upgrade|remove|uninstall|status|log|diff|compose|apply|create|ci|dlx)\\b/,\n 2,\n 3,\n ],\n [\"bash\", /\\s--?[a-zA-Z][\\w-]*(=\\S+)?(\\s|$)/, 0.5],\n [\"bash\", /^\\s*export\\s+[A-Za-z_]\\w*=/, 3],\n [\"bash\", /^\\s*[A-Za-z_]\\w*=(\"|'|\\$|[^\\s=])/, 1, 3],\n [\"bash\", /&&|\\|\\||\\s\\|\\s/, 0.5, 2],\n [\"bash\", /\\$\\{?[A-Za-z_]\\w*\\}?|\\$\\(|\\$[0-9@#?]/, 0.5, 3],\n [\n \"bash\",\n /^\\s*(if\\s+\\[|then\\s*$|fi\\s*$|do\\s*$|done\\b|esac\\b|case\\s+.+\\s+in\\s*$|while\\s+\\[|elif\\s+\\[|for\\s+\\w+\\s+in\\s+[^:]*$)/,\n 3,\n ],\n [\n \"bash\",\n /2>&1|>\\s*\\/dev\\/null|\\|\\s*(grep|xargs|sort|head|tail|wc|tee|less)\\b/,\n 2,\n 2,\n ],\n // SQL (statements at a line start, any case; clauses in capitals)\n [\"sql\", /^\\s*SELECT\\s*$/, 2, 1],\n [\n \"sql\",\n /^\\s*(select\\s+(\\*|distinct\\b|top\\s+\\d|count\\(|[\\w.]+\\s*,|[\\w.]+\\s+as\\s|[\\w.]+\\s+from\\s)|insert\\s+into\\s+[\\w.\"`[]|update\\s+[\\w.\"`]+\\s+set\\s|delete\\s+from\\s+[\\w.\"`[]|create\\s+(or\\s+replace\\s+)?(temp(orary)?\\s+)?(table|index|unique\\s+index|view|database|schema|function|trigger|sequence)\\b|alter\\s+table\\s|drop\\s+(table|index|view|database|schema)\\b|with\\s+(recursive\\s+)?\\w+\\s+as\\s*\\()/i,\n 4,\n 3,\n ],\n [\n \"sql\",\n /^\\s*(FROM|WHERE|JOIN|LEFT JOIN|INNER JOIN|RIGHT JOIN|GROUP BY|ORDER BY|HAVING|LIMIT|VALUES|SET|UNION|ON|AND|OR)\\b/,\n 1,\n ],\n [\n \"sql\",\n /\\b(VARCHAR|INTEGER|PRIMARY KEY|NOT NULL|FOREIGN KEY|REFERENCES|AUTO_INCREMENT|BIGINT|TIMESTAMP|primary key|not null|varchar|foreign key)\\b/,\n 1,\n 3,\n ],\n [\"sql\", /^\\s*--\\s/, 0.5, 2],\n // diff\n [\"diff\", /^@@ -\\d+(,\\d+)? \\+\\d+(,\\d+)? @@/, 5, 3],\n [\"diff\", /^diff --git /, 5, 1],\n [\"diff\", /^index [0-9a-f]+\\.\\.[0-9a-f]+/, 3, 1],\n // Markdown\n [\"markdown\", /^#\\s+\\S/, 1.5, 3],\n [\"markdown\", /^#{2,6}\\s+\\S/, 2.5, 3],\n [\"markdown\", /^\\s*[-*+]\\s+\\S/, 0.75],\n [\"markdown\", /^\\s*\\d+[.)]\\s+\\S/, 1, 3],\n [\n \"markdown\",\n /\\[[^\\]\\n]+\\]\\((https?:\\/\\/|mailto:|\\.{0,2}\\/|#)[^)\\s]*\\)|\\[[^\\]\\n]+\\]\\([\\w./-]+\\.(md|html?|png|jpe?g|gif|svg)\\)/,\n 2,\n 3,\n ],\n [\"markdown\", /!\\[[^\\]]*\\]\\([^)\\s]+\\)/, 2, 2],\n [\"markdown\", /^\\s{0,3}(```|~~~)/, 4],\n [\"markdown\", /^>\\s?\\S/, 1, 2],\n [\"markdown\", /\\*\\*[^*\\n]+\\*\\*/, 1, 2],\n [\"markdown\", /(^|[^`])`[^`\\n]+`/, 0.5, 2],\n [\"markdown\", /^\\s*\\|.+\\|\\s*$/, 0.5],\n [\"markdown\", /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)+\\|?\\s*$/, 3, 1],\n [\"markdown\", /^=+\\s*$/, 2, 1],\n];\n\n/** A prose sentence (Markdown paragraphs): words, no code punctuation */\nconst isProse = (line: string) =>\n /^[A-Z]/.test(line) &&\n /[.!?:]$/.test(line) &&\n !/[{};=<>()]/.test(line) &&\n line.split(/\\s+/).length >= 6;\n\n/** A line of a JSON document (keys and values, brackets, commas) */\nconst JSON_LINE =\n /^\\s*(\"([^\"\\\\]|\\\\.)*\"\\s*:\\s*)?([[{]|\"([^\"\\\\]|\\\\.)*\"|-?\\d[\\d.eE+-]*|true|false|null)?\\s*[\\]},]*\\s*,?\\s*$/;\nconst YAML_KEY_VALUE = /^\\s*(-\\s+)?[A-Za-z_\"'][\\w\"' ./-]*:\\s+\\S/;\nconst YAML_KEY = /^\\s*(-\\s+)?[A-Za-z_\"'][\\w\"'./-]*:\\s*$/;\nconst YAML_ITEM = /^\\s*-\\s+\\S/;\nconst YAML_DOCUMENT = /^(---|\\.\\.\\.)\\s*$/;\n\n/** Preference among equal scores: the more specific languages first */\nconst ORDER: readonly CodeLanguage[] = [\n \"diff\",\n \"json\",\n \"html\",\n \"tsx\",\n \"jsx\",\n \"typescript\",\n \"javascript\",\n \"python\",\n \"sql\",\n \"css\",\n \"yaml\",\n \"bash\",\n \"markdown\",\n];\n\n/** The analysed head of the code: ~4 KB, cut at a line break, ≤ 200 lines */\nfunction sample(code: string): { text: string; whole: boolean } {\n let text = code.slice(0, SAMPLE_CHARS);\n const whole = text.length === code.length;\n if (!whole) {\n const cut = text.lastIndexOf(\"\\n\");\n if (cut > 0) text = text.slice(0, cut);\n }\n const lines = text.split(\"\\n\");\n if (lines.length > SAMPLE_LINES) {\n return { text: lines.slice(0, SAMPLE_LINES).join(\"\\n\"), whole: false };\n }\n return { text, whole };\n}\n\n/** Language decided by an unambiguous marker, else undefined */\nfunction marker(text: string, whole: boolean): CodeLanguage | undefined {\n const end = text.indexOf(\"\\n\");\n const first = (end < 0 ? text : text.slice(0, end)).trim();\n if (first.startsWith(\"#!\")) {\n if (/\\b(ba|z|k|da)?sh\\b/.test(first)) return \"bash\";\n if (/\\bpython[\\d.]*\\b/.test(first)) return \"python\";\n if (/\\b(node|deno|bun)\\b/.test(first)) return \"javascript\";\n }\n if (/^(<!doctype\\s+html|<\\?xml\\s|<html[\\s>])/i.test(first)) return \"html\";\n if (whole && /^[[{]/.test(text) && /[\"\\d]/.test(text)) {\n try {\n const value: unknown = JSON.parse(text);\n if (value !== null && typeof value === \"object\") return \"json\";\n } catch {\n // not strict JSON: scored below\n }\n }\n return undefined;\n}\n\n/**\n * Guesses the language of unlabelled code: one of the canonical names of\n * `supportedCodeLanguages`, `\"plain\"` when nothing is convincing (empty,\n * very short or ambiguous text, prose). Fast heuristic scoring of the\n * first ~4 KB / 200 lines: shebangs, doctypes and valid JSON decide\n * directly; otherwise keywords, declarations and the shape of the lines\n * (`key: value`, `prop: value;`, `+` / `-` hunks, tags inside JavaScript…)\n * are weighed and the best score above a threshold wins. Deterministic and\n * dependency-free; a guess, so pass the language when it is known.\n */\nexport function detectCodeLanguage(code: string): CodeLanguage {\n if (typeof code !== \"string\") return \"plain\";\n const { text: head, whole } = sample(code.replace(/\\r\\n?/g, \"\\n\"));\n const text = head.trim();\n if (text.length < 4) return \"plain\";\n\n const decided = marker(text, whole);\n if (decided) return decided;\n\n const score: Record<Bucket, number> = {\n js: 0,\n ts: 0,\n jsx: 0,\n json: 0,\n css: 0,\n html: 0,\n bash: 0,\n python: 0,\n yaml: 0,\n sql: 0,\n diff: 0,\n markdown: 0,\n };\n const hits = new Array<number>(LINE_RULES.length).fill(0);\n const lines = text\n .split(\"\\n\")\n .map((line) => line.slice(0, LINE_CHARS).replace(/\\s+$/, \"\"));\n let nonBlank = 0;\n let jsonLines = 0;\n let yamlLines = 0;\n let yamlKeys = 0;\n let yamlItems = 0;\n let yamlDocuments = 0;\n let yamlNested = false;\n let yamlParent = false;\n let plus = 0;\n let minus = 0;\n let hunkLike = 0;\n let prose = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n nonBlank++;\n LINE_RULES.forEach(([bucket, pattern, points, cap = 4], r) => {\n if (hits[r] < cap && pattern.test(line)) {\n hits[r]++;\n score[bucket] += points;\n }\n });\n if (JSON_LINE.test(line) || /^\\s*\\/\\/ /.test(line)) jsonLines++;\n if (prose < 4 && isProse(line)) {\n prose++;\n score.markdown += 0.25;\n }\n // a `--- a/file` line followed by `+++ b/file`\n if (/^--- \\S/.test(line) && /^\\+\\+\\+ \\S/.test(lines[i + 1] ?? \"\")) {\n score.diff += 5;\n }\n if (/^[+-]/.test(line)) {\n if (line[0] === \"+\") plus++;\n else minus++;\n hunkLike++;\n } else if (/^( |@@|\\\\ No newline|diff |index |--- |\\+\\+\\+ )/.test(line)) {\n hunkLike++;\n }\n if (/^\\s*#/.test(line)) {\n yamlLines++; // a comment does not break the YAML shape\n } else if (YAML_DOCUMENT.test(line)) {\n yamlLines++;\n yamlDocuments++;\n } else if (\n (YAML_KEY_VALUE.test(line) || YAML_KEY.test(line)) &&\n !/[;,{(]$/.test(line)\n ) {\n yamlLines++;\n yamlKeys++;\n if (yamlParent && /^\\s+/.test(line)) yamlNested = true;\n yamlParent = YAML_KEY.test(line);\n } else if (YAML_ITEM.test(line) && !/[;{]$/.test(line)) {\n yamlLines++;\n yamlItems++;\n } else if (/^\\s+\\S/.test(line) && yamlKeys) {\n yamlLines += 0.5; // continuation of a block scalar or a flow value\n }\n }\n\n // JSON that is not strictly valid (truncated, trailing commas): its shape\n if (/^[[{]/.test(text)) {\n if (nonBlank >= 2 && jsonLines >= nonBlank * 0.9) score.json += 6;\n if (/^(\\[\\s*)?\\{\\s*\"[^\"\\n]*\"\\s*:/.test(text)) score.json += 4;\n }\n // headerless diff: only +, - and context lines, both + and -\n if (plus && minus && hunkLike === nonBlank) {\n score.diff += 3 + Math.min(nonBlank, 6) * 0.5;\n }\n if (text.startsWith(\"<\")) score.html += 2;\n // YAML: mostly `key: value` / `- item` lines\n if (yamlKeys >= 2 && yamlLines >= nonBlank * 0.75) {\n score.yaml +=\n yamlKeys +\n Math.min(yamlItems, 6) * 0.5 +\n yamlDocuments +\n (yamlNested ? 1 : 0);\n }\n\n const candidates: Partial<Record<CodeLanguage, number>> = {\n json: score.json,\n css: score.css,\n html: score.html,\n bash: score.bash,\n python: score.python,\n yaml: score.yaml,\n sql: score.sql,\n diff: score.diff,\n markdown: score.markdown,\n };\n const typed = score.ts >= THRESHOLD;\n if (score.jsx >= THRESHOLD && score.js + score.ts + score.jsx >= 5) {\n candidates[typed ? \"tsx\" : \"jsx\"] = score.js + score.ts + score.jsx;\n } else if (typed) {\n candidates.typescript = score.js + score.ts;\n } else {\n candidates.javascript = score.js;\n }\n\n let best: CodeLanguage = \"plain\";\n let bestScore = 0;\n for (const language of ORDER) {\n const value = candidates[language] ?? 0;\n if (value >= THRESHOLD && value > bestScore) {\n best = language;\n bestScore = value;\n }\n }\n return best;\n}\n","// A tiny, dependency-free syntax highlighter for read-only code blocks.\n//\n// `highlightCode(code, language)` splits the source into typed tokens whose\n// texts concatenate to the input exactly; renderers turn them into colored\n// spans / text nodes (never HTML strings: the code is user content).\n//\n// Each grammar is a list of rules tried in order at the current position: a\n// sticky regular expression with a token type (or a classifier, or one type\n// per capture group), or a scanner function for nested constructs (template\n// literals, tags, fenced code). Characters no rule matches are plain text.\n//\n// Cost: rules either succeed or fail within a bounded look-ahead (strings\n// and comments run to the end of the line / input instead of failing, so an\n// unterminated one is consumed once), keeping the work roughly linear. Input\n// longer than 200,000 characters is returned as plain text. Grammars are\n// built lazily, on first use of each language.\nimport { detectCodeLanguage } from \"./detect\";\nimport {\n supportedCodeLanguages,\n type CodeLanguage,\n type HighlightToken,\n type HighlightTokenType,\n} from \"./types\";\n\ntype T = HighlightTokenType | null;\n\n/** State of one lexing pass, read by the rules. */\ninterface Ctx {\n code: string;\n /** Start of the current rule attempt */\n start: number;\n /** End of the current regex match (classifiers) */\n end: number;\n /** Last token that is not blank */\n prev?: HighlightToken;\n /** Only blanks since the last line break (or the start) */\n line: boolean;\n /** Innermost open bracket (`{`, `(`, `[`), \"\" at the top level */\n opener: string;\n /** Highlights embedded code (one level deeper) */\n sub: (code: string, language: CodeLanguage) => void;\n}\n\ntype Emit = (type: T, text: string) => void;\n/** Type of a match (`false`: the rule does not apply). */\ntype Classify = (text: string, c: Ctx) => T | false;\n/** Emits tokens from `c.start`; returns the end (-1: no match). */\ntype Scanner = (c: Ctx, emit: Emit) => number;\ntype Rule =\n | Scanner\n | readonly [\n kind: T | readonly T[] | Classify,\n pattern: RegExp,\n when?: (c: Ctx) => boolean,\n ];\n\nconst MAX_LENGTH = 200_000;\nconst MAX_DEPTH = 4;\n\n// Token types used repeatedly (shorter once minified).\nconst PUNCT = \"punctuation\";\nconst FN = \"function\";\nconst PROP = \"property\";\nconst STR = \"string\";\nconst KW = \"keyword\";\nconst VAR = \"variable\";\nconst NUM = \"number\";\nconst CMT = \"comment\";\nconst OP = \"operator\";\nconst BUILTIN = \"builtin\";\n\n/** Language aliases, by canonical name (the first of each group). */\nconst ALIASES =\n \"javascript js mjs cjs|typescript ts mts cts|json jsonc json5|css scss less|html htm xml svg vue|bash sh shell zsh console|python py|yaml yml|markdown md|diff patch|plain text txt plaintext\";\n\n/**\n * Canonical name of a language or alias (`\"ts\"` -> `\"typescript\"`,\n * `\"yml\"` -> `\"yaml\"`, `\"language-js\"` -> `\"javascript\"`); `\"plain\"` for\n * unknown or missing languages.\n *\n * `\"auto\"` stands for the language detected from `code`\n * (`detectCodeLanguage`); without `code` it is `\"plain\"`. `code` is ignored\n * for any other language.\n */\nexport function normalizeCodeLanguage(\n language?: string | null,\n code?: string,\n): CodeLanguage {\n const name =\n typeof language === \"string\"\n ? language\n .trim()\n .toLowerCase()\n .replace(/^language-/, \"\")\n : \"\";\n if (name === \"auto\") {\n return typeof code === \"string\" ? detectCodeLanguage(code) : \"plain\";\n }\n for (const group of ALIASES.split(\"|\")) {\n const names = group.split(\" \");\n if (names.includes(name)) return names[0] as CodeLanguage;\n }\n return (supportedCodeLanguages as readonly string[]).includes(name)\n ? (name as CodeLanguage)\n : \"plain\";\n}\n\n/** Label of a language shown by the code blocks (`\"json\"` -> `\"JSON\"`). */\nexport const codeLanguageLabel = (language: string): string =>\n language.trim().toUpperCase();\n\n/**\n * Splits highlighted code into lines (tokens without the line breaks). A\n * final line break does not start an extra empty line.\n */\nexport function splitHighlightLines(\n tokens: readonly HighlightToken[],\n): HighlightToken[][] {\n const lines: HighlightToken[][] = [[]];\n for (const { type, text } of tokens) {\n text.split(\"\\n\").forEach((part, i) => {\n if (i) lines.push([]);\n if (part) lines[lines.length - 1].push({ type, text: part });\n });\n }\n if (lines.length > 1 && !lines[lines.length - 1].length) lines.pop();\n return lines;\n}\n\n/**\n * Splits `code` into highlighted tokens for `language` (any name accepted by\n * `normalizeCodeLanguage`; `\"auto\"` detects it from the code). The token\n * texts concatenate to `code` exactly.\n * Never throws: unknown languages, very large input (> 200,000 characters)\n * and unexpected failures give a single plain token.\n */\nexport function highlightCode(\n code: string,\n language?: string | null,\n): HighlightToken[] {\n let text = \"\";\n try {\n text = typeof code === \"string\" ? code : String(code ?? \"\");\n if (!text) return [];\n const lang = normalizeCodeLanguage(language, text);\n if (lang !== \"plain\" && text.length <= MAX_LENGTH) {\n const out: HighlightToken[] = [];\n lex(text, lang, out, 0);\n let length = 0;\n for (const token of out) length += token.text.length;\n if (length === text.length) return out;\n }\n } catch {\n // fall through: plain text\n }\n return text ? [{ type: null, text }] : [];\n}\n\nconst grammars: Partial<Record<CodeLanguage, readonly Rule[]>> = {};\n\nfunction lex(\n code: string,\n lang: CodeLanguage,\n out: HighlightToken[],\n depth: number,\n): void {\n const stack: string[] = [];\n const c: Ctx = {\n code,\n start: 0,\n end: 0,\n line: true,\n opener: \"\",\n sub: (inner, language) => lex(inner, language, out, depth + 1),\n };\n const emit: Emit = (type, text) => {\n if (!text) return;\n const last = out[out.length - 1];\n if (last && last.type === type) last.text += text;\n else out.push({ type, text });\n const solid = /\\S/.test(text);\n if (solid) {\n c.prev = { type, text };\n if (type === PUNCT && text.length === 1) {\n if (\"{([\".includes(text)) {\n if (stack.length < 256) stack.push(text);\n } else if (\"})]\".includes(text)) stack.pop();\n c.opener = stack[stack.length - 1] ?? \"\";\n }\n }\n const nl = text.lastIndexOf(\"\\n\");\n c.line = nl < 0 ? c.line && !solid : !/\\S/.test(text.slice(nl + 1));\n };\n const rules =\n depth > MAX_DEPTH || lang === \"plain\"\n ? undefined\n : (grammars[lang] ??= grammar(lang));\n if (!rules) return emit(null, code);\n let pos = 0;\n scan: while (pos < code.length) {\n c.start = pos;\n for (const rule of rules) {\n let end: number;\n if (typeof rule === \"function\") {\n end = rule(c, emit);\n if (end <= pos) continue;\n } else {\n const [kind, pattern, when] = rule;\n if (when && !when(c)) continue;\n pattern.lastIndex = pos;\n const m = pattern.exec(code);\n if (!m || !m[0]) continue;\n end = c.end = pos + m[0].length;\n if (Array.isArray(kind)) {\n (kind as readonly T[]).forEach((type, i) =>\n emit(type, m[i + 1] ?? \"\"),\n );\n } else {\n const type =\n typeof kind === \"function\" ? (kind as Classify)(m[0], c) : kind;\n if (type === false) continue;\n emit(type as T, m[0]);\n }\n }\n pos = end;\n continue scan;\n }\n emit(null, code[pos]);\n pos++;\n }\n}\n\n// ---------------------------------------------------------------- helpers\n\nconst words = (list: string) => new Set(list.split(\" \"));\n\n/** The two characters after the match, past spaces and tabs. */\nfunction after(c: Ctx): string {\n let i = c.end;\n while (c.code[i] === \" \" || c.code[i] === \"\\t\") i++;\n return c.code.slice(i, i + 2);\n}\n\nconst atLine = (c: Ctx) => c.line;\nconst afterBlank = (c: Ctx) => !c.start || /\\s/.test(c.code[c.start - 1]);\nconst isPascal = (word: string) => /^[A-Z]/.test(word) && /[a-z]/.test(word);\n\n/** Index of the `}` closing a `{` opened before `i` (skips strings). */\nfunction closeBrace(s: string, i: number): number {\n for (let depth = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === \"{\") depth++;\n else if (ch === \"}\") {\n if (!depth--) return i;\n } else if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n for (i++; i < s.length && s[i] !== ch; i++) {\n if (s[i] === \"\\\\\") i++;\n else if (s[i] === \"\\n\" && ch !== \"`\") break;\n }\n }\n }\n return s.length;\n}\n\n/** Emits `{ <code> }` (`i` is after the `{`); returns the end. */\nfunction embed(c: Ctx, emit: Emit, i: number, lang: CodeLanguage): number {\n const close = closeBrace(c.code, i);\n c.sub(c.code.slice(i, close), lang);\n emit(PUNCT, c.code.slice(close, close + 1));\n return Math.min(close + 1, c.code.length);\n}\n\n/** Whether an expression may start after `p` (regex / JSX vs division / `<`). */\nconst exprStart = (p?: HighlightToken) =>\n !p ||\n p.type === KW ||\n p.type === OP ||\n (p.type === PUNCT && !/[)\\]}]/.test(p.text));\n\n/** Numbers of JavaScript (`1n`), Python (`2j`), SQL: hex / binary / octal, `_` separators. */\nconst number =\n /(?:0[xob][\\da-f_]+|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:e[-+]?\\d[\\d_]*)?)[nj]?/iy;\n\nconst quoted = /([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\[\\s\\S])*\\1?/y;\n\n// ---------------------------------------------------------------- markup\n\n/**\n * Tag at `at` (`<name attrs>`, `</name>`, `<name/>`); emits it and returns\n * `[end, nesting change, lower-case name]`, or undefined (nothing emitted).\n * `lang`: JSX, attribute values in `{}` are expressions.\n */\nfunction head(\n c: Ctx,\n emit: Emit,\n at: number,\n lang?: CodeLanguage,\n): [number, number, string] | undefined {\n const s = c.code;\n const open = /(<\\/?)([A-Za-z][\\w:.-]*|(?=>))/y;\n open.lastIndex = at;\n const m = open.exec(s);\n if (!m) return;\n emit(PUNCT, m[1]);\n emit(\"tag\", m[2]);\n const attr = /\\s+|\\/?>|\"[^\"]*\"?|'[^']*'?|[={/]|[^\\s\"'>/={]+/y;\n const name = m[2].toLowerCase();\n let i = at + m[0].length;\n let eq = false;\n while (i < s.length) {\n attr.lastIndex = i;\n const t = attr.exec(s)![0];\n i += t.length;\n if (t[t.length - 1] === \">\") {\n emit(PUNCT, t);\n return [i, m[1] !== \"<\" ? -1 : t === \">\" ? 1 : 0, name];\n }\n if (t === \"{\" && lang) {\n emit(PUNCT, t);\n i = embed(c, emit, i, lang);\n eq = false;\n continue;\n }\n const blank = !/\\S/.test(t);\n emit(\n blank\n ? null\n : t === \"=\" || t === \"/\"\n ? PUNCT\n : eq || t[0] === '\"' || t[0] === \"'\"\n ? \"attr-value\"\n : \"attr-name\",\n t,\n );\n if (!blank) eq = t === \"=\";\n }\n return [i, 0, name];\n}\n\n/**\n * An element at `c.start`. `lang`: JSX, the whole element with its children\n * (text, `{expressions}`, nested elements); else an HTML tag (`<script>` /\n * `<style>` contents are highlighted as JavaScript / CSS).\n */\nfunction tag(c: Ctx, emit: Emit, lang?: CodeLanguage): number {\n const s = c.code;\n const h = head(c, emit, c.start, lang);\n if (!h) return -1;\n let [i, depth] = h;\n const name = h[2];\n if (depth < 1) return i;\n if (lang) {\n const text = /[^<{]+/y;\n while (depth > 0 && i < s.length) {\n text.lastIndex = i;\n const t = text.exec(s);\n if (t) {\n emit(null, t[0]);\n i += t[0].length;\n } else if (s[i] === \"{\") {\n emit(PUNCT, \"{\");\n i = embed(c, emit, i + 1, lang);\n } else {\n const n = head(c, emit, i, lang);\n if (n) [i, depth] = [n[0], depth + n[1]];\n else emit(null, s[i++]);\n }\n }\n return i;\n }\n if (name !== \"script\" && name !== \"style\") return i;\n const close = new RegExp(`</${name}`, \"gi\");\n close.lastIndex = i;\n const end = close.exec(s)?.index ?? s.length;\n const attrs = s.slice(c.start, i);\n c.sub(\n s.slice(i, end),\n name === \"style\"\n ? \"css\"\n : /\\blang=[\"']?ts/.test(attrs)\n ? \"typescript\"\n : /\\btype=[\"']?(?:application\\/(?:ld\\+)?json|importmap)/i.test(attrs)\n ? \"json\"\n : \"javascript\",\n );\n return end;\n}\n\n// ---------------------------------------------------------------- grammars\n\nfunction grammar(lang: CodeLanguage): readonly Rule[] {\n switch (lang) {\n case \"javascript\":\n case \"typescript\":\n case \"jsx\":\n case \"tsx\":\n return js(lang);\n case \"json\":\n return json();\n case \"css\":\n return css();\n case \"html\":\n return html();\n case \"bash\":\n return bash();\n case \"python\":\n return python();\n case \"yaml\":\n return yaml();\n case \"sql\":\n return sql();\n case \"diff\":\n return diff();\n default:\n return markdown();\n }\n}\n\nfunction js(lang: CodeLanguage): Rule[] {\n const ts = lang === \"typescript\" || lang === \"tsx\";\n const keywords = words(\n \"as async await break case catch class const continue debugger default delete do else export extends finally for from function if import in instanceof let new of return static super switch this throw try typeof var void while with yield\" +\n (ts\n ? \" abstract declare enum implements infer interface is keyof namespace override private protected public readonly satisfies type\"\n : \"\"),\n );\n const globals = words(\n \"console document window\" +\n (ts ? \" any boolean never number object string unknown\" : \"\"),\n );\n const template: Scanner = (c, emit) => {\n const s = c.code;\n let i = c.start;\n if (s[i] !== \"`\") return -1;\n let from = i++;\n while (i < s.length) {\n if (s[i] === \"\\\\\") i += 2;\n else if (s[i] === \"`\") {\n i++;\n break;\n } else if (s[i] === \"$\" && s[i + 1] === \"{\") {\n emit(STR, s.slice(from, i));\n emit(PUNCT, \"$\");\n emit(PUNCT, \"{\");\n i = from = embed(c, emit, i + 2, lang);\n } else i++;\n }\n i = Math.min(i, s.length);\n emit(STR, s.slice(from, i));\n return i;\n };\n const rules: Rule[] = [\n [null, /\\s+/y],\n [CMT, /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n template,\n [STR, quoted],\n [\n \"regex\",\n /\\/(?![*/])(?:[^/\\\\\\n[]|\\\\.|\\[(?:[^\\]\\\\\\n]|\\\\.){0,200}\\]){1,500}\\/[dgimsuvy]*/y,\n (c) => exprStart(c.prev),\n ],\n ];\n if (lang === \"jsx\" || lang === \"tsx\") {\n rules.push((c, emit) =>\n c.code[c.start] === \"<\" &&\n /[A-Za-z>]/.test(c.code[c.start + 1] ?? \"\") &&\n exprStart(c.prev)\n ? tag(c, emit, lang)\n : -1,\n );\n }\n rules.push(\n [FN, /@[A-Za-z_$][\\w$.]*/y],\n [NUM, number],\n [\n (w, c) => {\n const p = c.prev;\n const n = after(c);\n if (p?.text === \".\") return n[0] === \"(\" ? FN : null;\n if (\n w !== \"default\" &&\n c.opener === \"{\" &&\n ((n[0] === \":\" && n[1] !== \":\") || n === \"?:\") &&\n (!p || p.type === CMT || /^[{,;]$/.test(p.text))\n )\n return PROP;\n if (keywords.has(w)) return KW;\n if (w === \"true\" || w === \"false\") return \"boolean\";\n if (w === \"null\" || w === \"undefined\") return \"null\";\n if (n[0] === \"(\" || p?.text === FN) return FN;\n return globals.has(w) || isPascal(w) ? BUILTIN : null;\n },\n /[A-Za-z_$\\u00a0-\\uffff][\\w$\\u00a0-\\uffff]*/y,\n ],\n [OP, /=>|[-+*%=&|^~!<>?]+|\\//y],\n [PUNCT, /[{}[\\]();,.:#]/y],\n );\n return rules;\n}\n\nfunction json(): Rule[] {\n return [\n [null, /\\s+/y],\n [CMT, /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n [PROP, /([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\.)*\\1(?=\\s*:)/y],\n [STR, quoted],\n [NUM, /[-+]?(?:0x[\\da-f]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)/iy],\n [\n (w, c) =>\n after(c)[0] === \":\"\n ? PROP\n : w === \"true\" || w === \"false\"\n ? \"boolean\"\n : w === \"null\"\n ? \"null\"\n : w === \"Infinity\" || w === \"NaN\"\n ? NUM\n : null,\n /[A-Za-z_$][\\w$]*/y,\n ],\n [PUNCT, /[{}[\\],:]/y],\n ];\n}\n\nfunction css(): Rule[] {\n const inBlock = (c: Ctx) => c.opener === \"{\";\n return [\n [null, /\\s+/y],\n [CMT, /\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\/\\/[^\\n]*/y],\n [[FN, PUNCT, STR, PUNCT], /(url)(\\()([^)\\n]*)(\\)?)/iy],\n [STR, quoted],\n [KW, /@[\\w-]+|!\\s*important/iy],\n [VAR, /--[\\w-]+|\\$[\\w-]+/y],\n [NUM, /#[\\da-fA-F]{3,8}(?![\\w-])/y, inBlock],\n [NUM, /[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?(?:%|[a-zA-Z]+)?/y],\n [\"attr-name\", /[.#][\\w-]+/y],\n [\"attr-name\", /::?[\\w-]+/y, (c) => !inBlock(c) || c.prev?.text === \"&\"],\n [\n (_, c) => {\n const n = after(c);\n const p = c.prev;\n if (\n n[0] === \":\" &&\n (c.opener === \"(\" ||\n (inBlock(c) && (!p || p.type === CMT || /^[{;}]$/.test(p.text))))\n )\n return PROP;\n if (n[0] === \"(\") return FN;\n return inBlock(c) && n[0] !== \"{\" ? null : \"tag\";\n },\n /-?[A-Za-z_][\\w-]*/y,\n ],\n [PUNCT, /[{}()[\\];,:]/y],\n [OP, /[>+~*=|^$&]/y],\n ];\n}\n\nfunction html(): Rule[] {\n return [\n [CMT, /<!--[\\s\\S]*?(?:-->|$)/y],\n [KW, /<[!?][^>]*>?/y],\n (c, emit) => tag(c, emit),\n [BUILTIN, /&(?:#\\d+|#x[\\da-f]+|[a-z][\\da-z]*);/iy],\n [null, /[^<&]+/y],\n ];\n}\n\nfunction bash(): Rule[] {\n const keywords = words(\n \"if then else elif fi for while until do done case esac in function return local export break continue declare readonly\",\n );\n const variable = /\\$(?:\\{[^}\\n]*\\}?|[A-Za-z_]\\w*|[\\d@#?$!*-])/y;\n /** Command position: start of a line or after `|`, `&&`, `;`, `(`, `then`... */\n const command = (c: Ctx) => {\n const p = c.prev;\n if (p?.text === \"\\\\\") return false;\n return (\n c.line ||\n !p ||\n p.type === OP ||\n /^(?:[({`$]|then|do|else|elif|if|while|until|time|!)$/.test(p.text)\n );\n };\n const double: Scanner = (c, emit) => {\n const s = c.code;\n let i = c.start;\n if (s[i] !== '\"') return -1;\n let from = i++;\n for (; i < s.length && s[i] !== '\"'; i++) {\n if (s[i] === \"\\\\\") i++;\n else if (s[i] === \"$\") {\n variable.lastIndex = i;\n const m = variable.exec(s);\n if (m) {\n emit(STR, s.slice(from, i));\n emit(VAR, m[0]);\n from = i + m[0].length;\n i = from - 1;\n }\n }\n }\n i = Math.min(i + 1, s.length);\n emit(STR, s.slice(from, i));\n return i;\n };\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y, (c) => !c.start || /[\\s;|&(]/.test(c.code[c.start - 1])],\n double,\n [STR, /'[^']*'?/y],\n [VAR, variable],\n [\n VAR,\n /[A-Za-z_]\\w*(?=\\+?=)/y,\n (c) =>\n command(c) ||\n /^(?:export|local|declare|readonly)$/.test(c.prev?.text ?? \"\"),\n ],\n [NUM, /\\d+(?![\\w./~@%+:,=-])/y],\n [\n (w, c) => (command(c) ? (keywords.has(w) ? KW : FN) : null),\n /[\\w./~@%+:,-][\\w./~@%+:,=-]*/y,\n ],\n [OP, /&&|\\|\\||;;|[|&;<>!]+/y],\n [PUNCT, /[()[\\]{}=$`\\\\]/y],\n ];\n}\n\nfunction python(): Rule[] {\n const keywords = words(\n \"and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield\",\n );\n const builtins = words(\n \"bool dict float int len list print range set str super tuple type self cls\",\n );\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y],\n [STR, /[rRbBuUfF]{0,2}(\"\"\"|''')[\\s\\S]*?(?:\\1|$)/y],\n [STR, /[rRbBuUfF]{0,2}([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\[\\s\\S])*\\1?/y],\n [FN, /@[\\w.]+/y, atLine],\n [NUM, number],\n [\n (w, c) => {\n const p = c.prev?.text;\n const n = after(c);\n if (p === \".\") return n[0] === \"(\" ? FN : null;\n if (keywords.has(w)) return KW;\n if (w === \"True\" || w === \"False\") return \"boolean\";\n if (w === \"None\") return \"null\";\n if (p === \"def\") return FN;\n if (p === \"class\" || builtins.has(w) || isPascal(w)) return BUILTIN;\n return n[0] === \"(\" ? FN : null;\n },\n /[A-Za-z_\\u00a0-\\uffff][\\w\\u00a0-\\uffff]*/y,\n ],\n [OP, /:=|->|[-+*/%=<>!&|^~@]+/y],\n [PUNCT, /[()[\\]{},;.:]/y],\n ];\n}\n\nfunction yaml(): Rule[] {\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y, afterBlank],\n [PUNCT, /(?:---|\\.\\.\\.)(?=\\s|$)/y, atLine],\n [\n PROP,\n /(?:\"(?:[^\"\\\\\\n]|\\\\.)*\"|'[^'\\n]*'|[^\\s#:,[\\]{}'\"!&*|>%@`-][^\\n#:]{0,255})(?=:(?:\\s|$))/y,\n (c) => c.line || /^[-?{,]$/.test(c.prev?.text ?? \"\"),\n ],\n [PUNCT, /[-?](?=\\s|$)/y],\n [VAR, /[&*][\\w-]+/y],\n [KW, /!!?[\\w/.-]*/y],\n [OP, /[|>][-+\\d]*(?=[ \\t]*(?:#|\\n|$))/y],\n [STR, /\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"?|'(?:[^']|'')*'?/y],\n [PUNCT, /[:,[\\]{}]/y],\n [\n (text) => {\n const v = text.trim();\n return /^(?:true|false|yes|no|on|off)$/i.test(v)\n ? \"boolean\"\n : /^(?:null|~)$/i.test(v)\n ? \"null\"\n : /^[-+]?(?:\\.inf|\\.nan|0x[\\da-f]+|0o[0-7]+|(?:\\d[\\d_]*\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)$/i.test(\n v,\n )\n ? NUM\n : STR;\n },\n /[^\\s#,[\\]{}][^\\n#,[\\]{}]*/y,\n ],\n ];\n}\n\nfunction sql(): Rule[] {\n const keywords = words(\n \"select from where insert into values update set delete create alter drop table index and or not in is like between exists join left right inner outer on as order by group having limit offset union all distinct case when then else end with primary key references default asc desc\",\n );\n const types = words(\n \"int integer bigint decimal numeric float varchar char text boolean date timestamp json jsonb uuid\",\n );\n return [\n [null, /\\s+/y],\n [CMT, /--[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n [STR, /'(?:[^'\\\\]|''|\\\\[\\s\\S])*'?/y],\n [PROP, /\"(?:[^\"]|\"\")*\"?|`[^`]*`?/y],\n [VAR, /[@$][\\w.]+|\\?/y],\n [NUM, number],\n [\n (w, c) => {\n const lower = w.toLowerCase();\n if (lower === \"true\" || lower === \"false\") return \"boolean\";\n if (lower === \"null\") return \"null\";\n if (keywords.has(lower)) return KW;\n if (types.has(lower)) return BUILTIN;\n return after(c)[0] === \"(\" ? FN : null;\n },\n /[A-Za-z_][\\w$]*/y,\n ],\n [OP, /[-+*/%=<>!|&^~]+/y],\n [PUNCT, /[(),;.[\\]]/y],\n ];\n}\n\nfunction diff(): Rule[] {\n // Every rule starts at a line start: the last two consume a line / breaks.\n return [\n [KW, /(?:diff|index|---|\\+\\+\\+)(?=[ \\t\\n]|$)[^\\n]*/y],\n [\"heading\", /@@[^\\n]*/y],\n [\"inserted\", /[+>][^\\n]*/y],\n [\"deleted\", /[-<][^\\n]*/y],\n [null, /[^\\n]+|\\n+/y],\n ];\n}\n\nfunction markdown(): Rule[] {\n const fence: Scanner = (c, emit) => {\n if (!c.line) return -1;\n const s = c.code;\n const open = /(`{3,}|~{3,})([^\\n]*)/y;\n open.lastIndex = c.start;\n const m = open.exec(s);\n if (!m) return -1;\n emit(PUNCT, m[0]);\n const start = c.start + m[0].length;\n const close = new RegExp(\n `\\\\n[ \\\\t]{0,3}${m[1][0]}{${m[1].length},}[ \\\\t]*(?=\\\\n|$)`,\n \"g\",\n );\n close.lastIndex = start;\n const e = close.exec(s);\n const end = e ? e.index : s.length;\n c.sub(\n s.slice(start, end),\n normalizeCodeLanguage(m[2].trim().split(/\\s/)[0]),\n );\n if (!e) return end;\n const indent = /^\\n[ \\t]*/.exec(e[0])![0];\n emit(null, indent);\n emit(PUNCT, e[0].slice(indent.length));\n return end + e[0].length;\n };\n return [\n [null, /\\s+/y],\n fence,\n [\"heading\", /#{1,6}(?=\\s|$)[^\\n]*/y, atLine],\n [\n PUNCT,\n /(?:[-*_][ \\t]*){3,}(?=\\n|$)|(?:[*+-]|\\d{1,9}[.)])(?=[ \\t])|>/y,\n atLine,\n ],\n [null, /\\\\[\\s\\S]/y],\n [STR, /`[^`\\n]*`?/y],\n [\n KW,\n /\\*\\*[^*\\n]+\\*\\*|__[^_\\n]+__|\\*[^*\\n]+\\*|_[^_\\n]+_/y,\n (c) => !/\\w/.test(c.code[c.start - 1] ?? \"\"),\n ],\n [[PROP, \"attr-value\"], /(!?\\[[^[\\]\\n]{0,500}\\])(\\([^)\\n]*\\)?)/y],\n [\"attr-value\", /<(?:https?|mailto):[^>\\s]*>?/y],\n [null, /[^\\n`*_[!<\\\\]+/y],\n ];\n}\n","// Character-range marks of the code blocks (saved highlights, annotations,\n// search hits) laid over the syntax-highlighted tokens.\n//\n// `applyCodeMarks(tokens, marks)` cuts the highlighted tokens at the mark\n// boundaries and groups them into runs covered by the same mark, so every\n// renderer can wrap each run in a <mark> (a styled text on React Native and\n// the mini-programs) while keeping the token colors inside it.\n// `splitCodeMarkLines` then splits the runs into lines for the numbered\n// lines layout. Pure and platform neutral.\nimport type { ColorScheme } from \"../theme/types\";\nimport { colorMix } from \"../tokens/color\";\nimport type { HighlightToken } from \"./types\";\n\n/**\n * Color of a code mark: a theme color name (`\"primary\"`, `\"success\"`,\n * `\"warning\"`, `\"danger\"`, `\"info\"`, `\"neutral\"`: a translucent tint of it)\n * or any CSS color, used as the background as is (prefer a translucent one,\n * e.g. `\"rgb(250 204 21 / 0.35)\"`, so the token colors stay readable).\n */\nexport type CodeMarkColor = ColorScheme | (string & {});\n\n/** A highlighted character range of a code block. */\nexport interface CodeMark {\n /**\n * Start offset (inclusive), in UTF-16 code units of the code string (the\n * index of `String.prototype.slice`)\n */\n start: number;\n /** End offset (exclusive), in UTF-16 code units of the code string */\n end: number;\n /**\n * Background of the mark (default: a translucent yellow readable in light\n * and dark themes, `--code-block-mark-bg`)\n */\n color?: CodeMarkColor;\n /** Extra class of the rendered mark element(s) (web renderers) */\n className?: string;\n /** Identifier, rendered as `data-mark-id` */\n id?: string;\n /** Tooltip (`title`) of the rendered mark element(s) */\n title?: string;\n}\n\n/**\n * A run of highlighted tokens covered by the same mark (or by none). The\n * token texts of the runs returned by `applyCodeMarks` concatenate to the\n * code exactly.\n */\nexport interface CodeMarkRun<M extends CodeMark = CodeMark> {\n /** The mark shown on the run, `null` for unmarked text */\n mark: M | null;\n /** Index of `mark` in the marks array, -1 for unmarked text */\n index: number;\n /** Offset of the run in the code */\n start: number;\n /** End offset (exclusive) of the run in the code */\n end: number;\n /** Highlighted tokens of the run (cut at the mark boundaries) */\n tokens: HighlightToken[];\n}\n\n/** Theme colors a mark can name (a tint of `--<name>-color`) */\nexport const CODE_MARK_COLORS: readonly ColorScheme[] = [\n \"primary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"neutral\",\n];\n\n/**\n * Default background of the marks: a translucent yellow, readable on the\n * light and dark code backgrounds (no theme token is translucent in every\n * palette).\n */\nexport const CODE_MARK_DEFAULT_BACKGROUND = \"rgba(250, 204, 21, 0.35)\";\n\n/** Share of a theme color in the tint of a mark (percent). */\nexport const CODE_MARK_TINT = 30;\n\nconst isHigh = (code: number) => code >= 0xd800 && code <= 0xdbff;\nconst isLow = (code: number) => code >= 0xdc00 && code <= 0xdfff;\n\n/**\n * Clamps a mark range to `code`: offsets are truncated to integers, clamped\n * to `0..code.length` and swapped when reversed; a boundary falling inside a\n * surrogate pair (an emoji...) is moved outward so the pair stays whole.\n * Returns `null` for an empty range or non-numeric offsets.\n */\nexport function clampCodeRange(\n code: string,\n start: unknown,\n end: unknown,\n): [start: number, end: number] | null {\n if (typeof start !== \"number\" || typeof end !== \"number\") return null;\n if (Number.isNaN(start) || Number.isNaN(end)) return null;\n const length = code.length;\n const clamp = (n: number) =>\n Math.min(length, Math.max(0, Number.isFinite(n) ? Math.trunc(n) : n));\n let a = clamp(Math.min(start, end));\n let b = clamp(Math.max(start, end));\n if (a > 0 && isLow(code.charCodeAt(a)) && isHigh(code.charCodeAt(a - 1))) a--;\n if (b < length && isLow(code.charCodeAt(b)) && isHigh(code.charCodeAt(b - 1)))\n b++;\n return a < b ? [a, b] : null;\n}\n\n/**\n * Cuts highlighted tokens (`highlightCode`, or one plain token) at the\n * boundaries of `marks` and groups them into runs covered by the same mark.\n *\n * - Offsets are UTF-16 offsets into the code (the concatenated token texts),\n * clamped by `clampCodeRange`; empty, reversed-to-empty and non-numeric\n * ranges are ignored.\n * - Overlaps: where marks overlap, the one later in the array wins (its\n * color, class, title, id and click); the earlier one is cut around it,\n * so it may render as several elements sharing its `data-mark-id`. Order\n * the array by priority (e.g. put the active / nested mark last).\n * - Marks may cross token boundaries and line breaks: the tokens are cut,\n * their types are kept.\n */\nexport function applyCodeMarks<M extends CodeMark>(\n tokens: readonly HighlightToken[],\n marks?: readonly M[] | null,\n): CodeMarkRun<M>[] {\n const code = tokens.map((token) => token.text).join(\"\");\n if (!code) return [];\n // elementary intervals between the sorted boundaries, with their top mark\n const ranges: { index: number; start: number; end: number }[] = [];\n const points = new Set<number>([0, code.length]);\n (Array.isArray(marks) ? marks : []).forEach((mark, index) => {\n const range =\n mark && typeof mark === \"object\"\n ? clampCodeRange(code, mark.start, mark.end)\n : null;\n if (!range) return;\n ranges.push({ index, start: range[0], end: range[1] });\n points.add(range[0]).add(range[1]);\n });\n const bounds = [...points].sort((a, b) => a - b);\n const top = new Array<number>(bounds.length - 1).fill(-1);\n const find = (offset: number) => {\n let lo = 0;\n let hi = bounds.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (bounds[mid] < offset) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n for (const range of ranges) {\n for (let i = find(range.start); bounds[i] < range.end; i++) {\n top[i] = range.index;\n }\n }\n\n const runs: CodeMarkRun<M>[] = [];\n let interval = 0;\n let offset = 0;\n for (const { type, text } of tokens) {\n let from = 0;\n while (from < text.length) {\n while (bounds[interval + 1] <= offset + from) interval++;\n const to = Math.min(text.length, bounds[interval + 1] - offset);\n const index = top[interval];\n const piece = { type, text: text.slice(from, to) };\n const last = runs[runs.length - 1];\n if (last && last.index === index && last.end === offset + from) {\n last.tokens.push(piece);\n last.end = offset + to;\n } else {\n runs.push({\n mark: index < 0 ? null : (marks as readonly M[])[index],\n index,\n start: offset + from,\n end: offset + to,\n tokens: [piece],\n });\n }\n from = to;\n }\n offset += text.length;\n }\n return runs;\n}\n\n/**\n * Splits marked runs (`applyCodeMarks`) into lines, without the line breaks\n * (like `splitHighlightLines`: a final line break does not start an extra\n * empty line; an empty line has no runs). A mark crossing a line break is\n * cut into one run per line.\n */\nexport function splitCodeMarkLines<M extends CodeMark>(\n runs: readonly CodeMarkRun<M>[],\n): CodeMarkRun<M>[][] {\n const lines: CodeMarkRun<M>[][] = [[]];\n for (const run of runs) {\n let current: CodeMarkRun<M> | null = null;\n let offset = run.start;\n for (const { type, text } of run.tokens) {\n text.split(\"\\n\").forEach((part, i) => {\n if (i) {\n lines.push([]);\n current = null;\n offset++;\n }\n if (!part) return;\n if (!current) {\n current = {\n mark: run.mark,\n index: run.index,\n start: offset,\n end: offset,\n tokens: [],\n };\n lines[lines.length - 1].push(current);\n }\n current.tokens.push({ type, text: part });\n offset += part.length;\n current.end = offset;\n });\n }\n }\n if (lines.length > 1 && !lines[lines.length - 1].length) lines.pop();\n return lines;\n}\n\n/**\n * CSS background of a mark color (web and mini-program renderers): a tint\n * of a theme color (`color-mix` of `--<name>-color`, `--text-muted-color`\n * for `neutral`), any other value as is, `\"\"` when unset (the stylesheet\n * default, `--code-block-mark-bg`).\n */\nexport function codeMarkBackground(color: string | null | undefined): string {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return \"\";\n if (!(CODE_MARK_COLORS as readonly string[]).includes(value)) return value;\n const base =\n value === \"neutral\" ? \"var(--text-muted-color)\" : `var(--${value}-color)`;\n return `color-mix(in srgb, ${base} ${CODE_MARK_TINT}%, transparent)`;\n}\n\n/**\n * Concrete background of a mark color from resolved theme colors (React\n * Native and the mini-programs, without CSS variables / `color-mix`): the\n * tint of a theme color as an `rgba()` (`<name>-color`, `text-muted-color`\n * for `neutral`), any other value as is, the default translucent yellow when\n * unset (or when the theme color cannot be parsed).\n */\nexport function resolveCodeMarkBackground(\n color: string | null | undefined,\n colors: Readonly<Record<string, string | undefined>>,\n): string {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return CODE_MARK_DEFAULT_BACKGROUND;\n if (!(CODE_MARK_COLORS as readonly string[]).includes(value)) return value;\n const base =\n colors[value === \"neutral\" ? \"text-muted-color\" : `${value}-color`];\n return (\n (base && colorMix(base, \"transparent\", CODE_MARK_TINT)) ||\n CODE_MARK_DEFAULT_BACKGROUND\n );\n}\n","// Base of the headless state machines: a tiny immutable store and a\n// props-aware machine (controlled / uncontrolled values, `SYNC` events) that\n// every renderer drives the same way (React `useSyncExternalStore`, Lit\n// reactive controllers, Vue refs, Angular signals, mini-program `setData`).\n// Platform-neutral: no DOM, timers go through an injectable `Scheduler`.\n\n/** Called after every state change with the new and the previous state. */\nexport type StoreListener<S> = (state: S, prev: S) => void;\n\n/** Read / subscribe half shared by every store and machine. */\nexport interface ReadableStore<S> {\n /** Current state (a new object after every change, never mutated). */\n getState(): S;\n /** Listens to changes; returns the unsubscribe function. */\n subscribe(listener: StoreListener<S>): () => void;\n}\n\n/** The common shape of a machine: state, events and change listeners. */\nexport interface Store<S, E> extends ReadableStore<S> {\n /** Sends an event; listeners run only when the state actually changed. */\n send(event: E): void;\n}\n\n/** A writable store (the building block of the machines). */\nexport interface WritableStore<S> extends ReadableStore<S> {\n /** Replaces the state (or derives it); no-op when equal to the current one. */\n setState(next: S | ((prev: S) => S)): void;\n}\n\nexport interface CreateStoreOptions<S> {\n /**\n * Equality deciding whether a new state is a change.\n * @default shallowEqual (same keys, `Object.is` values)\n */\n equals?: (a: S, b: S) => boolean;\n}\n\n/** Same own keys with `Object.is` values (or the same value). */\nexport function shallowEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n typeof b !== \"object\" ||\n a === null ||\n b === null ||\n Array.isArray(a) !== Array.isArray(b)\n ) {\n return false;\n }\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Minimal immutable store: `setState` with an equal state (see `equals`) is a\n * no-op, listeners receive `(state, prev)` and may unsubscribe while being\n * notified. `getState` / `subscribe` are bound (safe to pass around, e.g. to\n * `useSyncExternalStore`).\n */\nexport function createStore<S>(\n initial: S,\n options: CreateStoreOptions<S> = {},\n): WritableStore<S> {\n const equals = options.equals ?? shallowEqual;\n let state = initial;\n const listeners = new Set<StoreListener<S>>();\n return {\n getState: () => state,\n setState(next) {\n const value =\n typeof next === \"function\" ? (next as (prev: S) => S)(state) : next;\n if (equals(value, state)) return;\n const prev = state;\n state = value;\n for (const listener of [...listeners]) listener(state, prev);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Scheduler\n\n/** Opaque timer handle of a `Scheduler`. */\nexport type SchedulerHandle = unknown;\n\n/**\n * Time source of the machines with timers (toast auto-dismiss...). Inject one\n * to drive time yourself (tests, React Native / mini-program timers, a\n * paused game loop...).\n */\nexport interface Scheduler {\n setTimeout(callback: () => void, ms: number): SchedulerHandle;\n clearTimeout(handle: SchedulerHandle): void;\n /** Current time in milliseconds. */\n now(): number;\n}\n\n/**\n * The engine's timers, read at call time (fake timers and polyfills installed\n * after this module loaded are honored).\n */\nexport const defaultScheduler: Scheduler = {\n setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),\n clearTimeout: (handle) =>\n globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>),\n now: () => Date.now(),\n};\n\n// ---------------------------------------------------------------------------\n// Props-aware machine\n\n/**\n * Updates the props of a machine (sent by framework adapters on every render\n * / property change). A controlled key set to `undefined` switches it back to\n * uncontrolled (its last value is kept).\n */\nexport interface SyncEvent<P> {\n type: \"SYNC\";\n props: Partial<P>;\n}\n\n/** A machine: a store driven by events and by its props. */\nexport interface Machine<S, E, P> extends Store<S, E | SyncEvent<P>> {\n /** Current props. */\n getProps(): Readonly<P>;\n /** Same as `send({ type: \"SYNC\", props })`. */\n setProps(props: Partial<P>): void;\n /**\n * The state `state` would be with `props` applied (controlled values and\n * normalization), without committing anything: lets adapters render\n * controlled values right away (before their props are synced).\n */\n project(state: S, props?: Partial<P>): S;\n}\n\n/** Definition of a machine (pure functions only). */\nexport interface MachineDefinition<S, E, P> {\n /** First state, from the initial props. */\n initial(props: P): S;\n /** Next state for `event` (return `state` itself when nothing changes). */\n reduce(state: S, event: E, props: P): S;\n /**\n * Keys of the state mirrored by props of the same name when those are not\n * `undefined` (controlled values).\n */\n controlled?: readonly (keyof S & keyof P)[];\n /**\n * Derived / clamped fields recomputed after every event and props change\n * (`prev`: the committed state the change starts from).\n */\n normalize?(state: S, props: P, prev: S): S;\n /**\n * Change callbacks: `requested` is the state an event asked for (before\n * controlled values are re-applied), `prev` the committed state before it.\n * Runs after the new state is committed and listeners notified.\n */\n changed?(requested: S, prev: S, props: P): void;\n}\n\nconst applyControlled = <S, P>(\n state: S,\n props: P,\n keys: readonly (keyof S & keyof P)[],\n): S => {\n let next = state;\n for (const key of keys) {\n const value = props[key] as unknown;\n if (value !== undefined && !Object.is(next[key], value)) {\n next = { ...next, [key]: value };\n }\n }\n return next;\n};\n\n/**\n * Builds a machine from a pure definition.\n *\n * - `send(event)`: `reduce`, then `normalize`; controlled keys keep their\n * prop value (the change is only reported through `changed`, the owner\n * decides by syncing the prop); the result is committed (no-op when\n * shallowly equal) and `changed` runs.\n * - `send({ type: \"SYNC\", props })` / `setProps(props)`: merges the props,\n * re-applies controlled values and `normalize`; never calls `changed`.\n */\nexport function createMachine<S extends object, E, P extends object>(\n definition: MachineDefinition<S, E, P>,\n initialProps: P,\n): Machine<S, E, P> {\n const keys = definition.controlled ?? [];\n let props: P = { ...initialProps };\n const normalize = (state: S, p: P, prev: S) =>\n definition.normalize ? definition.normalize(state, p, prev) : state;\n\n const first = definition.initial(props);\n const store = createStore<S>(\n normalize(applyControlled(first, props, keys), props, first),\n );\n\n const project = (state: S, partial?: Partial<P>): S => {\n const p = partial ? { ...props, ...partial } : props;\n return normalize(applyControlled(state, p, keys), p, state);\n };\n\n const send = (event: E | SyncEvent<P>) => {\n const prev = store.getState();\n if ((event as SyncEvent<P>)?.type === \"SYNC\") {\n props = { ...props, ...(event as SyncEvent<P>).props };\n store.setState(project(prev));\n return;\n }\n const reduced = definition.reduce(prev, event as E, props);\n if (reduced === prev) return;\n // Controlled values are re-applied before normalizing, so derived fields\n // follow the value actually kept (a rejected change leaves no trace).\n store.setState(\n normalize(applyControlled(reduced, props, keys), props, prev),\n );\n definition.changed?.(normalize(reduced, props, prev), prev, props);\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n send,\n getProps: () => props,\n setProps: (partial) => send({ type: \"SYNC\", props: partial }),\n project,\n };\n}\n\n/** Whether the value of `key` differs between two states. */\nexport const changedKey = <S>(a: S, b: S, key: keyof S): boolean =>\n !Object.is(a[key], b[key]);\n","// Disclosure (collapsible, accordion item, popover, dialog...) with presence\n// phases: closed -> opening -> open -> closing -> closed. The renderer keeps\n// the content mounted while the phase is not \"closed\" and reports the end of\n// its enter / exit animation with ANIMATION_END (or SKIP_ANIMATION when it\n// has none, e.g. reduced motion).\nimport { createMachine, type Machine } from \"./store\";\n\n/** Presence phase of the disclosed content. */\nexport type DisclosurePhase = \"closed\" | \"opening\" | \"open\" | \"closing\";\n\nexport interface DisclosureProps {\n /** Controlled open state (`undefined`: uncontrolled). */\n open?: boolean;\n /** Initial open state while uncontrolled. @default false */\n defaultOpen?: boolean;\n /** Ignores OPEN / CLOSE / TOGGLE (props still apply). @default false */\n disabled?: boolean;\n /**\n * Whether opening / closing go through the \"opening\" / \"closing\" phases\n * (ended by ANIMATION_END); `false` jumps straight to \"open\" / \"closed\".\n * @default true\n */\n animated?: boolean;\n /** Called with the requested open state (controlled or not). */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface DisclosureState {\n open: boolean;\n phase: DisclosurePhase;\n}\n\nexport type DisclosureEvent =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"TOGGLE\" }\n /** The enter / exit animation finished: settles the phase. */\n | { type: \"ANIMATION_END\" }\n /** Settles the phase at once (no animation to wait for). */\n | { type: \"SKIP_ANIMATION\" };\n\nexport type DisclosureMachine = Machine<\n DisclosureState,\n DisclosureEvent,\n DisclosureProps\n>;\n\nconst settle = (state: DisclosureState): DisclosureState => {\n if (state.phase === \"opening\") return { ...state, phase: \"open\" };\n if (state.phase === \"closing\") return { ...state, phase: \"closed\" };\n return state;\n};\n\n/** Whether the content should be rendered (any phase but \"closed\"). */\nexport const isDisclosurePresent = (state: DisclosureState): boolean =>\n state.phase !== \"closed\";\n\n/** Creates a disclosure machine. */\nexport function createDisclosureMachine(\n props: DisclosureProps = {},\n): DisclosureMachine {\n return createMachine<DisclosureState, DisclosureEvent, DisclosureProps>(\n {\n controlled: [\"open\"],\n initial: (p) => {\n const open = p.open ?? p.defaultOpen ?? false;\n return { open, phase: open ? \"open\" : \"closed\" };\n },\n reduce(state, event, p) {\n switch (event.type) {\n case \"OPEN\":\n case \"CLOSE\":\n case \"TOGGLE\": {\n if (p.disabled) return state;\n const open =\n event.type === \"TOGGLE\" ? !state.open : event.type === \"OPEN\";\n return open === state.open ? state : { ...state, open };\n }\n case \"ANIMATION_END\":\n case \"SKIP_ANIMATION\":\n return settle(state);\n default:\n return state;\n }\n },\n // The phase follows `open`: entering / leaving starts the transition.\n normalize(state, p) {\n const animated = p.animated ?? true;\n let { phase } = state;\n if (state.open && (phase === \"closed\" || phase === \"closing\")) {\n phase = animated ? \"opening\" : \"open\";\n } else if (!state.open && (phase === \"open\" || phase === \"opening\")) {\n phase = animated ? \"closing\" : \"closed\";\n } else if (!animated) {\n phase = state.open ? \"open\" : \"closed\";\n }\n return phase === state.phase ? state : { ...state, phase };\n },\n changed(requested, prev, p) {\n if (requested.open !== prev.open) p.onOpenChange?.(requested.open);\n },\n },\n props,\n );\n}\n","// Toast queue: the framework-neutral store behind the React `toast()` /\n// `<ToastProvider>` and the web components' `toast()` /\n// `<minerva-toast-region>`. Semantics: insertion order (a re-used id replaces\n// the toast in place and restarts its timer), auto-dismiss timers with\n// pause / resume (hover / focus), an \"open\" -> \"closing\" -> removed lifecycle\n// (`exitDuration` for the exit animation) and `getToastOverflow` for the\n// renderers' `max`. Generic over the content type (React nodes, Lit\n// templates, strings...) and over extra per-toast data (render scope...).\nimport { createStore, type Scheduler } from \"./store\";\n\n/**\n * The engine's timers read at call time, like `defaultScheduler`, but called\n * from this module so that leak reports name the toast queue.\n */\nconst engineScheduler: Scheduler = {\n setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),\n clearTimeout: (handle) =>\n globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>),\n now: () => Date.now(),\n};\n\n/** Default auto-close delay, in milliseconds. */\nexport const TOAST_DEFAULT_DURATION = 4000;\n/** Default length of the closing animation before a toast is removed. */\nexport const TOAST_DEFAULT_EXIT_DURATION = 200;\n\nexport type ToastQueueId = string | number;\n\n/** Semantic color of a toast. */\nexport type ToastQueueColor = \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/** Why a toast closed. */\nexport type ToastQueueCloseReason =\n \"timeout\" | \"close-button\" | \"action\" | \"escape\" | \"dismiss\" | \"overflow\";\n\n/** Button rendered in a toast. */\nexport interface ToastQueueAction<C> {\n label: C;\n onClick: () => void;\n}\n\n/** Options of a shown toast (`C`: content type). */\nexport interface ToastQueueOptions<C> {\n /** Re-using the id of a toast replaces it; generated when omitted. */\n id?: ToastQueueId;\n /** @default \"info\" */\n color?: ToastQueueColor;\n /** Spinner, no auto-close by default. @default false */\n loading?: boolean;\n title?: C;\n description?: C;\n /** Auto-close delay; 0 keeps the toast open. @default 4000 (0 when loading) */\n duration?: number;\n /** Custom icon; `null` hides it. */\n icon?: C | null;\n /** @default true */\n closable?: boolean;\n action?: ToastQueueAction<C>;\n /** Called once with the id when the toast starts closing. */\n onClose?: (id: ToastQueueId) => void;\n}\n\n/** A toast of the queue. */\nexport interface ToastQueueBaseItem<C> {\n id: ToastQueueId;\n color: ToastQueueColor;\n loading: boolean;\n title?: C;\n description?: C;\n duration: number;\n icon?: C | null;\n closable: boolean;\n action?: ToastQueueAction<C>;\n onClose?: (id: ToastQueueId) => void;\n state: \"open\" | \"closing\";\n}\n\n/** A toast with the renderer's extra data `X`. */\nexport type ToastQueueItem<\n C,\n X extends object = object,\n> = ToastQueueBaseItem<C> & X;\n\nexport interface ToastQueueState<C, X extends object = object> {\n /** Toasts in display order (a new array after every change). */\n toasts: ToastQueueItem<C, X>[];\n}\n\n/** Close / remove notifications (e.g. turned into DOM events). */\nexport type ToastQueueLifecycleEvent<C, X extends object = object> =\n | {\n type: \"close\";\n item: ToastQueueItem<C, X>;\n reason: ToastQueueCloseReason;\n }\n | { type: \"remove\"; item: ToastQueueItem<C, X> };\n\nexport type ToastQueueEvent<C, X extends object = object> =\n | { type: \"ADD\"; options: ToastQueueOptions<C>; extra?: X }\n | {\n type: \"UPDATE\";\n id: ToastQueueId;\n options: Omit<ToastQueueOptions<C>, \"id\">;\n }\n | { type: \"DISMISS\"; id: ToastQueueId; reason?: ToastQueueCloseReason }\n | { type: \"DISMISS_ALL\" }\n | { type: \"PAUSE\"; id: ToastQueueId }\n | { type: \"RESUME\"; id: ToastQueueId }\n | { type: \"RESET\" };\n\nexport interface ToastQueueConfig {\n /**\n * Whether toasts are kept. `false` (e.g. during SSR, where a module level\n * list would leak between requests) only hands out ids.\n * @default () => true\n */\n isClient?: () => boolean;\n /** Timers and clock. @default the engine's timers (`defaultScheduler`) */\n scheduler?: Scheduler;\n /** @default TOAST_DEFAULT_DURATION */\n defaultDuration?: number;\n /** @default TOAST_DEFAULT_EXIT_DURATION */\n exitDuration?: number;\n}\n\nexport interface ToastQueue<C, X extends object = object> {\n getState(): ToastQueueState<C, X>;\n subscribe(\n listener: (\n state: ToastQueueState<C, X>,\n prev: ToastQueueState<C, X>,\n ) => void,\n ): () => void;\n send(event: ToastQueueEvent<C, X>): void;\n /** Shows (or replaces) a toast; returns its id. */\n add(options: ToastQueueOptions<C>, extra?: X): ToastQueueId;\n /**\n * Merges options into an open toast (its extra data is kept) and restarts\n * its timer. Unknown or closing ids are ignored.\n */\n update(id: ToastQueueId, options: Omit<ToastQueueOptions<C>, \"id\">): void;\n /** Starts closing a toast (`onClose`, \"close\" notification), then removes it. */\n dismiss(id: ToastQueueId, reason?: ToastQueueCloseReason): void;\n /** Closes every toast. */\n dismissAll(): void;\n /** Stops the auto-close countdown (hover / focus). */\n pause(id: ToastQueueId): void;\n /** Continues a paused countdown where it stopped. */\n resume(id: ToastQueueId): void;\n /** Whether the countdown of a toast is paused. */\n isPaused(id: ToastQueueId): boolean;\n /** Clears every toast and timer (no callbacks). */\n reset(): void;\n /** Listens to close / remove notifications. */\n subscribeLifecycle(\n listener: (event: ToastQueueLifecycleEvent<C, X>) => void,\n ): () => void;\n}\n\ninterface Timer {\n handle?: unknown;\n /** Time at which the toast closes (while running). */\n deadline: number;\n /** Time left while paused. */\n remaining: number;\n paused: boolean;\n}\n\n/**\n * The oldest open toasts beyond `max` visible ones (closing toasts do not\n * count): the renderers dismiss them (reason \"overflow\").\n */\nexport function getToastOverflow<T extends { state: \"open\" | \"closing\" }>(\n toasts: readonly T[],\n max: number,\n): T[] {\n const open = toasts.filter((t) => t.state === \"open\");\n return open.slice(0, Math.max(0, open.length - max));\n}\n\n/** Creates a toast queue. */\nexport function createToastQueue<C, X extends object = object>(\n config: ToastQueueConfig = {},\n): ToastQueue<C, X> {\n const isClient = config.isClient ?? (() => true);\n const scheduler = config.scheduler ?? engineScheduler;\n const defaultDuration = config.defaultDuration ?? TOAST_DEFAULT_DURATION;\n const exitDuration = config.exitDuration ?? TOAST_DEFAULT_EXIT_DURATION;\n\n type Item = ToastQueueItem<C, X>;\n // Every change produces a new state (and array), so equality is identity.\n const store = createStore<ToastQueueState<C, X>>(\n { toasts: [] },\n { equals: Object.is },\n );\n const lifecycle = new Set<(event: ToastQueueLifecycleEvent<C, X>) => void>();\n const timers = new Map<ToastQueueId, Timer>();\n let idCounter = 0;\n\n const toasts = () => store.getState().toasts;\n const setToasts = (next: Item[]) => store.setState({ toasts: next });\n const notify = (event: ToastQueueLifecycleEvent<C, X>) => {\n for (const fn of [...lifecycle]) fn(event);\n };\n\n const clearTimer = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (timer) scheduler.clearTimeout(timer.handle);\n timers.delete(id);\n };\n\n const schedule = (id: ToastQueueId, duration: number) => {\n clearTimer(id);\n if (duration <= 0) return;\n timers.set(id, {\n handle: scheduler.setTimeout(() => dismiss(id, \"timeout\"), duration),\n deadline: scheduler.now() + duration,\n remaining: duration,\n paused: false,\n });\n };\n\n const add = (options: ToastQueueOptions<C>, extra?: X): ToastQueueId => {\n const id = options.id ?? ++idCounter;\n if (!isClient()) return id;\n const loading = options.loading ?? false;\n const next = {\n ...extra,\n id,\n color: options.color ?? \"info\",\n loading,\n title: options.title,\n description: options.description,\n duration: options.duration ?? (loading ? 0 : defaultDuration),\n icon: options.icon,\n closable: options.closable ?? true,\n action: options.action,\n onClose: options.onClose,\n state: \"open\",\n } as Item;\n const list = toasts();\n const index = list.findIndex((t) => t.id === id);\n if (index >= 0) {\n const updated = list.slice();\n updated[index] = next;\n setToasts(updated);\n } else {\n setToasts([...list, next]);\n }\n schedule(id, next.duration);\n return id;\n };\n\n const update = (\n id: ToastQueueId,\n options: Omit<ToastQueueOptions<C>, \"id\">,\n ) => {\n const current = toasts().find((t) => t.id === id && t.state === \"open\");\n if (!current) return;\n // Entering / leaving the loading state with the default duration of the\n // previous state switches to the default of the new one unless a\n // duration is given\n const loadingChanged =\n options.loading !== undefined && options.loading !== current.loading;\n const previousDefault = current.loading ? 0 : defaultDuration;\n const duration =\n options.duration ??\n (loadingChanged && current.duration === previousDefault\n ? undefined\n : current.duration);\n // The current toast doubles as the extra data: its own fields are all\n // overwritten by the merged options.\n add({ ...current, ...options, id, duration }, current);\n };\n\n function dismiss(\n id: ToastQueueId,\n reason: ToastQueueCloseReason = \"dismiss\",\n ): void {\n clearTimer(id);\n const closing = toasts().find((t) => t.id === id && t.state === \"open\");\n if (!closing) return;\n setToasts(\n toasts().map((t) => (t.id === id ? { ...t, state: \"closing\" } : t)),\n );\n closing.onClose?.(id);\n notify({ type: \"close\", item: closing, reason });\n scheduler.setTimeout(() => {\n // A toast shown again with the same id while closing stays\n const current = toasts().find((t) => t.id === id);\n if (current?.state !== \"closing\") return;\n setToasts(toasts().filter((t) => t.id !== id));\n notify({ type: \"remove\", item: current });\n }, exitDuration);\n }\n\n const dismissAll = () => {\n for (const t of toasts()) dismiss(t.id);\n };\n\n const pause = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (!timer || timer.paused) return;\n scheduler.clearTimeout(timer.handle);\n timer.remaining = Math.max(0, timer.deadline - scheduler.now());\n timer.paused = true;\n };\n\n const resume = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (!timer?.paused) return;\n timer.paused = false;\n timer.deadline = scheduler.now() + timer.remaining;\n timer.handle = scheduler.setTimeout(\n () => dismiss(id, \"timeout\"),\n timer.remaining,\n );\n };\n\n const reset = () => {\n for (const id of [...timers.keys()]) clearTimer(id);\n setToasts([]);\n };\n\n const send = (event: ToastQueueEvent<C, X>) => {\n switch (event.type) {\n case \"ADD\":\n add(event.options, event.extra);\n break;\n case \"UPDATE\":\n update(event.id, event.options);\n break;\n case \"DISMISS\":\n dismiss(event.id, event.reason);\n break;\n case \"DISMISS_ALL\":\n dismissAll();\n break;\n case \"PAUSE\":\n pause(event.id);\n break;\n case \"RESUME\":\n resume(event.id);\n break;\n case \"RESET\":\n reset();\n break;\n }\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n send,\n add,\n update,\n dismiss,\n dismissAll,\n pause,\n resume,\n isPaused: (id) => timers.get(id)?.paused ?? false,\n reset,\n subscribeLifecycle(listener) {\n lifecycle.add(listener);\n return () => {\n lifecycle.delete(listener);\n };\n },\n };\n}\n","// Selection of items of a collection (listbox, select, table rows, tree,\n// tag group...): single or multiple, disabled items, a maximum count.\nimport { createMachine, type Machine } from \"./store\";\n\nexport type SelectionMode = \"single\" | \"multiple\";\n\nexport interface SelectionProps<V = string> {\n /** \"single\": at most one value; \"multiple\": any number. @default \"single\" */\n mode?: SelectionMode;\n /** Controlled selected values, in selection order (`undefined`: uncontrolled). */\n value?: readonly V[];\n /** Initial selected values while uncontrolled. @default [] */\n defaultValue?: readonly V[];\n /** Every selectable value, in order (used by SELECT_ALL). @default [] */\n items?: readonly V[];\n /**\n * Disabled values can't be selected; in multiple mode a selected disabled\n * value can't be deselected either.\n */\n isDisabled?: (value: V) => boolean;\n /** Most values selected at once in multiple mode. @default Infinity */\n max?: number;\n /**\n * Single mode: whether TOGGLE / DESELECT may empty the selection.\n * @default true\n */\n allowEmpty?: boolean;\n /** Called with the requested selection (controlled or not). */\n onValueChange?: (value: V[]) => void;\n}\n\nexport interface SelectionState<V = string> {\n value: readonly V[];\n}\n\nexport type SelectionEvent<V = string> =\n | { type: \"SELECT\"; value: V }\n | { type: \"DESELECT\"; value: V }\n | { type: \"TOGGLE\"; value: V }\n /** Replaces the selection (disabled values are left as they are). */\n | { type: \"SET\"; value: readonly V[] }\n /** Selects every enabled item (up to `max`; multiple mode only). */\n | { type: \"SELECT_ALL\" }\n /** Deselects every enabled value. */\n | { type: \"CLEAR\" };\n\nexport type SelectionMachine<V = string> = Machine<\n SelectionState<V>,\n SelectionEvent<V>,\n SelectionProps<V>\n>;\n\n/** Whether `value` is selected. */\nexport const isSelected = <V>(state: SelectionState<V>, value: V): boolean =>\n state.value.includes(value);\n\nconst sameValues = <V>(a: readonly V[], b: readonly V[]) =>\n a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n\n/** Creates a selection machine. */\nexport function createSelectionMachine<V = string>(\n props: SelectionProps<V> = {},\n): SelectionMachine<V> {\n const reduceValue = (\n current: readonly V[],\n event: SelectionEvent<V>,\n p: SelectionProps<V>,\n ): readonly V[] => {\n const multiple = p.mode === \"multiple\";\n const disabled = p.isDisabled ?? (() => false);\n const max = multiple ? (p.max ?? Infinity) : 1;\n const allowEmpty = multiple || (p.allowEmpty ?? true);\n // Disabled values stay selected in multiple mode; a single selection\n // can always be replaced by an enabled value.\n const locked = multiple ? current.filter(disabled) : [];\n\n const select = (value: V): readonly V[] => {\n if (disabled(value) || current.includes(value)) return current;\n if (!multiple) return [value];\n return current.length >= max ? current : [...current, value];\n };\n const deselect = (value: V): readonly V[] => {\n if (!current.includes(value) || (multiple && disabled(value))) {\n return current;\n }\n const next = current.filter((v) => !Object.is(v, value));\n return next.length === 0 && !allowEmpty ? current : next;\n };\n\n switch (event.type) {\n case \"SELECT\":\n return select(event.value);\n case \"DESELECT\":\n return deselect(event.value);\n case \"TOGGLE\":\n return current.includes(event.value)\n ? deselect(event.value)\n : select(event.value);\n case \"SET\": {\n const wanted = event.value.filter((v, i, all) => {\n return !disabled(v) && all.indexOf(v) === i;\n });\n const next = [...locked, ...wanted].slice(0, multiple ? max : 1);\n return next.length === 0 && !allowEmpty ? current : next;\n }\n case \"SELECT_ALL\": {\n if (!multiple) return current;\n const next = [...current];\n for (const v of p.items ?? []) {\n if (next.length >= max) break;\n if (!disabled(v) && !next.includes(v)) next.push(v);\n }\n return next;\n }\n case \"CLEAR\": {\n const next = multiple ? current.filter(disabled) : [];\n return next.length === 0 && !allowEmpty ? current : next;\n }\n default:\n return current;\n }\n };\n\n return createMachine<SelectionState<V>, SelectionEvent<V>, SelectionProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({ value: p.value ?? p.defaultValue ?? [] }),\n reduce(state, event, p) {\n const value = reduceValue(state.value, event, p);\n return sameValues(value, state.value) ? state : { value };\n },\n changed(requested, prev, p) {\n if (!sameValues(requested.value, prev.value)) {\n p.onValueChange?.([...requested.value]);\n }\n },\n },\n props,\n );\n}\n","// Tabs (WAI-ARIA tabs pattern): selected value, focused tab, keyboard\n// navigation (arrows per orientation / direction, Home / End, optional\n// wrapping) and automatic or manual activation. Renderers that discover\n// their tabs at runtime (DOM children) pass them with the events.\nimport { getNextIndex, type Direction } from \"../keyboard-navigation\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport type TabsMachineOrientation = \"horizontal\" | \"vertical\";\nexport type TabsActivation = \"automatic\" | \"manual\";\n\n/** A tab of the list. */\nexport interface TabsItem {\n value: string;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n /** Controlled selected value (`undefined`: uncontrolled). */\n value?: string;\n /** Initial selected value while uncontrolled. */\n defaultValue?: string;\n /** Tabs in order (events may pass their own list). @default [] */\n tabs?: readonly TabsItem[];\n /** @default \"horizontal\" */\n orientation?: TabsMachineOrientation;\n /** Reading direction (ArrowLeft / ArrowRight swap in RTL). @default \"ltr\" */\n dir?: Direction;\n /** Arrow keys wrap around at both ends. @default true */\n loop?: boolean;\n /**\n * \"automatic\": a tab is selected when it receives focus; \"manual\": with\n * Enter / Space / click only. @default \"automatic\"\n */\n activationMode?: TabsActivation;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: string) => void;\n}\n\nexport interface TabsState {\n value: string | undefined;\n /** Tab holding the focus (`undefined`: focus outside the tabs). */\n focusedValue: string | undefined;\n}\n\nexport type TabsEvent =\n /** Click / Enter / Space on a tab. */\n | { type: \"SELECT\"; value: string; disabled?: boolean }\n /** A tab received focus (selects it in automatic mode). */\n | { type: \"FOCUS\"; value: string; disabled?: boolean }\n | { type: \"BLUR\" }\n /**\n * A key pressed on the tab list: moves `focusedValue` (the renderer then\n * focuses that tab, which sends FOCUS). `from` defaults to the focused\n * (else selected) tab.\n */\n | {\n type: \"NAVIGATE\";\n key: string;\n from?: string;\n tabs?: readonly TabsItem[];\n };\n\nexport type TabsMachine = Machine<TabsState, TabsEvent, TabsProps>;\n\nexport interface TabsNavigationOptions {\n key: string;\n currentIndex: number;\n tabs: readonly Pick<TabsItem, \"disabled\">[];\n orientation?: TabsMachineOrientation;\n dir?: Direction;\n loop?: boolean;\n}\n\n/**\n * Index of the tab a key moves the focus to (enabled tabs only), or `null`\n * when the key is not a navigation key for this orientation.\n */\nexport const getTabsNavigationIndex = ({\n key,\n currentIndex,\n tabs,\n orientation = \"horizontal\",\n dir = \"ltr\",\n loop = true,\n}: TabsNavigationOptions): number | null =>\n getNextIndex({\n currentIndex,\n count: tabs.length,\n key,\n orientation,\n dir,\n loop,\n isDisabled: (index) => !!tabs[index].disabled,\n });\n\n/**\n * The tab holding the roving tab stop: the selected tab when it is enabled,\n * else the first enabled one (`undefined` when every tab is disabled).\n */\nexport const getTabsTabStop = <T extends TabsItem>(\n tabs: readonly T[],\n value: string | undefined,\n): T | undefined =>\n tabs.find((tab) => tab.value === value && !tab.disabled) ??\n tabs.find((tab) => !tab.disabled);\n\nconst isTabDisabled = (\n tabs: readonly TabsItem[] | undefined,\n value: string,\n explicit: boolean | undefined,\n) => explicit ?? tabs?.find((tab) => tab.value === value)?.disabled ?? false;\n\n/** Creates a tabs machine. */\nexport function createTabsMachine(props: TabsProps = {}): TabsMachine {\n return createMachine<TabsState, TabsEvent, TabsProps>(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value ?? p.defaultValue,\n focusedValue: undefined,\n }),\n reduce(state, event, p) {\n switch (event.type) {\n case \"SELECT\":\n if (isTabDisabled(p.tabs, event.value, event.disabled)) {\n return state;\n }\n return event.value === state.value\n ? state\n : { ...state, value: event.value };\n case \"FOCUS\": {\n const disabled = isTabDisabled(p.tabs, event.value, event.disabled);\n const select =\n !disabled &&\n (p.activationMode ?? \"automatic\") === \"automatic\" &&\n event.value !== state.value;\n return {\n focusedValue: event.value,\n value: select ? event.value : state.value,\n };\n }\n case \"BLUR\":\n return state.focusedValue === undefined\n ? state\n : { ...state, focusedValue: undefined };\n case \"NAVIGATE\": {\n const tabs = event.tabs ?? p.tabs ?? [];\n const from = event.from ?? state.focusedValue ?? state.value;\n const next = getTabsNavigationIndex({\n key: event.key,\n currentIndex: tabs.findIndex((tab) => tab.value === from),\n tabs,\n orientation: p.orientation,\n dir: p.dir,\n loop: p.loop,\n });\n if (next === null) return state;\n return { ...state, focusedValue: tabs[next].value };\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (requested.value !== prev.value && requested.value !== undefined) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n","// Cascading picker columns (mobile wheel picker, cascader, region / date\n// pickers): an options tree shown as one column per level. Choosing an\n// option in column N keeps columns < N and recomputes every column > N\n// (first enabled option of each level, or the previous choice when it still\n// exists there).\nimport { createMachine, type Machine } from \"./store\";\n\n/** A node of the options tree. */\nexport interface PickerOption<V = string> {\n value: V;\n label?: string;\n disabled?: boolean;\n /** Options of the next column when this one is chosen. */\n children?: readonly PickerOption<V>[];\n}\n\n/** A column derived from the tree and the value path. */\nexport interface PickerColumn<V = string> {\n options: readonly PickerOption<V>[];\n /** Index of the chosen option (`-1`: none, every option disabled). */\n selectedIndex: number;\n}\n\nexport interface PickerProps<V = string> {\n /** Options of the first column (their `children` feed the next ones). */\n options: readonly PickerOption<V>[];\n /** Controlled value path, one value per column (`undefined`: uncontrolled). */\n value?: readonly V[];\n /** Initial value path while uncontrolled (missing levels pick the first enabled option). */\n defaultValue?: readonly V[];\n /** Called with the requested value path (controlled or not). */\n onValueChange?: (value: V[], selectedOptions: PickerOption<V>[]) => void;\n}\n\nexport interface PickerState<V = string> {\n /** Value path, one value per column (always a valid path of the tree). */\n value: readonly V[];\n}\n\nexport type PickerEvent<V = string> =\n /** Chooses the option at `index` of `column`. */\n | { type: \"SELECT\"; column: number; index: number }\n /** Moves the choice of `column` by `delta` enabled options (wheel, arrows), clamped. */\n | { type: \"STEP\"; column: number; delta: number }\n /** Replaces the value path. */\n | { type: \"SET\"; value: readonly V[] };\n\nexport type PickerMachine<V = string> = Machine<\n PickerState<V>,\n PickerEvent<V>,\n PickerProps<V>\n>;\n\nconst firstEnabled = <V>(options: readonly PickerOption<V>[]) =>\n options.findIndex((o) => !o.disabled);\n\n/**\n * Columns shown for a value path: every level down the chosen options\n * (a level whose value is missing or disabled falls back to its first\n * enabled option).\n */\nexport function getPickerColumns<V>(\n options: readonly PickerOption<V>[],\n value: readonly V[],\n): PickerColumn<V>[] {\n const columns: PickerColumn<V>[] = [];\n let level: readonly PickerOption<V>[] | undefined = options;\n for (let depth = 0; level && level.length > 0; depth++) {\n let index: number = level.findIndex(\n (o) => !o.disabled && Object.is(o.value, value[depth]),\n );\n if (index < 0) index = firstEnabled(level);\n columns.push({ options: level, selectedIndex: index });\n level = index < 0 ? undefined : level[index].children;\n }\n return columns;\n}\n\n/** The options chosen in each column (the resolved value path). */\nexport const getPickerSelectedOptions = <V>(\n columns: readonly PickerColumn<V>[],\n): PickerOption<V>[] =>\n columns\n .filter((c) => c.selectedIndex >= 0)\n .map((c) => c.options[c.selectedIndex]);\n\nconst resolve = <V>(options: readonly PickerOption<V>[], value: readonly V[]) =>\n getPickerSelectedOptions(getPickerColumns(options, value)).map(\n (o) => o.value,\n );\n\nconst samePath = <V>(a: readonly V[], b: readonly V[]) =>\n a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n\n/** Creates a picker columns machine. */\nexport function createPickerMachine<V = string>(\n props: PickerProps<V>,\n): PickerMachine<V> {\n return createMachine<PickerState<V>, PickerEvent<V>, PickerProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({ value: p.value ?? p.defaultValue ?? [] }),\n reduce(state, event, p) {\n const columns = getPickerColumns(p.options, state.value);\n const path = getPickerSelectedOptions(columns).map((o) => o.value);\n const choose = (column: number, index: number) => {\n const option = columns[column]?.options[index];\n if (!option || option.disabled) return state;\n // Levels after `column` are recomputed (previous values are kept\n // when they still exist below the new choice).\n const value = resolve(p.options, [\n ...path.slice(0, column),\n option.value,\n ...path.slice(column + 1),\n ]);\n return samePath(value, state.value) ? state : { value };\n };\n switch (event.type) {\n case \"SELECT\":\n return choose(event.column, event.index);\n case \"STEP\": {\n const column = columns[event.column];\n if (!column || event.delta === 0) return state;\n const step = event.delta > 0 ? 1 : -1;\n let index = column.selectedIndex;\n let target = index;\n for (let moved = 0; moved < Math.abs(event.delta);) {\n index += step;\n if (index < 0 || index >= column.options.length) break;\n if (!column.options[index].disabled) {\n target = index;\n moved++;\n }\n }\n return choose(event.column, target);\n }\n case \"SET\": {\n const value = resolve(p.options, event.value);\n return samePath(value, state.value) ? state : { value };\n }\n default:\n return state;\n }\n },\n normalize(state, p) {\n const value = resolve(p.options, state.value);\n return samePath(value, state.value) ? state : { value };\n },\n changed(requested, prev, p) {\n if (samePath(requested.value, prev.value)) return;\n const selected = getPickerSelectedOptions(\n getPickerColumns(p.options, requested.value),\n );\n p.onValueChange?.([...requested.value], selected);\n },\n },\n props,\n );\n}\n","// Form field state and validation: value, touched / dirty, sync validators\n// (required, min / max, minLength / maxLength, pattern, email, custom) and\n// optional async ones, with error messages translated from the\n// `validation.*` keys of the message bundles (en / zh / ja / fr).\nimport { createTranslator, type TranslateFunction } from \"../i18n/translate\";\nimport { messages } from \"../i18n\";\nimport { createMachine, type Machine } from \"./store\";\n\n/** A validation failure: an i18n key, its interpolation values and the message. */\nexport interface FieldError {\n /** Message key, e.g. \"validation.valueMissing\". */\n key: string;\n /** Interpolation values of the message (`{{min}}`...). */\n params?: Record<string, unknown>;\n /** Translated message (filled by the machine). */\n message: string;\n}\n\n/** What a validator reports: `null` / `undefined` when the value is valid. */\nexport type FieldValidationResult = Omit<FieldError, \"message\"> & {\n message?: string;\n};\n\n/** A synchronous validator. */\nexport type FieldValidator<V> = (\n value: V,\n) => FieldValidationResult | null | undefined;\n\n/** An asynchronous validator (runs once every sync validator passed). */\nexport type FieldAsyncValidator<V> = (\n value: V,\n) => Promise<FieldValidationResult | null | undefined>;\n\n/** \"Empty\" for the validators: `undefined`, `null`, `\"\"`, `[]` or `false`. */\nexport const isEmptyFieldValue = (value: unknown): boolean =>\n value === undefined ||\n value === null ||\n value === \"\" ||\n value === false ||\n (Array.isArray(value) && value.length === 0);\n\nconst lengthOf = (value: unknown): number | undefined =>\n typeof value === \"string\" || Array.isArray(value) ? value.length : undefined;\n\n// Same rule as the HTML input type=\"email\" (WHATWG)\nconst EMAIL_RE =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n/**\n * Built-in validators. Every one but `required` accepts empty values (combine\n * with `required`). `key` overrides the message key.\n */\nexport const fieldValidators = {\n /** Fails on empty values (\"validation.valueMissing\"). */\n required:\n (key = \"validation.valueMissing\"): FieldValidator<unknown> =>\n (value) =>\n isEmptyFieldValue(value) ? { key } : null,\n /** Number below `min` (\"validation.rangeUnderflow\"). */\n min:\n (min: number, key = \"validation.rangeUnderflow\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"number\" && value < min\n ? { key, params: { min } }\n : null,\n /** Number above `max` (\"validation.rangeOverflow\"). */\n max:\n (max: number, key = \"validation.rangeOverflow\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"number\" && value > max\n ? { key, params: { max } }\n : null,\n /** Text / list shorter than `min` (\"validation.tooShort\"). */\n minLength:\n (min: number, key = \"validation.tooShort\"): FieldValidator<unknown> =>\n (value) => {\n const length = lengthOf(value);\n return length !== undefined && length > 0 && length < min\n ? { key, params: { min } }\n : null;\n },\n /** Text / list longer than `max` (\"validation.tooLong\"). */\n maxLength:\n (max: number, key = \"validation.tooLong\"): FieldValidator<unknown> =>\n (value) => {\n const length = lengthOf(value);\n return length !== undefined && length > max\n ? { key, params: { max } }\n : null;\n },\n /** Text not fully matching `pattern` (\"validation.patternMismatch\"). */\n pattern: (\n pattern: RegExp | string,\n key = \"validation.patternMismatch\",\n ): FieldValidator<unknown> => {\n const source = typeof pattern === \"string\" ? pattern : pattern.source;\n const flags = typeof pattern === \"string\" ? \"\" : pattern.flags;\n // Whole-value match, like the HTML `pattern` attribute (no `g` state)\n const re = new RegExp(`^(?:${source})$`, flags.replace(/[gy]/g, \"\"));\n return (value) =>\n typeof value === \"string\" && value !== \"\" && !re.test(value)\n ? { key }\n : null;\n },\n /** Text that is not an email address (\"validation.emailMismatch\"). */\n email:\n (key = \"validation.emailMismatch\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"string\" && value !== \"\" && !EMAIL_RE.test(value)\n ? { key }\n : null,\n /**\n * Custom rule: `test` returns whether the value is valid\n * (\"validation.badInput\" unless `key` / `message` is given).\n */\n custom:\n <V>(\n test: (value: V) => boolean,\n options: { key?: string; message?: string } = {},\n ): FieldValidator<V> =>\n (value) =>\n test(value)\n ? null\n : {\n key: options.key ?? \"validation.badInput\",\n message: options.message,\n },\n};\n\n/** When validation runs. */\nexport type FieldValidateOn = \"change\" | \"blur\" | \"submit\";\n\n/** Validation status. */\nexport type FieldStatus = \"idle\" | \"validating\" | \"valid\" | \"invalid\";\n\nexport interface FieldProps<V> {\n /** Controlled value (`undefined`: uncontrolled). */\n value?: V;\n /** Initial value (and the RESET target). */\n defaultValue: V;\n /** Sync validators, run in order (every failure is reported). */\n validators?: readonly FieldValidator<V>[];\n /** Async validators, run once the sync ones pass (stale results are dropped). */\n asyncValidators?: readonly FieldAsyncValidator<V>[];\n /**\n * First validation: on every CHANGE, on BLUR, or only on VALIDATE (submit).\n * Once validated, every change re-validates. @default \"blur\"\n */\n validateOn?: FieldValidateOn;\n /** Translates the error keys. @default English messages */\n translate?: TranslateFunction;\n /** Value equality (dirty check). @default Object.is */\n equals?: (a: V, b: V) => boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: V) => void;\n}\n\nexport interface FieldState<V> {\n value: V;\n /** The field lost focus at least once (or was submitted). */\n touched: boolean;\n /** The value differs from `defaultValue`. */\n dirty: boolean;\n /** Validation ran at least once since the last reset. */\n validated: boolean;\n status: FieldStatus;\n errors: readonly FieldError[];\n /** Id of the latest validation run (async results of older runs are dropped). */\n run: number;\n}\n\nexport type FieldEvent<V> =\n | { type: \"CHANGE\"; value: V }\n | { type: \"BLUR\" }\n /** Validates now (e.g. on submit) and marks the field touched. */\n | { type: \"VALIDATE\" }\n /** Back to `value` (default: `defaultValue`), untouched, no errors. */\n | { type: \"RESET\"; value?: V }\n /** Result of the async validators of run `run` (sent by the machine). */\n | { type: \"ASYNC_RESULT\"; run: number; errors: readonly FieldError[] };\n\nexport interface FieldMachine<V> extends Machine<\n FieldState<V>,\n FieldEvent<V>,\n FieldProps<V>\n> {\n /** Resolves once the validation in flight (if any) settled. */\n whenSettled(): Promise<FieldState<V>>;\n}\n\nconst englishTranslator = /* @__PURE__ */ createTranslator({\n messages,\n language: \"en\",\n});\n\n/** Translates a validator result into a `FieldError`. */\nexport const toFieldError = (\n result: FieldValidationResult,\n translate: TranslateFunction = englishTranslator,\n): FieldError => ({\n ...result,\n message:\n result.message ??\n translate(result.key, { ...result.params, defaultValue: result.key }),\n});\n\n/** Whether the field currently has validation errors. */\nexport const isFieldInvalid = <V>(state: FieldState<V>): boolean =>\n state.errors.length > 0;\n\n/** Creates a field machine. */\nexport function createFieldMachine<V>(props: FieldProps<V>): FieldMachine<V> {\n const runSync = (value: V, p: FieldProps<V>): FieldError[] => {\n const errors: FieldError[] = [];\n for (const validate of p.validators ?? []) {\n const result = validate(value);\n if (result) errors.push(toFieldError(result, p.translate));\n }\n return errors;\n };\n\n const validate = (state: FieldState<V>, p: FieldProps<V>): FieldState<V> => {\n const errors = runSync(state.value, p);\n const pending = errors.length === 0 && (p.asyncValidators?.length ?? 0) > 0;\n return {\n ...state,\n validated: true,\n errors,\n status: pending ? \"validating\" : errors.length ? \"invalid\" : \"valid\",\n run: state.run + 1,\n };\n };\n\n const machine = createMachine<FieldState<V>, FieldEvent<V>, FieldProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : p.defaultValue,\n touched: false,\n dirty: false,\n validated: false,\n status: \"idle\",\n errors: [],\n run: 0,\n }),\n reduce(state, event, p) {\n const validateOn = p.validateOn ?? \"blur\";\n switch (event.type) {\n case \"CHANGE\": {\n if (Object.is(event.value, state.value)) return state;\n const next = { ...state, value: event.value };\n return validateOn === \"change\" || state.validated\n ? validate(next, p)\n : next;\n }\n case \"BLUR\": {\n const next = state.touched ? state : { ...state, touched: true };\n return validateOn === \"submit\" && !state.validated\n ? next\n : validate(next, p);\n }\n case \"VALIDATE\":\n return validate({ ...state, touched: true }, p);\n case \"RESET\":\n return {\n ...state,\n value: event.value !== undefined ? event.value : p.defaultValue,\n touched: false,\n validated: false,\n status: \"idle\",\n errors: [],\n run: state.run + 1,\n };\n case \"ASYNC_RESULT\":\n if (event.run !== state.run || state.status !== \"validating\") {\n return state;\n }\n return {\n ...state,\n errors: event.errors,\n status: event.errors.length ? \"invalid\" : \"valid\",\n };\n default:\n return state;\n }\n },\n normalize(state, p) {\n const equals = p.equals ?? Object.is;\n const dirty = !equals(state.value, p.defaultValue);\n return dirty === state.dirty ? state : { ...state, dirty };\n },\n changed(requested, prev, p) {\n if (!Object.is(requested.value, prev.value)) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n\n let inFlight: Promise<void> | null = null;\n\n const startAsync = (state: FieldState<V>) => {\n const p = machine.getProps();\n const { run, value } = state;\n const current = Promise.all(\n (p.asyncValidators ?? []).map((validate) => validate(value)),\n ).then(\n (results) => {\n const errors = results\n .filter((r): r is FieldValidationResult => !!r)\n .map((r) => toFieldError(r, machine.getProps().translate));\n machine.send({ type: \"ASYNC_RESULT\", run, errors });\n },\n () => {\n // A failing async validator counts as an invalid value\n machine.send({\n type: \"ASYNC_RESULT\",\n run,\n errors: [\n toFieldError(\n { key: \"validation.badInput\" },\n machine.getProps().translate,\n ),\n ],\n });\n },\n );\n inFlight = current;\n current.then(() => {\n if (inFlight === current) inFlight = null;\n });\n };\n\n machine.subscribe((state, prev) => {\n if (state.status === \"validating\" && state.run !== prev.run) {\n startAsync(state);\n }\n });\n\n return {\n ...machine,\n async whenSettled() {\n while (inFlight) await inFlight;\n return machine.getState();\n },\n };\n}\n","// Pagination: current page and page size (each controlled or not), the page\n// count and the page items (numbers, jump / ellipsis items) of the React\n// Pagination and <minerva-pagination>.\nimport {\n getCompactPageItems,\n getPageRange,\n PAGINATION_JUMP_SIZE,\n} from \"../pagination\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport interface PaginationMachineProps {\n /** Controlled current page, 1-based (`undefined`: uncontrolled). */\n page?: number;\n /** @default 1 */\n defaultPage?: number;\n /** Controlled page size (`undefined`: uncontrolled). */\n pageSize?: number;\n /** @default 10 */\n defaultPageSize?: number;\n /** Total number of items. @default 0 */\n total?: number;\n /** Ignores every event. @default false */\n disabled?: boolean;\n /** Called with the requested page and page size (controlled or not). */\n onChange?: (page: number, pageSize: number) => void;\n}\n\nexport interface PaginationMachineState {\n page: number;\n pageSize: number;\n}\n\nexport type PaginationMachineEvent =\n | { type: \"GOTO\"; page: number }\n | { type: \"NEXT\" }\n | { type: \"PREV\" }\n | { type: \"FIRST\" }\n | { type: \"LAST\" }\n /**\n * A key pressed on a page item: ArrowLeft / ArrowRight (logical, i.e.\n * already swapped in RTL) move by one page, Home / End to the first /\n * last page.\n */\n | { type: \"KEY\"; key: string }\n /** Changes the page size and goes back to the first page. */\n | { type: \"SET_PAGE_SIZE\"; pageSize: number };\n\nexport type PaginationMachine = Machine<\n PaginationMachineState,\n PaginationMachineEvent,\n PaginationMachineProps\n>;\n\n/** Number of pages, at least 1 (there is always a possibly empty page). */\nexport const getTotalPages = (total: number, pageSize: number): number =>\n Math.max(1, pageSize > 0 ? Math.ceil(total / pageSize) : 0);\n\n/**\n * `[first, last]` item numbers shown on `page` (1-based, the page clamped to\n * the valid range); `[0, 0]` without items.\n */\nexport function getPaginationVisibleRange(\n page: number,\n pageSize: number,\n total: number,\n): [number, number] {\n if (total <= 0) return [0, 0];\n const shown = Math.min(Math.max(1, page), getTotalPages(total, pageSize));\n return [(shown - 1) * pageSize + 1, Math.min(shown * pageSize, total)];\n}\n\n/** Whether moving to `target` is a change within range. */\nexport const canGoToPage = (\n page: number,\n target: number,\n totalPages: number,\n disabled = false,\n): boolean =>\n !disabled && target !== page && target >= 1 && target <= totalPages;\n\n/**\n * Page a navigation key leads to (ArrowLeft / ArrowRight: previous / next,\n * Home / End: first / last), or `null` for other keys. Not clamped.\n */\nexport function getPaginationKeyTarget(\n key: string,\n page: number,\n totalPages: number,\n): number | null {\n switch (key) {\n case \"ArrowLeft\":\n return page - 1;\n case \"ArrowRight\":\n return page + 1;\n case \"Home\":\n return 1;\n case \"End\":\n return totalPages;\n default:\n return null;\n }\n}\n\nexport type PaginationItemKind =\n \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\" | \"ellipsis\";\n\n/** An entry of the page list. */\nexport interface PaginationItem {\n /** Stable key (a focused button survives page changes). */\n key: string;\n kind: PaginationItemKind;\n /** Page the item leads to (0 for ellipses). */\n page: number;\n}\n\nexport interface PaginationItemsOptions {\n page: number;\n totalPages: number;\n /**\n * Pages on each side of the current one: switches to the compact list\n * (boundary pages + \"…\" gaps). Compact when this or `boundaryCount` is set.\n */\n siblingCount?: number;\n /** Pages kept at both ends of the compact list. */\n boundaryCount?: number;\n /** Leaves out the prev / next items. @default false */\n hideEdges?: boolean;\n}\n\n/**\n * Items of the page list: prev, the pages (a window of 5 around the current\n * page with first / last pages and jump items, or the compact list with\n * ellipses), next.\n */\nexport function getPaginationItems({\n page,\n totalPages,\n siblingCount,\n boundaryCount,\n hideEdges = false,\n}: PaginationItemsOptions): PaginationItem[] {\n const edge = (kind: \"prev\" | \"next\"): PaginationItem[] =>\n hideEdges\n ? []\n : [{ key: kind, kind, page: kind === \"prev\" ? page - 1 : page + 1 }];\n const pageItem = (p: number): PaginationItem => ({\n key: `page-${p}`,\n kind: \"page\",\n page: p,\n });\n\n if (siblingCount !== undefined || boundaryCount !== undefined) {\n const compact = getCompactPageItems(\n totalPages,\n page,\n Math.max(0, siblingCount ?? 1),\n Math.max(1, boundaryCount ?? 1),\n );\n return [\n ...edge(\"prev\"),\n ...compact.map((item) =>\n typeof item === \"number\"\n ? pageItem(item)\n : { key: item, kind: \"ellipsis\" as const, page: 0 },\n ),\n ...edge(\"next\"),\n ];\n }\n\n const range = getPageRange(page, totalPages);\n const items: PaginationItem[] = [...edge(\"prev\")];\n if (range.length > 0 && range[0] > 1) {\n items.push(pageItem(1));\n if (range[0] > 2) {\n items.push({\n key: \"jump-prev\",\n kind: \"jump-prev\",\n page: Math.max(1, page - PAGINATION_JUMP_SIZE),\n });\n }\n }\n for (const p of range) items.push(pageItem(p));\n const last = range[range.length - 1];\n if (range.length > 0 && last < totalPages) {\n if (last < totalPages - 1) {\n items.push({\n key: \"jump-next\",\n kind: \"jump-next\",\n page: Math.min(totalPages, page + PAGINATION_JUMP_SIZE),\n });\n }\n items.push(pageItem(totalPages));\n }\n items.push(...edge(\"next\"));\n return items;\n}\n\n/** Creates a pagination machine. */\nexport function createPaginationMachine(\n props: PaginationMachineProps = {},\n): PaginationMachine {\n return createMachine<\n PaginationMachineState,\n PaginationMachineEvent,\n PaginationMachineProps\n >(\n {\n controlled: [\"page\", \"pageSize\"],\n initial: (p) => ({\n page: p.page ?? p.defaultPage ?? 1,\n pageSize: p.pageSize ?? p.defaultPageSize ?? 10,\n }),\n reduce(state, event, p) {\n if (p.disabled) return state;\n const totalPages = getTotalPages(p.total ?? 0, state.pageSize);\n const goTo = (target: number | null) =>\n target !== null && canGoToPage(state.page, target, totalPages)\n ? { ...state, page: target }\n : state;\n switch (event.type) {\n case \"GOTO\":\n return goTo(event.page);\n case \"NEXT\":\n return goTo(state.page + 1);\n case \"PREV\":\n return goTo(state.page - 1);\n case \"FIRST\":\n return goTo(1);\n case \"LAST\":\n return goTo(totalPages);\n case \"KEY\":\n return goTo(\n getPaginationKeyTarget(event.key, state.page, totalPages),\n );\n case \"SET_PAGE_SIZE\":\n return { page: 1, pageSize: event.pageSize };\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (\n requested.page !== prev.page ||\n requested.pageSize !== prev.pageSize\n ) {\n p.onChange?.(requested.page, requested.pageSize);\n }\n },\n },\n props,\n );\n}\n","// Star rating: a score on a 0..max scale drawn as five stars, with hover\n// preview, half-star picks, keyboard steps (slider pattern), read-only and\n// clearable modes. The React Rating and <minerva-rating> run on it.\nimport {\n ratingDisplayStars,\n ratingStarFill,\n roundRating,\n type RatingStarFill,\n} from \"../rating\";\nimport { createMachine, type Machine } from \"./store\";\n\n/** Number of stars a rating is drawn with. */\nexport const RATING_STAR_COUNT = 5;\n\nexport interface RatingMachineProps {\n /** Controlled score (`undefined`: uncontrolled). */\n value?: number;\n /** @default 0 */\n defaultValue?: number;\n /** Highest score. @default 10 */\n max?: number;\n /** Display only: events are ignored, no hover preview. @default false */\n readOnly?: boolean;\n /** Picks and arrow keys use half stars. @default true */\n allowHalf?: boolean;\n /** Picking the current score again clears it to 0. @default false */\n clearable?: boolean;\n /** Called with the requested score (controlled or not). */\n onValueChange?: (value: number) => void;\n}\n\nexport interface RatingMachineState {\n value: number;\n /** Stars previewed under the pointer (`null`: not hovering). */\n hoverStars: number | null;\n}\n\nexport type RatingMachineEvent =\n /** The pointer is over star `index` (0-based); `half`: its first half. */\n | { type: \"HOVER\"; index: number; half?: boolean }\n | { type: \"HOVER_END\" }\n /** Star `index` (0-based) was clicked; `half`: on its first half. */\n | { type: \"PICK\"; index: number; half?: boolean }\n /**\n * A key on the slider. Arrow keys are logical (swap ArrowLeft / ArrowRight\n * in RTL before sending): Right / Up add a step (half a star, `max / 10`),\n * Left / Down remove one, PageUp / PageDown one whole star, Home / End go\n * to 0 / `max`; clamped to 0..max.\n */\n | { type: \"KEY\"; key: string }\n | { type: \"SET\"; value: number }\n | { type: \"CLEAR\" };\n\nexport type RatingMachine = Machine<\n RatingMachineState,\n RatingMachineEvent,\n RatingMachineProps\n>;\n\n/** PageUp / PageDown step, in stars. */\nconst PAGE_STARS = Math.max(1, Math.round(RATING_STAR_COUNT / 5));\n\n/**\n * Score a key leads to from `value` (`null`: not a rating key). Arrow keys\n * are logical (already swapped in RTL).\n */\nexport function getRatingKeyValue(\n key: string,\n value: number,\n max: number,\n allowHalf = true,\n): number | null {\n const step = max / (RATING_STAR_COUNT * (allowHalf ? 2 : 1));\n const pageStep = (max / RATING_STAR_COUNT) * PAGE_STARS;\n switch (key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n return Math.min(max, roundRating(value + step));\n case \"ArrowLeft\":\n case \"ArrowDown\":\n return Math.max(0, roundRating(value - step));\n case \"PageUp\":\n return Math.min(max, roundRating(value + pageStep));\n case \"PageDown\":\n return Math.max(0, roundRating(value - pageStep));\n case \"Home\":\n return 0;\n case \"End\":\n return max;\n default:\n return null;\n }\n}\n\n/** Score of a click on star `index` (its first half: a half star). */\nexport const getRatingPickValue = (\n index: number,\n half: boolean,\n max: number,\n allowHalf = true,\n): number =>\n roundRating(\n ((index + (half && allowHalf ? 0.5 : 1)) / RATING_STAR_COUNT) * max,\n );\n\n/** Stars drawn: the hover preview, else the score on five stars. */\nexport const getRatingDisplayStars = (\n state: RatingMachineState,\n max: number,\n): number => state.hoverStars ?? ratingDisplayStars(state.value, max);\n\n/** Fill of each of the five stars. */\nexport const getRatingStarFills = (\n state: RatingMachineState,\n max: number,\n): RatingStarFill[] => {\n const displayed = getRatingDisplayStars(state, max);\n return Array.from({ length: RATING_STAR_COUNT }, (_, i) =>\n ratingStarFill(i, displayed),\n );\n};\n\n/** Creates a rating machine. */\nexport function createRatingMachine(\n props: RatingMachineProps = {},\n): RatingMachine {\n return createMachine<\n RatingMachineState,\n RatingMachineEvent,\n RatingMachineProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value ?? p.defaultValue ?? 0,\n hoverStars: null,\n }),\n reduce(state, event, p) {\n if (p.readOnly) return state;\n const max = p.max ?? 10;\n const allowHalf = p.allowHalf ?? true;\n const setValue = (value: number) =>\n value === state.value ? state : { ...state, value };\n switch (event.type) {\n case \"HOVER\": {\n const stars = event.index + (event.half && allowHalf ? 0.5 : 1);\n return stars === state.hoverStars\n ? state\n : { ...state, hoverStars: stars };\n }\n case \"HOVER_END\":\n return state.hoverStars === null\n ? state\n : { ...state, hoverStars: null };\n case \"PICK\": {\n const value = getRatingPickValue(\n event.index,\n !!event.half,\n max,\n allowHalf,\n );\n return setValue(p.clearable && value === state.value ? 0 : value);\n }\n case \"KEY\": {\n const value = getRatingKeyValue(\n event.key,\n state.value,\n max,\n allowHalf,\n );\n return value === null ? state : setValue(value);\n }\n case \"SET\":\n return setValue(Math.min(max, Math.max(0, event.value)));\n case \"CLEAR\":\n return setValue(0);\n default:\n return state;\n }\n },\n // No preview while read-only\n normalize: (state, p) =>\n p.readOnly && state.hoverStars !== null\n ? { ...state, hoverStars: null }\n : state,\n changed(requested, prev, p) {\n if (requested.value !== prev.value) p.onValueChange?.(requested.value);\n },\n },\n props,\n );\n}\n","// Number stepper (number input / spin button): a value within min..max moved\n// by `step` (rounded to `precision`), a draft text while typing, committed\n// (parsed, clamped, rounded) on blur / Enter.\nimport {\n clampNumber,\n formatNumberValue,\n inferStepPrecision,\n parseNumberDraft,\n} from \"../number-input\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport interface NumberStepperProps {\n /** Controlled value; `null` is empty (`undefined`: uncontrolled). */\n value?: number | null;\n /** @default null */\n defaultValue?: number | null;\n min?: number;\n max?: number;\n /** @default 1 */\n step?: number;\n /** Decimals kept. @default the decimals of `step` */\n precision?: number;\n /** PageUp / PageDown move by `step * pageMultiplier`. @default 10 */\n pageMultiplier?: number;\n /** Committed text out of range is clamped (else kept as is). @default true */\n clampOnBlur?: boolean;\n /** Ignores every event. */\n disabled?: boolean;\n /** Ignores every event. */\n readOnly?: boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: number | null) => void;\n}\n\nexport interface NumberStepperState {\n value: number | null;\n /** Text being typed (`null`: not editing, the formatted value is shown). */\n draft: string | null;\n}\n\nexport type NumberStepperEvent =\n /** Adds `step * (multiplier ?? 1)`. */\n | { type: \"INCREMENT\"; multiplier?: number }\n | { type: \"DECREMENT\"; multiplier?: number }\n /** Sets a value (clamped and rounded); `null` empties the field. */\n | { type: \"SET\"; value: number | null }\n /** Text typed into the field. */\n | { type: \"INPUT\"; text: string }\n /** Commits the draft (blur, Enter). */\n | { type: \"COMMIT\" }\n /** ArrowUp / ArrowDown: one step; PageUp / PageDown: a page; Home / End: min / max. */\n | { type: \"KEY\"; key: string };\n\nexport type NumberStepperMachine = Machine<\n NumberStepperState,\n NumberStepperEvent,\n NumberStepperProps\n>;\n\nconst precisionOf = (p: NumberStepperProps) =>\n p.precision ?? inferStepPrecision(p.step ?? 1);\n\n/** `n` rounded to the stepper's precision and clamped to min..max. */\nexport const normalizeStepperValue = (\n n: number,\n p: NumberStepperProps,\n): number => {\n const rounded = Number(n.toFixed(precisionOf(p)));\n return clampNumber(rounded, p.min, p.max);\n};\n\n/** Text shown by the field: the draft, else the formatted value. */\nexport const getNumberStepperText = (\n state: NumberStepperState,\n props: NumberStepperProps,\n): string => state.draft ?? formatNumberValue(state.value, precisionOf(props));\n\n/** Whether INCREMENT would change the value. */\nexport const canIncrementStepper = (\n state: NumberStepperState,\n p: NumberStepperProps,\n): boolean =>\n !p.disabled &&\n !p.readOnly &&\n (state.value === null || p.max === undefined || state.value < p.max);\n\n/** Whether DECREMENT would change the value. */\nexport const canDecrementStepper = (\n state: NumberStepperState,\n p: NumberStepperProps,\n): boolean =>\n !p.disabled &&\n !p.readOnly &&\n (state.value === null || p.min === undefined || state.value > p.min);\n\n/** Creates a number stepper machine. */\nexport function createNumberStepperMachine(\n props: NumberStepperProps = {},\n): NumberStepperMachine {\n return createMachine<\n NumberStepperState,\n NumberStepperEvent,\n NumberStepperProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : (p.defaultValue ?? null),\n draft: null,\n }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const step = p.step ?? 1;\n const set = (value: number | null): NumberStepperState =>\n Object.is(value, state.value) && state.draft === null\n ? state\n : { value, draft: null };\n const move = (delta: number) => {\n // From empty: start at 0 (or the nearest bound)\n const base = state.value ?? clampNumber(0, p.min, p.max);\n const target = state.value === null ? base : base + delta;\n return set(normalizeStepperValue(target, p));\n };\n switch (event.type) {\n case \"INCREMENT\":\n return move(step * (event.multiplier ?? 1));\n case \"DECREMENT\":\n return move(-step * (event.multiplier ?? 1));\n case \"SET\":\n return set(\n event.value === null || Number.isNaN(event.value)\n ? null\n : normalizeStepperValue(event.value, p),\n );\n case \"INPUT\":\n return event.text === state.draft\n ? state\n : { ...state, draft: event.text };\n case \"COMMIT\": {\n if (state.draft === null) return state;\n if (state.draft.trim() === \"\") return set(null);\n const parsed = parseNumberDraft(state.draft);\n // Invalid text: back to the current value\n if (parsed === null) return { ...state, draft: null };\n const rounded = Number(parsed.toFixed(precisionOf(p)));\n return set(\n (p.clampOnBlur ?? true)\n ? clampNumber(rounded, p.min, p.max)\n : rounded,\n );\n }\n case \"KEY\": {\n const page = p.pageMultiplier ?? 10;\n switch (event.key) {\n case \"ArrowUp\":\n return move(step);\n case \"ArrowDown\":\n return move(-step);\n case \"PageUp\":\n return move(step * page);\n case \"PageDown\":\n return move(-step * page);\n case \"Home\":\n return p.min === undefined ? state : set(p.min);\n case \"End\":\n return p.max === undefined ? state : set(p.max);\n default:\n return state;\n }\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (!Object.is(requested.value, prev.value)) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n","// Toggles: checkbox (with the indeterminate / mixed state), switch and radio\n// group (single selection, roving focus: arrows move and check).\nimport {\n getNextIndex,\n type Direction,\n type Orientation,\n} from \"../keyboard-navigation\";\nimport { createMachine, type Machine } from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Checkbox\n\nexport interface CheckboxMachineProps {\n /** Controlled checked state (`undefined`: uncontrolled). */\n checked?: boolean;\n /** @default false */\n defaultChecked?: boolean;\n /** Controlled indeterminate (mixed) state (`undefined`: uncontrolled). */\n indeterminate?: boolean;\n /** @default false */\n defaultIndeterminate?: boolean;\n /** Ignores TOGGLE / SET. */\n disabled?: boolean;\n /** Ignores TOGGLE / SET. */\n readOnly?: boolean;\n /** Called when the user checks / unchecks (an indeterminate box becomes checked). */\n onCheckedChange?: (checked: boolean) => void;\n /** Called when the indeterminate state is requested to change. */\n onIndeterminateChange?: (indeterminate: boolean) => void;\n}\n\nexport interface CheckboxMachineState {\n checked: boolean;\n indeterminate: boolean;\n}\n\nexport type CheckboxMachineEvent =\n /** An indeterminate box becomes checked; otherwise `checked` flips. */\n { type: \"TOGGLE\" } | { type: \"SET\"; checked: boolean };\n\nexport type CheckboxMachine = Machine<\n CheckboxMachineState,\n CheckboxMachineEvent,\n CheckboxMachineProps\n>;\n\n/** `aria-checked` of a checkbox: \"mixed\" while indeterminate. */\nexport const getCheckboxAriaChecked = (\n state: CheckboxMachineState,\n): \"true\" | \"false\" | \"mixed\" =>\n state.indeterminate ? \"mixed\" : state.checked ? \"true\" : \"false\";\n\n/** Creates a checkbox machine. */\nexport function createCheckboxMachine(\n props: CheckboxMachineProps = {},\n): CheckboxMachine {\n return createMachine<\n CheckboxMachineState,\n CheckboxMachineEvent,\n CheckboxMachineProps\n >(\n {\n controlled: [\"checked\", \"indeterminate\"],\n initial: (p) => ({\n checked: p.checked ?? p.defaultChecked ?? false,\n indeterminate: p.indeterminate ?? p.defaultIndeterminate ?? false,\n }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const checked =\n event.type === \"TOGGLE\"\n ? state.indeterminate || !state.checked\n : event.checked;\n return checked === state.checked && !state.indeterminate\n ? state\n : { checked, indeterminate: false };\n },\n changed(requested, prev, p) {\n if (requested.checked !== prev.checked || prev.indeterminate) {\n p.onCheckedChange?.(requested.checked);\n }\n if (requested.indeterminate !== prev.indeterminate) {\n p.onIndeterminateChange?.(requested.indeterminate);\n }\n },\n },\n props,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Switch\n\nexport interface SwitchMachineProps {\n /** Controlled state (`undefined`: uncontrolled). */\n checked?: boolean;\n /** @default false */\n defaultChecked?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n /** Called with the requested state (controlled or not). */\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport interface SwitchMachineState {\n checked: boolean;\n}\n\nexport type SwitchMachineEvent =\n { type: \"TOGGLE\" } | { type: \"SET\"; checked: boolean };\n\nexport type SwitchMachine = Machine<\n SwitchMachineState,\n SwitchMachineEvent,\n SwitchMachineProps\n>;\n\n/** Creates a switch machine. */\nexport function createSwitchMachine(\n props: SwitchMachineProps = {},\n): SwitchMachine {\n return createMachine<\n SwitchMachineState,\n SwitchMachineEvent,\n SwitchMachineProps\n >(\n {\n controlled: [\"checked\"],\n initial: (p) => ({ checked: p.checked ?? p.defaultChecked ?? false }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const checked =\n event.type === \"TOGGLE\" ? !state.checked : event.checked;\n return checked === state.checked ? state : { checked };\n },\n changed(requested, prev, p) {\n if (requested.checked !== prev.checked) {\n p.onCheckedChange?.(requested.checked);\n }\n },\n },\n props,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radio group\n\n/** An option of a radio group. */\nexport interface RadioGroupItem {\n value: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupMachineProps {\n /** Controlled checked value (`undefined`: uncontrolled; `null`: none). */\n value?: string | null;\n /** @default null */\n defaultValue?: string | null;\n /** Options in order (events may pass their own list). @default [] */\n items?: readonly RadioGroupItem[];\n /** Disables the whole group. */\n disabled?: boolean;\n readOnly?: boolean;\n /** Which arrow keys move. @default \"both\" */\n orientation?: Orientation;\n /** @default \"ltr\" */\n dir?: Direction;\n /** @default true */\n loop?: boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: string) => void;\n}\n\nexport interface RadioGroupMachineState {\n value: string | null;\n /** Option holding the focus (`null`: focus outside the group). */\n focusedValue: string | null;\n}\n\nexport type RadioGroupMachineEvent =\n /** Click / Space on an option. */\n | { type: \"SELECT\"; value: string }\n | { type: \"FOCUS\"; value: string }\n | { type: \"BLUR\" }\n /**\n * An arrow key: moves the focus to the next enabled option and checks it\n * (the renderer focuses `focusedValue`). Home / End are not part of the\n * radio pattern and are ignored.\n */\n | { type: \"NAVIGATE\"; key: string; items?: readonly RadioGroupItem[] };\n\nexport type RadioGroupMachine = Machine<\n RadioGroupMachineState,\n RadioGroupMachineEvent,\n RadioGroupMachineProps\n>;\n\n/**\n * The option holding the roving tab stop: the checked one when enabled, else\n * the first enabled option.\n */\nexport const getRadioGroupTabStop = (\n items: readonly RadioGroupItem[],\n value: string | null,\n): RadioGroupItem | undefined =>\n items.find((item) => item.value === value && !item.disabled) ??\n items.find((item) => !item.disabled);\n\n/** Creates a radio group machine. */\nexport function createRadioGroupMachine(\n props: RadioGroupMachineProps = {},\n): RadioGroupMachine {\n const isItemDisabled = (p: RadioGroupMachineProps, value: string) =>\n !!p.items?.find((item) => item.value === value)?.disabled;\n\n return createMachine<\n RadioGroupMachineState,\n RadioGroupMachineEvent,\n RadioGroupMachineProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : (p.defaultValue ?? null),\n focusedValue: null,\n }),\n reduce(state, event, p) {\n switch (event.type) {\n case \"SELECT\":\n if (p.disabled || p.readOnly || isItemDisabled(p, event.value)) {\n return state;\n }\n return event.value === state.value\n ? state\n : { ...state, value: event.value };\n case \"FOCUS\":\n return event.value === state.focusedValue\n ? state\n : { ...state, focusedValue: event.value };\n case \"BLUR\":\n return state.focusedValue === null\n ? state\n : { ...state, focusedValue: null };\n case \"NAVIGATE\": {\n if (p.disabled || event.key === \"Home\" || event.key === \"End\") {\n return state;\n }\n const items = event.items ?? p.items ?? [];\n const from = state.focusedValue ?? state.value;\n const next = getNextIndex({\n currentIndex: items.findIndex((item) => item.value === from),\n count: items.length,\n key: event.key,\n orientation: p.orientation ?? \"both\",\n dir: p.dir,\n loop: p.loop,\n isDisabled: (index) => !!items[index].disabled,\n });\n if (next === null) return state;\n const value = items[next].value;\n return {\n focusedValue: value,\n value: p.readOnly ? state.value : value,\n };\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (requested.value !== prev.value && requested.value !== null) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n"],"mappings":";AAAA,IAAIiO,IAAU;AAed,SAAgBC,EAAS,IAAS,WAAmB;CAEnD,OADA,KAAW,GACJ,GAAGC,EAAO,GAAGF;AACtB;;;ACmCA,SAAgBG,EACd,GACsB;CACtB,IAAM,EAAE,aAAU,YAAS,OAAO,OAAOC,GACrCC,IAA4BD,EAAQ,OACpCE,IAAYF,EAAQ,cAClBG,oBAAY,IAAI,IAAwB,GAExCC,UAAqBH,MAAe,KAAA,GACpCI,UAAgBD,EAAa,IAAKH,IAAmBC,GACrDI,KAAQ,MAAa;EACzB,KAAK,IAAMC,KAAY,CAAC,GAAGJ,CAAS,GAAG,EAASK,CAAK;CACvD;CAEA,OAAO;EACL;EACA;EACA,IAAI,GAAM;GACR,IAAMC,IAAOJ,EAAI,GACXG,IACJ,OAAOE,KAAS,aAAcA,EAAwBD,CAAI,IAAIC;GAChE,AAAIC,EAAOF,GAAMD,CAAK,MACjBJ,EAAa,MAChB,IAASI,GACTF,EAAKE,CAAK,IAEZI,IAAWJ,CAAK;EAClB;EACA,mBAAmB,GAAO;GACxB,IAAMC,IAAOJ,EAAI;GAKjB,AAJIG,MAAU,KAAA,KAAaP,MAAe,KAAA,MAExC,IAASA,IAEX,IAAaO;GACb,IAAMK,IAAUR,EAAI;GACpB,AAAKM,EAAOF,GAAMI,CAAO,KAAGP,EAAKO,CAAO;EAC1C;EACA,UAAU,GAAU;GAElB,OADAV,EAAU,IAAII,CAAQ,SACT;IACX,EAAU,OAAOA,CAAQ;GAC3B;EACF;CACF;AACF;;;ACvFA,IAAaO,IAAqB;AAGlC,SAAgBC,EAAiB,GAAiB,GAAyB;CACzE,OAAO,GAAGD,EAAmB,GAAGE,EAAQ,IAAIC;AAC9C;;;ACHA,IAAMC,oBAAiB,IAAI,IAAI,CAAC,cAAc,UAAU,CAAC,GAQnDC,IAAU;AAGhB,SAAgBC,EAAU,GAAsB;CAC9C,IAAMC,IAAaC,EAAI,QAAQH,GAAS,EAAE,GACpCI,IAAS,wBAAwB,KAAKF,CAAU;CACtD,OAAO,CAACE,KAAU,CAACL,EAAe,IAAIK,EAAO,EAAE,CAAC,YAAY,CAAC;AAC/D;AAOA,SAAgBC,EACd,GACoB;CACpB,IAAIF,KAAO,MACX,OAAOF,EAAUE,CAAG,IAAIA,IAAM,KAAA;AAChC;AAMA,SAAgBG,EACd,GACA,GACoB;CAEpB,OADIC,MACGC,GAAQ,YAAY,MAAM,WAAW,wBAAwB,KAAA;AACtE;;;ACxCA,IAAaC,IAAW;CAAC;CAAa;CAAQ;CAAY;AAAM,GAKnDC,KAAe,MAC1BrB,MAAU,WAAWA,MAAU,UAAUA,MAAU,UAExCsB,KAAa,MACxB,OAAOtB,KAAU,YAAaoB,EAA+B,SAASpB,CAAK,GCHhEuB,IAAY;CAAC;CAAW;CAAY;AAAa,GAIjDC,IAAgB;CAAC;CAAQ;CAAS;CAAU;AAAO,GAInDC,IAAgB;CAAC;CAAQ;CAAU;AAAU,GAI7CC,IAAc;CAAC;CAAS;CAAY;AAAO,GAI3CC,IAAiB;CAC5B;CACA;CACA;CACA;AACF,GA2CaC,IAA8D;CACzE,SAAS;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,SAAS;CACX;CACA,WAAW;EACT,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,SAAS;CACX;CACA,SAAS;EACP,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,SAAS;CACX;CAGA,OAAO;EACL,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,SAAS;CACX;AACF,GAEMC,KACJ,GACA,MAEA,OAAO7B,KAAU,YAAa8B,EAA6B,SAAS9B,CAAK,GAE9D+B,KAAa,MACxBF,EAASN,GAAWvB,CAAK,GACdgC,MAAiB,MAC5BH,EAASL,GAAexB,CAAK,GAClBiC,MAAiB,MAC5BJ,EAASJ,GAAezB,CAAK,GAClBkC,MAAe,MAC1BL,EAASH,GAAa1B,CAAK,GAChBmC,MAAkB,MAC7BN,EAASF,GAAgB3B,CAAK;AAMhC,SAAgBoC,GACd,IAAyB,CAAC,GAC1B,GACgB;CAChB,IAAMC,IAASF,GAAe3C,EAAQ,MAAM,IACxCA,EAAQ,SACP8C,GAAM,UAAU,WAEfC,IACJD,KAAQ,CAACH,GAAe3C,EAAQ,MAAM,IAAI8C,IAAOV,EAAcS;CACjE,OAAO;EACL;EACA,SAASN,EAAUvC,EAAQ,OAAO,IAAIA,EAAQ,UAAU+C,EAAK;EAC7D,QAAQP,GAAcxC,EAAQ,MAAM,IAAIA,EAAQ,SAAS+C,EAAK;EAC9D,QAAQN,GAAczC,EAAQ,MAAM,IAAIA,EAAQ,SAAS+C,EAAK;EAC9D,WAAWL,GAAY1C,EAAQ,SAAS,IACpCA,EAAQ,YACR+C,EAAK;CACX;AACF;AAGA,IAAaC,MAAiB,MAC5BL,GAAeE,CAAM,IAAIT,EAAcS,EAAO,CAAC,UAAU,MAG9CI,KAAoB;CAC/B,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;AACb,GAGMtR,KAAW;CACf,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;AACb;AAWA,SAAgBwR,GACd,IAA0C,CAAC,GAC3C,EAAE,SAAM,OAA6B,CAAC,GACd;CACxB,IAAMC,IAASR,GAAc5C,CAAO,GAC9BqD,IAAqC,CAAC;CAC5C,KAAK,IAAMC,KAAQ,OAAO,KAAKL,EAAiB,GAG9C,CAAIM,KAAOH,EAAOE,OAAU3R,GAAS2R,QACnC,EAAWL,GAAkBK,MAASF,EAAOE;CAGjD,OAAOD;AACT;;;AC7GA,IAAaG,gCAAO,OAA4B;CAAE,MAAM;CAAO;AAAK,IAGvDC,gCACX,GACA,GACA,OACc;CACd,MAAM;CACN;CACA;CACA;AACF,IAGaC,gCAAO,OAAgC;CAClD,MAAM;CACN;CACA,MAAM;AACR,IAGaC,gCAAM,OAAgC;CACjD,MAAM;CACN;CACA,MAAM;AACR,IAGa/R,iCACX,GACA,GACA,OACgB;CAAE,MAAM;CAAS;CAAK;CAAI;AAAI,IAGnCiS,gCAAU,GAAGC,OAA6C;CACrE,MAAM;CACN;AACF,IAGaC,iCACX,GACA,OACqB;CAAE,MAAM;CAAc;CAAU;AAAO,IAGjDC,iCACX,GACA,GACA,GACA,OACsB;CAAE,MAAM;CAAgB,QAAQ;EAACC;EAAIC;EAAIC;EAAIC;CAAE;AAAE;;AAOzE,SAAgBC,EAA8B,GAAGC,GAAgB;CAC/D,OAAO,OAAO,OAAO,CAAC,GAAG,GAAGA,CAAM;AACpC;AAIA,IAAMC,MAAa,MAAmB/D,MAAU,IAAI,MAAM,GAAGA,EAAM;;AAInE,SAAgBgE,EAAM,GAA2B;CAC/C,IAAI,OAAOhE,KAAU,UAAU,OAAOA;CACtC,IAAI,OAAOA,KAAU,UAAU,OAAO,OAAOA,CAAK;CAClD,QAAQA,EAAM,MAAd;EACE,KAAK,OACH,OAAO,SAASA,EAAM,KAAK;EAC7B,KAAK,OACH,OAAO,sBAAsB,kBAAMA,EAAM,CAAC,EAAE,GAAGA,EAAM,OAAO,KAAK,kBAAMA,EAAM,CAAC,EAAE;EAClF,KAAK,UACH,OAAOA,EAAM,UAAU,IAAI,MAAM,GAAGA,EAAM,QAAQA,EAAM;EAC1D,KAAK,SACH,OAAO,SAAS,kBAAMA,EAAM,GAAG,EAAE,IAAIA,EAAM,GAAG,MAAM,kBAAMA,EAAM,GAAG,EAAE;EACvE,KAAK,UACH,OAAOA,EAAM,OAAO,WAAW,IAC3B,SACAA,EAAM,OACH,KAAK,MACJ;GACE+D,GAAUE,EAAM,CAAC;GACjBF,GAAUE,EAAM,CAAC;GACjBF,GAAUE,EAAM,IAAI;GACpB,GAAIA,EAAM,WAAW,KAAA,IACjB,CAAC,IACD,CAACF,GAAUE,EAAM,MAAM,CAAC;GAC5B,kBAAMA,EAAM,KAAK;EACnB,CAAC,CAAC,KAAK,GAAG,CACZ,CAAC,CACA,KAAK,IAAI;EAClB,KAAK,cACH,OAAO,GAAGjE,EAAM,SAAS,KAAKA,EAAM;EACtC,KAAK,gBACH,OAAO,gBAAgBA,EAAM,OAAO,KAAK,IAAI,EAAE;CACnD;AACF;;;ACtLA,IAAMkE,KAAO,kBAAI,YAAY,GAGhBC,KAAkB;CAC7B,4BAA4B;CAC5B,4BAA4B;CAC5B,2BAA2B;CAC3B,2BAA2B;CAC3B,4BAA4B;CAC5B,yBAAyB;CACzB,6BAA6B;CAC7B,6BAA6B;CAC7B,wBAAwB;CACxB,8BAA8B;CAC9B,+BAA+B;CAC/B,gCAAgCD;CAChC,6BAA6B;CAC7B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,6BAA6B;CAC7B,4BAA4B;CAC5B,4BAA4B;AAC9B,GAGaE,KAAiB;CAC5B,4BAA4B;CAC5B,4BAA4B;CAC5B,2BAA2B;CAC3B,2BAA2B;CAC3B,4BAA4B;CAC5B,yBAAyB;CACzB,6BAA6B;CAC7B,6BAA6B;CAC7B,wBAAwB;CACxB,8BAA8B;CAC9B,+BAA+B;CAC/B,gCAAgCF;CAChC,6BAA6B;CAC7B,0BAA0B;CAC1B,6BAA6B;CAC7B,4BAA4B;CAC5B,6BAA6B;CAC7B,4BAA4B;CAC5B,4BAA4B;AAC9B,GCrCMG,gCAAS,MAAiB,kBAAI,SAASC,GAAM,GAGtCC,KAAkB;CAC7B,qBAAqB,kBAAI,GAAG;CAC5B,qBAAqB,kBAAI,CAAC;CAC1B,qBAAqB,kBAAI,GAAG;CAC5B,qBAAqB,kBAAI,CAAC;CAC1B,qBAAqB,kBAAI,GAAG;CAC5B,wBAAwB,kBAAM,GAAG;CACjC,wBAAwB,kBAAM,GAAG;CACjC,wBAAwB,kBAAM,GAAG;CACjC,wBAAwB,kBAAM,GAAG;CACjC,wBAAwB,kBAAM,GAAG;CACjC,iBAAiB,kBAAM,GAAG;CAC1B,iBAAiB,kBAAM,GAAG;CAC1B,oBAAoB,kBAAG,EAAE;AAC3B,GAMaC,KAAoB;CAC/B,aAAa,kBAAG,CAAC;CACjB,aAAa,kBAAG,CAAC;CACjB,aAAa,kBAAG,CAAC;AACnB,GACaC,KAAoB;CAC/B,aAAa,kBAAG,EAAE;CAClB,cAAc,kBAAG,EAAE;AACrB,GAGaC,KAAoB;CAC/B,gBAAgB,kBAAI,GAAI;CACxB,gBAAgB,kBAAI,KAAM;CAC1B,gBAAgB,kBAAI,IAAK;CACzB,gBAAgB,kBAAI,CAAC;CACrB,gBAAgB,kBAAI,KAAK;CACzB,iBAAiB,kBAAI,KAAK;CAC1B,iBAAiB,kBAAI,IAAI;CACzB,iBAAiB,kBAAI,IAAI;CACzB,iBAAiB,kBAAI,CAAC;CACtB,iBAAiB,kBAAI,IAAI;AAC3B,GAGaC,KAA6C;CACxD,UAAUJ;CACV,SAAS;EACP,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,CAAC;EAC1B,qBAAqB,kBAAI,GAAG;EAC5B,qBAAqB,kBAAI,CAAC;EAC1B,wBAAwB,kBAAM,KAAK;EACnC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,iBAAiB,kBAAM,GAAG;EAC1B,iBAAiB,kBAAM,GAAG;EAE1B,oBAAoB,kBAAG,EAAE;CAC3B;CACA,aAAa;EACX,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,IAAI;EAC7B,qBAAqB,kBAAI,IAAI;EAC7B,wBAAwB,kBAAM,KAAK;EACnC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,wBAAwB,kBAAM,GAAG;EACjC,iBAAiB,kBAAM,GAAG;EAC1B,iBAAiB,kBAAM,GAAG;EAE1B,oBAAoB,kBAAG,EAAE;CAC3B;AACF,GAGaK,KAAgD;CAC3D,MAAM;EACJ,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,cAAc,kBAAG,CAAC;CACpB;CACA,OAAO;EACL,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,CAAC;EACjB,cAAc,kBAAG,CAAC;CACpB;CACA,QAAQ,kBAAwBJ,IAAmBC,EAAiB;CACpE,OAAO;EACL,aAAa,kBAAG,CAAC;EACjB,aAAa,kBAAG,EAAE;EAClB,aAAa,kBAAG,EAAE;EAClB,aAAa,kBAAG,EAAE;EAClB,cAAc,kBAAG,EAAE;CACrB;AACF,GAGMI,iCAAS,MACb,kBAAI,kBAAI,cAAc,GAAGC,GAAQ,aAAa,GAGnCC,KAGT;CACF,MAAM;EACJ,aAAa,kBAAO;EACpB,aAAa,kBAAO;EACpB,aAAa,kBAAO;EACpB,aAAa,kBAAO;CACtB;CACA,QAAQ;EACN,aAAa,kBAAO;GAAE,GAAG;GAAG,GAAG;GAAG,MAAM;GAAG,OAAO,mBAAM,EAAE;EAAE,CAAC;EAC7D,aAAa,kBAAO;GAAE,GAAG;GAAG,GAAG;GAAG,MAAM;GAAG,OAAO,mBAAM,EAAE;EAAE,CAAC;EAC7D,aAAa,kBAAO;GAAE,GAAG;GAAG,GAAG;GAAG,MAAM;GAAI,OAAO,mBAAM,EAAE;EAAE,CAAC;EAC9D,aAAa,kBAAO;GAAE,GAAG;GAAG,GAAG;GAAI,MAAM;GAAI,OAAO,mBAAM,EAAE;EAAE,CAAC;CACjE;AACF,GAEMC,KAAiB;CACrB,gBAAgB,kBAAI,KAAM;CAC1B,gBAAgB,kBAAI,GAAI;CACxB,gBAAgB,kBAAI,KAAM;CAC1B,gBAAgB,kBAAI,KAAM;CAC1B,gBAAgB,kBAAI,MAAM;CAC1B,iBAAiB,kBAAI,IAAI;CACzB,iBAAiB,kBAAI,GAAG;CACxB,iBAAiB,kBAAI,CAAC;CACtB,iBAAiB,kBAAI,KAAK;CAC1B,iBAAiB,kBAAI,IAAI;AAC3B,GAEMC,KAAiB;CACrB,gBAAgB,kBAAI,KAAM;CAC1B,gBAAgB,kBAAI,IAAK;CACzB,gBAAgB,kBAAI,CAAC;CACrB,gBAAgB,kBAAI,KAAK;CACzB,gBAAgB,kBAAI,IAAI;CACxB,iBAAiB,kBAAI,GAAG;CACxB,iBAAiB,kBAAI,CAAC;CACtB,iBAAiB,kBAAI,GAAG;CACxB,iBAAiB,kBAAI,IAAI;CACzB,iBAAiB,kBAAI,CAAC;AACxB,GAGaC,KAAgD;CAC3D,OAAOF;CACP,UAAUN;CACV,OAAOO;AACT,GAEME,KAAmB,EAAE,oBAAoB,KAAK,GAC9CC,KAAsB;CAC1B,oBAAoB;CACpB,uBAAuB;AACzB,GACMC,KAAmB;CACvB,oBAAoB;CACpB,uBAAuB;AACzB,GAGaC,KAAkD;CAC7D,OAAOH;CACP,UAAUC;CACV,OAAOC;AACT,GAGaE,KAAiD;CAC5D,OAAO,kBAAwBP,IAAgBG,EAAgB;CAC/D,UAAU,kBAAwBT,IAAmBU,EAAmB;CACxE,OAAO,kBAAwBH,IAAgBI,EAAgB;AACjE,GCvLaG,KAAa;CACxB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,gBAAgB;CAChB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,aAAa;CACb,0BAA0B;CAC1B,wBAAwB;CACxB,4BAA4B;CAC5B,0BAA0B;CAC1B,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,sBAAsB;AACxB,GAEMC,IAAK,kBAAI,kBAAkB,GAC3BC,IAAK,kBAAI,kBAAkB,GAC3BC,KAAU,kBAAI,eAAe,GAC7BC,KAAc,kBAAI,cAAc,GAGzBC,KAAiB;CAE5B,iBAAiBH;CACjB,uBAAuB,kBAAID,GAAI,GAAGC,CAAE;CACpC,0BAA0BA;CAC1B,wBAAwB,kBAAID,GAAI,GAAGC,CAAE;CACrC,gBAAgB,kBAAI,sBAAsB;CAC1C,iBAAiB,kBAAI,sBAAsB;CAC3C,eAAe,kBAAI,qBAAqB;CACxC,kBAAkB,kBAAI,kBAAI,eAAe,GAAG,IAAIC,EAAO;CACvD,iBAAiB,kBAAI,WAAW,IAAI,aAAa;CAEjD,uBAAuB,kBAAIF,GAAI,IAAIC,CAAE;CAErC,cAAcD;CACd,wBAAwB,kBAAIA,GAAI,IAAIC,CAAE;CACtC,oBAAoB,kBAAID,GAAI,IAAIC,CAAE;CAClC,uBAAuB,kBAAID,GAAI,IAAIC,CAAE;CACrC,sBAAsB;CAEtB,oBAAoB,kBAAI,kBAAI,eAAe,GAAG,IAAI,aAAa;CAC/D,aAAa,kBAAO;EAAE,GAAG;EAAG,GAAG;EAAG,MAAM;EAAG,OAAOE;CAAY,CAAC;CAC/D,aAAa,kBAAO;EAAE,GAAG;EAAG,GAAG;EAAG,MAAM;EAAI,OAAOA;CAAY,CAAC;CAChE,aAAa,kBAAO;EAAE,GAAG;EAAG,GAAG;EAAI,MAAM;EAAI,OAAOA;CAAY,CAAC;CACjE,aAAa,kBAAO;EAAE,GAAG;EAAG,GAAG;EAAI,MAAM;EAAI,OAAOA;CAAY,CAAC;CACjE,gBAAgB,kBAAI,eAAe;AACrC,GAGaE,KAAc;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAIaC,iCAAc,MAA8C;CACvE,IAAMC,IAAI,kBAAI,GAAGC,EAAM,OAAO;CAC9B,OAAO;GACJ,GAAGA,EAAM,gBAAgB,kBAAID,GAAG,IAAIP,CAAE;GACtC,GAAGQ,EAAM,iBAAiB,kBAAID,GAAG,IAAIP,CAAE;GACvC,GAAGQ,EAAM,iBAAiB,kBAAID,GAAG,IAAIL,EAAO;GAC5C,GAAGM,EAAM,iBAAiB,kBAAID,GAAG,IAAIL,EAAO;GAC5C,GAAGM,EAAM,eAAe,kBAAID,GAAG,IAAIP,CAAE;CACxC;AACF;;AAIA,SAASS,KAA4C;CACnD,OAAO,kBAAY,CAAC,GAAG,GAAGJ,GAAY,IAAIC,EAAU,CAAC;AACvD;AAGA,IAAaI,IAAiC,kBAC5CX,IACAK,IAEArB,IACA,mBAAc,GAEdL,EACF;;;;ACvHA,SAASiC,GACP,GACA,GACmB;CACnB,IAAMC,IAAM,CAAC;CACb,KAAK,IAAMC,KAAOC,GAAM,EAAID,KAAO,kBAAME,EAAMF,EAAI;CACnD,OAAOD;AACT;AAoBA,IAAaI,KAAwC,kBAEnDjB,IAAY,gBAf0BY,GAAQP,IAAgB;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAIc,CAAe,GAEhBa,IAAuB;CAClC,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,gBAAgB;CAChB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,aAAa;CACb,0BAA0B;CAC1B,wBAAwB;CACxB,4BAA4B;CAC5B,0BAA0B;CAC1B,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,sBAAsB;CACtB,iBAAiB;CACjB,uBAAuB;CACvB,0BAA0B;CAC1B,iBAAiB;CACjB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,uBAAuB;CACvB,sBAAsB;CACtB,oBAAoB;AACtB,GAEaC,KAA6B;CACxC,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,gBAAgB;CAChB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,aAAa;CACb,0BAA0B;CAC1B,wBAAwB;CACxB,4BAA4B;CAC5B,0BAA0B;CAC1B,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,sBAAsB;CACtB,iBAAiB;CACjB,uBAAuB;CACvB,0BAA0B;CAC1B,iBAAiB;CACjB,uBAAuB;CACvB,cAAc;CACd,wBAAwB;CACxB,uBAAuB;CACvB,sBAAsB;CACtB,oBAAoB;AACtB;AAGA,SAASC,GAAW,GAAGC,GAA4B;CACjD,IAAMN,oBAAO,IAAI,IAAY;CAC7B,KAAK,IAAMO,KAASD,GAAQ,KAAK,IAAMP,KAAOQ,GAAO,EAAK,IAAIR,CAAG;CACjE,OAAO,MAAM,KAAKC,CAAI;AACxB;AAMA,IAAaQ,KAA+C,mBAC1DN,IACAC,GACAC,EACF,GAMaE,KAAS;CACpB;CACA;CACA,eAAeF;AACjB,GAEaK,MAAe,MAC1B,OAAOhH,KAAU,YACjB,OAAO,UAAU,eAAe,KAAK6G,IAAQ7G,CAAK,GClIvCiH,KAAW;CACtB,WAAW;EACT,OAAO;GACL,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aACE;GACF,aACE;GACF,aACE;GACF,oBACE;GACF,uBACE;GACF,oBACE;EACJ;EACA,MAAM;GACJ,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aACE;GACF,aACE;GACF,aACE;GACF,oBACE;GACF,uBACE;GACF,oBACE;EACJ;CACF;CACA,MAAM;EACJ,OAAO;GACL,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aACE;GACF,aACE;GACF,aACE;GACF,oBACE;GACF,uBACE;GACF,oBACE;EACJ;EACA,MAAM;GACJ,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aACE;GACF,aACE;GACF,aACE;GACF,oBACE;GACF,uBACE;GACF,oBACE;EACJ;CACF;CACA,UAAU;EACR,OAAO;GACL,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aAAa;GACb,aAAa;GACb,aAAa;GACb,oBACE;GACF,uBACE;GACF,oBACE;EACJ;EACA,MAAM;GACJ,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aAAa;GACb,aAAa;GACb,aAAa;GACb,oBACE;GACF,uBACE;GACF,oBACE;EACJ;CACF;CACA,MAAM;EACJ,OAAO;GACL,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aAAa;GACb,aAAa;GACb,aAAa;GACb,oBACE;GACF,uBACE;GACF,oBACE;EACJ;EACA,MAAM;GACJ,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GACjB,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,oBAAoB;GACpB,gBAAgB;GAChB,aAAa;GACb,0BAA0B;GAC1B,wBAAwB;GACxB,4BAA4B;GAC5B,0BAA0B;GAC1B,mBAAmB;GACnB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,iBAAiB;GACjB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,uBAAuB;GACvB,cAAc;GACd,wBAAwB;GACxB,oBAAoB;GACpB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,gBAAgB;GAChB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,aAAa;GACb,aAAa;GACb,aAAa;GACb,aAAa;GACb,oBACE;GACF,uBACE;GACF,oBACE;EACJ;CACF;AACF,GC/nBaC,KAET;CACF,WAAW;EACT,OAAO;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;EAC/D,MAAM;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;CAChE;CACA,MAAM;EACJ,OAAO;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;EAC/D,MAAM;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;CAChE;CACA,UAAU;EACR,OAAO;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;EAC/D,MAAM;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;CAChE;CACA,MAAM;EACJ,OAAO;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;EAC/D,MAAM;GAAE,iBAAiB;GAAW,gBAAgB;EAAU;CAChE;AACF,GCTaC,KAAc;CACzB,WAAW,kBAAI,CAAC;CAChB,aAAa,kBAAI,IAAK;CACtB,WAAW,kBAAI,GAAI;CACnB,aAAa,kBAAI,IAAK;CACtB,WAAW,kBAAI,EAAG;CAClB,aAAa,kBAAI,IAAK;CACtB,WAAW,kBAAI,GAAI;CACnB,WAAW,kBAAI,CAAC;CAChB,WAAW,kBAAI,IAAI;CACnB,WAAW,kBAAI,GAAG;CAClB,WAAW,kBAAI,IAAI;CACnB,WAAW,kBAAI,CAAC;CAChB,YAAY,kBAAI,GAAG;CACnB,YAAY,kBAAI,CAAC;CACjB,YAAY,kBAAI,GAAG;CACnB,YAAY,kBAAI,CAAC;CACjB,YAAY,kBAAI,CAAC;CACjB,YAAY,kBAAI,CAAC;AACnB,GAGaC,KAAmB;CAC9B,oBACE;CACF,uBAAuB,kBAAI,kBAAkB;CAC7C,oBACE;AACJ,GAGaC,KAA0B,kBACrCF,IAEA,EAAE,eAAe,kBAAG,CAAC,EAAE,GACvB1C,IACA,EAAE,eAAe,kBAAG,IAAI,EAAE,GAE1B2C,IACA1C,IACA;CACE,uBAAuB;CACvB,sBAAsB;CACtB,wBAAwB;CACxB,oBAAoB;CACpB,qBAAqB;CACrB,oBAAoB;CACpB,uBAAuB;CAEvB,UAAU;CACV,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,WAAW;CACX,aAAa;CACb,WAAW;CAEX,mBAAmB,mBAAW,KAAK,UAAU;CAC7C,mBAAmB,mBAAW,KAAK,UAAU;CAC7C,mBAAmB,mBAAW,KAAK,UAAU;CAC7C,YAAY,mBAAY,KAAM,GAAG,KAAM,CAAC;CACxC,eAAe,mBAAY,KAAM,MAAM,KAAM,CAAC;CAC9C,WAAW,mBAAY,IAAK,GAAG,KAAM,CAAC;CAEtC,kBAAkB,mBAAM,kBAAI,CAAC,GAAG,GAAG,kBAAI,CAAC,CAAC;CACzC,gBAAgB,mBAAM,kBAAI,GAAG,GAAG,GAAG,kBAAI,GAAG,CAAC;CAC3C,gBAAgB,kBAAI,GAAI;CACxB,kBAAkB;CAClB,oBAAoB,kBAAI,WAAW;CACnC,oBAAoB,kBAAI,WAAW;CACnC,sBAAsB,kBAAI,WAAW;AACvC,GAEAH,IACA;CAEE,oBAAoB,kBAAG,CAAC;CACxB,qBAAqB,kBAAG,CAAC;AAC3B,CACF,GC/Fa+C,KAAsB;CACjC,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;AACrB,GAMaC,KAAqB,EAChC,oBAAoB,YACtB,GCRMC,KAAgC;CACpC,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,aAAa;AACf,GAEMC,KAAS,GAAe,GAAa,MACzC,KAAK,IAAIC,GAAK,KAAK,IAAIC,GAAK3H,CAAK,CAAC;AAEpC,SAAS4H,GAAS,GAA+B;CAC/C,IAAI,CAAC,cAAc,KAAKC,CAAG,GAAG;CAC9B,IAAMC,IACJD,EAAI,WAAW,KAAKA,EAAI,WAAW,IAC/BA,EAAI,QAAQ,OAAO,MAAME,IAAIA,CAAC,IAC9BF;CACN,IAAIC,EAAO,WAAW,KAAKA,EAAO,WAAW,GAAG;CAChD,IAAME,KAAW,MAAc,SAASF,EAAO,MAAMG,GAAGA,IAAI,CAAC,GAAG,EAAE;CAClE,OAAO;EACL,GAAGD,EAAQ,CAAC;EACZ,GAAGA,EAAQ,CAAC;EACZ,GAAGA,EAAQ,CAAC;EACZ,GAAGF,EAAO,WAAW,IAAIE,EAAQ,CAAC,IAAI,MAAM;CAC9C;AACF;AAGA,SAASE,GAAU,GAAc,GAAiC;CAChE,IAAMC,IAAQ,gCAAgC,KAAKjE,CAAI;CACvD,IAAI,CAACiE,GAAO;CACZ,IAAMnI,IAAQ,OAAOmI,EAAM,EAAE;CAC7B,OAAOA,EAAM,KAAMnI,IAAQ,MAAOoI,IAAMpI;AAC1C;AAEA,SAASqI,GAAiB,GAAgC;CAExD,IAAMC,IAAQC,EAAK,SAAS,GAAG,IAC3BA,EAAK,MAAM,GAAG,CAAC,CAAC,KAAK,MAAMC,EAAE,KAAK,CAAC,IACnCD,EACG,QAAQ,KAAK,KAAK,CAAC,CACnB,KAAK,CAAC,CACN,MAAM,KAAK,CAAC,CACZ,QAAQ,MAAMC,MAAM,GAAG;CAC9B,IAAIF,EAAM,WAAW,KAAKA,EAAM,WAAW,GAAG;CAC9C,IAAM,CAACG,GAAGC,GAAGC,KAAKL,EAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,MAAMJ,GAAUM,GAAG,GAAG,CAAC,GAC1D,IAAIF,EAAM,WAAW,IAAIJ,GAAUI,EAAM,IAAI,CAAC,IAAI;CACxD,IAAI;EAACG;EAAGC;EAAGC;EAAG;CAAC,CAAC,CAAC,MAAM,MAAMC,MAAM,KAAA,KAAa,OAAO,MAAMA,CAAC,CAAC,GAG/D,OAAO;EACL,GAAGnB,EAAMgB,GAAI,GAAG,GAAG;EACnB,GAAGhB,EAAMiB,GAAI,GAAG,GAAG;EACnB,GAAGjB,EAAMkB,GAAI,GAAG,GAAG;EACnB,GAAGlB,EAAM,GAAI,GAAG,CAAC;CACnB;AACF;AAGA,SAAgBoB,GAAc,GAAc,IAAY,KAAe;CACrE,IAAMP,IAAkB,CAAC,GACrBQ,IAAQ,GACRC,IAAQ;CACZ,KAAK,IAAId,IAAI,GAAGA,IAAI/D,EAAK,QAAQ,KAAK;EACpC,IAAM8E,IAAO9E,EAAK+D;EAClB,AAAIe,MAAS,MAAK,MACTA,MAAS,MAAK,MACdF,MAAU,KAAKE,MAASC,MAC/BX,EAAM,KAAKpE,EAAK,MAAM6E,GAAOd,CAAC,CAAC,CAAC,KAAK,CAAC,GACtC,IAAQA,IAAI;CAEhB;CAEA,OADAK,EAAM,KAAKpE,EAAK,MAAM6E,CAAK,CAAC,CAAC,KAAK,CAAC,GAC5BT;AACT;AAGA,SAASY,GACP,GACsD;CACtD,IAAMC,IAAW,yBAAyB,KAAKjF,CAAI,GAC7CkF,IAAU,wBAAwB,KAAKlF,CAAI,GAC3C,CAACmF,GAAWC,KAAWH,IACzB,CAACA,EAAS,IAAIA,EAAS,EAAE,IACzBC,IACE,CAACA,EAAQ,IAAIA,EAAQ,EAAE,IACvB,CAAClF,GAAM,KAAA,CAAS,GAChB+B,IAAQsD,EAAWF,CAAS;CAClC,IAAKpD,GACL,OAAO;EAAE;EAAO,KAAKqD,MAAY,KAAA,IAAY,KAAA,IAAY,OAAOA,CAAO;CAAE;AAC3E;AAQA,SAAgBC,EAAW,GAAgC;CACzD,IAAMvJ,IAAQkE,EAAK,KAAK,CAAC,CAAC,YAAY;CACtC,IAAIlE,EAAM,WAAW,GAAG,GAAG,OAAO4H,GAAS5H,EAAM,MAAM,CAAC,CAAC;CACzD,IAAIA,KAASwH,IAAO,OAAOI,GAASJ,GAAMxH,EAAM,CAAC,MAAM,CAAC,CAAC;CACzD,IAAMwJ,IAAK,uBAAuB,KAAKxJ,CAAK;CAC5C,IAAI,CAACwJ,GAAI;CACT,IAAM,GAAGC,GAAMlB,KAAQiB;CACvB,IAAIC,MAAS,SAASA,MAAS,QAAQ,OAAOpB,GAAiBE,CAAI;CACnE,IAAIkB,MAAS,aAAa;CAC1B,IAAM,CAACpF,GAAOqF,GAAOC,KAAUd,GAAcN,CAAI;CACjD,IAAIlE,MAAU,aAAaqF,MAAU,KAAA,KAAaC,MAAW,KAAA,GAC3D;CAEF,IAAMC,IAAIV,GAAYQ,CAAK,GACrBf,IAAIO,GAAYS,CAAM;CAC5B,IAAKC,KAAMjB,GACX,OAAOkB,GAAQD,EAAE,OAAOjB,EAAE,OAAOiB,EAAE,KAAKjB,EAAE,GAAG;AAC/C;AAcA,SAAgBkB,GACd,GACA,GACA,GACA,GACkB;CAClB,IAAI,CAACC,GAAIC,CAAE,CAAC,CAAC,MAAM,MAAMvB,MAAM,KAAA,MAAcA,IAAI,KAAKA,IAAI,IAAI,GAC5D;CAEF,IAAIwB,IAAKF,MAAOC,MAAO,KAAA,IAAY,KAAK,MAAMA,IAC1CE,IAAKF,KAAM,MAAMC,GACfE,IAAMF,IAAKC;CACjB,IAAIC,MAAQ,GAAG;CACf,IAAMC,IAAaD,IAAM,MAAMA,IAAM,MAAM;CAE3C,AADA,KAAMA,GACN,KAAMA;CACN,IAAME,IAAQR,EAAE,IAAII,IAAKrB,EAAE,IAAIsB,GACzBjC,KAAW,GAAY,MAC3BoC,MAAU,IAAI,KAAKC,IAAKT,EAAE,IAAII,IAAKM,IAAK3B,EAAE,IAAIsB,KAAMG;CACtD,OAAO;EACL,GAAGpC,EAAQ4B,EAAE,GAAGjB,EAAE,CAAC;EACnB,GAAGX,EAAQ4B,EAAE,GAAGjB,EAAE,CAAC;EACnB,GAAGX,EAAQ4B,EAAE,GAAGjB,EAAE,CAAC;EACnB,GAAGyB,IAAQD;CACb;AACF;AAEA,IAAMI,KAAiB,KAEjBC,MAAQ,MAAkBxK,EAAM,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AAQlE,SAAgByK,EAAY,EAAE,MAAG,MAAG,MAAG,QAAmB;CACxD,IAAM,CAACC,GAAGC,GAAGC,KAAK;EAACnC;EAAGC;EAAGC;CAAC,CAAC,CAAC,KAAK,MAAMlB,EAAM,KAAK,MAAMzB,CAAC,GAAG,GAAG,GAAG,CAAC,GAC7DoE,IAAQ,KAAK,MAAM3C,EAAMmC,GAAG,GAAG,CAAC,IAAIW,EAAc,IAAIA;CAC5D,OAAOH,MAAU,IACb,IAAII,GAAKE,CAAC,IAAIF,GAAKG,CAAC,IAAIH,GAAKI,CAAC,MAC9B,QAAQF,EAAE,IAAIC,EAAE,IAAIC,EAAE,IAAIR,EAAM;AACtC;AAQA,SAAgBS,GACd,GACA,GACA,GACA,GACoB;CACpB,IAAMC,IAAKvB,EAAWK,CAAC,GACjBmB,IAAKxB,EAAWZ,CAAC,GACjBqC,IAAQF,KAAMC,IAAKlB,GAAQiB,GAAIC,GAAIjG,GAAQmG,CAAO,IAAI,KAAA;CAC5D,OAAOD,KAASP,EAAYO,CAAK;AACnC;AAGA,SAAgBE,GAAe,GAAkC;CAC/D,IAAMjF,IAAQsD,EAAWrF,CAAI;CAC7B,OAAO+B,KAASwE,EAAYxE,CAAK;AACnC;;;AClMA,IAAMkF,MAAU,MAAoB;CAClC,IAAMnF,IAAIgC,IAAU;CACpB,OAAOhC,KAAK,SAAUA,IAAI,UAAUA,IAAI,QAAS,UAAU;AAC7D,GAEMoF,MAAS,MACb,OAAOpF,KAAK,WAAY,QAAQA,IAAI,QAAQA,MAAM,IAAI,OAAO;AAG/D,SAAgBqF,GAAkB,EAAE,MAAG,MAAG,QAAmB;CAC3D,OAAO,QAASF,GAAO1C,CAAC,IAAI,QAAS0C,GAAOzC,CAAC,IAAI,QAASyC,GAAOxC,CAAC;AACpE;AAMA,SAAgB2C,GAAc,GAAW,GAA+B;CACtE,IAAMR,IAAKvB,EAAWK,CAAC,GACjBmB,IAAKxB,EAAWZ,CAAC;CACvB,IAAI,CAACmC,KAAM,CAACC,GAAI;CAChB,IAAM,CAACQ,GAAIC,KAAM,CAACH,GAAkBP,CAAE,GAAGO,GAAkBN,CAAE,CAAC,CAAC,CAAC,MAC7D,GAAG,MAAMU,IAAIC,CAChB;CACA,QAAQH,IAAK,QAASC,IAAK;AAC7B;AAMA,SAASG,GAAQ,EAAE,MAAG,MAAG,QAAgB;CACvC,IAAM,CAACjB,GAAGC,GAAGC,KAAK;EAACO,GAAO1C,CAAC;EAAG0C,GAAOzC,CAAC;EAAGyC,GAAOxC,CAAC;CAAC,GAC5CiD,IAAI,KAAK,KAAK,cAAelB,IAAI,cAAeC,IAAI,cAAeC,CAAC,GACpEiB,IAAI,KAAK,KAAK,cAAenB,IAAI,cAAeC,IAAI,cAAeC,CAAC,GACpEkB,IAAI,KAAK,KAAK,cAAepB,IAAI,cAAeC,IAAI,cAAeC,CAAC;CAC1E,OAAO;EACL,cAAegB,IAAI,aAAcC,IAAI,cAAeC;EACpD,eAAeF,IAAI,cAAcC,IAAI,cAAeC;EACpD,cAAeF,IAAI,cAAeC,IAAI,aAAcC;CACtD;AACF;AAEA,SAASC,GAAU,CAACC,GAAGC,GAAGrB,IAAS,GAAqB;CACtD,IAAMgB,KAAKI,IAAI,cAAeC,IAAI,cAAerB,MAAM,GACjDiB,KAAKG,IAAI,cAAeC,IAAI,cAAerB,MAAM,GACjDkB,KAAKE,IAAI,cAAeC,IAAI,cAAcrB,MAAM,GAChD5C,KAAW,MAAc,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGoD,GAAMpF,CAAC,CAAC,CAAC;CAClE,OAAO;EACL,GAAGgC,EAAQ,eAAe4D,IAAI,eAAeC,IAAI,cAAeC,CAAC;EACjE,GAAG9D,EAAQ,gBAAgB4D,IAAI,eAAeC,IAAI,cAAeC,CAAC;EAClE,GAAG9D,EAAQ,eAAgB4D,IAAI,cAAeC,IAAI,cAAcC,CAAC;EACjE,GAAG1B;CACL;AACF;AAiBA,IAAM8B,KAAQ;AAad,SAAgBC,GACd,GACA,EACE,gBAAazF,EAAK,kBAClB,iBAAc,QACc,CAAC,GACX;CACpB,IAAMpE,IAAOiH,EAAWtD,CAAK,GACvBN,IAAU4D,EAAW6C,CAAU;CACrC,IAAI,CAAC9J,KAAQ,CAACqD,GAAS;CACvB,IAAMxE,IAASkK,GAAkB1F,CAAO,GAClC0G,KAAW,MAAY;EAC3B,IAAMZ,IAAIJ,GAAkBrF,CAAC;EAC7B,QACG,KAAK,IAAIyF,GAAGtK,CAAM,IAAI,QAAS,KAAK,IAAIsK,GAAGtK,CAAM,IAAI,QAASmL;CAEnE,GAEMC,KAAM,MAAoB;EAC9B,IAAM,CAACX,GAAGhC,GAAGjB,KAAKgD,GAAQrJ,CAAI,GACxB0I,IAAQe,GACZ;GAACH,KAAK,IAAIA,KAAKY;GAAG5C,KAAK,IAAI4C;GAAI7D,KAAK,IAAI6D;EAAE,GAC1ClK,EAAK,CACP;EACA,OAAO;GACL,GAAG0I;GACH,GAAG,KAAK,MAAMA,EAAM,CAAC;GACrB,GAAG,KAAK,MAAMA,EAAM,CAAC;GACrB,GAAG,KAAK,MAAMA,EAAM,CAAC;EACvB;CACF;CACA,IAAIqB,EAAQ/J,CAAI,GAAG,OAAOmI,EAAYnI,CAAI;CAC1C,IAAIkJ,IAAK,GACLD,IAAK;CACT,KAAK,IAAItD,IAAI,GAAGA,IAAIiE,IAAO,KAAK;EAC9B,IAAMO,KAAOjB,IAAKD,KAAM;EACxB,AAAIc,EAAQE,EAAGE,CAAG,CAAC,IAAG,IAAKA,IACtB,IAAKA;CACZ;CACA,OAAOhC,EAAY8B,EAAGhB,CAAE,CAAC;AAC3B;AAKA,IAAMmB,MAAc,MAAuC;CACzD,IAAI,OAAO1M,KAAU,UAAU;CAC/B,IAAMiG,IAAQsD,EAAWvJ,CAAK;CAC9B,OAAOiG,KAASwE,EAAYxE,CAAK;AACnC;AAYA,SAAgB0G,GACd,GACqC;CACrC,IAAI3M,KAAU,MAA6B,OAAO;CAClD,IAAI,OAAOA,KAAU,UAAU;EAC7B,IAAMyG,IAAQiG,GAAW1M,CAAK;EAC9B,OAAOyG,MAAU,KAAA,IACb,KAAA,IACA;GAAE;GAAO,MAAM0F,GAAkB1F,CAAK;EAAG;CAC/C;CACA,IAAI,OAAOzG,KAAU,UAAU;EAC7B,IAAM4M,IAAO5M,GACPyG,IAAQiG,GAAWE,EAAK,KAAK,GAC7BC,IAAYH,GAAWE,EAAK,IAAI;EACtC,OAAOnG,MAAU,KAAA,KAAaoG,MAAc,KAAA,IACxC;GAAE;GAAO,MAAMA;EAAU,IACzB,KAAA;CACN;AAEF;AAGA,SAAgBC,GAA2B,GAAwB;CACjE,IAAI5I;CACJ,IAAI;EACF,IAAO,KAAK,UAAUlE,CAAK,KAAK,OAAOA,CAAK;CAC9C,QAAQ;EACN,IAAO,OAAOA,CAAK;CACrB;CACA,OAAO,oCAAoCkE,EAAK;AAClD;AAKA,SAAS6I,GAAO,GAA6B;CAC3C,IAAI,OAAO/M,KAAU,UAAU,OAAO,CAAC;CACvC,QAAQA,EAAM,MAAd;EACE,KAAK,OACH,OAAO,CAACA,EAAM,IAAI;EACpB,KAAK,OACH,OAAO,CAAC,GAAG+M,GAAO/M,EAAM,CAAC,GAAG,GAAG+M,GAAO/M,EAAM,CAAC,CAAC;EAChD,KAAK,UACH,OAAOA,EAAM,OAAO,SAAS,MAAU+M,GAAO9I,EAAM,KAAK,CAAC;EAC5D,SACE,OAAO,CAAC;CACZ;AACF;AAGA,SAAS+I,GACP,GACA,GACU;CACV,IAAMC,oBAAQ,IAAI,IAAI,CAACxD,CAAI,CAAC,GACxByD,IAAO;CACX,OAAOA,IAAM;EACX,IAAO;EACP,KAAK,IAAM,CAAC5G,GAAKtG,MAAU,OAAO,QAAQwG,CAAK,GAC7C,AAAI,CAACyG,EAAM,IAAI3G,CAAG,KAAKyG,GAAO/M,CAAK,CAAC,CAAC,MAAM,MAAQiN,EAAM,IAAIjK,CAAG,CAAC,MAC/DiK,EAAM,IAAI3G,CAAG,GACb,IAAO;CAGb;CAEA,OADA2G,EAAM,OAAOxD,CAAI,GACV,OAAO,KAAKjD,CAAK,CAAC,CAAC,QAAQ,MAAQyG,EAAM,IAAI3G,CAAG,CAAC;AAC1D;AAQA,IAAa6G,KACK,mBAAWhH,GAAoB,eAAe,GAE5DiH;AAMJ,SAASC,KAAwC;CAK/C,OAJAD,OAAA,qBAAiB,IAAI,IAAI,CACvB,gBACA,GAAGJ,GAAW7G,GAAoB,cAAc,CAClD,CAAC,IACMiH;AACT;AAQA,SAAgBE,GAAqB,GAAgC;CACnE,IAAMC,IAAUzG,KAAS,CAAC,GACpB0G,IAASD,EAAO;CACtB,IAAIC,KAAmC,MAAM,OAAO;CACpD,IAAI,OAAOA,KAAW,UAAU;EAC9B,IAAMC,IAAUD;EAChB,OAAOC,EAAQ,SAAS,SAASA,EAAQ,SAAS;CACpD;CAEA,IADa,OAAOD,CAAM,CAAC,CAAC,QAAQ,QAAQ,EACxC,MAAS,wBAAwB,OAAO;CAC5C,IAAME,IAAUH,EAAO;CACvB,IAAI,OAAOG,KAAY,UAAU,OAAO;CACxC,IAAM9D,IAAIL,EAAW,OAAOiE,CAAM,CAAC,GAC7BhF,IAAIe,EAAWmE,CAAO;CAC5B,OAAO,CAAC,CAAC9D,KAAK,CAAC,CAACpB,KAAKiC,EAAYb,CAAC,MAAMa,EAAYjC,CAAC;AACvD;AAgBA,SAAgBmF,GACd,GACA,GAC4B;CAC5B,IAAMC,IAAaN,GAAqBxG,CAAK,GACvCN,IAAoC,EAAE,iBAAiBP,EAAM;CACnE,KAAK,IAAMwD,KAAQ0D,IACjB,CAAKS,KAAc,IAAiB,CAAC,CAAC,IAAInE,CAAI,OAC9C,EAAMA,KAAQtD,EAAmBsD;CAEnC,OAAOjD;AACT;;;AC5SA,SAASqH,GAAa,GAAc,GAAsB;CACxD,IAAI/E,IAAQ;CACZ,KAAK,IAAIb,IAAI6F,GAAM7F,IAAI/D,EAAK,QAAQ,KAClC,IAAIA,EAAK+D,OAAO,KAAK;MAChB,IAAI/D,EAAK+D,OAAO,OAAO,EAAEa,MAAU,GAAG,OAAOb;CAEpD,OAAO;AACT;AAQA,SAAgB8F,GACd,GACA,GACoB;CACpB,IAAI1H,IAAM,IACN2H,IAAQ;CACZ,SAAS;EACP,IAAMjF,IAAQ7E,EAAK,QAAQ,QAAQ8J,CAAK;EACxC,IAAIjF,IAAQ,GAAG,OAAO1C,IAAMnC,EAAK,MAAM8J,CAAK;EAC5C,IAAMC,IAAMJ,GAAa3J,GAAM6E,IAAQ,CAAC;EACxC,IAAIkF,IAAM,GAAG;EACb,IAAM,CAACxE,GAAM,GAAGyE,KAAQrF,GAAc3E,EAAK,MAAM6E,IAAQ,GAAGkF,CAAG,CAAC,GAC1DE,IAAWD,EAAK,SAASA,EAAK,KAAK,GAAG,IAAI,KAAA,GAC1ClO,KACHyJ,EAAK,WAAW,IAAI,IAAI2E,EAAO3E,EAAK,MAAM,CAAC,CAAC,IAAI,KAAA,OAChD0E,MAAa,KAAA,IAAY,KAAA,IAAYJ,GAAeI,GAAUC,CAAM;EACvE,IAAIpO,MAAU,KAAA,GAAW;EAEzB,AADA,KAAOkE,EAAK,MAAM8J,GAAOjF,CAAK,IAAI/I,GAClC,IAAQiO,IAAM;CAChB;AACF;AAOA,IAAMI,KAAN,MAAmB;CAEjB,YACE,GACA,GACA;EAJU,AAEO,KAAA,OAAAnK,GACA,KAAA,UAAAoK,GAHP,KAAA,IAAA;CAIT;CAEH,QAA4B;EAC1B,IAAMC,IAAS,KAAK,IAAI;EAExB,IADA,KAAK,MAAM,GACNA,KAAU,KAAK,MAAM,KAAK,KAAK,QAEpC,OAAOA,EAAO,UAAUA,EAAO,UAAU,IAAIA,EAAO,QAAQ,KAAA;CAC9D;CAEA,QAAgB;EACd,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,EAAE,IAAG,KAAK;CAClD;CAEA,MAA+B;EAC7B,IAAIC,IAAO,KAAK,QAAQ;EACxB,SAAS;GACP,KAAK,MAAM;GACX,IAAMC,IAAK,KAAK,KAAK,KAAK;GAC1B,IAAI,CAACD,KAASC,MAAO,OAAOA,MAAO,KAAM,OAAOD;GAChD,KAAK;GACL,IAAME,IAAQ,KAAK,QAAQ;GAC3B,IAAI,CAACA,KAASA,EAAM,WAAWF,EAAK,QAAQ;GAC5C,IAAO;IACL,OAAOC,MAAO,MAAMD,EAAK,QAAQE,EAAM,QAAQF,EAAK,QAAQE,EAAM;IAClE,QAAQF,EAAK;GACf;EACF;CACF;CAEA,UAAmC;EACjC,IAAIA,IAAO,KAAK,KAAK;EACrB,SAAS;GACP,KAAK,MAAM;GACX,IAAMC,IAAK,KAAK,KAAK,KAAK;GAC1B,IAAI,CAACD,KAASC,MAAO,OAAOA,MAAO,KAAM,OAAOD;GAChD,KAAK;GACL,IAAME,IAAQ,KAAK,KAAK;GACxB,IAAI,CAACA,GAAO;GACZ,IAAID,MAAO,KAAK;IACd,IAAID,EAAK,UAAUE,EAAM,QAAQ;IACjC,IAAO;KACL,OAAOF,EAAK,QAAQE,EAAM;KAC1B,QAAQF,EAAK,UAAUE,EAAM;IAC/B;GACF,OAAO;IACL,IAAIA,EAAM,UAAUA,EAAM,UAAU,GAAG;IACvC,IAAO;KAAE,OAAOF,EAAK,QAAQE,EAAM;KAAO,QAAQF,EAAK;IAAO;GAChE;EACF;CACF;CAEA,OAAkC;EAChC,IAAM1M,IAAgB,CAAC;EACvB,SAAS;GACP,IAAM9B,IAAQ,KAAK,IAAI;GACvB,IAAI,CAACA,GAAO;GAEZ,AADA8B,EAAO,KAAK9B,CAAK,GACjB,KAAK,MAAM;GACX,IAAMgJ,IAAO,KAAK,KAAK,KAAK;GAC5B,IAAIA,MAAS,KAAK,OAAOlH;GACzB,IAAIkH,MAAS,KAAK;EACpB;CACF;CAEA,OAAgC;EAC9B,KAAK,MAAM;EACX,IAAMkF,IAAO,KAAK,KAAK,MAAM,KAAK,CAAC,GAC7B1E,IAAK,2BAA2B,KAAK0E,CAAI;EAC/C,IAAI1E,GAAI;GACN,KAAK,KAAKA,EAAG,EAAE,CAAC;GAChB,IAAMjB,IAAO,KAAK,KAAK;GACvB,IAAI,CAACA,KAAQA,EAAK,MAAM,MAAMqB,EAAE,WAAWrB,EAAK,EAAE,CAAC,MAAM,GACvD;GAEF,IAAMzG,IAASyG,EAAK,KAAK,MAAMqB,EAAE,KAAK,GAChC+E,IAASpG,EAAK,EAAE,CAAC;GACvB,QAAQiB,EAAG,IAAX;IACE,KAAK,OACH,OAAO;KAAE,OAAO,KAAK,IAAI,GAAG1H,CAAM;KAAG;IAAO;IAC9C,KAAK,OACH,OAAO;KAAE,OAAO,KAAK,IAAI,GAAGA,CAAM;KAAG;IAAO;IAC9C,KAAK,SACH,OAAOA,EAAO,WAAW,IACrB;KACE,OAAO,KAAK,IAAIA,EAAO,IAAI,KAAK,IAAIA,EAAO,IAAIA,EAAO,EAAE,CAAC;KACzD;IACF,IACA,KAAA;IACN,SACE,OAAOA,EAAO,WAAW,IAAIyG,EAAK,KAAK,KAAA;GAC3C;EACF;EACA,IAAMqG,IAAS,6CAA6C,KAAKV,CAAI;EACrE,IAAI,CAACU,GAAQ;EACb,KAAK,KAAKA,EAAO,EAAE,CAAC;EACpB,IAAM5O,IAAQ,OAAO4O,EAAO,EAAE,GACxB,EAAE,iBAAc,kBAAe,sBAAmB,KAAK,SACvDC,IAAQ;GACZ,IAAI;GACJ,KAAKC;GACL,IAAIA;GACJ,IAAIC,IAAgB;GACpB,IAAIC,IAAiB;EACvB;EACA,OAAOJ,EAAO,KACV;GAAE,OAAO5O,IAAQ6O,EAAMD,EAAO;GAA2B,QAAQ;EAAK,IACtE;GAAE;GAAO,QAAQ;EAAM;CAC7B;AACF,GAMaK,MACX,GACA,MACuB,IAAIZ,GAAanK,EAAK,KAAK,GAAGoK,CAAO,CAAC,CAAC,MAAM,GAGzDY,MAAS,MAAkB,KAAK,MAAMlP,IAAQ,GAAG,IAAI,KA6B5DmP,YAAkC;CACtC,KAAK;CACL,QAAQ,CAAC;CACT,OAAO;CACP,QAAQ;EAAE,OAAO;EAAG,QAAQ;CAAE;CAC9B,SAAS;CACT,QAAQ;CACR,WAAW;AACb,IAEM9d,MAAS,MAAkB,GAAG6d,GAAMlP,CAAK,EAAE;AAGjD,SAAgBqP,GACd,GACA,GAC4B;CAC5B,IAAInL,EAAK,KAAK,MAAM,QAAQ,OAAOiL,GAAS;CAC5C,IAAM7L,IAAgC,CAAC;CACvC,KAAK,IAAMgM,KAAazG,GAAc3E,CAAI,GAAG;EAC3C,IAAMoE,IAAQO,GAAcyG,EAAU,QAAQ,QAAQ,GAAG,GAAG,GAAG,GACzDC,IAAQjH,EAAM,SAAS,OAAO,GAC9BkH,IAAoB,CAAC,GACrBtB,IAAiB,CAAC;EACxB,KAAK,IAAMuB,KAAQnH,GAAO;GACxB,IAAImH,MAAS,SAAS;GACtB,IAAMd,IAAST,EAAK,SAAS,KAAA,IAAYe,GAAeQ,GAAMnB,CAAO;GACrE,AAAIK,MAAW,KAAA,IAAWT,EAAK,KAAKuB,CAAI,IACnCD,EAAQ,KAAKb,CAAM;EAC1B;EACA,IAAM1I,IAAQsD,EAAW2E,EAAK,SAASA,EAAK,KAAK,GAAG,IAAI,OAAO;EAC/D,IAAIsB,EAAQ,SAAS,KAAKA,EAAQ,SAAS,KAAK,CAACvJ,GAAO;EACxD,IAAM,CAACyF,GAAGD,GAAGiE,IAAO,GAAGC,IAAS,KAAKH;EACrC,EAAO,KAAK;GAAE;GAAG;GAAG;GAAM;GAAQ,OAAO/E,EAAYxE,CAAK;GAAG;EAAM,CAAC;CACtE;CACA,IAAM2J,IAAMtM,EACT,KAAK,MACJ;EACE,GAAIsI,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC;EAC3Bva,GAAMua,EAAE,CAAC;EACTva,GAAMua,EAAE,CAAC;EACTva,GAAMua,EAAE,IAAI;EACZ,GAAIA,EAAE,SAAS,CAACva,GAAMua,EAAE,MAAM,CAAC,IAAI,CAAC;EACpCA,EAAE;CACJ,CAAC,CAAC,KAAK,GAAG,CACZ,CAAC,CACA,KAAK,IAAI,GACNlC,IAAQpG,EAAO,IACf2C,IAAQsD,EAAWG,EAAM,KAAK;CACpC,OAAO;EACL;EACA;EACA,OAAOe,EAAY;GAAE,GAAGxE;GAAO,GAAG;EAAE,CAAC;EACrC,QAAQ;GAAE,OAAOyD,EAAM;GAAG,QAAQA,EAAM;EAAE;EAC1C,SAASwF,GAAMjJ,EAAM,CAAC;EACtB,QAAQiJ,GAAMxF,EAAM,OAAO,CAAC;EAC5B,WAAW,KAAK,MAAMA,EAAM,OAAO,CAAC;CACtC;AACF;AAaA,SAAgBmG,GACd,GACgC;CAChC,IAAM1H,IAAQ,kCAAkC,KAAKjE,EAAK,KAAK,CAAC;CAChE,IAAI,CAACiE,GAAO;CACZ,IAAM2H,IAAW,OAAO3H,EAAM,EAAE,KAAKA,EAAM,OAAO,MAAM,MAAO;CAC/D,OAAO;EAAE,KAAKjE,EAAK,KAAK;EAAG;EAAU,QAAQiE,EAAM,MAAM;CAAO;AAClE;AAGA,IAAM4H,KAA4D;CAChE,QAAQ;EAAC;EAAG;EAAG;EAAG;CAAC;CACnB,MAAM;EAAC;EAAM;EAAK;EAAM;CAAC;CACzB,WAAW;EAAC;EAAM;EAAG;EAAG;CAAC;CACzB,YAAY;EAAC;EAAG;EAAG;EAAM;CAAC;CAC1B,eAAe;EAAC;EAAM;EAAG;EAAM;CAAC;AAClC;AAGA,SAAgBC,GACd,GAC8C;CAC9C,IAAMhQ,IAAQkE,EAAK,KAAK;CACxB,IAAIlE,KAAS+P,IAAS,OAAO,CAAC,GAAGA,GAAQ/P,EAAM;CAE/C,IAAMiQ,IADQ,yBAAyB,KAAKjQ,CAC7B,CAAA,GAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAC/C,OAAOiQ,GAAQ,WAAW,KAAKA,EAAO,MAAM,OAAO,QAAQ,IACtDA,IACD,KAAA;AACN;;;AC1KA,IAAMC,KAEF;CACF;EAAC;EAAW;EAAU;EAAS;CAAQ;CACvC;EAAC;EAAY;EAAU;EAAU;CAAS;CAC1C;EAAC;EAAe;EAAU;EAAY;CAAY;CAClD;EAAC;EAAiB;EAAU;EAAc;CAAc;CACxD;EAAC;EAAiB;EAAU;EAAc;CAAc;CACxD;EAAC;EAAiB;EAAU;EAAc;CAAc;CACxD;EAAC;EAAO;EAAU;EAAU;CAAI;CAChC;EAAC;EAAkB;EAAS;EAAU;CAAE;CACxC;EAAC;EAAY;EAAU;EAAW;CAAS;CAC3C;EAAC;EAAe;EAAU;EAAa;CAAY;CACnD;EAAC;EAAgB;EAAc;EAAe;CAAa;CAC3D;EAAC;EAAU;EAAU;EAAW;CAAO;CACvC;EACE;EACA;EACA;EACA;CACF;AACF,GAEMC,KAAe;CAAC;CAAK;CAAS;CAAU;AAAE,GAE1CC,MAAU,MACdF,GAAS,MAAM,CAACG,OAAUA,EAAK,KAAK5G,CAAI,CAAC,KAAK0G,IAGnCG,MAAa,MAAuBF,GAAO3G,CAAI,CAAC,CAAC;AAG9D,SAAgB8G,GAAa,EAC3B,UAAO,SACP,YACA,QAAQC,GACR,eAAY,CAAC,GACb,iBACA,mBAAgB,OACQ,CAAC,GAIzB;CACA,IAAM5N,IAASR,GAAcoO,CAAa,GACpCC,IAASC,MAAY,KAAA,IAAYlO,GAAcI,EAAO,MAAM,IAAI8N,GAChE5O,oBAAS,IAAI,IAAoB,GACjC6O,KAAS,MAAkB;EAC/B,KAAK,IAAM,CAAClH,GAAMzJ,MAAU,OAAO,QACjCwG,CACF,GACE,AAAIxG,MAAU,KAAA,KAAW8B,EAAO,IAAI2H,GAAM,kBAAMzJ,CAAK,CAAC;CAE1D;CAEA,AADA2Q,EAAMxK,CAAkB,GACxBwK,EAAMtJ,EAAW;CACjB,IAAM/E,IAAOmO,IACTxJ,GAASwJ,EAAO,CAACG,KACjBA,MAAS,SACPlK,IACA,KAAA;CAGN,AAFIpE,KAAMqO,EAAMrO,CAAI,GAEhBsO,MAAS,UAAQD,EAAMvM,EAAc;CACzC,IAAMyM,IAAQlE,GAAoBmE,CAAY;CAU9C,OATID,KACFF,EAAMhD,GAAmBkD,EAAMD,IAAO;EAAE,GAAGtO;EAAM,GAAGyO;CAAU,CAAC,CAAC,GAElEJ,EAAMhM,GAAc/B,EAAO,QAAQ,GACnC+N,EAAM/L,GAAahC,EAAO,OAAO,GAC7BA,EAAO,WAAW,cAAY+N,EAAM5L,GAAanC,EAAO,OAAO,GACnE+N,EAAMpL,GAAgB3C,EAAO,UAAU,GACnCoO,KAAeL,EAAMrJ,EAAmB,GAC5CqJ,EAAMI,CAAS,GACR;EAAE;EAAQ,SAASN;EAAQ;CAAO;AAC3C;AAEA,IAAMQ,MAAS,MAAkB,GAAG/B,GAAMlP,CAAK,EAAE;AAGjD,SAASkR,GACP,GACA,GACA,GAC6C;CAC7C,QAAQC,GAAR;EACE,KAAK,SAAS;GACZ,IAAMlL,IAAQsD,EAAWrF,CAAI;GAC7B,IAAI,CAAC+B,GAAO;GACZ,IAAM2J,IAAMnF,EAAYxE,CAAK;GAC7B,OAAO;IAAE,OAAO2J;IAAK;GAAI;EAC3B;EACA,KAAK,UAAU;GACb,IAAMjB,IAASM,GAAe/K,GAAMoK,CAAO;GAC3C,OAAOK,MAAW,KAAA,IACd,KAAA,IACA;IAAE,OAAOO,GAAMP,CAAM;IAAG,KAAKsC,GAAMtC,CAAM;GAAE;EACjD;EACA,KAAK,UAAU;GACb,IAAMC,IAAS1K,EAAK,KAAK,MAAM,KAAK,MAAM,OAAOA,CAAI;GACrD,OAAO,OAAO,SAAS0K,CAAM,IACzB;IAAE,OAAOA;IAAQ,KAAK,OAAOA,CAAM;GAAE,IACrC,KAAA;EACN;EACA,KAAK,UAAU;GAEb,IAAMgB,IAAM1L,EAAK,KAAK,CAAC,CAAC,QAAQ,MAAM,IAAG;GACzC,OAAO;IAAE,OAAO0L;IAAK;GAAI;EAC3B;EACA,KAAK,UAAU;GACb,IAAMvM,IAASgM,GAAenL,GAAMoK,CAAO;GAC3C,OAAOjL,KAAU;IAAE,OAAOA;IAAQ,KAAKA,EAAO;GAAI;EACpD;EACA,KAAK,cAAc;GACjB,IAAME,IAAasM,GAAmB3L,CAAI;GAC1C,OAAOX,KAAc;IAAE,OAAOA;IAAY,KAAKA,EAAW;GAAI;EAChE;EACA,KAAK,UAAU;GACb,IAAM6N,IAASpB,GAAe9L,CAAI;GAClC,OAAOkN,KAAU;IAAE,OAAOA;IAAQ,KAAKlN,EAAK,KAAK;GAAE;EACrD;CACF;AACF;AAYA,SAAgBmN,EACd,IAAgC,CAAC,GACjB;CAChB,IAAM,EAAE,UAAO,YAAY7R,GACrB8O,IAAyB;EAC7B,cAAc9O,EAAQ,gBAAgB;EACtC,eAAeA,EAAQ,iBAAiB;EACxC,gBAAgBA,EAAQ,kBAAkB;CAC5C,GACM,EAAE,WAAQ,YAAS,cAAW+Q,GAAa/Q,CAAO,GAGlD8R,oBAAc,IAAI,IAAgC,GAClDC,oBAAW,IAAI,IAAY,GAC3BnD,KAAU,MAAqC;EACnD,IAAIkD,EAAY,IAAI7H,CAAI,GAAG,OAAO6H,EAAY,IAAI7H,CAAI;EACtD,IAAM+H,IAAM1P,EAAO,IAAI2H,CAAI;EAC3B,IAAI+H,MAAQ,KAAA,KAAaD,EAAS,IAAI9H,CAAI,GAAG;EAC7C,EAAS,IAAIA,CAAI;EACjB,IAAMzJ,IAAQ+N,GAAeyD,GAAKpD,CAAM;EAGxC,OAFAmD,EAAS,OAAO9H,CAAI,GACpB6H,EAAY,IAAI7H,GAAMzJ,CAAK,GACpBA;CACT,GAEMqG,IAAsB;EAC1B;EACA;EACA;EACA,QAAQ,CAAC;EACT,OAAO,CAAC;EACR,QAAQ,CAAC;EACT,UAAU,CAAC;EACX,YAAY,CAAC;EACb,YAAY,CAAC;EACb,YAAY,CAAC;EACb,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,WAAW,CAAC;EACZ,aAAa,CAAC;EACd,SAAS,CAAC;EACV,OAAO,CAAC;EACR,gBAAgB;EAChB,KAAK,CAAC;EACN,YAAY,CAAC;CACf;CACA,KAAK,IAAMoD,KAAQ3H,EAAO,KAAK,GAAG;EAChC,IAAMoC,IAAOkK,EAAO3E,CAAI,GAClB,GAAG0H,GAAMM,GAAOnS,KAAU8Q,GAAO3G,CAAI,GACrCzJ,IACJkE,MAAS,KAAA,IAAY,KAAA,IAAYgN,GAASC,GAAMjN,GAAMoK,CAAO;EAC/D,IAAItO,MAAU,KAAA,GAAW;GACvB,EAAI,WAAW,KAAKyJ,CAAI;GACxB;EACF;EAGA,AAFA,EAAKgI,EAAM,CAA6BhI,EAAK,MAAMnK,EAAO,MAAM,KAC9DU,EAAM,OACR,EAAI,IAAIyJ,KAAQzJ,EAAM;CACxB;CAEA,OADA,EAAI,iBAAiBqG,EAAI,MAAM,uBAAuB,GAC/CA;AACT;;;ACjTA,IAAaqL,KAEX,GAEA,KAAgC,MAAQ9B,MAExC,OAAO,QAAQpJ,CAAmB,CAAC,CAAC,KAAK,CAACiD,GAAMzJ,OAAW,CACzD,KAAKyJ,KACLkI,EAAI,kBAAM3R,CAAK,CAAC,CAClB,CAAC;AAGH,SAAgB4R,GAAe,GAA2B,IAAQ,GAAa;CAC7E,IAAMC,IAAM,KAAK,OAAO/I,CAAK;CAC7B,OAAOgJ,EAAM,KACV,EAAE,cAAW,sBACZ,GAAGD,IAAME,EAAU,KAAK,MAAMF,GAAK,EAAE,MAAMG,EACxC,KAAK,CAACC,GAAUjS,OAAW,GAAG6R,EAAI,IAAII,EAAS,IAAIjS,EAAM,EAAE,CAAC,CAC5D,KAAK,IAAI,EAAE,IAAI6R,EAAI,EAC1B;AACF;AAGA,IAAMK,MAAc,GAAe,MACjC,UAAUC,EAAM,MAAMP,GAAeE,GAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,MAGxDM,KAAQ,GAAc,MAC1BpS,MAAU,KAAA,IAAY,IAAIyJ,EAAK,KAAK,IAAIA,EAAK,GAAGzJ,EAAM,IAGlDqS,MAAgB,MAAgBzC,EAAI,QAAQ,MAAM,IAAG,GAErD0C,KAAO,CAAC,SAAS,4BAA4B,GAG7CC,YAAyB;CAC7B,WAAW,CAAC,kBAAkB;CAC9B,cACE;EACE,CAAC,YAAY,UAAU;EACvB,CAAC,SAAS,KAAK;EACf,CAAC,UAAU,KAAK;EAChB,CAAC,WAAW,GAAG;EACf,CAAC,UAAU,MAAM;EACjB,CAAC,YAAY,QAAQ;EACrB,CAAC,QAAQ,kBAAkB;EAC3B,CAAC,eAAe,QAAQ;EACxB,CAAC,UAAU,GAAG;CAChB,CAAC,CACD,KAAK,CAACN,GAAUjS,OAAW,CAACiS,GAAU,GAAGjS,EAAM,YAAY,CAAU;AACzE;AAGA,SAAS1O,KAA0B;CACjC,IAAMwV,IAAQsL,EAAK,KAAK,MAAM,YAAY;CAC1C,OAAOhR,EAAS,SAAS,MAAS;EAChC,IAAMsP,IAAU0B,EAAK,gBAAgB3I,CAAI;EACzC,OAAO,CACL;GACE,WAAW,CACT,GAAGiH,IAAU5J,EAAM,OAAO,KAC1B,GAAG4J,EAAQ,OAAO5J,EAAM,MAAM,EAAE,EAClC;GACA,cAAc4K,EAAkBzK,GAASwC,EAAK,CAAC,OAAO4I,EAAY;EACpE,GACA;GACE,WAAW,CAAC,GAAG3B,IAAU5J,EAAM,MAAM,GAAG;GACxC,cAAc4K,EAAkBzK,GAASwC,EAAK,CAAC,MAAM4I,EAAY;EACnE,CACF;CACF,CAAC;AACH;AAGA,SAASI,KAAyB;CAShC,OAAO;EALL,CAAC,WAAW9N,EAAa;EACzB,CAAC,UAAUC,EAAY;EACvB,CAAC,UAAUG,EAAY;EACvB,CAAC,aAAaQ,EAAe;CAExB,CAAA,CAAK,SAAS,CAACzC,GAAMgB,OAAY;EACtC,IAAM2F,IAAOhH,GAAkBK;EAC/B,OAAO,OAAO,QAAQgB,CAAM,CAAC,CAAC,KAAK,CAAC9D,GAAOwG,QAAY;GACrD,WAAW,CAAC,GAAG4L,EAAK3I,GAAMzJ,CAAK,IAAIoS,EAAK3I,CAAI,GAAG;GAC/C,cAAciI,EAAkBlL,CAAK;EACvC,EAAE;CACJ,CAAC;AACH;AAgBA,SAAgBkM,GAAkB,EAChC,WAAQ,cACoB,CAAC,GAAW;CACxC,IAAMZ,IAAmB;EACvB;GAAE,WAAWQ;GAAM,cAAcZ,EAAkBvL,CAAkB;EAAE;EACvE;GAAE,WAAW,CAAC,OAAO;GAAG,cAAcuL,EAAkBrK,EAAW;EAAE;EACrEkL,GAAO;EACP,GAAGjhB,GAAa;EAGhB;GACE,WAAW,CAAC,GAAG8gB,EAAK,cAAc,MAAM,EAAE,OAAOA,EAAK,cAAc,EAAE,EAAE;GACxE,cAAcV,EAAkBhL,CAAI;EACtC;EAEA;GACE,WAAW,CAAC0L,EAAK,cAAc,MAAM,CAAC;GACtC,cAAcV,EAAkBtN,EAAc;EAChD;EACA,GAAGqO,GAAY;CACjB,GACME,KAAU,MAAiC,CAC/C;EAAE,WAAW,CAAC,OAAO;EAAG,cAAcjB,EAAkBlL,CAAK;CAAE,CACjE,GACMoM,IAAQ,CACZV,GAAW,oCAAoCS,EAAOrL,EAAmB,CAAC,GAC1E4K,GAAW,2BAA2BS,EAAOpL,EAAkB,CAAC,CAClE,CAAC,CAAC,KAAK,IAAI,GACLsL,IAAO,CAAC,GAAGjB,GAAeE,CAAK,GAAGc,CAAK,CAAC,CAAC,KAAK,MAAM;CAC1D,OAAO3O,IAAQ,UAAUA,EAAM,MAAM4O,EAAK,SAAS,GAAGA,EAAK;AAC7D;;;AClIA,IAAaC,KAAoB,OAGpBC,KAAqB,kBAE5BC,KAAe;CAAC;CAAM;CAAM;CAAM;AAAI,GAEtCC,MAAO,GAAG3K,MAAoB,MAAuBA,EAAM,KAAK,GAAG,KAG5D4K,MACX,GACA,MAEAxC,IACIuC,GAAI,WAAWvC,GAAS,GAAIE,MAAS,SAAS,CAAC,MAAM,IAAI,CAAC,CAAE,IAC5DA,MAAS,SACPqC,GAAI,SAAS,MAAM,IACnB,MAGFE,MAAa,GAA4C,MAC7DF,GAAInQ,MAAS,cAAc,eAAeA,GAAM9C,CAAK,GAGjDoT,KAA2C;CAC/C,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;AACb;AASA,SAAgBC,GAAoB,EAClC,UAAO,SACP,YACA,cAGE,CAAC,GAAW;CACd,IAAMC,IAAWlR,GAAcQ,CAAM,GAC/B6N,IACJC,MAAY,KAAA,IACRW,EAAc,EAAE,QAAQiC,EAAS,CAAC,CAAC,CAAC,UACpC5C,GACA6C,IAAU,CAACN,GAAI,MAAM,CAAC,GACtBhN,IAAQiN,GAAetC,GAAMH,CAAM;CACzC,AAAIxK,KAAOsN,EAAQ,KAAKtN,CAAK;CAC7B,KAAK,IAAMnD,KAAQ,OAAO,KAAKsQ,EAAQ,GACrC,AAAIE,EAASxQ,OAAUsQ,GAAStQ,MAC9ByQ,EAAQ,KAAKJ,GAAUrQ,GAAMwQ,EAASxQ,EAAK,CAAC;CAGhD,OAAOyQ,EAAQ,KAAK,GAAG;AACzB;AAEA,IAAMC,MAAa,GAA8B,MAC/C,aAAa3E,EAAM,GAAGvK;AAMxB,SAASmP,GACP,GACA,GACqB;CACrB,IAAMC,IAAWrC,EAAc;EAAE;EAAM;CAAQ,CAAC,GAC1CsC,IAAStC,EAAc;EAAE;EAAM;EAAS,QAAQ,EAAE,QAAQ,SAAS;CAAE,CAAC,GACtEhL,oBAAM,IAAI,IAAoB;CACpC,KAAK,IAAM,CAACoD,GAAMmG,MAAQ,OAAO,QAAQ8D,EAAS,GAAG,GAEnD,CADapD,GAAU7G,CACnB,MAAS,WAAWA,EAAK,WAAW,cAAc,MAAGpD,EAAI,IAAIoD,GAAMmG,CAAG;CAE5E,KAAK,IAAMtL,KAAQ0O,IAEjB,AADA3M,EAAI,IAAImN,GAAU,YAAYlP,CAAI,GAAGoP,EAAS,IAAI,UAAUpP,IAAO,GACnE+B,EAAI,IAAImN,GAAU,UAAUlP,CAAI,GAAGqP,EAAO,IAAI,UAAUrP,IAAO;CAEjE,OAAO+B;AACT;AAEA,IAAM2L,MACJ,MAEA,CAAC,GAAG4B,CAAO,CAAC,CAAC,KAAK,CAACnK,GAAMzJ,OAAW,CAAC,KAAKyJ,KAAQzJ,CAAK,CAAU,GAG7DzO,MAAQ,GAA8B,MAC1C,CAAC,GAAGuiB,CAAO,CAAC,CAAC,QAAQ,CAACrK,GAAMzJ,OAAWsC,EAAK,IAAImH,CAAI,MAAMzJ,CAAK,GAE3D+T,KAAS,6DAETC,MAAc,MAClB,GAAGD,GAAO,IAAInC,GAAeE,CAAK,CAAC,CAAC,KAAK,MAAM,EAAE;AAGnD,SAASmC,GAAU,GAAkC;CACnD,IAAMjU,IAAQqH,GAAYoC;CAC1B,OAAO,OAAOzJ,KAAU,YACtBA,EAAM,SAAS,SACfA,EAAM,KAAK,WAAW,SAAS,IAC7B,kBAAMA,CAAK,IACX,KAAA;AACN;AAGA,SAASkU,KAAuB;CAC9B,IAAMC,IAAW9C,EAAc,GACzB5K,IAAQgN,GAAY,SAAS,IAAI,GACjCW,oBAAO,IAAI,IAAoB;CACrC,KAAK,IAAM,CAAC3K,GAAMmG,MAAQ,OAAO,QAAQuE,EAAS,GAAG,GACnD,AAAI,yBAAyB,KAAK1K,CAAI,IACpC2K,EAAK,IAAI3K,GAAM,SAAS+J,GAAU,YAAY/J,EAAK,MAAM,CAAC,CAAC,EAAE,EAAE,IACtDwK,GAAUxK,CAAI,IAEvB2K,EAAK,IAAI3K,GAAMwK,GAAUxK,CAAI,CAAE,IAE/B2K,EAAK,IAAI3K,GAAMmG,CAAG;CAGtB,KAAK,IAAM,CAACnG,GAAMmG,MAAQnJ,GAAO,EAAK,IAAIgD,GAAMmG,CAAG;CAEnD,IAAM9M,KACJ,GACA,GACA,MAEAhB,EAAO,KAAK,OAAW;EACrB,WAAW,CAAC,IAAIqR,GAAU1J,GAAMzJ,CAAK,GAAG;EACxC,cAAcgS,GAAazE,EAAOvN,CAAK,CAAC;CAC1C,EAAE,GACEqU,KACJ,GACA,MACG;EACH,IAAM,EAAE,WAAQhD,EAAc,EAAE,UAAO,CAAC;EACxC,OAAO,IAAI,IAAI,OAAO,KAAK7K,CAAK,CAAC,CAAC,KAAK,MAAS,CAACiD,GAAMmG,EAAInG,EAAK,CAAC,CAAC;CACpE;CAEA,OAAO;EACL;GAAE,WAAW,CAACsJ,EAAkB;GAAG,cAAcf,GAAaoC,CAAI;EAAE;EACpE;GACE,WAAW,CAAC,IAAIlB,GAAe,QAAQ,IAAI,GAAG;GAC9C,cAAclB,GAAazgB,GAAKkiB,GAAY,QAAQ,IAAI,GAAGhN,CAAK,CAAC;EACnE;EACA,GAAG3D,EAAK,WAAWvB,IAAY,MAC7B8S,EAAc1P,GAAc2P,IAAU,EAAE,WAAQ,CAAC,CACnD;EACA,GAAGxR,EAAK,UAAUtB,IAAgB,MAChC6S,EAAczP,GAAa2P,IAAS,EAAE,UAAO,CAAC,CAChD;EACA,GAAGzR,EACD,UACArB,IACC,MACC,IAAI,IACFuR,GAAa,KAAK,MAAS,CACzB,UAAU1O,KACVjB,MAAW,SAAS,SAAS,SAASmQ,GAAUnQ,GAAQiB,CAAI,EAAE,EAChE,CAAC,CACH,CACJ;EACA,GAAGxB,EAAK,aAAapB,IAAc,MACjC2S,EAAc9O,GAAgBiP,IAAY,EAAE,aAAU,CAAC,CACzD;CACF;AACF;AAGA,SAASC,GAAa,GAA6B;CACjD,IAAMhO,IAAQgN,GAAY,SAAS,IAAI;CACvC,OAAQ,CAAC,SAAS,MAAM,CAAC,CAAW,KAAK,OAAU;EACjD,WAAW,CAAC,IAAIP,GAAetC,GAAMF,CAAO,GAAG;EAC/C,cAAcsB,GAAazgB,GAAKkiB,GAAY7C,GAAMF,CAAO,GAAGjK,CAAK,CAAC;CACpE,EAAE;AACJ;AAYA,SAAgBiO,GAAsB,EACpC,cAAWtT,MACqB,CAAC,GAAW;CAC5C,OAAO4S,GAAW,CAAC,GAAGE,GAAU,GAAG,GAAGjN,EAAS,QAAQwN,EAAY,CAAC,CAAC;AACvE;AAUA,SAAgBE,KAAkD;CAChE,OAAO;EACL,mBAAmBD,GAAsB;EACzC,wBAAwBA,GAAsB,EAAE,UAAU,CAAC,EAAE,CAAC;EAC9D,GAAG,OAAO,YACRtT,EAAS,KAAK,MAAY,CACxB,uBAAuBsP,EAAQ,OAC/BsD,GAAWS,GAAa/D,CAAO,CAAC,CAClC,CAAC,CACH;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GY5PM+Q,MAAY,MAChB,OAAOzhB,KAAU,cAAYA,KAAkB,CAAC,MAAM,QAAQA,CAAK;AAGrE,SAAgB0hB,EACd,GACA,GAAGC,GACA;CACH,IAAMtb,IAAgB,EAAE,GAAI/D,EAAkB;CAC9C,KAAK,IAAMsf,KAAUD,GACnB,KAAK,IAAM,CAACrb,GAAKtG,MAAU,OAAO,QAAQ4hB,CAAkB,GAAG;EAC7D,IAAM3hB,IAAOoG,EAAIC;EACjB,EAAIA,KACFmb,GAASxhB,CAAI,KAAKwhB,GAASzhB,CAAK,IAAI0hB,EAAczhB,GAAMD,CAAK,IAAIA;CACrE;CAEF,OAAOqG;AACT;;;ACPA,IAAMpR,KAAqC,kBACzCC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,EACF,GYZM0D,KAAqC,kBACzCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;EAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;AAAAA,CACF,GYZM0D,KAAqC,kBACzCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;EAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;AAAAA,CACF,GYZME,KAAqC,kBACzCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;EAAAA,GACAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;;;;;AAAAA,GACAC;;;;;;;;;;;;;;;AAAAA,CACF,GCKM8iB,KAA4B,MAE5BC,MAAU,GAAgB,MAC9B,OAAO,UAAU,eAAe,KAAKC,GAAQ7b,CAAG,GAK5C8b,WACJ,OAAO,OAAS,OAAe,OAAO,KAAK,eAAgB,YAWhDC,MACX,GACA,MACwB;CACxB,IAAM,IAAI,KAAK,IAAIC,CAAK;CACxB,QAAQC,EAAS,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAA1C;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MACH,OAAO;EACT,KAAK;EACL,KAAK,MAEH,OADI,IAAI,IAAU,QACX,OAAO,UAAU,CAAC,KAAK,IAAI,OAAc,IAAI,SAAS;EAC/D,SACE,OAAO,MAAM,IAAI,QAAQ;CAC7B;AACF,GAGMC,qBAAmB,IAAI,IAAqC,GAE5DC,MAAkB,MAA8C;CACpE,IAAI3Q,IAAQ0Q,GAAiB,IAAID,CAAQ;CACzC,IAAIzQ,MAAU,KAAA,GAAW;EACvB,IAAI;GACF,IAAQ,IAAI,KAAK,YAAYyQ,CAAQ;EACvC,QAAQ;GAEN,IAAQ;EACV;EACA,GAAiB,IAAIA,GAAUzQ,CAAK;CACtC;CACA,OAAOA;AACT,GAQa4Q,MACX,GACA,MAEAN,GAAe,IACVK,GAAeF,CAAQ,CAAC,EAAE,OAAOD,CAAK,KAAK,UAC5CD,GAAuBE,GAAUD,CAAK,GAGtClU,MACJ,GACA,MACuB;CACvB,IAAIuU,IAAsCC;CAC1C,KAAK,IAAMnT,KAAQnJ,EAAI,MAAM,GAAG,GAAG;EACjC,IAAI,OAAOqc,KAAS,YAAY,CAACT,GAAOS,GAAMlT,CAAI,GAChD;EAEF,IAAOkT,EAAKlT;CACd;CACA,OAAO,OAAOkT,KAAS,WAAWA,IAAO,KAAA;AAC3C,GAGME,MAAa,GAAiC,MAA0B;CAC5E,IAAIX,GAAOpgB,GAAQghB,CAAI,GAAG,OAAOhhB,EAAOghB;CACxC,IAAIH,IAAgB7gB;CACpB,KAAK,IAAM2N,KAAQqT,EAAK,MAAM,GAAG,GAAG;EAClC,IAAI,OAAOH,KAAS,aAAYA,KAAiB,CAACT,GAAOS,GAAMlT,CAAI,GACjE;EAEF,IAAQkT,EAAiClT;CAC3C;CACA,OAAOkT;AACT,GAEMI,KAAc,4BAMPC,MACX,GACA,IAAkC,CAAC,MAEnCC,EAAS,QAAQF,KAAc,GAAO,MAAiB;CACrD,IAAM/iB,IAAQ6iB,GAAU/gB,GAAQghB,CAAI;CACpC,OAAO9iB,KAAiC,OAAOmI,IAAQ,OAAOnI,CAAK;AACrE,CAAC,GAGGkjB,MAAiB,GAAkB,MAA6B;CACpE,IAAMC,IAAQ,CAACZ,CAAQ,GACjBjgB,IAAOigB,EAAS,MAAM,GAAG,CAAC,CAAC;CAGjC,OAFIjgB,KAAM6gB,EAAM,KAAK7gB,CAAI,GACzB6gB,EAAM,KAAKC,CAAgB,GACpB,CAAC,GAAG,IAAI,IAAID,CAAK,CAAC;AAC3B,GAGaE,MACX,EACE,aACA,aACA,sBAAmBpB,MAErB,GACA,IAA4B,CAAC,MAClB;CACX,IAAM,EAAE,UAAO,oBAAiBziB;CAChC,KAAK,IAAM8jB,KAAOJ,GAAcX,GAAUa,CAAgB,GAAG;EAC3D,IAAMR,IAAOW,EAASD;EACtB,IAAI,CAACV,GAAM;EACX,IAAMniB,KACH,OAAO6hB,KAAU,WACdlU,GAAOwU,GAAM,GAAGtc,EAAI,GAAGoc,GAAkBY,GAAKhB,CAAK,GAAG,IACtD,KAAA,MAAclU,GAAOwU,GAAMtc,CAAG;EACpC,IAAI7F,MAAY,KAAA,GAAW,OAAOuiB,GAAYviB,GAASjB,CAAO;CAChE;CACA,OAAOgkB,MAAiB,KAAA,IAAiDld,IAArC0c,GAAYQ,GAAchkB,CAAO;AACvE,GAUaikB,MACX,MACsB;CACtB,IAAMnQ,IAAW,EAAE,GAAGoQ,EAAO;CAC7B,QAAQ,GAAK,MAAYL,GAAU/P,GAAUhN,GAAK9G,CAAO;AAC3D,GC3KamkB,KAAoD;CAC/D;CACA;CACA;CACA;AACF,GAGaC,KAAsC,MAGtCL,KAA0D;CACrE,IAAA1B;CACA,IAAAG;CACA,IAAAD;CACA,IAAAD;AACF,GAGa+B,MACX,MAEA,OAAO7jB,KAAU,YAChB2jB,GAA0C,SAAS3jB,CAAK,GC5CrD8jB,KAAgB,4BAEhBjS,MAAO,MAAc,OAAOkS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,GAGvCC,MAAc,GAAY,MAA2B;CAChE,IAAMC,IAAUC,EAAK,SAAS,GACxBC,IAAUF,IAAU,MAAM,IAC1BniB,IAAiC;EACrC,IAAI+P,GAAIoS,CAAO;EACf,GAAG,OAAOA,CAAO;EACjB,IAAIpS,GAAIsS,CAAO;EACf,GAAG,OAAOA,CAAO;EACjB,IAAItS,GAAIqS,EAAK,WAAW,CAAC;EACzB,GAAG,OAAOA,EAAK,WAAW,CAAC;EAC3B,IAAIrS,GAAIqS,EAAK,WAAW,CAAC;EACzB,GAAG,OAAOA,EAAK,WAAW,CAAC;EAC3B,GAAGD,KAAW,KAAK,OAAO;CAC5B;CACA,OAAOG,EAAO,QAAQN,KAAgB,MAAUhiB,EAAOuiB,EAAM;AAC/D,GAUaC,MACX,GACA,GACA,EAAE,WAAQ,cACW;CACrB,IAAMtkB,IAAQkE,EAAK,KAAK;CACxB,IAAI,CAAClE,GAAO;CACZ,IAAMuN,IAAmB6W,EAAO,MAAMN,EAAa,KAAK,CAAC;CACzD,IAAIS,GAAQ;EACV,IAAM3C,IAASwC,EACZ,QAAQ,uBAAuB,MAAM,CAAC,CACtC,QAAQN,KAAgB,MACvBO,MAAU,MACN,qBACA,QAAQA,EAAM,WAAW,IAAI,IAAI,MAAM,GAC7C;EACF,IAAI,CAAK,OAAO,IAAIzC,EAAO,EAAE,CAAC,CAAC,KAAK5hB,CAAK,GAAG;CAC9C;CACA,IAAMwkB,IAAUxkB,EAAM,MAAM,MAAM,KAAK,CAAC,GAClCykB,IAASzkB,EAAM,MAAM,YAAY,CAAC,GAAG,EAAE,EAAE,YAAY,GACrD0kB,IAAgBnX,EAAO,QAAQ,MAAMf,MAAM,GAAG;CACpD,IAAIgY,EAAQ,WAAWE,EAAc,QAAQ;CAC7C,IAAMC,IAAaD,EAAc,MAAM,MAAMlY,EAAE,WAAW,GAAG,CAAC;CAC9D,IAAImY,KAAcpX,EAAO,SAAS,GAAG,KAAK,CAACkX,GAAQ;CAEnD,IAAIG,IAAQ,GACRC,IAAU,GACVC,IAAU;CAOd,IANAJ,EAAc,SAAS,GAAO,MAAM;EAClC,IAAM,IAAI,OAAOF,EAAQvc,EAAE;EAC3B,AAAIoc,EAAM,WAAW,GAAG,KAAKA,EAAM,WAAW,GAAG,IAAG,IAAQ,IACnDA,EAAM,WAAW,GAAG,IAAG,IAAU,IACrC,IAAU;CACjB,CAAC,GACGM,GAAY;EACd,IAAIC,IAAQ,KAAKA,IAAQ,IAAI;EAE7B,AADIH,MAAW,QAAQG,IAAQ,OAAI,KAAS,KACxCH,MAAW,QAAQG,MAAU,OAAI,IAAQ;CAC/C;CACA,IAAIA,IAAQ,MAAMC,IAAU,MAAMC,IAAU,IAAI;CAChD,IAAMZ,IAAO,IAAI,KAAK5hB,qBAAQ,IAAI,KAAK,CAAC;CAExC,OADA4hB,EAAK,SAASU,GAAOC,GAASC,GAAS,CAAC,GACjCZ;AACT,GAGaa,WAA2B;CACtC,IAAMb,oBAAO,IAAI,KAAK;CAEtB,OADAA,EAAK,SAAS,GAAG,GAAG,GAAG,CAAC,GACjBA;AACT,GAEMc,KAAgB,oCAMTC,MACX,MACgB;CAChB,IAAM9c,IAAQ6c,GAAc,MAAM9gB,KAAQ,GAAA,CAAI,KAAK,CAAC;CACpD,IAAI,CAACiE,GAAO,OAAO;CACnB,IAAM,CAACyc,GAAOC,GAASC,KAAW;EAAC3c,EAAM;EAAIA,EAAM;EAAIA,EAAM,MAAM;CAAG,CAAC,CAAC,IACtE,MACF;CACA,IAAIyc,IAAQ,MAAMC,IAAU,MAAMC,IAAU,IAAI,OAAO;CACvD,IAAMZ,IAAOa,GAAa;CAE1B,OADAb,EAAK,SAASU,GAAOC,GAASC,GAAS,CAAC,GACjCZ;AACT,GAGagB,MAAe,GAAY,MACtClB,GAAWE,GAAMiB,IAAc,aAAa,OAAO,GAGxCC,MAAgB,MAC3BlB,EAAK,SAAS,IAAI,OAAOA,EAAK,WAAW,IAAI,KAAKA,EAAK,WAAW,GAGvDmB,MAAoB,MAC/B,mCAAmC,KAAKjB,CAAM,GASnCkB,MAAqB,GAAgB,MAChDC,IAAanB,IAASA,EAAO,QAAQ,6BAA6B,EAAE;;;ACtGtE,SAAgBoB,GACd,GACU;CAEV,QADe,MAAM,QAAQC,CAAQ,IAAIA,IAAW,CAACA,CAAQ,EAAA,CAC/C,QACX,MACC,OAAOzlB,KAAU,YAAYA,EAAM,KAAK,MAAM,EAClD;AACF;AAOA,SAAgB0lB,GACd,GACA,GACS;CACT,IAAI,OAAOD,KAAa,UAAU,OAAO;CACzC,IAAMnd,IAAQmd,EACX,KAAK,CAAC,CACN,YAAY,CAAC,CACb,MAAM,GAAG,CAAC,CACV,KAAK,MAAShW,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,GACXnJ,IAAMgC,EAAMA,EAAM,SAAS;CACjC,IAAI,CAAChC,KAAO,OAAOqf,EAAM,OAAO,EAAE,CAAC,CAAC,YAAY,MAAMrf,GAAK,OAAO;CAClE,IAAMsf,KAAO,GAAGC,MAAoBA,EAAM,MAAM,MAAMvd,EAAM,SAASyb,CAAC,CAAC;CAMvE,OADA,EAJI6B,EAAI,KAAK,KAAK,CAACD,EAAM,WAAW,CAACA,EAAM,WACvCC,EAAI,MAAM,KAAK,CAACD,EAAM,WACtBC,EAAI,QAAQ,KAAK,KAAK,CAACD,EAAM,WAC7BC,EAAI,OAAO,KAAK,CAACD,EAAM,YACvBC,EAAI,OAAO,QAAQ,KAAK,CAACD,EAAM;AAErC;AAWA,IAAaG,MAAuB,MAClC9lB,EAAM,KAAK,CAAC,CAAC,YAAY,GAGd+lB,MAAqB,MAChC,GAAGC,EAAK,SAAS,GAAG,GAAGA,EAAK,MAAM,GAAGA,EAAK,eAAe,GAAG,GAAGA,EAAK,YAAY,MAE5EC,KAAgB;CAAC;CAAU;CAAW;CAAW;AAAU,GAWpDC,MACX,GACA,MAEAC,EAAO,SAAS,KAChBA,EAAO,OAAO,MACXF,GAAoC,SAAS3f,CAAG,IAC7Cqf,EAAMrf,KACNqf,EAAM,SAASrf,KAAOqf,EAAM,QAAQrf,CAC1C,GAGW8f,MAAgB,MAC3BD,EACG,KAAK,MACJ7f,EACG,QAAQ,QAAQ,EAAE,CAAC,CACnB,QAAQ,aAAa,EAAE,CAAC,CACxB,QAAQ,UAAU,EAAE,CAAC,CACrB,QAAQ,OAAO,MAAMN,EAAE,YAAY,CAAC,CACzC,CAAC,CACA,KAAK,GAAG;;;AChFb,SAASqgB,GACP,GACA,GACA,GACA,GACa;CACb,IAAMC,IAAWC,MAAgB,cAC3BC,IAAaD,MAAgB;CACnC,QAAQjgB,GAAR;EACE,KAAK,aACH,OAAOggB,IAAW,SAAS;EAC7B,KAAK,WACH,OAAOA,IAAW,SAAS;EAC7B,KAAK,cACH,OAAOE,IAAcC,MAAQ,QAAQ,SAAS,SAAU;EAC1D,KAAK,aACH,OAAOD,IAAcC,MAAQ,QAAQ,SAAS,SAAU;EAC1D,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,YACH,OAAOC,IAAW,aAAa;EACjC,KAAK,UACH,OAAOA,IAAW,aAAa;EACjC,SACE,OAAO;CACX;AACF;AAGA,SAASC,GACP,GACA,GACA,GACA,GACe;CACf,KAAK,IAAI,IAAI5d,GAAO,KAAK,KAAK,IAAIuZ,GAAO,KAAKhe,GAC5C,IAAI,CAACsiB,EAAW,CAAC,GAAG,OAAO;CAE7B,OAAO;AACT;AAcA,SAAgBC,GAAa,EAC3B,iBACA,UACA,QACA,iBAAc,YACd,SAAM,OACN,UAAO,IACP,sBAAmB,IACnB,eACqC;CACrC,IAAIvE,KAAS,GAAG,OAAO;CACvB,IAAMwE,IAAOT,GAAU/f,GAAKigB,GAAaE,GAAKC,CAAQ;CACtD,IAAI,CAACI,GAAM,OAAO;CAElB,QAAQA,GAAR;EACE,KAAK,SACH,OAAOH,GAAK,GAAG,GAAGrE,GAAOsE,CAAU;EACrC,KAAK,QACH,OAAOD,GAAKrE,IAAQ,GAAG,IAAIA,GAAOsE,CAAU;EAC9C,KAAK;EACL,KAAK,YAAY;GACf,IAAMtiB,IAAOwiB,MAAS,aAAa,IAAI,IACjCvkB,IAAOwkB,IAAe,IAAKziB,MAAS,IAAI,KAAKge,IAASyE,GACtD5lB,IAAS,KAAK,IAClBmhB,IAAQ,GACR,KAAK,IAAI,GAAG/f,IAAO+B,IAAQoiB,CAAmB,CAChD,GACMzZ,IACJ0Z,GAAKxlB,GAAQmD,MAAS,IAAI,KAAK,GAAGge,GAAOsE,CAAU,KACnDD,GAAKxlB,GAAQmD,GAAMge,GAAOsE,CAAU;GACtC,OAAO3Z,MAAU8Z,IAAe,OAAO9Z;EACzC;EACA,SAAS;GACP,IAAM3I,IAAOwiB,MAAS,SAAS,IAAI;GACnC,IAAIC,IAAe,KAAKA,KAAgBzE,GACtC,OAAOqE,GAAKriB,MAAS,IAAI,IAAIge,IAAQ,GAAGhe,GAAMge,GAAOsE,CAAU;GAEjE,KAAK,IAAI7C,IAAI,GAAGA,IAAIzB,GAAO,KAAK;IAC9B,IAAI,IAAIyE,IAAeziB,IAAOyf;IAC9B,IAAI,IAAI,KAAK,KAAKzB,GAAO;KACvB,IAAI,CAAC0E,GAAM,OAAO;KAClB,KAAK,IAAI1E,KAASA;IACpB;IACA,IAAI,CAACsE,EAAW,CAAC,GAAG,OAAO;GAC7B;GACA,OAAO;EACT;CACF;AACF;;;AC7FA,SAAgBK,GAAgB,IAA4B,CAAC,GAAc;CACzE,IAAM,EAAE,aAAU,QAAQznB,GACtB0nB,IAAS,IACTC,IAAW;CAEf,OAAO;EACL,OAAO,GAAK,GAAO,GAAc;GAC/B,IAAI7gB,EAAI,WAAW,GAAG,OAAO;GAC7B,IAAM8gB,IAAM,KAAK,IAAI;GAErB,IADIA,IAAMD,IAAWE,MAAS,IAAS,KACnC/gB,MAAQ,OAAO4gB,MAAW,IAAI,OAAO;GAEzC,AADA,IAAWE,GACX,KAAU9gB,EAAI,YAAY;GAI1B,IAAM6L,IADJ+U,EAAO,SAAS,KAAKA,EAAO,MAAM,EAAE,CAAC,CAAC,OAAO,MAAMlhB,MAAMkhB,EAAO,EAAE,IACzCA,EAAO,KAAKA,GACjC5E,IAAQgF,EAAM,QAEdC,IAAc,IAAM,WAAW,IAC/Bxe,IAAQge,IAAe,IAAI,IAAIA,IAAeQ;GACpD,KAAK,IAAIxD,IAAI,GAAGA,IAAIzB,GAAO,KAAK;IAC9B,IAAMra,KAAKc,IAAQgb,KAAKzB,GAClB0D,IAAOsB,EAAMrf;IACnB,IAAI,GAAK,aACLkK,EAAM,WAAW,KAAKlK,MAAM8e,MAC5Bf,EAAK,KAAK,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW7T,CAAK,GAAG,OAAOlK;GAC/D;GACA,OAAO;EACT;EACA,QAAQ;GAEN,AADA,IAAS,IACT,IAAW;EACb;EACA,YAAY;GACV,OAAOif;EACT;CACF;AACF;;;ACtDA,IAAMM,MAAgB,MAA+C;CACnE,IAAI,OAAOC,KAAU,UAAU,OAAOA;CACtC,IAAI,OAAOA,KAAU,UAAU;EAC7B,IAAM1D,IAAI,WAAW0D,CAAK;EAC1B,OAAO,OAAO,SAAS1D,CAAC,IAAIA,IAAI;CAClC;CACA,OAAO;AACT;AAUA,SAAgB2D,GACd,GACmB;CACnB,IAAMC,IAAsC,CAAC,GACvCC,IAAuC,CAAC,GAC1CC,IAAU;CACd,KAAK,IAAMC,KAAOC,GAChB,AAAID,EAAI,UAAU,WAChB,EAAYA,EAAI,OAAOD,GACvB,KAAWL,GAAaM,EAAI,KAAK;CAGrC,IAAIE,IAAW;CACf,KAAK,IAAI/f,IAAI8f,EAAQ,SAAS,GAAG9f,KAAK,GAAG,KAAK;EAC5C,IAAM6f,IAAMC,EAAQ9f;EACpB,AAAI6f,EAAI,UAAU,YAChB,EAAaA,EAAI,OAAOE,GACxB,KAAYR,GAAaM,EAAI,KAAK;CAEtC;CACA,IAAIG;CACJ,KAAK,IAAMH,KAAOC,GAChB,IAAID,EAAI,UAAU,QAAQ,IAAmBA,EAAI;MAC5C,IAAIG,MAAqB,KAAA,GAAW;CAE3C,IAAIC;CACJ,KAAK,IAAIjgB,IAAI8f,EAAQ,SAAS,GAAG9f,KAAK,GAAG,KAAK;EAC5C,IAAM6f,IAAMC,EAAQ9f;EACpB,IAAI6f,EAAI,UAAU,SAAS,IAAqBA,EAAI;OAC/C,IAAII,MAAuB,KAAA,GAAW;CAC7C;CACA,OAAO;EAAE;EAAa;EAAc;EAAkB;CAAmB;AAC3E;;;AClDA,IAAMC,MAAW,MACfnoB,KAAU,QAA+BA,MAAU,IAGjDooB,KAAiC;AAOrC,SAAgBC,GAAmB,GAAY,GAAoB;CAUjE,OATIF,GAAQve,CAAC,KAAKue,GAAQxf,CAAC,IAAUwf,GAAQve,CAAC,IAAK,KAAQjB,CAAC,IAAa,KACrE,OAAOiB,KAAM,YAAY,OAAOjB,KAAM,WAAiBiB,IAAIjB,IAC3DiB,aAAa,QAAQjB,aAAa,OAAaiB,EAAE,QAAQ,IAAIjB,EAAE,QAAQ,IACvE,OAAOiB,KAAM,aAAa,OAAOjB,KAAM,YAClC,OAAOiB,CAAC,IAAI,OAAOjB,CAAC,KAC7Byf,OAAA,KAAa,IAAI,KAAK,SAAS,KAAA,GAAW;EACxC,SAAS;EACT,aAAa;CACf,CAAC,IACMA,GAAS,QAAQ,OAAOxe,CAAC,GAAG,OAAOjB,CAAC,CAAC;AAC9C;AAMA,SAAgB2f,GACd,GACiC;CAQjC,OAPI,OAAOR,EAAI,YAAa,aAAmBA,EAAI,WAC/CA,EAAI,YACE,GAAG,MACTO,GACGze,EAA8Bke,EAAI,MAClCnf,EAA8Bmf,EAAI,IACrC,IACG;AACT;AAGA,SAAgBS,GACd,GACA,GACgB;CAChB,IAAMC,IAAQnoB,GAAS,QAAQiG,IAAMjG,EAAQ,QAAQ;CACrD,OAAO;EACL;EACA,OAAOmoB,MAAU,OAAO,WAAWA,MAAU,WAAW,YAAY;CACtE;AACF;;;ACrEA,IAAaC,KAAuB,GAE9BC,KAAW,GAAe,MAA0B;CACxD,IAAMriB,IAAgB,CAAC;CACvB,KAAK,IAAI4B,IAAIc,GAAOd,KAAKgG,GAAK,KAAK,EAAI,KAAKhG,CAAC;CAC7C,OAAO5B;AACT;AAMA,SAAgBsiB,GACd,GACA,GACA,IAAa,GACH;CACV,IAAI5f,IAAQ,KAAK,IAAI,GAAG1I,IAAU,KAAK,MAAMuoB,IAAa,CAAC,CAAC,GACtD3a,IAAM,KAAK,IAAI4a,GAAY9f,IAAQ6f,IAAa,CAAC;CAEvD,OADI3a,IAAMlF,IAAQ,IAAI6f,MAAY,IAAQ,KAAK,IAAI,GAAG3a,IAAM2a,IAAa,CAAC,IACnEF,EAAQ3f,GAAOkF,CAAG;AAC3B;AAUA,SAAgB6a,GACd,GACA,GACA,GACA,GACmB;CAGnB,IAAID,KADeE,IAAW,IAAIC,IAAW,IAAI,GACnB,OAAON,EAAQ,GAAGG,CAAU;CAE1D,IAAMI,IAAc,KAAK,IAAIC,IAAOF,GAAUD,IAAW,CAAC,GACpDI,IAAe,KAAK,IAAID,IAAOF,GAAUH,IAAaE,CAAQ,GAC9DK,IAAeH,IAAcF,IAAW,GACxCM,IAAaF,IAAeN,IAAaE,IAAW,GACpDO,IAAcP,IAAWC,IAAW,IAAI;CAgB9C,OAdKI,IAOAC,IAOE;EACL,GAAGX,EAAQ,GAAGK,CAAQ;EACtB;EACA,GAAGL,EAAQO,GAAaE,CAAY;EACpC;EACA,GAAGT,EAAQG,IAAaE,IAAW,GAAGF,CAAU;CAClD,IAZS;EACL,GAAGH,EAAQ,GAAGK,CAAQ;EACtB;EACA,GAAGL,EAAQG,IAAaS,IAAc,GAAGT,CAAU;CACrD,IAXO;EACL,GAAGH,EAAQ,GAAGY,CAAW;EACzB;EACA,GAAGZ,EAAQG,IAAaE,IAAW,GAAGF,CAAU;CAClD;AAgBJ;;;ACnEA,IAAaU,KAAwB;CACnC;CACA;CACA;CACA;CACA;AACF,GAyCaC,MAAqB,MAC/BD,GAA4C,SAASE,KAAU,EAAE,IAC7DA,IACD;AAON,SAAgBC,GACd,GACA,GACyB;CACzB,IAAMC,IAAO,MAAM,QAAQrC,CAAK,IAAIA,IAAQ,CAAC,GACvCsC,IAAQ,IAAI,KAAKC,KAAU,CAAC,EAAA,CAAG,KAAK,MAAUpY,EAAM,GAAG,CAAC,GACxDqY,IAAyD,CAC7D;EACE,KAAK;EACL,OAAOH,EAAK,QAAQ,MAAS,CAAC3D,EAAK,SAAS,CAAC4D,EAAM,IAAI5D,EAAK,KAAK,CAAC;CACpE,GACA,IAAI6D,KAAU,CAAC,EAAA,CAAG,KAAK,OAAW;EAChC,KAAKpY,EAAM;EACX,OAAOA,EAAM;EACb,OAAOkY,EAAK,QAAQ,MAAS3D,EAAK,UAAUvU,EAAM,GAAG;CACvD,EAAE,CACJ,GACIzD,IAAQ,GACN+b,IAAoC,CAAC;CAC3C,KAAK,IAAMC,KAAUF,GACnB,AAAKE,EAAO,MAAM,UAClBD,EAAS,KAAK;EACZ,KAAKC,EAAO;EACZ,OAAOA,EAAO;EACd,SAASA,EAAO,MAAM,KAAK,MAAS;GAClC,IAAMC,IAAQ;IACZ;IACA;IACA,QAAQT,GAAkBxD,EAAK,MAAM;IACrC,OAAOA,EAAK,SAAS,OAAOhY,IAAQ,CAAC;GACvC;GAEA,OADA,KAAS,GACFic;EACT,CAAC;CACH,CAAC;CAEH,OAAOF;AACT;AAGA,SAAgBG,GACd,GACqC;CACrC,IAAMP,IAAO,MAAM,QAAQrC,CAAK,IAAIA,IAAQ,CAAC;CAI7C,OAAO;EAAE,UAHQqC,EAAK,QAAQ,MAC5B;GAAC;GAAY;GAAW;EAAO,CAAC,CAAC,SAASH,GAAkBxD,EAAK,MAAM,CAAC,CAC1E,CAAC,CAAC;EACiB,OAAO2D,EAAK;CAAO;AACxC;AAMA,SAAgBQ,GACd,GACuC;CACvC,IAAMR,IAAO,MAAM,QAAQrC,CAAK,IAAIA,IAAQ,CAAC,GACvC8C,IAAU,IAAI,IAAIT,EAAK,KAAK,MAASH,GAAkBxD,EAAK,MAAM,CAAC,CAAC,GACpE3f,IACJkjB,GAAsB,QAAQ,MAAWa,EAAQ,IAAIX,CAAM,CAAC;CAE9D,OADIE,EAAK,MAAM,MAAS3D,EAAK,OAAO,KAAG3f,EAAI,KAAK,SAAS,GAClDA;AACT;AAaA,SAAgBgkB,GACd,GACA,GACA,GACA,GACe;CACf,IAAMC,IAAQP,EAAS,KAAK,MAAYQ,EAAQ,QAAQ,MAAM,GACxDC,IAAQF,EAAM,QAAQ,GAAK,MAASpgB,IAAMugB,GAAM,CAAC;CACvD,IAAI,CAACD,GAAO,OAAO;CACnB,IAAM/iB,KAAS,MAAiB,KAAK,IAAI+iB,IAAQ,GAAG,KAAK,IAAI,GAAGtqB,CAAI,CAAC;CACrE,QAAQ4mB,GAAR;EACE,KAAK,YACH,OAAOrf,EAAMuG,IAAQ,CAAC;EACxB,KAAK,QACH,OAAOvG,EAAMuG,IAAQ,CAAC;EACxB,KAAK,SACH,OAAO;EACT,KAAK,QACH,OAAOwc,IAAQ;CACnB;CACA,IAAME,IAAO3C,KAAWA,IAAU,IAAI,KAAK,MAAMA,CAAO,IAAI;CAC5D,IAAI,CAAC2C,GAAM,OAAO;CAElB,IAAI3hB,IAAQ,GACRwhB,IAAU;CACd,OAAOA,IAAUD,EAAM,UAAUtc,KAASjF,IAAQuhB,EAAMC,KAEtD,AADA,KAASD,EAAMC,IACf,KAAW;CAEb,IAAIA,KAAWD,EAAM,QAAQ,OAAO7iB,EAAMuG,CAAK;CAC/C,IAAM2c,IAAS3c,IAAQjF,GACjB6hB,IAASD,IAASD;CACxB,IAAI5D,MAAS,QAAQ;EACnB,IAAI6D,IAASD,IAAOJ,EAAMC,IAAU,OAAOvc,IAAQ0c;EAEnD,IAAMG,IAAU,KAAK,OAAOP,EAAMC,KAAW,KAAKG,CAAI;EAGtD,OAFI,KAAK,MAAMC,IAASD,CAAI,IAAIG,IAAgB9hB,IAAQuhB,EAAMC,KAAW,IACrEA,IAAU,KAAKD,EAAM,SAAetc,IACjCjF,IAAQuhB,EAAMC,KAAW,KAAK,IAAIK,GAAQN,EAAMC,IAAU,KAAK,CAAC;CACzE;CACA,IAAII,IAASD,KAAQ,GAAG,OAAO1c,IAAQ0c;CACvC,IAAIH,MAAY,GAAG,OAAOvc;CAC1B,IAAMyc,IAAOH,EAAMC,IAAU,IACvBO,IAAY/hB,IAAQ0hB,GACpBM,IAAW,KAAK,OAAON,IAAO,KAAKC,CAAI,IAAIA;CACjD,OAAOI,IAAY,KAAK,IAAIC,IAAWH,GAAQH,IAAO,CAAC;AACzD;;;AC/KA,SAAgBO,GAAU,GAAc,GAAe,GAAmB;CACxE,IAAM9G,oBAAO,IAAI,KAAK,CAAC;CAGvB,OAFAA,EAAK,YAAY+G,GAAMC,GAAOC,CAAG,GACjCjH,EAAK,SAAS,GAAG,GAAG,GAAG,CAAC,GACjBA;AACT;AAGA,SAAgBkH,GAAO,GAAoB;CACzC,OAAO,GAAG,OAAOlH,EAAK,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OACvDA,EAAK,SAAS,IAAI,CACpB,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAOA,EAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AAC9D;AAGA,SAAgBmH,GAAQ,GAAY,GAAoB;CACtD,OAAOL,GAAU9G,EAAK,YAAY,GAAGA,EAAK,SAAS,GAAGA,EAAK,QAAQ,IAAIoH,CAAI;AAC7E;AAGA,SAAgBC,GAAW,GAAY,IAAS,GAAS;CACvD,OAAOP,GAAU9G,EAAK,YAAY,GAAGA,EAAK,SAAS,IAAIyG,GAAQ,CAAC;AAClE;AAGA,SAAgBa,GAAU,GAAS,GAAkB;CACnD,OAAO5hB,EAAE,YAAY,MAAMjB,EAAE,YAAY,KAAKiB,EAAE,SAAS,MAAMjB,EAAE,SAAS;AAC5E;AAOA,SAAgB8iB,GAAU,GAAY,IAAiB,GAAS;CAC9D,IAAM/hB,IACJ,OAAO,UAAUgiB,CAAc,KAC/BA,KAAkB,KAClBA,KAAkB,IACdA,IACA;CACN,OAAOL,GAAQnH,GAAM,GAAGA,EAAK,OAAO,IAAIxa,IAAQ,KAAK,EAAE;AACzD;AAEA,IAAMiiB,KAAiB,6BACjBC,KAAgB;AAMtB,SAAgBC,GAAY,GAAc,IAAS,IAAmB;CACpE,IAAM1jB,KAASoc,IAASoH,KAAiBC,GAAA,CAAe,KAAK1nB,CAAI;CACjE,IAAI,CAACiE,GAAO,OAAO;CACnB,IAAM8iB,IAAO,OAAO9iB,EAAM,EAAE,GACtB+iB,IAAQ,OAAO/iB,EAAM,EAAE,GACvBgjB,IAAM,OAAOhjB,EAAM,EAAE;CAC3B,IAAI+iB,IAAQ,KAAKA,IAAQ,MAAMC,IAAM,KAAKA,IAAM,IAAI,OAAO;CAC3D,IAAMjH,IAAO8G,GAAUC,GAAMC,IAAQ,GAAGC,CAAG;CAQ3C,OANEjH,EAAK,YAAY,MAAM+G,KACvB/G,EAAK,SAAS,MAAMgH,IAAQ,KAC5BhH,EAAK,QAAQ,MAAMiH,IAEZ,OAEFjH;AACT;;;ACvEA,SAAgB4H,GAAmB,GAAuB;CACxD,IAAI,CAACxnB,KAAQA,KAAQ,GAAG,OAAO;CAC/B,IAAMwH,IAAI,OAAOxH,CAAI,GACfynB,IAAMjgB,EAAE,QAAQ,GAAG;CACzB,OAAOigB,MAAQ,KAAK,IAAIjgB,EAAE,SAASigB,IAAM;AAC3C;AAGA,SAAgBC,GAAY,GAAW,GAAc,GAAsB;CACzE,IAAIpjB,IAAImb;CAGR,OAFIpc,MAAQ,KAAA,MAAW,IAAI,KAAK,IAAIA,GAAKiB,CAAC,IACtClB,MAAQ,KAAA,MAAW,IAAI,KAAK,IAAIA,GAAKkB,CAAC,IACnCA;AACT;AAGA,SAAgBqjB,GACd,GACA,GACQ;CAER,OADIrjB,KAAM,QAA2B,OAAO,MAAMA,CAAC,IAAU,KACtDA,EAAE,QAAQsjB,CAAS;AAC5B;AAMA,SAAgBC,GAAiB,GAA8B;CAC7D,IAAMC,IAAUC,EAAM,KAAK;CAC3B,IAAI,CAACD,KAAW,CAAC,kBAAkB,KAAKA,CAAO,GAAG,OAAO;CACzD,IAAM,IAAI,OAAOA,CAAO;CACxB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;;;AC7BA,SAAgBE,GAAa,GAAgC;CAC3D,IAAMpoB,IAAO,OAAOlE,CAAK,CAAC,CAAC,KAAK;CAEhC,OADI,OAAOA,KAAU,YAAY,CAAC,gBAAgB,KAAKkE,CAAI,IAAUA,IAC9D,eAAeA,EAAK,QAAQ,KAAK,GAAG,EAAE;AAC/C;AAOA,SAAgBqoB,GAAY,GAAgC;CAC1D,IAAMroB,IAAO,OAAOlE,CAAK,CAAC,CAAC,KAAK;CAChC,OAAO,OAAOA,KAAU,YAAY,kBAAkB,KAAKkE,CAAI,IAC3D,GAAGA,EAAK,MACRA;AACN;;;ACnBA,IAAasoB,KAA2C;CACtD;CACA;CACA;CACA;CACA;CACA;AACF,GAGaC,KAAyB,SAGzBC,KAAgB;AAM7B,SAAgBC,GAAgB,GAG9B;CACA,IAAM3sB,IAAQ,OAAOiG,KAAU,WAAWA,EAAM,KAAK,IAAI;CAIzD,OAHKjG,IACAwsB,GAAuC,SAASxsB,CAAK,IACjD,EAAE,QAAQA,EAAqB,IACjC,EAAE,QAAQA,EAAM,IAHJ,CAAC;AAItB;AAGA,SAAgB4sB,GAAqB,GAA0C;CAC7E,IAAM,EAAE,WAAQ,cAAWD,GAAgB1mB,CAAK;CAGhD,OAFI4mB,MACA9rB,MAAW,YAAkB,4BAC1BA,IAAS,SAASA,EAAO,WAAW;AAC7C;AAMA,SAAgB+rB,GAAe,GAAoC;CACjE,IAAM9sB,IAAQ,OAAOsiB,KAAU,YAAYA,EAAM,KAAK,IAAI,CAACA,IAAQA;CACnE,OAAO,OAAOtiB,KAAU,YAAY,OAAO,SAASA,CAAK,KAAKA,KAAS,IACnE,KAAK,MAAMA,CAAK,IAChB,KAAA;AACN;AAGA,SAAgB+sB,GACd,GACoB;CAIpB,OAHI/sB,KAAU,QACV,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,IAAG,SAC7CusB,GAAYvsB,CAClB,KAAc,KAAA;AACvB;AA+CA,SAAgBgtB,GACd,GACA,GAC+B;CAC/B,KAAK,IAAMpC,KAAUqC,GAAQ;EAC3B,IAAMjf,IAAQ4c,EAAO,MAAM,QAAQsC,CAAO;EAC1C,IAAIlf,KAAS,GAAG,OAAO;GAAE,QAAQ4c,EAAO;GAAK;EAAM;CACrD;AAEF;AAMA,SAAgBuC,GACd,GACA,GACA,GACQ;CACR,IAAMvC,IAASqC,EAAO,MAAM,MAAUhD,EAAM,QAAQmD,CAAS;CAE7D,OADKxC,IACEA,EAAO,MAAM,QAAQ,MAAQtkB,MAAQ4mB,CAAO,CAAC,CAAC,SAAS,IAD1C;AAEtB;AAMA,SAAgBG,GACd,GACA,GACA,GAC+B;CAC/B,IAAM9qB,IAAOyqB,GAAcC,GAAQC,CAAO,GACpCI,IAAQH,GAAeF,GAAQC,GAASK,EAAG,MAAM;CACvD,IAAKhrB,KAAQ+qB,MAAU,GACvB,OAAO;EACL;EACA,YAAY/qB,EAAK;EACjB,WAAWA,EAAK;EAChB,UAAUgrB,EAAG;EACb,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMA,EAAG,KAAK,CAAC,GAAGD,IAAQ,CAAC;CAChE;AACF;AAGA,SAAgBE,GAAgB,GAAkC;CAChE,OAAO1G,EAAK,eAAeA,EAAK,YAAYA,EAAK,cAAcA,EAAK;AACtE;AAQA,SAAgB2G,GACd,GACA,GACQ;CACR,IAAIzf,IAAQ;CACZ,OAAOA,IAAQ0f,EAAU,UAAUA,EAAU1f,KAAU2f,IAAU;CACjE,OAAO3f;AACT;AASA,SAAgB4f,GACd,GACA,GACA,GACA,GACA,GAC+B;CAC/B,IAAMC,KAAM,MAAgC;EAC1C,IAAM/G,IAAOuG,GAAkBJ,GAAQC,GAASS,CAAQ;EAExD,OADK7G,IACE0G,GAAgB1G,CAAI,KAAK,CAACgH,KAAUA,EAAOhH,CAAI,IADpC;CAEpB;CACA,IAAIiH,MAAc,QAAQA,MAAc,QAAQ;EAC9C,IAAMzpB,IAAOypB,MAAc,OAAO,KAAK,GACjCT,IAAQH,GAAeF,GAAQC,GAAS7sB,EAAQ,MAAM;EAC5D,KACE,IAAI2N,IAAQ3N,EAAQ,QAAQiE,GAC5B0J,KAAS,KAAKA,IAAQsf,GACtB,KAAShpB,GACT;GACA,IAAMqpB,IAAW;IAAE,QAAQttB,EAAQ;IAAQ;GAAM;GACjD,IAAIwtB,EAAGF,CAAQ,GAAG,OAAOA;EAC3B;EACA;CACF;CACA,IAAMrpB,IAAOypB,MAAc,SAAS,KAAK,GACnChlB,IAAQkkB,EAAO,WAAW,MAAWrC,EAAO,QAAQvqB,EAAQ,MAAM;CACxE,IAAI,MAAQ,IACZ,KACE,IAAI2N,IAAQjF,IAAQzE,GACpB0J,KAAS,KAAKA,IAAQif,EAAO,QAC7B,KAAS3oB,GACT;EACA,IAAMsmB,IAASqC,EAAOjf,EAAM,CAAE,KACxBsf,IAAQH,GAAeF,GAAQC,GAAStC,CAAM,GAC9C+C,IAAW;GAAE;GAAQ,OAAO,KAAK,IAAIttB,EAAQ,OAAOitB,IAAQ,CAAC;EAAE;EACrE,IAAIO,EAAGF,CAAQ,GAAG,OAAOA;CAC3B;AAEF;AAOA,SAAgBK,GACd,GACA,IAAM,IACgD;CACtD,QAAQ1nB,GAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO2nB,IAAM,UAAU;EACzB,KAAK,cACH,OAAOA,IAAM,SAAS;EACxB,SACE;CACJ;AACF;AAOA,SAAgBC,GACd,GACA,GACA,GACqB;CACrB,IAAMhuB,IAA4B,CAAC;CACnC,KAAK,IAAM,CAACoG,GAAKghB,MAAU,OAAO,QAAQ6G,CAAK,GAAG,EAAK7nB,KAAO,CAAC,GAAGghB,CAAK;CACvE,IAAM1F,IAAS1hB,EAAK4mB,EAAK,aACnB3lB,IAASjB,EAAK4mB,EAAK;CACzB,IAAI,CAAClF,KAAU,CAACzgB,GAAQ,OAAOjB;CAC/B,IAAM8N,IAAQ4T,EAAO,WAClB,MAAS,OAAOwM,EAAMpI,CAAI,CAAC,MAAMc,EAAK,OACzC;CACA,IAAI9Y,IAAQ,GAAG,OAAO9N;CACtB,IAAM,CAACmuB,KAAQzM,EAAO,OAAO5T,GAAO,CAAC;CAErC,OADA7M,EAAO,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG2lB,EAAK,OAAO,GAAG3lB,EAAO,MAAM,GAAG,GAAGktB,CAAK,GACnEnuB;AACT;AAOA,IAAaouB,KAAgB9B,IAEhB+B,KAAsB9B,IAEtB+B,KAAa9B,IAEb+B,KAAe9B,IAEf+B,KAAoB9B,IAEpB+B,KAAc7B,IAEd8B,KAAe7B,IAUf8B,KAAa7B,IAEb8B,KAAc3B,IAEd4B,KAAiB1B,IAEjB2B,KAAexB,IAEfyB,KAAoBxB,IAEpByB,KAAuBtB,IAEvBuB,KAAkBnB,IAElBoB,KAAiBlB;;;ACrS9B,SAAgBmB,GAAgB,EAC9B,cACA,mBACA,eACA,cACA,cAAW,KACuB;CAClC,IAAI,EAAEC,IAAa,IAAI,OAAO;EAAE,OAAO;EAAG,KAAK;EAAG,cAAc;CAAE;CAClE,IAAMC,IAAQ,KAAK,IAAI,GAAGC,KAAY,CAAC,GACjCzmB,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAM0mB,IAAYH,CAAU,IAAIC,CAAK,GAC9DG,IAAe,KAAK,KAAK1gB,IAAiBsgB,CAAU,IAAI,IAAIC;CAElE,OAAO;EAAE;EAAO,KADJ,KAAK,IAAII,GAAW5mB,IAAQ2mB,CACxB;EAAK;CAAa;AACpC;;;AC3BA,SAAgBE,GAAc,GAAsB,GAAyB;CAC3E,OAAO9B,EAAO,MAAM,GAAG,CAAC,CAAC,MAAM,MAAS;EACtC,IAAM+B,IAAOpgB,EAAK,KAAK,CAAC,CAAC,YAAY;EACrC,IAAI,CAACogB,KAAQA,MAAS,OAAOA,MAAS,OAAO,OAAO;EACpD,IAAIA,EAAK,WAAW,GAAG,GAAG,OAAOC,EAAK,KAAK,YAAY,CAAC,CAAC,SAASD,CAAI;EACtE,IAAME,IAAOD,EAAK,KAAK,YAAY;EACnC,OAAOD,EAAK,SAAS,IAAI,IACrBE,EAAK,WAAWF,EAAK,MAAM,GAAG,EAAE,CAAC,IACjCE,MAASF;CACf,CAAC;AACH;;;AClBA,IAAaG,KAA4C,CAAC,KAAK,OAAO;AAMtE,SAAgBC,GACd,GACA,GACU;CACV,IAAIC,EAAW,WAAW,GAAG,OAAO,CAAChsB,CAAI;CACzC,IAAMisB,IAAU,CAAC,GAAGD,CAAU,CAAC,CAC5B,MAAM,GAAG,MAAMvnB,EAAE,SAASiB,EAAE,MAAM,CAAC,CACnC,KAAK,MAAQwmB,EAAI,QAAQ,uBAAuB,MAAM,CAAC,CAAC,CACxD,KAAK,GAAG;CACX,OAAOlsB,EAAK,MAAM,IAAI,OAAOisB,CAAO,CAAC;AACvC;;;ACEA,SAAgBE,GACd,GACA,GACK;CACL,IAAM9hB,IAAc,CAAC,GACjB+hB,IAAkC9wB;CACtC,KAAK,IAAMQ,KAAS8B,GAAQ;EAC1B,IAAMmL,IAAuBqjB,GAAO,MAAM,MAAMC,EAAE,UAAUvwB,CAAK;EACjE,IAAI,CAACiN,GAAO;EAEZ,AADAsB,EAAO,KAAKtB,CAAK,GACjB,IAAQA,EAAM;CAChB;CACA,OAAOsB;AACT;AAMA,SAAgBiiB,GACd,GACA,IAAY,CAAC,GACa;CAC1B,OAAOhxB,EAAQ,SAAS,MAAW;EACjC,IAAIixB,EAAO,UAAU,OAAO,CAAC;EAC7B,IAAMpwB,IAAU,CAAC,GAAGyiB,GAAM2N,CAAM;EAChC,OAAO,CACL;GAAE;GAAQ,MAAMpwB;EAAQ,GACxB,GAAIowB,EAAO,WACPD,GAAuBC,EAAO,UAAUpwB,CAAO,IAC/C,CAAC,CACP;CACF,CAAC;AACH;;;AC/CA,IAAaqwB,KAAe,MAAsB,KAAK,MAAM3M,IAAI,EAAE,IAAI;AAOvE,SAAgB4M,GAAmB,GAAe,GAAqB;CACrE,IAAMC,IAASlpB,IAAM,IAAK1H,IAAQ0H,IAAO,IAAI,GACvCmpB,IAAY,KAAK,MAAMD,CAAM,GAC7BE,IAAWF,IAASC,GACpBE,IAAOD,KAAY,OAAQA,IAAW;CAE5C,QADoBA,KAAY,MAAOD,IAAY,IAAIA,MACjCE,IAAO,KAAM;AACrC;AAGA,IAAaC,MACX,GACA,MAEAhjB,IAAQ,KAAK,MAAMijB,CAAS,IAAI,SAASjjB,IAAQijB,IAAY,SAAS,SCnB3DC,KAA4C;CACvD;CAAK;CAAM;CAAG;CAAM;CAAK;AAC3B,GAGaC,KAAuB,IAGvBC,KAAsB,GAGtBC,KAAwB,IAE/BC,qBAAmB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAMD,SAAgBC,GACd,GACA,GACA,GACW;CACX,IAAIxB,MAAS,WAAWA,MAAS,SAAS,OAAOA;CACjD,IAAMyB,IAAOC,GAAU,KAAK,CAAC,CAAC,YAAY;CAC1C,IAAID,GAAM,WAAW,QAAQ,GAAG,OAAO;CACvC,IAAIA,GAAM,WAAW,QAAQ,GAAG,OAAO;CACvC,IAAM1O,KAAQ4O,KAAO,GAAA,CAAI,MAAM,MAAM,CAAC,CAAC,MAAM,IACvC3F,IAAMjJ,EAAK,YAAY,GAAG,GAC1B6O,IAAM5F,KAAO,IAAIjJ,EAAK,MAAMiJ,IAAM,CAAC,CAAC,CAAC,YAAY,IAAI;CAC3D,OAAOuF,GAAiB,IAAIK,CAAG,IAAI,UAAU;AAC/C;AAEA,IAAMC,MAAU,MACd,OAAO7N,KAAM,YAAY,OAAO,SAASA,CAAC,KAAKA,IAAI,IAAIA,IAAI;AAM7D,SAAgB8N,GAAgB,GAAiB,GAA2B;CAC1E,IAAMrH,IAAQ,KAAK,MAAMoH,GAAO9M,CAAO,CAAC,GAClCF,IAAQ,KAAK,MAAM4F,IAAQ,IAAI,GAC/B3F,IAAU,KAAK,MAAO2F,IAAQ,OAAQ,EAAE,GACxCsH,IAAOtH,IAAQ,IACfuH,IAAK,OAAOD,CAAI,CAAC,CAAC,SAAS,GAAG,GAAG;CAIvC,OAHIlN,IAAQ,KAAKgN,GAAO9hB,CAAQ,KAAK,OAC5B,GAAG8U,EAAM,GAAG,OAAOC,CAAO,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAGkN,MAElD,GAAGlN,EAAQ,GAAGkN;AACvB;AAGA,SAAgBC,GAAe,GAAiB,GAA2B;CACzE,IAAMhyB,IAAQ,OAAO,SAAS8kB,CAAO,IAAI,KAAK,IAAI,GAAGA,CAAO,IAAI,GAC1Dpd,IAAMkqB,GAAO9hB,CAAQ;CAC3B,OAAOpI,IAAM,IAAI,KAAK,IAAI1H,GAAO0H,CAAG,IAAI1H;AAC1C;AAGA,IAAaiyB,MAAiB,GAAqB,MACjDL,GAAO9hB,CAAQ,IAAI,IACf,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG8hB,GAAOM,CAAW,IAAIpiB,CAAQ,CAAC,IACvD,GAGOqiB,MAAe,MAC1B,OAAO,SAASC,CAAM,IAClB,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAM,CAAC,IAAI,GAAG,IAAI,MACrD;AAGN,SAAgBC,GACd,GACA,IAA2BnB,IACnB;CAGR,OAFIoB,EAAM,WAAW,IAAUjyB,IAExBiyB,GADOA,EAAM,QAAQjyB,CACd,IAAQ,KAAKiyB,EAAM,WAAWjyB;AAC9C;AAGA,IAAakyB,MAAsB,MACjC,GAAG,OAAOC,EAAK,QAAQ,CAAC,CAAC,EAAE;AAa7B,SAAgBC,GACd,GACA,GACQ;CACR,IAAI,CAACC,KAAUA,EAAO,WAAW,GAAG,OAAO;CAC3C,IAAIzkB,IAAM;CACV,KAAK,IAAIhG,IAAI,GAAGA,IAAIyqB,EAAO,QAAQ,KAAK;EACtC,IAAM3pB,IAAQ2pB,EAAO,MAAMzqB,CAAC,GACtB0qB,IAAOD,EAAO,IAAIzqB,CAAC;EACzB,IAAIiqB,KAAenpB,KAASmpB,KAAeS,GAAM,OAAOA;EACxD,AAAIA,KAAQT,MAAa,IAAMS;CACjC;CACA,OAAO1kB;AACT;AAMA,IAAa2kB,KAAmB;CAC9B,MAAM;CACN,OAAO;CACP,UACE;CACF,aACE;CACF,QACE;CACF,OACE;CACF,YACE;CACF,gBACE;CACF,kBACE;CACF,UACE;AACJ;AAmBA,SAAgBC,GACd,GACA,IAAwE,CAAC,GAClD;CACvB,IAAIC,EAAU,WAAWA,EAAU,WAAWA,EAAU,QAAQ,OAAO;CACvE,QAAQxsB,GAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK,aACH,OAAO;GAAE,MAAM;GAAQ,OAAO;EAAqB;EACrD,KAAK,cACH,OAAO;GAAE,MAAM;GAAQ,OAAA;EAA2B;EACpD,KAAK,WACH,OAAO;GAAE,MAAM;GAAU,OAAO+qB;EAAsB;EACxD,KAAK,aACH,OAAO;GAAE,MAAM;GAAU,OAAO;EAAuB;EACzD,KAAK;EACL,KAAK,KACH,OAAO,EAAE,MAAM,OAAO;EACxB,KAAK;EACL,KAAK,KACH,OAAO,EAAE,MAAM,aAAa;EAC9B,KAAK;EACL,KAAK,KACH,OAAO,EAAE,MAAM,WAAW;EAC5B,SACE,OAAO;CACX;AACF;;;AC5KA,IAAM0B,KACJ;AAGF,SAAgBC,GAAa,GAAuB;CAClD,IAAM1qB,IAAQtI,EAAM,KAAK,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG;CACtD,IAAIsI,EAAM,SAAS,KAAKA,EAAM,SAAS,GAAG,OAAO;CACjD,IAAIwc,IAAU;CACd,KAAK,IAAMrV,KAAQnH,GAAO;EACxB,IAAI,CAAC,kBAAkB,KAAKmH,CAAI,GAAG,OAAO;EAC1C,IAAUqV,IAAU,KAAK,OAAOrV,CAAI;CACtC;CACA,OAAOqV;AACT;AAEA,IAAMmO,KAAmC;CACvC,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;AACP;AAOA,SAAgBC,GAAQ,GAAqB;CAC3C,OAAO1hB,EACJ,QAAQ,UAAU,IAAI,CAAC,CACvB,QAAQ,gBAAgB,EAAE,CAAC,CAC3B,QAAQ,cAAc,EAAE,CAAC,CACzB,QAAQ,kCAAkC,GAAO,MAAiB;EACjE,IAAI/H,EAAK,OAAO,KAAK;GACnB,IAAM0pB,IACJ1pB,EAAK,OAAO,OAAOA,EAAK,OAAO,MAC3B,OAAO,SAASA,EAAK,MAAM,CAAC,GAAG,EAAE,IACjC,OAAO,SAASA,EAAK,MAAM,CAAC,GAAG,EAAE;GACvC,OAAO,OAAO,SAAS0pB,CAAI,KAAKA,IAAO,KAAKA,KAAQ,UAChD,OAAO,cAAcA,CAAI,IACzBhrB;EACN;EACA,OAAO8qB,GAASxpB,EAAK,YAAY,MAAMtB;CACzC,CAAC,CAAC,CACD,MAAM,IAAI,CAAC,CACX,KAAK,MAASirB,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;AACd;AAEA,SAASC,GAAY,GAA0B;CAC7C,IAAMC,IAAmB,CAAC,GACpBxvB,IAASI,EACZ,QAAQ,WAAW,EAAE,CAAC,CACtB,QAAQ,UAAU,IAAI,CAAC,CACvB,MAAM,YAAY;CACrB,KAAK,IAAMsC,KAAS1C,GAAQ;EAC1B,IAAMyvB,IAAQ/sB,EAAM,MAAM,IAAI,GACxB+F,IAAKgnB,EAAM,WAAW,MAASH,EAAK,SAAS,KAAK,CAAC;EACzD,IAAI7mB,IAAK,GAAG;EACZ,IAAMinB,IAAOD,EAAM,EAAE,EAAE,KAAK,KAAK;EAEjC,IAAI,6BAA6B,KAAKC,CAAI,KAAKjnB,MAAO,GAAG;EACzD,IAAMknB,IAASV,GAAO,KAAKQ,EAAMhnB,MAAO,EAAE;EAC1C,IAAI,CAACknB,GAAQ;EACb,IAAM1qB,IAAQiqB,GAAaS,EAAO,MAAM,EAAE,GACpCxlB,IAAM+kB,GAAaS,EAAO,MAAM,EAAE;EACxC,IAAI,CAAC,OAAO,SAAS1qB,CAAK,KAAK,CAAC,OAAO,SAASkF,CAAG,KAAKA,KAAOlF,GAC7D;EAEF,IAAM2qB,IAAUR,GAAQK,EAAM,MAAMhnB,IAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;EACtD,AAAImnB,KAASJ,EAAK,KAAK;GAAE;GAAO;GAAK,MAAMI;EAAQ,CAAC;CACtD;CACA,OAAOJ,EAAK,MAAM,GAAG,MAAM1pB,EAAE,QAAQjB,EAAE,SAASiB,EAAE,MAAMjB,EAAE,GAAG;AAC/D;AAGA,SAAgBgrB,GAAS,GAA0B;CACjD,OAAON,GAAYnvB,EAAK,QAAQ,8BAA8B,IAAI,CAAC;AACrE;AAGA,IAAa0vB,MAAY,MAA6BP,GAAYnvB,CAAI;AAGtE,SAAgB2vB,GAAc,GAA0B;CACtD,OAAO,iBAAiB,KAAK3vB,CAAI,IAAIyvB,GAASzvB,CAAI,IAAI0vB,GAAS1vB,CAAI;AACrE;AAGA,SAAgB4vB,GAAc,GAA2B,GAAsB;CAC7E,IAAI,CAAC,OAAO,SAASC,CAAI,GAAG,OAAO;CACnC,IAAMR,IAAkB,CAAC;CACzB,KAAK,IAAMS,KAAOV,GAAM;EACtB,IAAIU,EAAI,QAAQD,GAAM;EACtB,AAAIA,IAAOC,EAAI,OAAKT,EAAM,KAAKS,EAAI,IAAI;CACzC;CACA,OAAOT,EAAM,KAAK,IAAI;AACxB;AAGA,SAAgBU,GAAY,GAAsB;CAChD,IAAI,UAAU,KAAKvC,CAAG,GAAG,OAAO,4BAA4B,KAAKA,CAAG;CACpE,IAAM5O,IAAO4O,EAAI,MAAM,MAAM,CAAC,CAAC,MAAM;CACrC,OAAO,UAAU,KAAK5O,CAAI;AAC5B;AAEA,IAAMoR,KACJ;AAEF,SAASC,GAAa,GAAuB;CAC3C,IAAMC,IAAQp0B,EAAM,QAAQ,mBAAmB,EAAE,GAC7C6H,IAAM,IACNqf,IAAS,GACTmN,IAAO;CACX,KAAK,IAAMrrB,KAAQorB,GAGjB,AAFA,IAAUlN,KAAU,IAAKgN,GAAO,QAAQlrB,CAAI,GAC5C,KAAQ,GACJqrB,KAAQ,MACV,KAAQ,GACR,KAAO,KAAMnN,KAAUmN,IAAQ,IAAA,CAAM,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAGrE,IAAI;EACF,OAAO,mBAAmBxsB,CAAG;CAC/B,QAAQ;EAEN,OAAOA,EAAI,QAAQ,oBAAoB,GAAG,MACxC,OAAO,aAAa,OAAO,SAASysB,GAAM,EAAE,CAAC,CAC/C;CACF;AACF;AAGA,SAAgBC,GAAc,GAA4B;CACxD,IAAMpsB,IAAQ,4BAA4B,KAAKupB,EAAI,KAAK,CAAC;CACzD,IAAI,CAACvpB,GAAO,OAAO;CACnB,IAAMqsB,IAAOrsB,EAAM,MAAM,IACnB0K,IAAO1K,EAAM,MAAM;CACzB,IAAI,YAAY,KAAKqsB,CAAI,GAAG,OAAOL,GAAathB,CAAI;CACpD,IAAI;EACF,OAAO,mBAAmBA,CAAI;CAChC,QAAQ;EACN,OAAOA;CACT;AACF;AAMA,eAAsB4hB,GACpB,GACA,GACqB;CAErB,IAAMvwB,IADSqwB,GAAc7C,CAChB,KAAW,MAAMgD,EAAUhD,CAAG;CAC3C,OAAOuC,GAAYvC,CAAG,IAAIkC,GAAS1vB,CAAI,IAAI2vB,GAAc3vB,CAAI;AAC/D;AAGA,IAAaywB,KAA6B,iCAG7BC,MAAsB,MACjCC,IAAQA,EAAM,WAAWA,EAAM,QAAQ,OAEnCnnB,MAAW,MAAiBonB,EAAK,YAAY,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM;AAOzE,SAAgBC,GACd,GACA,GACQ;CAER,IADIC,EAAO,WAAW,KAClBC,MAAe,OAAO,OAAO;CACjC,IAAIA,GAAY;EACd,IAAMC,IAASD,EAAW,YAAY,GAClCjnB,IAAQgnB,EAAO,WAAW,MAAMxoB,EAAE,SAAS,YAAY,MAAM0oB,CAAM;EASvE,IARIlnB,IAAQ,MACV,IAAQgnB,EAAO,WACZ,MAAM,CAAC,CAACxoB,EAAE,WAAWkB,GAAQlB,EAAE,OAAO,MAAMkB,GAAQwnB,CAAM,CAC7D,IAEElnB,IAAQ,MACV,IAAQgnB,EAAO,WAAW,MAAMxoB,EAAE,MAAM,YAAY,MAAM0oB,CAAM,IAE9DlnB,KAAS,GAAG,OAAOA;CACzB;CACA,OAAOgnB,EAAO,WAAW,MAAMxoB,EAAE,OAAO;AAC1C;AASA,SAAgB2oB,GACd,GACe;CACf,IAAI;EACF,IAAMn1B,IAAQo1B,GAAS,QAAQT,EAA0B;EACzD,OAAO,OAAO30B,KAAU,YAAYA,IAAQA,IAAQ;CACtD,QAAQ;EACN,OAAO;CACT;AACF;AAGA,SAAgBq1B,GACd,GACA,GACM;CACN,IAAI;EACF,GAAS,QAAQV,IAA4BC,GAAmBC,CAAK,CAAC;CACxE,QAAQ,CAER;AACF;AAMA,SAAgBS,GACd,GACA,GACA,GACe;CAGf,OAFIN,EAAO,WAAW,IAAU,OAC5B30B,KAAW,IAAU,KAClBk1B,KAAY,KAAKA,IAAWP,EAAO,SAASO,IAAW;AAChE;;;ACvPA,IAAaC,KAAwB;AAGrC,SAAgBC,GAAgB,GAA8B;CAC5D,IAAI,CAACnxB,KAAQ,CAAC,OAAO,SAASA,CAAI,GAAG,OAAO;CAC5C,IAAMwH,IAAI,OAAOxH,CAAI,GACfoxB,IAAM5pB,EAAE,MAAM,UAAU;CAC9B,IAAI4pB,GAAK,OAAO,OAAOA,EAAI,EAAE;CAC7B,IAAM3J,IAAMjgB,EAAE,QAAQ,GAAG;CACzB,OAAOigB,MAAQ,KAAK,IAAIjgB,EAAE,SAASigB,IAAM;AAC3C;AAGA,SAAgB4J,GAAiB,GAAW,GAAa,GAAqB;CAE5E,OADI,OAAO,MAAM/sB,CAAC,IAAUjB,IACrB,KAAK,IAAID,GAAK,KAAK,IAAIC,GAAKiB,CAAC,CAAC;AACvC;AAOA,SAAgBgtB,GACd,GACA,GACA,GACA,IAAsB,GACR;CACd,IAAI,CAACC,KAASnuB,KAAOC,GAAK,OAAO,CAAC;CAClC,IAAIkuB,MAAU,IAAM;EAClB,IAAI,CAACvxB,KAAQA,KAAQ,GAAG,OAAO,CAAC;EAChC,IAAMge,IAAQ,KAAK,OAAO5a,IAAMC,KAAOrD,IAAO,IAAI,IAAI;EACtD,IAAIge,IAAA,KAA+B,OAAO,CAAC;EAC3C,IAAM4J,IAAYuJ,GAAgBnxB,CAAI;EACtC,OAAO,MAAM,KAAK,EAAE,QAAQge,EAAM,IAAI,GAAG,OAAO,EAC9C,OAAO,QAAQ3a,IAAMM,IAAI3D,EAAA,CAAM,QAAQ4nB,CAAS,CAAC,EACnD,EAAE;CACJ;CACA,OAAO2J,EACJ,QAAQ,MAAM,OAAO,SAAShqB,EAAE,KAAK,KAAKA,EAAE,SAASlE,KAAOkE,EAAE,SAASnE,CAAG,CAAC,CAC3E,MAAM,CAAC,CACP,MAAM,GAAG,MAAMkC,EAAE,QAAQjB,EAAE,KAAK;AACrC;AAGA,SAASmtB,GACP,GACA,GACoB;CACpB,IAAI,CAACD,GAAO,QAAQ;CACpB,IAAIE,IAAOF,EAAM,EAAE,CAAC;CACpB,KAAK,IAAMhqB,KAAKgqB,GACd,AAAI,KAAK,IAAIhqB,EAAE,QAAQjD,CAAC,IAAI,KAAK,IAAImtB,IAAOntB,CAAC,MAAG,IAAOiD,EAAE;CAE3D,OAAOkqB;AACT;AAMA,SAAgBC,EAAgB,GAAW,GAA4B;CACrE,IAAM,EAAE,QAAK,QAAK,SAAM,UAAO,mBAAgBnnB,GACzConB,IAAUN,GAAiB/sB,GAAGjB,GAAKD,CAAG;CAC5C,IAAIwuB,KAAe5xB,MAAS,MAC1B,OAAOwxB,GAAYG,GAASJ,CAAK,KAAKI;CAExC,IAAI,CAAC3xB,KAAQA,KAAQ,GAAG,OAAO2xB;CAC/B,IAAME,IAAUxuB,IAAM,KAAK,OAAOsuB,IAAUtuB,KAAOrD,CAAI,IAAIA,GACrD4nB,IAAY,KAAK,IAAIuJ,GAAgBnxB,CAAI,GAAGmxB,GAAgB9tB,CAAG,CAAC;CAEtE,OAAOguB,GAAiB,OAAOQ,EAAQ,QAAQjK,CAAS,CAAC,GAAGvkB,GAAKD,CAAG;AACtE;AAGA,SAAgB0uB,GAAc,GAAW,GAAa,GAAqB;CAEzE,OADI1uB,KAAOC,IAAY,KACdguB,GAAiB/sB,GAAGjB,GAAKD,CAAG,IAAIC,MAAQD,IAAMC,KAAQ;AACjE;AASA,SAAgB0uB,GACd,GACA,GACA,GACA,IAAW,IACH;CACR,IAAI,CAAC1nB,GAAQ,OAAO;CACpB,IAAM2nB,KAAS3I,IAAW5kB,KAAS4F;CACnC,OAAO4nB,IAAW,IAAID,IAAQA;AAChC;AAOA,SAAgBE,GACd,GACA,GACQ;CACR,IAAM/tB,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,SAAS6tB,CAAK,IAAIA,IAAQ,CAAC,CAAC;CACrE,OAAON,EAAgBnnB,EAAM,MAAMpG,KAAKoG,EAAM,MAAMA,EAAM,MAAMA,CAAK;AACvE;AASA,SAAgB4nB,GACd,GACA,GACA,GACe;CACf,IAAM,EAAE,QAAK,QAAK,SAAM,UAAO,mBAAgB5nB;CAC/C,IAAIvI,MAAQ,QAAQ,OAAO0vB,EAAgBruB,GAAKkH,CAAK;CACrD,IAAIvI,MAAQ,OAAO,OAAO0vB,EAAgBtuB,GAAKmH,CAAK;CACpD,IAAM6nB,IAAKpwB,MAAQ,gBAAgBA,MAAQ,WACrCqwB,IAAOrwB,MAAQ,eAAeA,MAAQ,aACtCswB,IAAStwB,MAAQ,UACjBuwB,IAAWvwB,MAAQ;CACzB,IAAI,CAACowB,KAAM,CAACC,KAAQ,CAACC,KAAU,CAACC,GAAU,OAAO;CACjD,IAAM9I,IAAY2I,KAAME,IAAS,IAAI;CACrC,KAAKV,KAAe5xB,MAAS,SAASuxB,GAAO,QAAQ;EACnD,IAAM/zB,IAAS+zB,EAAM,KAAK,MAAMhqB,EAAE,KAAK;EACvC,IAAI+qB,KAAUC,GAAU;GACtB,IAAMC,IAAO,KAAK,IAAI,GAAG,KAAK,MAAMh1B,EAAO,SAAS,EAAE,CAAC,GACjDkM,IAAQlM,EAAO,QAAQg0B,GAAY91B,GAAO61B,CAAK,CAAW;GAKhE,OAAO/zB,EAJM,KAAK,IAChBA,EAAO,SAAS,GAChB,KAAK,IAAI,GAAGkM,IAAQ+f,IAAY+I,CAAI,CAExB;EAChB;EAKA,QAHE/I,IAAY,IACRjsB,EAAO,MAAM,MAAM8G,IAAI5I,CAAK,IAC5B,CAAC,GAAG8B,CAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,MAAM8G,IAAI5I,CAAK,MAClCA;CACjB;CACA,IAAM+2B,IAAOzyB,KAAQA,IAAO,IAAIA,KAAQoD,IAAMC,KAAO;CAErD,OAAOquB,EAAgBh2B,IAAQ+tB,KADjB6I,KAAUC,IAAW,KAAK,IAAIE,IAAOrvB,IAAMC,KAAO,EAAE,IAAIovB,IACpBloB,CAAK;AACzD;AAOA,SAAgBmoB,GACd,GACA,GACA,GACa;CACb,IAAMC,KAAO,GAAY,MACvB,OAAOruB,KAAM,YAAY,OAAO,SAASA,CAAC,IACtCotB,EAAgBptB,GAAGiG,CAAK,IACxBV;CACN,IAAI+oB,GAAO;EACT,IAAMtqB,IAAO,MAAM,QAAQ5M,CAAK,IAC5BA,IACA,OAAOA,KAAU,WACf,CAAC6O,EAAM,KAAK7O,CAAK,IACjB,CAAC6O,EAAM,KAAKA,EAAM,GAAG,GACrBjF,IAAIqtB,EAAIrqB,EAAK,IAAIiC,EAAM,GAAG,GAC1BlG,IAAIsuB,EAAIrqB,EAAK,IAAIiC,EAAM,GAAG;EAChC,OAAOjF,KAAKjB,IAAI,CAACiB,GAAGjB,CAAC,IAAI,CAACA,GAAGiB,CAAC;CAChC;CACA,OAAOqtB,EAAI,MAAM,QAAQj3B,CAAK,IAAIA,EAAM,KAAKA,GAAO6O,EAAM,GAAG;AAC/D;AAGA,SAAgBsoB,GAAa,GAA8B;CACzD,OAAO,MAAM,QAAQn3B,CAAK,IAAI,CAACA,EAAM,IAAIA,EAAM,EAAE,IAAI,CAACA,CAAK;AAC7D;AAMA,SAAgBo3B,GACd,GACA,GACA,GACa;CAGb,OAFK,MAAM,QAAQp3B,CAAK,IACpBgO,MAAU,IAAU,CAAC,KAAK,IAAI9N,GAAMF,EAAM,EAAE,GAAGA,EAAM,EAAE,IACpD,CAACA,EAAM,IAAI,KAAK,IAAIE,GAAMF,EAAM,EAAE,CAAC,IAFRE;AAGpC;AAGA,SAAgBm3B,GAAmB,GAAoB,GAAmB;CACxE,IAAI,CAAC,MAAM,QAAQr3B,CAAK,GAAG,OAAO;CAClC,IAAM,CAAC4J,GAAGjB,KAAK3I;CAEf,OADI4J,MAAMjB,IAAU,MAAIA,KACjB,KAAK,IAAIC,IAAIgB,CAAC,KAAK,KAAK,IAAIhB,IAAID,CAAC,IAAI,IAAI;AAClD;AAGA,SAAgB2uB,GAAkB,GAAgB,GAAyB;CAGzE,OAFI,MAAM,QAAQ1tB,CAAC,KAAK,MAAM,QAAQjB,CAAC,IAC9BiB,EAAE,OAAOjB,EAAE,MAAMiB,EAAE,OAAOjB,EAAE,KAC9BiB,MAAMjB;AACf;AAGA,SAAgB4uB,GAAmB,GAAc,GAA6B;CAE5E,OADI,MAAM,QAAQv3B,CAAK,IAAUw3B,KAAQx3B,EAAM,MAAMw3B,KAAQx3B,EAAM,KAC5Dw3B,KAAQx3B;AACjB;;;ACtOA,IAAMy3B,MAAU,GAAe,MAA4B;CACzD,IAAKz3B,KAASA,MAAU,IACxB;MAAI,OAAOA,KAAU,YAAY,OAAOA,KAAU,UAChD,EAAI,KAAK,OAAOA,CAAK,CAAC;OACjB,IAAI,OAAOA,KAAU,UAC1B,EAAI,KAAKA,EAAM,SAAS,CAAC;OACpB,IAAI,MAAM,QAAQA,CAAK,GAC5B,KAAK,IAAMgmB,KAAQhmB,GAAO,GAAOqG,GAAK2f,CAAI;OAE1C,KAAK,IAAM1f,KAAO,OAAO,KAAKtG,CAAK,GACjC,AAAIsG,KAAOtG,EAAMsG,MAAMD,EAAI,KAAKC,CAAG;CAAA;AAGzC;AAOA,SAAgBoxB,GAAG,GAAGC,GAA8B;CAClD,IAAMtxB,IAAgB,CAAC;CACvB,KAAK,IAAMgmB,KAASsL,GAAQ,GAAOtxB,GAAKgmB,CAAK;CAC7C,OAAOhmB,EAAI,KAAK,GAAG;AACrB;;;AChCA,IAAauxB,KAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAeaC,KAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GC9CMC,KAAe,MACfC,KAAe,KACfC,KAAa,KAEbC,KAAY,GAwBZC,KACJ,uQAMIC,KAAkC;CAEtC;EAAC;EAAM;EAAwD;CAAC;CAChE;EAAC;EAAM;EAAmD;CAAC;CAC3D;EAAC;EAAM;EAAM;CAAG;CAChB;EAAC;EAAM;EAAoC;CAAG;CAC9C;EAAC;EAAM;EAAsB;CAAC;CAC9B;EAAC;EAAM;EAAsD;CAAC;CAC9D;EAAC;EAAM;EAAmC;CAAC;CAC3C;EAAC;EAAM;EAA2C;CAAC;CACnD;EAAC;EAAM;EAA6D;CAAG;CACvE;EAAC;EAAM;EAA4C;CAAC;CACpD;EAAC;EAAM;EAAU;CAAG;CACpB;EAAC;EAAM;EAAsC;CAAC;CAC9C;EAAC;EAAM;EAA6D;CAAG;CACvE;EAAC;EAAM;EAAyB;CAAC;CACjC;EAAC;EAAM;EAAiB;CAAG;CAC3B;EAAC;EAAM;EAAc;CAAG;CACxB;EAAC;EAAM;EAA+C;CAAC;CACvD;EAAC;EAAM;EAAmC;CAAG;CAC7C;EAAC;EAAM;EAAS;EAAM;CAAC;CACvB;EAAC;EAAM;EAAgB;CAAG;CAE1B;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAM;EAAmE;CAAC;CAC3E;EAAC;EAAM;EAAkB;CAAC;CAC1B;EAAC;EAAM;EAAuB;CAAC;CAE/B;EACE;EACA;EACA;CACF;CACA;EACE;EACA;EACA;CACF;CACA;EAAC;EAAM;EAA4D;CAAC;CACpE;EAAC;EAAM;EAA4D;CAAC;CACpE;EACE;EACA;EACA;CACF;CACA;EAAC;EAAM;EAAoE;CAAC;CAE5E;EAAC;EAAO;EAA6D;CAAC;CAEtE;EAAC;EAAO;EAAoC;CAAG;CAC/C;EAAC;EAAO;EAAqC;CAAC;CAC9C;EAAC;EAAO;EAAe;CAAC;CACxB;EAAC;EAAO;EAAW;CAAC;CAEpB;EAAC;EAAQ;EAA0B;EAAK;CAAC;CACzC;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAQ;EAAQ;EAAG;CAAC;CACrB;EAAC;EAAQ;EAA6C;EAAG;CAAC;CAC1D;EAAC;EAAQ;EAAmB;EAAG;CAAC;CAEhC;EACE;EACA;EACA;EACA;CACF;CACA;EACE;EACI,OACF,iDAAiDD,GAAS,sBAC5D;EACA;CACF;CACA;EACE;EACI,OACF,iCAAiCA,GAAS,sCAC5C;EACA;CACF;CACA;EACE;EACA,gBAAI,OACF,60BACF;EACA;EACA;CACF;CACA;EACE;EACA;EACA;CACF;CACA;EAAC;EAAO;EAAkB;EAAG;CAAC;CAE9B;EAAC;EAAU;EAA6D;EAAG;CAAC;CAC5E;EAAC;EAAU;EAAS;CAAC;CACrB;EAAC;EAAU;EAAuC;EAAG;CAAC;CACtD;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAU;EAAc;EAAK;CAAC;CAC/B;EAAC;EAAU;EAAqB;EAAG;CAAC;CACpC;EACE;EACA;EACA;CACF;CACA;EAAC;EAAU;EAAe;EAAG;CAAC;CAC9B;EAAC;EAAU;EAAyB;EAAG;CAAC;CACxC;EAAC;EAAU;EAAW;EAAG;CAAC;CAC1B;EACE;EACA;EACA;CACF;CACA;EAAC;EAAU;EAA4B;EAAK;CAAC;CAC7C;EAAC;EAAU;EAA2B;EAAG;CAAC;CAC1C;EAAC;EAAU;EAA4B;EAAK;CAAC;CAE7C;EAAC;EAAQ;EAAe;CAAC;CACzB;EACE;EACA,gBAAI,OACF,gRACF;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAQ;EAAoC;CAAG;CAChD;EAAC;EAAQ;EAA8B;CAAC;CACxC;EAAC;EAAQ;EAAoC;EAAG;CAAC;CACjD;EAAC;EAAQ;EAAkB;EAAK;CAAC;CACjC;EAAC;EAAQ;EAAwC;EAAK;CAAC;CACvD;EACE;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;CACF;CAEA;EAAC;EAAO;EAAkB;EAAG;CAAC;CAC9B;EACE;EACA;EACA;EACA;CACF;CACA;EACE;EACA;EACA;CACF;CACA;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAO;EAAY;EAAK;CAAC;CAE1B;EAAC;EAAQ;EAAmC;EAAG;CAAC;CAChD;EAAC;EAAQ;EAAgB;EAAG;CAAC;CAC7B;EAAC;EAAQ;EAAiC;EAAG;CAAC;CAE9C;EAAC;EAAY;EAAW;EAAK;CAAC;CAC9B;EAAC;EAAY;EAAgB;EAAK;CAAC;CACnC;EAAC;EAAY;EAAkB;CAAI;CACnC;EAAC;EAAY;EAAoB;EAAG;CAAC;CACrC;EACE;EACA;EACA;EACA;CACF;CACA;EAAC;EAAY;EAA0B;EAAG;CAAC;CAC3C;EAAC;EAAY;EAAqB;CAAC;CACnC;EAAC;EAAY;EAAW;EAAG;CAAC;CAC5B;EAAC;EAAY;EAAmB;EAAG;CAAC;CACpC;EAAC;EAAY;EAAqB;EAAK;CAAC;CACxC;EAAC;EAAY;EAAkB;CAAG;CAClC;EAAC;EAAY;EAAqD;EAAG;CAAC;CACtE;EAAC;EAAY;EAAW;EAAG;CAAC;AAC9B,GAGME,MAAW,MACf,SAAS,KAAKhF,CAAI,KAClB,UAAU,KAAKA,CAAI,KACnB,CAAC,aAAa,KAAKA,CAAI,KACvBA,EAAK,MAAM,KAAK,CAAC,CAAC,UAAU,GAGxBiF,KACJ,0GACIC,KAAiB,2CACjBC,KAAW,yCACXC,KAAY,cACZC,KAAgB,qBAGhBC,KAAiC;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,SAASC,GAAO,GAAgD;CAC9D,IAAIz0B,IAAOivB,EAAK,MAAM,GAAG2E,EAAY,GAC/Bc,IAAQ10B,EAAK,WAAWivB,EAAK;CACnC,IAAI,CAACyF,GAAO;EACV,IAAMC,IAAM30B,EAAK,YAAY,IAAI;EACjC,AAAI20B,IAAM,MAAG,IAAO30B,EAAK,MAAM,GAAG20B,CAAG;CACvC;CACA,IAAMtF,IAAQrvB,EAAK,MAAM,IAAI;CAI7B,OAHIqvB,EAAM,SAASwE,KACV;EAAE,MAAMxE,EAAM,MAAM,GAAGwE,EAAY,CAAC,CAAC,KAAK,IAAI;EAAG,OAAO;CAAM,IAEhE;EAAE;EAAM;CAAM;AACvB;AAGA,SAASe,GAAO,GAAc,GAA0C;CACtE,IAAM7qB,IAAM/J,EAAK,QAAQ,IAAI,GACvBwF,KAASuE,IAAM,IAAI/J,IAAOA,EAAK,MAAM,GAAG+J,CAAG,EAAA,CAAG,KAAK;CACzD,IAAIvE,EAAM,WAAW,IAAI,GAAG;EAC1B,IAAI,qBAAqB,KAAKA,CAAK,GAAG,OAAO;EAC7C,IAAI,mBAAmB,KAAKA,CAAK,GAAG,OAAO;EAC3C,IAAI,sBAAsB,KAAKA,CAAK,GAAG,OAAO;CAChD;CACA,IAAI,2CAA2C,KAAKA,CAAK,GAAG,OAAO;CACnE,IAAIkvB,KAAS,QAAQ,KAAK10B,CAAI,KAAK,QAAQ,KAAKA,CAAI,GAClD,IAAI;EACF,IAAMlE,IAAiB,KAAK,MAAMkE,CAAI;EACtC,IAAsB,OAAOlE,KAAU,YAAnCA,GAA6C,OAAO;CAC1D,QAAQ,CAER;AAGJ;AAYA,SAAgB+4B,GAAmB,GAA4B;CAC7D,IAAI,OAAO5F,KAAS,UAAU,OAAO;CACrC,IAAM,EAAE,MAAMK,GAAM,aAAUmF,GAAOxF,EAAK,QAAQ,UAAU,IAAI,CAAC,GAC3DjvB,IAAOsvB,EAAK,KAAK;CACvB,IAAItvB,EAAK,SAAS,GAAG,OAAO;CAE5B,IAAM80B,IAAUF,GAAO50B,GAAM00B,CAAK;CAClC,IAAII,GAAS,OAAOA;CAEpB,IAAMC,IAAgC;EACpC,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,KAAK;EACL,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN,KAAK;EACL,MAAM;EACN,UAAU;CACZ,GACMC,IAAW,MAAcf,GAAW,MAAM,CAAC,CAAC,KAAK,CAAC,GAClD5E,IAAQrvB,EACX,MAAM,IAAI,CAAC,CACX,KAAK,MAASkvB,EAAK,MAAM,GAAG4E,EAAU,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,GAC1DmB,IAAW,GACXC,IAAY,GACZC,IAAY,GACZC,IAAW,GACXC,IAAY,GACZC,IAAgB,GAChBC,IAAa,IACbC,IAAa,IACbC,IAAO,GACPC,IAAQ,GACRC,IAAW,GACXC,IAAQ;CAEZ,KAAK,IAAI7xB,IAAI,GAAGA,IAAIsrB,EAAM,QAAQ,KAAK;EACrC,IAAMH,IAAOG,EAAMtrB;EACnB,AAAKmrB,EAAK,KAAK,MACf,KACA+E,GAAW,SAAS,CAACnO,GAAQmG,GAASlgB,GAAQ8pB,IAAM,IAAI,MAAM;GAC5D,AAAIb,EAAKzwB,KAAKsxB,KAAO5J,EAAQ,KAAKiD,CAAI,MACpC,EAAK3qB,EAAE,IACP,EAAMuhB,MAAW/Z;EAErB,CAAC,IACGooB,GAAU,KAAKjF,CAAI,KAAK,YAAY,KAAKA,CAAI,MAAG,KAChD0G,IAAQ,KAAK1B,GAAQhF,CAAI,MAC3B,KACA,EAAM,YAAY,MAGhB,UAAU,KAAKA,CAAI,KAAK,aAAa,KAAKG,EAAMtrB,IAAI,MAAM,EAAE,MAC9D,EAAM,QAAQ,IAEZ,QAAQ,KAAKmrB,CAAI,KACfA,EAAK,OAAO,MAAK,MAChB,KACL,OACS,kDAAkD,KAAKA,CAAI,KACpE,KAEE,QAAQ,KAAKA,CAAI,IACnB,MACSqF,GAAc,KAAKrF,CAAI,KAChC,KACA,QAECkF,GAAe,KAAKlF,CAAI,KAAKmF,GAAS,KAAKnF,CAAI,MAChD,CAAC,UAAU,KAAKA,CAAI,KAEpB,KACA,KACIsG,KAAc,OAAO,KAAKtG,CAAI,MAAG,IAAa,KAClD,IAAamF,GAAS,KAAKnF,CAAI,KACtBoF,GAAU,KAAKpF,CAAI,KAAK,CAAC,QAAQ,KAAKA,CAAI,KACnD,KACA,OACS,SAAS,KAAKA,CAAI,KAAKkG,MAChC,KAAa;CAEjB;CAaA,AAVI,QAAQ,KAAKp1B,CAAI,MACfi1B,KAAY,KAAKC,KAAaD,IAAW,OAAK,EAAM,QAAQ,IAC5D,8BAA8B,KAAKj1B,CAAI,MAAG,EAAM,QAAQ,KAG1Dy1B,KAAQC,KAASC,MAAaV,MAChC,EAAM,QAAQ,IAAI,KAAK,IAAIA,GAAU,CAAC,IAAI,KAExCj1B,EAAK,WAAW,GAAG,MAAG,EAAM,QAAQ,IAEpCo1B,KAAY,KAAKD,KAAaF,IAAW,QAC3C,EAAM,QACJG,IACA,KAAK,IAAIC,GAAW,CAAC,IAAI,KACzBC,IACC;CAGL,IAAMQ,IAAoD;EACxD,MAAMf,EAAM;EACZ,KAAKA,EAAM;EACX,MAAMA,EAAM;EACZ,MAAMA,EAAM;EACZ,QAAQA,EAAM;EACd,MAAMA,EAAM;EACZ,KAAKA,EAAM;EACX,MAAMA,EAAM;EACZ,UAAUA,EAAM;CAClB,GACMgB,KAAQhB,EAAM,MAAMhB;CAC1B,AAAIgB,EAAM,OAAOhB,MAAagB,EAAM,KAAKA,EAAM,KAAKA,EAAM,OAAO,IAC/D,EAAWgB,KAAQ,QAAQ,SAAShB,EAAM,KAAKA,EAAM,KAAKA,EAAM,MACvDgB,KACT,EAAW,aAAahB,EAAM,KAAKA,EAAM,KAEzC,EAAW,aAAaA,EAAM;CAGhC,IAAIlD,KAAqB,SACrBmE,KAAY;CAChB,KAAK,IAAM3X,KAAYmW,IAAO;EAC5B,IAAM14B,IAAQg6B,EAAWzX,MAAa;EACtC,AAAIviB,KAASi4B,MAAaj4B,IAAQk6B,OAChC,KAAO3X,GACP,KAAYviB;CAEhB;CACA,OAAO+1B;AACT;;;AC/ZA,IAAMoE,KAAa,KACbC,KAAY,GAGZC,IAAQ,eACRC,IAAK,YACLC,IAAO,YACPC,IAAM,UACNC,IAAK,WACLC,IAAM,YACNC,IAAM,UACNC,IAAM,WACNC,IAAK,YACLC,KAAU,WAGVC,KACJ;AAWF,SAAgBC,GACd,GACA,GACc;CACd,IAAMvxB,IACJ,OAAO8Y,KAAa,WAChBA,EACG,KAAK,CAAC,CACN,YAAY,CAAC,CACb,QAAQ,cAAc,EAAE,IAC3B;CACN,IAAI9Y,MAAS,QACX,OAAO,OAAO0pB,KAAS,WAAW4F,GAAmB5F,CAAI,IAAI;CAE/D,KAAK,IAAM1hB,KAASspB,GAAQ,MAAM,GAAG,GAAG;EACtC,IAAMlV,IAAQpU,EAAM,MAAM,GAAG;EAC7B,IAAIoU,EAAM,SAASpc,CAAI,GAAG,OAAOoc,EAAM;CACzC;CACA,OAAQgS,GAA6C,SAASpuB,CAAI,IAC7DA,IACD;AACN;AAGA,IAAawxB,MAAqB,MAChC1Y,EAAS,KAAK,CAAC,CAAC,YAAY;AAM9B,SAAgB2Y,GACd,GACoB;CACpB,IAAM3H,IAA4B,CAAC,CAAC,CAAC;CACrC,KAAK,IAAM,EAAE,SAAM,aAAUhmB,GAC3B,EAAK,MAAM,IAAI,CAAC,CAAC,SAAS,GAAM,MAAM;EAEpC,AADItF,KAAGsrB,EAAM,KAAK,CAAC,CAAC,GAChB9jB,KAAM8jB,EAAMA,EAAM,SAAS,EAAE,CAAC,KAAK;GAAE;GAAM,MAAM9jB;EAAK,CAAC;CAC7D,CAAC;CAGH,OADI8jB,EAAM,SAAS,KAAK,CAACA,EAAMA,EAAM,SAAS,EAAE,CAAC,UAAQA,EAAM,IAAI,GAC5DA;AACT;AASA,SAAgB4H,GACd,GACA,GACkB;CAClB,IAAIj3B,IAAO;CACX,IAAI;EAEF,IADA,IAAO,OAAOivB,KAAS,WAAWA,IAAO,OAAOA,KAAQ,EAAE,GACtD,CAACjvB,GAAM,OAAO,CAAC;EACnB,IAAM4wB,IAAOkG,GAAsBzY,GAAUre,CAAI;EACjD,IAAI4wB,MAAS,WAAW5wB,EAAK,UAAUi2B,IAAY;GACjD,IAAM9zB,IAAwB,CAAC;GAC/B,GAAInC,GAAM4wB,GAAMzuB,GAAK,CAAC;GACtB,IAAIsI,IAAS;GACb,KAAK,IAAM0V,KAAShe,GAAK,KAAUge,EAAM,KAAK;GAC9C,IAAI1V,MAAWzK,EAAK,QAAQ,OAAOmC;EACrC;CACF,QAAQ,CAER;CACA,OAAOnC,IAAO,CAAC;EAAE,MAAM;EAAM;CAAK,CAAC,IAAI,CAAC;AAC1C;AAEA,IAAMk3B,KAA2D,CAAC;AAElE,SAASC,GACP,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAkB,CAAC,GACnBt1B,IAAS;EACb;EACA,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACR,MAAM,GAAO,MAAaq1B,GAAIE,GAAOhZ,GAAUlc,GAAKyC,IAAQ,CAAC;CAC/D,GACMhJ,KAAc,GAAM,MAAS;EACjC,IAAI,CAACoE,GAAM;EACX,IAAMs3B,IAAOn1B,EAAIA,EAAI,SAAS;EAC9B,AAAIm1B,KAAQA,EAAK,SAASzL,IAAM,EAAK,QAAQ7rB,IACxCmC,EAAI,KAAK;GAAE;GAAM;EAAK,CAAC;EAC5B,IAAMo1B,IAAQ,KAAK,KAAKv3B,CAAI;EAC5B,AAAIu3B,MACF,EAAE,OAAO;GAAE;GAAM;EAAK,GAClB1L,MAASsK,KAASn2B,EAAK,WAAW,MAChC,MAAM,SAASA,CAAI,IACjBo3B,EAAM,SAAS,OAAKA,EAAM,KAAKp3B,CAAI,IAC9B,MAAM,SAASA,CAAI,KAAGo3B,EAAM,IAAI,GAC3C,EAAE,SAASA,EAAMA,EAAM,SAAS,MAAM;EAG1C,IAAMI,IAAKx3B,EAAK,YAAY,IAAI;EAChC,EAAE,OAAOw3B,IAAK,IAAI11B,EAAE,QAAQ,CAACy1B,IAAQ,CAAC,KAAK,KAAKv3B,EAAK,MAAMw3B,IAAK,CAAC,CAAC;CACpE,GACM5pB,IACJhJ,IAAQsxB,MAAatF,MAAS,UAC1B,KAAA,IACCsG,GAAStG,OAAT,GAASA,KAAU6G,GAAQ7G,CAAI;CACtC,IAAI,CAAChjB,GAAO,OAAOhS,EAAK,MAAMqzB,CAAI;CAClC,IAAIyI,IAAM;CACV,MAAM,OAAOA,IAAMzI,EAAK,SAAQ;EAC9B,EAAE,QAAQyI;EACV,KAAK,IAAM/L,KAAQ/d,GAAO;GACxB,IAAI7D;GACJ,IAAI,OAAO4hB,KAAS,YAElB;QADA,IAAMA,EAAK7pB,GAAGlG,CAAI,GACdmO,KAAO2tB,GAAK;GAAA,OACX;IACL,IAAM,CAACzqB,GAAMgf,GAAS0L,KAAQhM;IAC9B,IAAIgM,KAAQ,CAACA,EAAK71B,CAAC,GAAG;IACtB,EAAQ,YAAY41B;IACpB,IAAM/vB,IAAIskB,EAAQ,KAAKgD,CAAI;IAC3B,IAAI,CAACtnB,KAAK,CAACA,EAAE,IAAI;IAEjB,IADA,IAAM,EAAE,MAAM+vB,IAAM/vB,EAAE,EAAE,CAAC,QACrB,MAAM,QAAQsF,CAAI,GACpB,EAAuB,SAAS,GAAM,MACpCrR,EAAKiwB,GAAMlkB,EAAE5D,IAAI,MAAM,EAAE,CAC3B;SACK;KACL,IAAM8nB,IACJ,OAAO5e,KAAS,aAAcA,EAAkBtF,EAAE,IAAI7F,CAAC,IAAImL;KAC7D,IAAI4e,MAAS,IAAO;KACpB,EAAKA,GAAWlkB,EAAE,EAAE;IACtB;GACF;GACA,IAAMoC;GACN,SAAS;EACX;EAEA,AADAnO,EAAK,MAAMqzB,EAAKyI,EAAI,GACpB;CACF;AACF;AAIA,IAAME,KAAS,MAAiB,IAAI,IAAInS,EAAK,MAAM,GAAG,CAAC;AAGvD,SAASoS,GAAM,GAAgB;CAC7B,IAAI9zB,IAAIjC,EAAE;CACV,OAAOA,EAAE,KAAKiC,OAAO,OAAOjC,EAAE,KAAKiC,OAAO,MAAM;CAChD,OAAOjC,EAAE,KAAK,MAAMiC,GAAGA,IAAI,CAAC;AAC9B;AAEA,IAAM+zB,MAAU,MAAWh2B,EAAE,MACvBi2B,MAAc,MAAW,CAACj2B,EAAE,SAAS,KAAK,KAAKA,EAAE,KAAKA,EAAE,QAAQ,EAAE,GAClEk2B,MAAY,MAAiB,SAAS,KAAKC,CAAI,KAAK,QAAQ,KAAKA,CAAI;AAG3E,SAASC,GAAW,GAAW,GAAmB;CAChD,KAAK,IAAItzB,IAAQ,GAAGb,IAAI6D,EAAE,QAAQ,KAAK;EACrC,IAAMuwB,IAAKvwB,EAAE7D;EACb,IAAIo0B,MAAO,KAAK;OACX,IAAIA,MAAO,KACV;OAAA,CAAC,KAAS,OAAOp0B;EAAA,OAChB,IAAIo0B,MAAO,QAAOA,MAAO,OAAOA,MAAO,KACvC;QAAA,KAAKp0B,IAAI6D,EAAE,UAAUA,EAAE7D,OAAOo0B,GAAI,KACrC,IAAIvwB,EAAE7D,OAAO,MAAM;QACd,IAAI6D,EAAE7D,OAAO,QAAQo0B,MAAO,KAAK;EAAA;CAG5C;CACA,OAAOvwB,EAAE;AACX;AAGA,SAASwwB,GAAM,GAAQ,GAAY,GAAW,GAA4B;CACxE,IAAMC,IAAQH,GAAWp2B,EAAE,MAAMiC,CAAC;CAGlC,OAFAjC,EAAE,IAAIA,EAAE,KAAK,MAAMiC,GAAGs0B,CAAK,GAAGzH,CAAI,GAClCh1B,EAAKu6B,GAAOr0B,EAAE,KAAK,MAAMu2B,GAAOA,IAAQ,CAAC,CAAC,GACnC,KAAK,IAAIA,IAAQ,GAAGv2B,EAAE,KAAK,MAAM;AAC1C;AAGA,IAAMw2B,MAAa,MACjB,CAACh0B,KACDA,EAAE,SAASiyB,KACXjyB,EAAE,SAASqyB,KACVryB,EAAE,SAAS6xB,KAAS,CAAC,SAAS,KAAK7xB,EAAE,IAAI,GAGtCoG,KACJ,kFAEI6tB,KAAS;AASf,SAASjJ,GACP,GACA,GACA,GACA,GACsC;CACtC,IAAM1nB,IAAI9F,EAAE,MACN8H,IAAO;CACb,EAAK,YAAYvB;CACjB,IAAMV,IAAIiC,EAAK,KAAKhC,CAAC;CACrB,IAAI,CAACD,GAAG;CAER,AADA/L,EAAKu6B,GAAOxuB,EAAE,EAAE,GAChB/L,EAAK,OAAO+L,EAAE,EAAE;CAChB,IAAMuG,IAAO,kDACP3I,IAAOoC,EAAE,EAAE,CAAC,YAAY,GAC1B5D,IAAIsE,IAAKV,EAAE,EAAE,CAAC,QACd6wB,IAAK;CACT,OAAOz0B,IAAI6D,EAAE,SAAQ;EACnB,EAAK,YAAY7D;EACjB,IAAMuE,IAAI4F,EAAK,KAAKtG,CAAC,CAAC,CAAE;EAExB,IADA,KAAKU,EAAE,QACHA,EAAEA,EAAE,SAAS,OAAO,KAEtB,OADA1M,EAAKu6B,GAAO7tB,CAAC,GACN;GAACvE;GAAG4D,EAAE,OAAO,MAAW,QAAM,OAAX;GAAwBpC;EAAI;EAExD,IAAI+C,MAAM,OAAOsoB,GAAM;GAGrB,AAFAh1B,EAAKu6B,GAAO7tB,CAAC,GACb,IAAI8vB,GAAMt2B,GAAGlG,GAAMmI,GAAG6sB,CAAI,GAC1B,IAAK;GACL;EACF;EACA,IAAM6H,IAAQ,CAAC,KAAK,KAAKnwB,CAAC;EAW1B,AAVA1M,EACE68B,IACI,OACAnwB,MAAM,OAAOA,MAAM,MACjB6tB,IACAqC,KAAMlwB,EAAE,OAAO,QAAOA,EAAE,OAAO,MAC7B,eACA,aACRA,CACF,GACKmwB,MAAO,IAAKnwB,MAAM;CACzB;CACA,OAAO;EAACvE;EAAG;EAAGwB;CAAI;AACpB;AAOA,SAASmzB,GAAI,GAAQ,GAAY,GAA6B;CAC5D,IAAM9wB,IAAI9F,EAAE,MACN62B,IAAIrJ,GAAKxtB,GAAGlG,GAAMkG,EAAE,OAAO8uB,CAAI;CACrC,IAAI,CAAC+H,GAAG,OAAO;CACf,IAAI,CAAC50B,GAAGa,KAAS+zB,GACXpzB,IAAOozB,EAAE;CACf,IAAI/zB,IAAQ,GAAG,OAAOb;CACtB,IAAI6sB,GAAM;EACR,IAAM5wB,IAAO;EACb,OAAO4E,IAAQ,KAAKb,IAAI6D,EAAE,SAAQ;GAChC,EAAK,YAAY7D;GACjB,IAAMuE,IAAItI,EAAK,KAAK4H,CAAC;GACrB,IAAIU,GAEF,AADA1M,EAAK,MAAM0M,EAAE,EAAE,GACf,KAAKA,EAAE,EAAE,CAAC;QACL,IAAIV,EAAE7D,OAAO,KAElB,AADAnI,EAAKu6B,GAAO,GAAG,GACf,IAAIiC,GAAMt2B,GAAGlG,GAAMmI,IAAI,GAAG6sB,CAAI;QACzB;IACL,IAAM/Q,IAAIyP,GAAKxtB,GAAGlG,GAAMmI,GAAG6sB,CAAI;IAC/B,AAAI/Q,IAAG,CAAC9b,GAAGa,KAAS,CAACib,EAAE,IAAIjb,IAAQib,EAAE,EAAE,IAClCjkB,EAAK,MAAMgM,EAAE,IAAI;GACxB;EACF;EACA,OAAO7D;CACT;CACA,IAAIwB,MAAS,YAAYA,MAAS,SAAS,OAAOxB;CAClD,IAAMs0B,IAAY,OAAO,KAAK9yB,KAAQ,IAAI;CAC1C,EAAM,YAAYxB;CAClB,IAAMgG,IAAMsuB,EAAM,KAAKzwB,CAAC,CAAC,EAAE,SAASA,EAAE,QAChCgxB,IAAQhxB,EAAE,MAAM9F,EAAE,OAAOiC,CAAC;CAWhC,OAVAjC,EAAE,IACA8F,EAAE,MAAM7D,GAAGgG,CAAG,GACdxE,MAAS,UACL,QACA,iBAAiB,KAAKqzB,CAAK,IACzB,eACA,wDAAwD,KAAKA,CAAK,IAChE,SACA,YACV,GACO7uB;AACT;AAIA,SAAS0tB,GAAQ,GAAqC;CACpD,QAAQ7G,GAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,OACH,OAAOiI,GAAGjI,CAAI;EAChB,KAAK,QACH,OAAOkI,GAAK;EACd,KAAK,OACH,OAAOptB,GAAI;EACb,KAAK,QACH,OAAOqtB,GAAK;EACd,KAAK,QACH,OAAOC,GAAK;EACd,KAAK,UACH,OAAOC,GAAO;EAChB,KAAK,QACH,OAAOC,GAAK;EACd,KAAK,OACH,OAAOC,GAAI;EACb,KAAK,QACH,OAAOC,GAAK;EACd,SACE,OAAOC,GAAS;CACpB;AACF;AAEA,SAASR,GAAG,GAA4B;CACtC,IAAMS,IAAK1I,MAAS,gBAAgBA,MAAS,OACvC2I,IAAW3B,EACf,iPACG0B,IACG,mIACA,GACR,GACME,IAAU5B,EACd,6BACG0B,IAAK,oDAAoD,GAC9D,GAsBM1rB,IAAgB;EACpB,CAAC,MAAM,MAAM;EACb,CAAC8oB,GAAK,oCAAoC;GAvBjB,GAAG,MAAS;GACrC,IAAM9uB,IAAI9F,EAAE,MACR,IAAIA,EAAE;GACV,IAAI8F,EAAE,OAAO,KAAK,OAAO;GACzB,IAAIvJ,IAAO;GACX,OAAO,IAAIuJ,EAAE,SACX,IAAIA,EAAE,OAAO,MAAM,KAAK;QACnB,IAAIA,EAAE,OAAO,KAAK;IACrB;IACA;GACF,OAAO,AAAIA,EAAE,OAAO,OAAOA,EAAE,IAAI,OAAO,OACtChM,EAAK06B,GAAK1uB,EAAE,MAAMvJ,GAAM,CAAC,CAAC,GAC1BzC,EAAKu6B,GAAO,GAAG,GACfv6B,EAAKu6B,GAAO,GAAG,GACf,IAAI,IAAOiC,GAAMt2B,GAAGlG,GAAM,IAAI,GAAGg1B,CAAI,KAChC;GAIT,OAFA,IAAI,KAAK,IAAI,GAAGhpB,EAAE,MAAM,GACxBhM,EAAK06B,GAAK1uB,EAAE,MAAMvJ,GAAM,CAAC,CAAC,GACnB;EACT;EAKE,CAACi4B,GAAKiC,EAAM;EACZ;GACE;GACA;IACC,MAAMD,GAAUx2B,EAAE,IAAI;EACzB;CACF;CAoCA,QAnCI8uB,MAAS,SAASA,MAAS,UAC7BhjB,EAAM,MAAM,GAAG,MACb9L,EAAE,KAAKA,EAAE,WAAW,OACpB,YAAY,KAAKA,EAAE,KAAKA,EAAE,QAAQ,MAAM,EAAE,KAC1Cw2B,GAAUx2B,EAAE,IAAI,IACZ42B,GAAI52B,GAAGlG,GAAMg1B,CAAI,IACjB,EACN,GAEFhjB,EAAM,KACJ,CAACwoB,GAAI,qBAAqB,GAC1B,CAACK,GAAK/rB,EAAM,GACZ,EACG,GAAG,MAAM;EACR,IAAMpG,IAAIxC,EAAE,MACN+d,IAAIgY,GAAM/1B,CAAC;EAajB,OAZIwC,GAAG,SAAS,MAAYub,EAAE,OAAO,MAAMuW,IAAK,OAE9CqD,MAAM,aACN33B,EAAE,WAAW,QACX+d,EAAE,OAAO,OAAOA,EAAE,OAAO,OAAQA,MAAM,UACxC,CAACvb,KAAKA,EAAE,SAASoyB,KAAO,UAAU,KAAKpyB,EAAE,IAAI,KAEvC+xB,IACLkD,EAAS,IAAIE,CAAC,IAAUlD,IACxBkD,MAAM,UAAUA,MAAM,UAAgB,YACtCA,MAAM,UAAUA,MAAM,cAAoB,SAC1C5Z,EAAE,OAAO,OAAOvb,GAAG,SAAS8xB,IAAWA,IACpCoD,EAAQ,IAAIC,CAAC,KAAKzB,GAASyB,CAAC,IAAI7C,KAAU;CACnD,GACA,6CACF,GACA,CAACD,GAAI,yBAAyB,GAC9B,CAACR,GAAO,iBAAiB,CAC3B,GACOvoB;AACT;AAEA,SAASkrB,KAAe;CACtB,OAAO;EACL,CAAC,MAAM,MAAM;EACb,CAACpC,GAAK,oCAAoC;EAC1C,CAACL,GAAM,yCAAyC;EAChD,CAACC,GAAKiC,EAAM;EACZ,CAAC9B,GAAK,yDAAyD;EAC/D,EACG,GAAG,MACFoB,GAAM/1B,CAAC,CAAC,CAAC,OAAO,MACZu0B,IACAoD,MAAM,UAAUA,MAAM,UACpB,YACAA,MAAM,SACJ,SACAA,MAAM,cAAcA,MAAM,QACxBhD,IACA,MACZ,mBACF;EACA,CAACN,GAAO,YAAY;CACtB;AACF;AAEA,SAASzqB,KAAc;CACrB,IAAMguB,KAAW,MAAW53B,EAAE,WAAW;CACzC,OAAO;EACL,CAAC,MAAM,MAAM;EACb,CAAC40B,GAAK,oCAAoC;EAC1C,CAAC;GAACN;GAAID;GAAOG;GAAKH;EAAK,GAAG,2BAA2B;EACrD,CAACG,GAAKiC,EAAM;EACZ,CAAChC,GAAI,yBAAyB;EAC9B,CAACC,GAAK,oBAAoB;EAC1B;GAACC;GAAK;GAA8BiD;EAAO;EAC3C,CAACjD,GAAK,yDAAyD;EAC/D,CAAC,aAAa,aAAa;EAC3B;GAAC;GAAa;IAAe,MAAM,CAACiD,EAAQ53B,CAAC,KAAKA,EAAE,MAAM,SAAS;EAAG;EACtE,EACG,GAAG,MAAM;GACR,IAAM+d,IAAIgY,GAAM/1B,CAAC,GACXwC,IAAIxC,EAAE;GAQZ,OANE+d,EAAE,OAAO,QACR/d,EAAE,WAAW,OACX43B,EAAQ53B,CAAC,MAAM,CAACwC,KAAKA,EAAE,SAASoyB,KAAO,UAAU,KAAKpyB,EAAE,IAAI,MAExD+xB,IACLxW,EAAE,OAAO,MAAYuW,IAClBsD,EAAQ53B,CAAC,KAAK+d,EAAE,OAAO,MAAM,OAAO;EAC7C,GACA,oBACF;EACA,CAACsW,GAAO,eAAe;EACvB,CAACQ,GAAI,cAAc;CACrB;AACF;AAEA,SAASoC,KAAe;CACtB,OAAO;EACL,CAACrC,GAAK,wBAAwB;EAC9B,CAACH,GAAI,eAAe;GACnB,GAAG,MAASmC,GAAI52B,GAAGlG,CAAI;EACxB,CAACg7B,IAAS,uCAAuC;EACjD,CAAC,MAAM,SAAS;CAClB;AACF;AAEA,SAASoC,KAAe;CACtB,IAAMO,IAAW3B,EACf,wHACF,GACM+B,IAAW,gDAEXC,KAAW,MAAW;EAC1B,IAAMt1B,IAAIxC,EAAE;EAEZ,OADIwC,GAAG,SAAS,OAAa,KAE3BxC,EAAE,QACF,CAACwC,KACDA,EAAE,SAASqyB,KACX,uDAAuD,KAAKryB,EAAE,IAAI;CAEtE;CAuBA,OAAO;EACL,CAAC,MAAM,MAAM;EACb;GAACoyB;GAAK;IAAa,MAAM,CAAC50B,EAAE,SAAS,WAAW,KAAKA,EAAE,KAAKA,EAAE,QAAQ,EAAE;EAAC;GAxBlD,GAAG,MAAS;GACnC,IAAM8F,IAAI9F,EAAE,MACR,IAAIA,EAAE;GACV,IAAI8F,EAAE,OAAO,MAAK,OAAO;GACzB,IAAIvJ,IAAO;GACX,OAAO,IAAIuJ,EAAE,UAAUA,EAAE,OAAO,MAAK,KACnC,IAAIA,EAAE,OAAO,MAAM;QACd,IAAIA,EAAE,OAAO,KAAK;IACrB,EAAS,YAAY;IACrB,IAAMD,IAAIgyB,EAAS,KAAK/xB,CAAC;IACzB,AAAID,MACF/L,EAAK06B,GAAK1uB,EAAE,MAAMvJ,GAAM,CAAC,CAAC,GAC1BzC,EAAK46B,GAAK7uB,EAAE,EAAE,GACd,IAAO,IAAIA,EAAE,EAAE,CAAC,QAChB,IAAItJ,IAAO;GAEf;GAIF,OAFA,IAAI,KAAK,IAAI,IAAI,GAAGuJ,EAAE,MAAM,GAC5BhM,EAAK06B,GAAK1uB,EAAE,MAAMvJ,GAAM,CAAC,CAAC,GACnB;EACT;EAKE,CAACi4B,GAAK,WAAW;EACjB,CAACE,GAAKmD,CAAQ;EACd;GACEnD;GACA;IACC,MACCoD,EAAQ93B,CAAC,KACT,sCAAsC,KAAKA,EAAE,MAAM,QAAQ,EAAE;EACjE;EACA,CAAC20B,GAAK,wBAAwB;EAC9B,EACG,GAAG,MAAOmD,EAAQ93B,CAAC,IAAKy3B,EAAS,IAAIE,CAAC,IAAIlD,IAAKH,IAAM,MACtD,+BACF;EACA,CAACO,GAAI,uBAAuB;EAC5B,CAACR,GAAO,iBAAiB;CAC3B;AACF;AAEA,SAAS8C,KAAiB;CACxB,IAAMM,IAAW3B,EACf,+KACF,GACMiC,IAAWjC,EACf,4EACF;CACA,OAAO;EACL,CAAC,MAAM,MAAM;EACb,CAAClB,GAAK,UAAU;EAChB,CAACJ,GAAK,2CAA2C;EACjD,CAACA,GAAK,sDAAsD;EAC5D;GAACF;GAAI;GAAY0B;EAAM;EACvB,CAACrB,GAAK/rB,EAAM;EACZ,EACG,GAAG,MAAM;GACR,IAAMpG,IAAIxC,EAAE,MAAM,MACZ+d,IAAIgY,GAAM/1B,CAAC;GAOjB,OANIwC,MAAM,MAAYub,EAAE,OAAO,MAAMuW,IAAK,OACtCmD,EAAS,IAAIE,CAAC,IAAUlD,IACxBkD,MAAM,UAAUA,MAAM,UAAgB,YACtCA,MAAM,SAAe,SACrBn1B,MAAM,QAAc8xB,IACpB9xB,MAAM,WAAWu1B,EAAS,IAAIJ,CAAC,KAAKzB,GAASyB,CAAC,IAAU7C,KACrD/W,EAAE,OAAO,MAAMuW,IAAK;EAC7B,GACA,2CACF;EACA,CAACO,GAAI,0BAA0B;EAC/B,CAACR,GAAO,gBAAgB;CAC1B;AACF;AAEA,SAAS+C,KAAe;CACtB,OAAO;EACL,CAAC,MAAM,MAAM;EACb;GAACxC;GAAK;GAAYqB;EAAU;EAC5B;GAAC5B;GAAO;GAA2B2B;EAAM;EACzC;GACEzB;GACA;IACC,MAAMv0B,EAAE,QAAQ,WAAW,KAAKA,EAAE,MAAM,QAAQ,EAAE;EACrD;EACA,CAACq0B,GAAO,eAAe;EACvB,CAACK,GAAK,aAAa;EACnB,CAACD,GAAI,cAAc;EACnB,CAACI,GAAI,kCAAkC;EACvC,CAACL,GAAK,0CAA0C;EAChD,CAACH,GAAO,YAAY;EACpB,EACG,MAAS;GACR,IAAMzxB,IAAI1E,EAAK,KAAK;GACpB,OAAO,kCAAkC,KAAK0E,CAAC,IAC3C,YACA,gBAAgB,KAAKA,CAAC,IACpB,SACA,qFAAqF,KACjFA,CACF,IACA+xB,IACAH;EACV,GACA,4BACF;CACF;AACF;AAEA,SAAS6C,KAAc;CACrB,IAAMI,IAAW3B,EACf,wRACF,GACMkC,IAAQlC,EACZ,mGACF;CACA,OAAO;EACL,CAAC,MAAM,MAAM;EACb,CAAClB,GAAK,kCAAkC;EACxC,CAACJ,GAAK,6BAA6B;EACnC,CAACD,GAAM,2BAA2B;EAClC,CAACG,GAAK,gBAAgB;EACtB,CAACC,GAAK/rB,EAAM;EACZ,EACG,GAAG,MAAM;GACR,IAAMqvB,IAAQN,EAAE,YAAY;GAK5B,OAJIM,MAAU,UAAUA,MAAU,UAAgB,YAC9CA,MAAU,SAAe,SACzBR,EAAS,IAAIQ,CAAK,IAAUxD,IAC5BuD,EAAM,IAAIC,CAAK,IAAUnD,KACtBiB,GAAM/1B,CAAC,CAAC,CAAC,OAAO,MAAMs0B,IAAK;EACpC,GACA,kBACF;EACA,CAACO,GAAI,mBAAmB;EACxB,CAACR,GAAO,aAAa;CACvB;AACF;AAEA,SAASiD,KAAe;CAEtB,OAAO;EACL,CAAC7C,GAAI,+CAA+C;EACpD,CAAC,WAAW,WAAW;EACvB,CAAC,YAAY,aAAa;EAC1B,CAAC,WAAW,aAAa;EACzB,CAAC,MAAM,aAAa;CACtB;AACF;AAEA,SAAS8C,KAAmB;CA2B1B,OAAO;EACL,CAAC,MAAM,MAAM;GA3BS,GAAG,MAAS;GAClC,IAAI,CAACv3B,EAAE,MAAM,OAAO;GACpB,IAAM8F,IAAI9F,EAAE,MACN8H,IAAO;GACb,EAAK,YAAY9H,EAAE;GACnB,IAAM6F,IAAIiC,EAAK,KAAKhC,CAAC;GACrB,IAAI,CAACD,GAAG,OAAO;GACf,EAAKwuB,GAAOxuB,EAAE,EAAE;GAChB,IAAM9C,IAAQ/C,EAAE,QAAQ6F,EAAE,EAAE,CAAC,QACvB0wB,IAAY,OAChB,iBAAiB1wB,EAAE,EAAE,CAAC,GAAG,GAAGA,EAAE,EAAE,CAAC,OAAO,qBACxC,GACF;GACA,EAAM,YAAY9C;GAClB,IAAMm1B,IAAI3B,EAAM,KAAKzwB,CAAC,GAChBmC,IAAMiwB,IAAIA,EAAE,QAAQpyB,EAAE;GAK5B,IAJA9F,EAAE,IACA8F,EAAE,MAAM/C,GAAOkF,CAAG,GAClB+sB,GAAsBnvB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAClD,GACI,CAACqyB,GAAG,OAAOjwB;GACf,IAAMkwB,IAAS,YAAY,KAAKD,EAAE,EAAE,CAAC,CAAE;GAGvC,OAFAp+B,EAAK,MAAMq+B,CAAM,GACjBr+B,EAAKu6B,GAAO6D,EAAE,EAAE,CAAC,MAAMC,EAAO,MAAM,CAAC,GAC9BlwB,IAAMiwB,EAAE,EAAE,CAAC;EACpB;EAIE;GAAC;GAAW;GAAyBlC;EAAM;EAC3C;GACE3B;GACA;GACA2B;EACF;EACA,CAAC,MAAM,WAAW;EAClB,CAACxB,GAAK,aAAa;EACnB;GACEC;GACA;IACC,MAAM,CAAC,KAAK,KAAKz0B,EAAE,KAAKA,EAAE,QAAQ,MAAM,EAAE;EAC7C;EACA,CAAC,CAACu0B,GAAM,YAAY,GAAG,wCAAwC;EAC/D,CAAC,cAAc,+BAA+B;EAC9C,CAAC,MAAM,iBAAiB;CAC1B;AACF;;;ACjtBA,IAAa6D,KAA2C;CACtD;CACA;CACA;CACA;CACA;CACA;AACF,GAOaC,KAA+B,4BAG/BC,KAAiB,IAExBC,MAAU,MAAiBpL,KAAQ,SAAUA,KAAQ,OACrDqL,MAAS,MAAiBrL,KAAQ,SAAUA,KAAQ;AAQ1D,SAAgBsL,GACd,GACA,GACA,GACqC;CAErC,IADI,OAAO11B,KAAU,YAAY,OAAOkF,KAAQ,YAC5C,OAAO,MAAMlF,CAAK,KAAK,OAAO,MAAMkF,CAAG,GAAG,OAAO;CACrD,IAAMU,IAASwkB,EAAK,QACd1rB,KAAS,MACb,KAAK,IAAIkH,GAAQ,KAAK,IAAI,GAAG,OAAO,SAASoV,CAAC,IAAI,KAAK,MAAMA,CAAC,IAAIA,CAAC,CAAC,GAClE,IAAItc,EAAM,KAAK,IAAIsB,GAAOkF,CAAG,CAAC,GAC9BtF,IAAIlB,EAAM,KAAK,IAAIsB,GAAOkF,CAAG,CAAC;CAIlC,OAHI,IAAI,KAAKuwB,GAAMrL,EAAK,WAAW,CAAC,CAAC,KAAKoL,GAAOpL,EAAK,WAAW,IAAI,CAAC,CAAC,KAAG,KACtExqB,IAAIgG,KAAU6vB,GAAMrL,EAAK,WAAWxqB,CAAC,CAAC,KAAK41B,GAAOpL,EAAK,WAAWxqB,IAAI,CAAC,CAAC,KAC1E,KACK,IAAIA,IAAI,CAAC,GAAGA,CAAC,IAAI;AAC1B;AAgBA,SAAgB+1B,GACd,GACA,GACkB;CAClB,IAAMvL,IAAO5lB,EAAO,KAAK,MAAU8W,EAAM,IAAI,CAAC,CAAC,KAAK,EAAE;CACtD,IAAI,CAAC8O,GAAM,OAAO,CAAC;CAEnB,IAAMT,IAA0D,CAAC,GAC3DziB,oBAAS,IAAI,IAAY,CAAC,GAAGkjB,EAAK,MAAM,CAAC;CAC/C,CAAC,MAAM,QAAQ0C,CAAK,IAAIA,IAAQ,CAAC,EAAA,CAAG,SAAS,GAAM,MAAU;EAC3D,IAAMqB,IACJM,KAAQ,OAAOA,KAAS,WACpBiH,GAAetL,GAAMqE,EAAK,OAAOA,EAAK,GAAG,IACzC;EACN,AAAKN,MACLxE,EAAO,KAAK;GAAE;GAAO,OAAOwE,EAAM;GAAI,KAAKA,EAAM;EAAG,CAAC,GACrDjnB,EAAO,IAAIinB,EAAM,EAAE,CAAC,CAAC,IAAIA,EAAM,EAAE;CACnC,CAAC;CACD,IAAMyH,IAAS,CAAC,GAAG1uB,CAAM,CAAC,CAAC,MAAM,GAAG,MAAMrG,IAAIjB,CAAC,GACzCi2B,IAAU,MAAcD,EAAO,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,GAClDE,KAAQ,MAAmB;EAC/B,IAAIrzB,IAAK,GACLD,IAAKozB,EAAO,SAAS;EACzB,OAAOnzB,IAAKD,IAAI;GACd,IAAMkB,IAAOjB,IAAKD,KAAO;GACzB,AAAIozB,EAAOlyB,KAAOke,IAAQ,IAAKle,IAAM,IAChC,IAAKA;EACZ;EACA,OAAOjB;CACT;CACA,KAAK,IAAM0rB,KAASxE,GAClB,KAAK,IAAIzqB,IAAI42B,EAAK3H,EAAM,KAAK,GAAGyH,EAAO12B,KAAKivB,EAAM,KAAK,KACrD,EAAIjvB,KAAKivB,EAAM;CAInB,IAAM4H,IAAyB,CAAC,GAC5BC,IAAW,GACXpU,IAAS;CACb,KAAK,IAAM,EAAE,SAAM,aAAUpd,GAAQ;EACnC,IAAIhL,IAAO;EACX,OAAOA,IAAO2B,EAAK,SAAQ;GACzB,OAAOy6B,EAAOI,IAAW,MAAMpU,IAASpoB,IAAM;GAC9C,IAAMgrB,IAAK,KAAK,IAAIrpB,EAAK,QAAQy6B,EAAOI,IAAW,KAAKpU,CAAM,GACxD3c,IAAQ4wB,EAAIG,IACZC,IAAQ;IAAE;IAAM,MAAM96B,EAAK,MAAM3B,GAAMgrB,CAAE;GAAE,GAC3CiO,IAAOsD,EAAKA,EAAK,SAAS;GAahC,AAZItD,KAAQA,EAAK,UAAUxtB,KAASwtB,EAAK,QAAQ7Q,IAASpoB,KACxDi5B,EAAK,OAAO,KAAKwD,CAAK,GACtB,EAAK,MAAMrU,IAAS4C,KAEpBuR,EAAK,KAAK;IACR,MAAM9wB,IAAQ,IAAI,OAAQ6nB,EAAuB7nB;IACjD;IACA,OAAO2c,IAASpoB;IAChB,KAAKooB,IAAS4C;IACd,QAAQ,CAACyR,CAAK;GAChB,CAAC,GAEH,IAAOzR;EACT;EACA,KAAUrpB,EAAK;CACjB;CACA,OAAO46B;AACT;AAQA,SAAgBG,GACd,GACoB;CACpB,IAAM1L,IAA4B,CAAC,CAAC,CAAC;CACrC,KAAK,IAAM2L,KAAOJ,GAAM;EACtB,IAAIz+B,IAAiC,MACjCsqB,IAASuU,EAAI;EACjB,KAAK,IAAM,EAAE,SAAM,aAAUA,EAAI,QAC/B,EAAK,MAAM,IAAI,CAAC,CAAC,SAAS,GAAM,MAAM;GAMpC,AALIj3B,MACFsrB,EAAM,KAAK,CAAC,CAAC,GACb,IAAU,MACV,MAEG9jB,MACApP,MACH,IAAU;IACR,MAAM6+B,EAAI;IACV,OAAOA,EAAI;IACX,OAAOvU;IACP,KAAKA;IACL,QAAQ,CAAC;GACX,GACA4I,EAAMA,EAAM,SAAS,EAAE,CAAC,KAAKlzB,CAAO,IAEtCA,EAAQ,OAAO,KAAK;IAAE;IAAM,MAAMoP;GAAK,CAAC,GACxC,KAAUA,EAAK,QACf,EAAQ,MAAMkb;EAChB,CAAC;CAEL;CAEA,OADI4I,EAAM,SAAS,KAAK,CAACA,EAAMA,EAAM,SAAS,EAAE,CAAC,UAAQA,EAAM,IAAI,GAC5DA;AACT;AAQA,SAAgB4L,GAAmB,GAA0C;CAC3E,IAAMn/B,IAAQ,OAAOiG,KAAU,WAAWA,EAAM,KAAK,IAAI;CAKzD,OAJKjG,IACCo+B,GAAuC,SAASp+B,CAAK,IAGpD,sBADLA,MAAU,YAAY,4BAA4B,SAASA,EAAM,SACjC,sBAHmCA,IADlD;AAKrB;AASA,SAAgBo/B,GACd,GACA,GACQ;CACR,IAAMp/B,IAAQ,OAAOiG,KAAU,WAAWA,EAAM,KAAK,IAAI;CACzD,IAAI,CAACjG,GAAO,OAAOq+B;CACnB,IAAI,CAAED,GAAuC,SAASp+B,CAAK,GAAG,OAAOA;CACrE,IAAMsC,IACJ+8B,EAAOr/B,MAAU,YAAY,qBAAqB,GAAGA,EAAM;CAC7D,OACGsC,KAAQuI,GAASvI,GAAM,eAAA,EAA6B,KAAA;AAGzD;;;AClOA,SAAgBg9B,GAAgB,GAAM,GAAe;CACnD,IAAI,OAAO,GAAG11B,GAAGjB,CAAC,GAAG,OAAO;CAC5B,IACE,OAAOiB,KAAM,YACb,OAAOjB,KAAM,YACbiB,MAAM,QACNjB,MAAM,QACN,MAAM,QAAQiB,CAAC,MAAM,MAAM,QAAQjB,CAAC,GAEpC,OAAO;CAET,IAAM42B,IAAQ,OAAO,KAAK31B,CAAC,GACrB41B,IAAQ,OAAO,KAAK72B,CAAC;CAC3B,IAAI42B,EAAM,WAAWC,EAAM,QAAQ,OAAO;CAC1C,KAAK,IAAMl5B,KAAOi5B,GAChB,IACE,CAAC,OAAO,UAAU,eAAe,KAAK52B,GAAGrC,CAAG,KAC5C,CAAC,OAAO,GACLsD,EAA8BtD,IAC9BqC,EAA8BrC,EACjC,GAEA,OAAO;CAGX,OAAO;AACT;AAQA,SAAgBm5B,GACd,GACA,IAAiC,CAAC,GAChB;CAClB,IAAMt/B,IAASX,EAAQ,UAAU8/B,IAC7BI,IAAQC,GACNhgC,oBAAY,IAAI,IAAsB;CAC5C,OAAO;EACL,gBAAgB+/B;EAChB,SAAS,GAAM;GACb,IAAM1/B,IACJ,OAAOE,KAAS,aAAcA,EAAwBw/B,CAAK,IAAIx/B;GACjE,IAAIC,EAAOH,GAAO0/B,CAAK,GAAG;GAC1B,IAAMz/B,IAAOy/B;GACb,IAAQ1/B;GACR,KAAK,IAAMD,KAAY,CAAC,GAAGJ,CAAS,GAAG,EAAS+/B,GAAOz/B,CAAI;EAC7D;EACA,UAAU,GAAU;GAElB,OADAN,EAAU,IAAII,CAAQ,SACT;IACX,EAAU,OAAOA,CAAQ;GAC3B;EACF;CACF;AACF;AAwBA,IAAa6/B,KAA8B;CACzC,aAAa,GAAU,MAAO,WAAW,WAAWC,GAAUC,CAAE;CAChE,eAAe,MACb,WAAW,aAAaC,CAAuC;CACjE,WAAW,KAAK,IAAI;AACtB,GAqDMC,MACJ,GACA,GACA,MACM;CACN,IAAI9/B,IAAOw/B;CACX,KAAK,IAAMp5B,KAAOC,GAAM;EACtB,IAAMvG,IAAQigC,EAAM35B;EACpB,AAAItG,MAAU,KAAA,KAAa,CAAC,OAAO,GAAGE,EAAKoG,IAAMtG,CAAK,MACpD,IAAO;GAAE,GAAGE;IAAOoG,IAAMtG;EAAM;CAEnC;CACA,OAAOE;AACT;AAYA,SAAgBggC,EACd,GACA,GACkB;CAClB,IAAM35B,IAAO45B,EAAW,cAAc,CAAC,GACnCF,IAAW,EAAE,GAAGG,EAAa,GAC3BC,KAAa,GAAU,GAAM,MACjCF,EAAW,YAAYA,EAAW,UAAUT,GAAOl3B,GAAGvI,CAAI,IAAIy/B,GAE1Dh2B,IAAQy2B,EAAW,QAAQF,CAAK,GAChCK,IAAQb,GACZY,EAAUL,GAAgBt2B,GAAOu2B,GAAO15B,CAAI,GAAG05B,GAAOv2B,CAAK,CAC7D,GAEM62B,KAAW,GAAU,MAA4B;EACrD,IAAM/3B,IAAIg4B,IAAU;GAAE,GAAGP;GAAO,GAAGO;EAAQ,IAAIP;EAC/C,OAAOI,EAAUL,GAAgBN,GAAOl3B,GAAGjC,CAAI,GAAGiC,GAAGk3B,CAAK;CAC5D,GAEMe,KAAQ,MAA4B;EACxC,IAAMxgC,IAAOqgC,EAAM,SAAS;EAC5B,IAAK3a,GAAwB,SAAS,QAAQ;GAE5C,AADA,IAAQ;IAAE,GAAGsa;IAAO,GAAIta,EAAuB;GAAM,GACrD2a,EAAM,SAASC,EAAQtgC,CAAI,CAAC;GAC5B;EACF;EACA,IAAMygC,IAAUP,EAAW,OAAOlgC,GAAM0lB,GAAYsa,CAAK;EACzD,AAAIS,MAAYzgC,MAGhBqgC,EAAM,SACJD,EAAUL,GAAgBU,GAAST,GAAO15B,CAAI,GAAG05B,GAAOhgC,CAAI,CAC9D,GACAkgC,EAAW,UAAUE,EAAUK,GAAST,GAAOhgC,CAAI,GAAGA,GAAMggC,CAAK;CACnE;CAEA,OAAO;EACL,UAAUK,EAAM;EAChB,WAAWA,EAAM;EACjB;EACA,gBAAgBL;EAChB,WAAW,MAAYQ,EAAK;GAAE,MAAM;GAAQ,OAAOD;EAAQ,CAAC;EAC5D;CACF;AACF;AAGA,IAAaG,MAAiB,GAAM,GAAM,MACxC,CAAC,OAAO,GAAG/2B,EAAEtD,IAAMqC,EAAErC,EAAI,GC5MrBs6B,MAAU,MACVlB,EAAM,UAAU,YAAkB;CAAE,GAAGA;CAAO,OAAO;AAAO,IAC5DA,EAAM,UAAU,YAAkB;CAAE,GAAGA;CAAO,OAAO;AAAS,IAC3DA,GAIImB,MAAuB,MAClCnB,EAAM,UAAU;AAGlB,SAAgBoB,GACd,IAAyB,CAAC,GACP;CACnB,OAAOZ,EACL;EACE,YAAY,CAAC,MAAM;EACnB,UAAU,MAAM;GACd,IAAMpyB,IAAOtF,EAAE,QAAQA,EAAE,eAAe;GACxC,OAAO;IAAE;IAAM,OAAOsF,IAAO,SAAS;GAAS;EACjD;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,QAAQ6X,EAAM,MAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK,UAAU;KACb,IAAInd,EAAE,UAAU,OAAOk3B;KACvB,IAAM5xB,IACJ6X,EAAM,SAAS,WAAW,CAAC+Z,EAAM,OAAO/Z,EAAM,SAAS;KACzD,OAAO7X,MAAS4xB,EAAM,OAAOA,IAAQ;MAAE,GAAGA;MAAO;KAAK;IACxD;IACA,KAAK;IACL,KAAK,kBACH,OAAOkB,GAAOlB,CAAK;IACrB,SACE,OAAOA;GACX;EACF;EAEA,UAAU,GAAO,GAAG;GAClB,IAAMqB,IAAWv4B,EAAE,YAAY,IAC3B,EAAE,aAAUk3B;GAQhB,OAPIA,EAAM,SAASsB,MAAU,YAAYA,MAAU,aACjD,IAAQD,IAAW,YAAY,SACtB,CAACrB,EAAM,SAASsB,MAAU,UAAUA,MAAU,aACvD,IAAQD,IAAW,YAAY,WACrBA,MACV,IAAQrB,EAAM,OAAO,SAAS,WAEzBsB,MAAUtB,EAAM,QAAQA,IAAQ;IAAE,GAAGA;IAAO;GAAM;EAC3D;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAIuB,EAAU,SAAShhC,EAAK,QAAMuI,EAAE,eAAey4B,EAAU,IAAI;EACnE;CACF,GACAhB,CACF;AACF;;;AC1FA,IAAMiB,KAA6B;CACjC,aAAa,GAAU,MAAO,WAAW,WAAWrB,GAAUC,CAAE;CAChE,eAAe,MACb,WAAW,aAAaC,CAAuC;CACjE,WAAW,KAAK,IAAI;AACtB,GAGaoB,KAAyB,KAEzBC,KAA8B;AAoJ3C,SAAgBC,GACd,GACA,GACK;CACL,IAAMvzB,IAAOwzB,EAAO,QAAQ,MAAM90B,EAAE,UAAU,MAAM;CACpD,OAAOsB,EAAK,MAAM,GAAG,KAAK,IAAI,GAAGA,EAAK,SAASpG,CAAG,CAAC;AACrD;AAGA,SAAgB65B,GACd,IAA2B,CAAC,GACV;CAClB,IAAMC,IAAW9d,EAAO,mBAAmB,KACrC+d,IAAY/d,EAAO,aAAawd,IAChCQ,IAAkBhe,EAAO,mBAAA,KACzBie,IAAeje,EAAO,gBAAA,KAItB4c,IAAQb,GACZ,EAAE,QAAQ,CAAC,EAAE,GACb,EAAE,QAAQ,OAAO,GAAG,CACtB,GACMmC,oBAAY,IAAI,IAAqD,GACrEC,oBAAS,IAAI,IAAyB,GACxCC,IAAY,GAEVR,UAAehB,EAAM,SAAS,CAAC,CAAC,QAChCyB,KAAa,MAAiBzB,EAAM,SAAS,EAAE,QAAQpgC,EAAK,CAAC,GAC7D8hC,KAAU,MAA0C;EACxD,KAAK,IAAMx4B,KAAM,CAAC,GAAGo4B,CAAS,GAAG,EAAGjc,CAAK;CAC3C,GAEMsc,KAAc,MAAqB;EACvC,IAAMC,IAAQL,EAAO,IAAIM,CAAE;EAE3B,AADID,KAAOT,EAAU,aAAaS,EAAM,MAAM,GAC9CL,EAAO,OAAOM,CAAE;CAClB,GAEMC,KAAY,GAAkB,MAAqB;EAEvD,AADAH,EAAWE,CAAE,GACT,OAAY,MAChBN,EAAO,IAAIM,GAAI;GACb,QAAQV,EAAU,iBAAiBY,EAAQF,GAAI,SAAS,GAAGryB,CAAQ;GACnE,UAAU2xB,EAAU,IAAI,IAAI3xB;GAC5B,WAAWA;GACX,QAAQ;EACV,CAAC;CACH,GAEMwyB,KAAO,GAA+B,MAA4B;EACtE,IAAMH,IAAK3iC,EAAQ,MAAM,EAAEsiC;EAC3B,IAAI,CAACN,EAAS,GAAG,OAAOW;EACxB,IAAMI,IAAU/iC,EAAQ,WAAW,IAC7BU,IAAO;GACX,GAAGqvB;GACH;GACA,OAAO/vB,EAAQ,SAAS;GACxB;GACA,OAAOA,EAAQ;GACf,aAAaA,EAAQ;GACrB,UAAUA,EAAQ,aAAa+iC,IAAU,IAAIb;GAC7C,MAAMliC,EAAQ;GACd,UAAUA,EAAQ,YAAY;GAC9B,QAAQA,EAAQ;GAChB,SAASA,EAAQ;GACjB,OAAO;EACT,GACMmqB,IAAO2X,EAAO,GACdtzB,IAAQ2b,EAAK,WAAW,MAAMnd,EAAE,OAAO21B,CAAE;EAC/C,IAAIn0B,KAAS,GAAG;GACd,IAAMw0B,IAAU7Y,EAAK,MAAM;GAE3B,AADA,EAAQ3b,KAAS9N,GACjB6hC,EAAUS,CAAO;EACnB,OACE,EAAU,CAAC,GAAG7Y,GAAMzpB,CAAI,CAAC;EAG3B,OADAkiC,EAASD,GAAIjiC,EAAK,QAAQ,GACnBiiC;CACT,GAEMM,KACJ,GACA,MACG;EACH,IAAMpiC,IAAUihC,EAAO,CAAC,CAAC,MAAM,MAAM,EAAE,OAAOa,KAAM,EAAE,UAAU,MAAM;EACtE,IAAI,CAAC9hC,GAAS;EAId,IAAMqiC,IACJljC,EAAQ,YAAY,KAAA,KAAaA,EAAQ,YAAYa,EAAQ,SACzDsiC,IAAkBtiC,EAAQ,UAAU,IAAIqhC,GACxC5xB,IACJtQ,EAAQ,aACPkjC,KAAkBriC,EAAQ,aAAasiC,IACpC,KAAA,IACAtiC,EAAQ;EAGd,EAAI;GAAE,GAAGA;GAAS,GAAGb;GAAS;GAAI;EAAS,GAAGa,CAAO;CACvD;CAEA,SAASgiC,EACP,GACA,IAAgC,WAC1B;EACN,EAAWF,CAAE;EACb,IAAMS,IAAUtB,EAAO,CAAC,CAAC,MAAM,MAAM,EAAE,OAAOa,KAAM,EAAE,UAAU,MAAM;EACtE,AAAKS,MACLb,EACET,EAAO,CAAC,CAAC,KAAK,MAAO,EAAE,OAAOa,IAAK;GAAE,GAAG;GAAG,OAAO;EAAU,IAAI,CAAE,CACpE,GACAS,EAAQ,UAAUT,CAAE,GACpBH,EAAO;GAAE,MAAM;GAAS,MAAMY;GAAS;EAAO,CAAC,GAC/CnB,EAAU,iBAAiB;GAEzB,IAAMphC,IAAUihC,EAAO,CAAC,CAAC,MAAM,MAAM,EAAE,OAAOa,CAAE;GAChD,AAAI9hC,GAAS,UAAU,cACvB0hC,EAAUT,EAAO,CAAC,CAAC,QAAQ,MAAM,EAAE,OAAOa,CAAE,CAAC,GAC7CH,EAAO;IAAE,MAAM;IAAU,MAAM3hC;GAAQ,CAAC;EAC1C,GAAGshC,CAAY;CACjB;CAEA,IAAMkB,UAAmB;EACvB,KAAK,IAAMr2B,KAAK80B,EAAO,GAAG,EAAQ90B,EAAE,EAAE;CACxC,GAEMs2B,KAAS,MAAqB;EAClC,IAAMZ,IAAQL,EAAO,IAAIM,CAAE;EAC3B,AAAKD,KAAS,GAAM,WACpBT,EAAU,aAAaS,EAAM,MAAM,GACnC,EAAM,YAAY,KAAK,IAAI,GAAGA,EAAM,WAAWT,EAAU,IAAI,CAAC,GAC9D,EAAM,SAAS;CACjB,GAEMsB,KAAU,MAAqB;EACnC,IAAMb,IAAQL,EAAO,IAAIM,CAAE;EAC3B,AAAKD,GAAO,WACZ,EAAM,SAAS,IACf,EAAM,WAAWT,EAAU,IAAI,IAAIS,EAAM,WACzC,EAAM,SAAST,EAAU,iBACjBY,EAAQF,GAAI,SAAS,GAC3BD,EAAM,SACR;CACF,GAEMc,UAAc;EAClB,KAAK,IAAMb,KAAM,CAAC,GAAGN,EAAO,KAAK,CAAC,GAAG,EAAWM,CAAE;EAClD,EAAU,CAAC,CAAC;CACd;CA4BA,OAAO;EACL,UAAU7B,EAAM;EAChB,WAAWA,EAAM;EACjB,OA7BY,MAAiC;GAC7C,QAAQ3a,EAAM,MAAd;IACE,KAAK;KACH,EAAIA,EAAM,SAASA,EAAM,KAAK;KAC9B;IACF,KAAK;KACH,EAAOA,EAAM,IAAIA,EAAM,OAAO;KAC9B;IACF,KAAK;KACH,EAAQA,EAAM,IAAIA,EAAM,MAAM;KAC9B;IACF,KAAK;KACH,EAAW;KACX;IACF,KAAK;KACH,EAAMA,EAAM,EAAE;KACd;IACF,KAAK;KACH,EAAOA,EAAM,EAAE;KACf;IACF,KAAK,SACH,EAAM;GAEV;EACF;EAME;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,MAAOkc,EAAO,IAAIM,CAAE,CAAC,EAAE,UAAU;EAC5C;EACA,mBAAmB,GAAU;GAE3B,OADAP,EAAU,IAAI7hC,CAAQ,SACT;IACX,EAAU,OAAOA,CAAQ;GAC3B;EACF;CACF;AACF;;;AC5TA,IAAakjC,MAAiB,GAA0B,MACtDvD,EAAM,MAAM,SAAS1/B,CAAK,GAEtBkjC,MAAiB,GAAiB,MACtCt5B,EAAE,WAAWjB,EAAE,UAAUiB,EAAE,OAAO,GAAG,MAAM,OAAO,GAAGhB,GAAGD,EAAEV,EAAE,CAAC;AAG/D,SAAgBk7B,GACd,IAA2B,CAAC,GACP;CACrB,IAAMC,KACJ,GACA,GACA,MACiB;EACjB,IAAMC,IAAW76B,EAAE,SAAS,YACtB86B,IAAW96B,EAAE,qBAAqB,KAClCd,IAAM27B,IAAY76B,EAAE,OAAO,WAAY,GACvC+6B,IAAaF,MAAa76B,EAAE,cAAc,KAG1Cg7B,IAASH,IAAWhjC,EAAQ,OAAOijC,CAAQ,IAAI,CAAC,GAEhDG,KAAU,MACVH,EAAStjC,CAAK,KAAKK,EAAQ,SAASL,CAAK,IAAUK,IAClDgjC,IACEhjC,EAAQ,UAAUqH,IAAMrH,IAAU,CAAC,GAAGA,GAASL,CAAK,IADrC,CAACA,CAAK,GAGxB0jC,KAAY,MAA2B;GAC3C,IAAI,CAACrjC,EAAQ,SAASL,CAAK,KAAMqjC,KAAYC,EAAStjC,CAAK,GACzD,OAAOK;GAET,IAAMH,IAAOG,EAAQ,QAAQ,MAAM,CAAC,OAAO,GAAGuI,GAAG5I,CAAK,CAAC;GACvD,OAAOE,EAAK,WAAW,KAAK,CAACqjC,IAAaljC,IAAUH;EACtD;EAEA,QAAQylB,EAAM,MAAd;GACE,KAAK,UACH,OAAO8d,EAAO9d,EAAM,KAAK;GAC3B,KAAK,YACH,OAAO+d,EAAS/d,EAAM,KAAK;GAC7B,KAAK,UACH,OAAOtlB,EAAQ,SAASslB,EAAM,KAAK,IAC/B+d,EAAS/d,EAAM,KAAK,IACpB8d,EAAO9d,EAAM,KAAK;GACxB,KAAK,OAAO;IACV,IAAMuP,IAASvP,EAAM,MAAM,QAAQ,GAAG,GAAG,MAChC,CAAC2d,EAAS16B,CAAC,KAAK7F,EAAI,QAAQ6F,CAAC,MAAMX,CAC3C,GACK/H,IAAO,CAAC,GAAGsjC,GAAQ,GAAGtO,CAAM,CAAC,CAAC,MAAM,GAAGmO,IAAW37B,IAAM,CAAC;IAC/D,OAAOxH,EAAK,WAAW,KAAK,CAACqjC,IAAaljC,IAAUH;GACtD;GACA,KAAK,cAAc;IACjB,IAAI,CAACmjC,GAAU,OAAOhjC;IACtB,IAAMH,IAAO,CAAC,GAAGG,CAAO;IACxB,KAAK,IAAMuI,KAAKJ,EAAE,SAAS,CAAC,GAAG;KAC7B,IAAItI,EAAK,UAAUwH,GAAK;KACxB,AAAI,CAAC47B,EAAS16B,CAAC,KAAK,CAAC1I,EAAK,SAAS0I,CAAC,KAAG1I,EAAK,KAAK0I,CAAC;IACpD;IACA,OAAO1I;GACT;GACA,KAAK,SAAS;IACZ,IAAMA,IAAOmjC,IAAWhjC,EAAQ,OAAOijC,CAAQ,IAAI,CAAC;IACpD,OAAOpjC,EAAK,WAAW,KAAK,CAACqjC,IAAaljC,IAAUH;GACtD;GACA,SACE,OAAOG;EACX;CACF;CAEA,OAAO6/B,EACL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO,EAAE,OAAO13B,EAAE,SAASA,EAAE,gBAAgB,CAAC,EAAE;EAC1D,OAAO,GAAO,GAAO,GAAG;GACtB,IAAMxI,IAAQojC,EAAY1D,EAAM,OAAO/Z,GAAOnd,CAAC;GAC/C,OAAO06B,GAAWljC,GAAO0/B,EAAM,KAAK,IAAIA,IAAQ,EAAE,SAAM;EAC1D;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAKwD,GAAWjC,EAAU,OAAOhhC,EAAK,KAAK,KACzCuI,EAAE,gBAAgB,CAAC,GAAGy4B,EAAU,KAAK,CAAC;EAE1C;CACF,GACAhB,CACF;AACF;;;AC9DA,IAAa0D,MAA0B,EACrC,QACA,iBACA,SACA,iBAAc,cACd,SAAM,OACN,UAAO,SAEP9c,GAAa;CACX;CACA,OAAO+c,EAAK;CACZ;CACA;CACA;CACA;CACA,aAAa,MAAU,CAAC,CAACA,EAAK51B,EAAM,CAAC;AACvC,CAAC,GAMU61B,MACX,GACA,MAEAD,EAAK,MAAM,MAAQE,EAAI,UAAU9jC,KAAS,CAAC8jC,EAAI,QAAQ,KACvDF,EAAK,MAAM,MAAQ,CAACE,EAAI,QAAQ,GAE5BC,MACJ,GACA,GACA,MACGC,KAAYJ,GAAM,MAAM,MAAQE,EAAI,UAAU9jC,CAAK,CAAC,EAAE,YAAY;AAGvE,SAAgBikC,GAAkB,IAAmB,CAAC,GAAgB;CACpE,OAAO/D,EACL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO;GACf,OAAO13B,EAAE,SAASA,EAAE;GACpB,cAAc,KAAA;EAChB;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,QAAQmd,EAAM,MAAd;IACE,KAAK,UAIH,OAHIoe,GAAcv7B,EAAE,MAAMmd,EAAM,OAAOA,EAAM,QAAQ,KAG9CA,EAAM,UAAU+Z,EAAM,QAFpBA,IAIL;KAAE,GAAGA;KAAO,OAAO/Z,EAAM;IAAM;IACrC,KAAK,SAAS;KAEZ,IAAM8d,IACJ,CAFeM,GAAcv7B,EAAE,MAAMmd,EAAM,OAAOA,EAAM,QAEvD,MACAnd,EAAE,kBAAkB,iBAAiB,eACtCmd,EAAM,UAAU+Z,EAAM;KACxB,OAAO;MACL,cAAc/Z,EAAM;MACpB,OAAO8d,IAAS9d,EAAM,QAAQ+Z,EAAM;KACtC;IACF;IACA,KAAK,QACH,OAAOA,EAAM,iBAAiB,KAAA,IAC1BA,IACA;KAAE,GAAGA;KAAO,cAAc,KAAA;IAAU;IAC1C,KAAK,YAAY;KACf,IAAMkE,IAAOje,EAAM,QAAQnd,EAAE,QAAQ,CAAC,GAChCjG,IAAOojB,EAAM,QAAQ+Z,EAAM,gBAAgBA,EAAM,OACjDx/B,IAAOyjC,GAAuB;MAClC,KAAKhe,EAAM;MACX,cAAcie,EAAK,WAAW,MAAQE,EAAI,UAAUvhC,CAAI;MACxD;MACA,aAAaiG,EAAE;MACf,KAAKA,EAAE;MACP,MAAMA,EAAE;KACV,CAAC;KAED,OADItI,MAAS,OAAaw/B,IACnB;MAAE,GAAGA;MAAO,cAAckE,EAAK1jC,EAAK,CAAC;KAAM;IACpD;IACA,SACE,OAAOw/B;GACX;EACF;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAIuB,EAAU,UAAUhhC,EAAK,SAASghC,EAAU,UAAU,KAAA,KACxDz4B,EAAE,gBAAgBy4B,EAAU,KAAK;EAErC;CACF,GACAhB,CACF;AACF;;;ACtHA,IAAMiE,MAAmB,MACvB1kC,EAAQ,WAAW,MAAM,CAAC+wB,EAAE,QAAQ;AAOtC,SAAgB4T,GACd,GACA,GACmB;CACnB,IAAMpc,IAA6B,CAAC,GAChCuI,IAAgD9wB;CACpD,KAAK,IAAIsJ,IAAQ,GAAGwnB,KAASA,EAAM,SAAS,GAAG,KAAS;EACtD,IAAItiB,IAAgBsiB,EAAM,WACvB,MAAM,CAACC,EAAE,YAAY,OAAO,GAAGA,EAAE,OAAOvwB,EAAM8I,EAAM,CACvD;EAGA,AAFIkF,IAAQ,MAAG,IAAQk2B,GAAa5T,CAAK,IACzCvI,EAAQ,KAAK;GAAE,SAASuI;GAAO,eAAetiB;EAAM,CAAC,GACrD,IAAQA,IAAQ,IAAI,KAAA,IAAYsiB,EAAMtiB,EAAM,CAAC;CAC/C;CACA,OAAO+Z;AACT;AAGA,IAAaqc,MACX,MAEArc,EACG,QAAQ,MAAM/hB,EAAE,iBAAiB,CAAC,CAAC,CACnC,KAAK,MAAMA,EAAE,QAAQA,EAAE,cAAc,GAEpCq+B,MAAc,GAAqC,MACvDD,GAAyBD,GAAiB3kC,GAASQ,CAAK,CAAC,CAAC,CAAC,KACxD,MAAMuwB,EAAE,KACX,GAEI+T,MAAe,GAAiB,MACpC16B,EAAE,WAAWjB,EAAE,UAAUiB,EAAE,OAAO,GAAG,MAAM,OAAO,GAAGhB,GAAGD,EAAEV,EAAE,CAAC;AAG/D,SAAgBs8B,GACd,GACkB;CAClB,OAAOrE,EACL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO,EAAE,OAAO13B,EAAE,SAASA,EAAE,gBAAgB,CAAC,EAAE;EAC1D,OAAO,GAAO,GAAO,GAAG;GACtB,IAAMuf,IAAUoc,GAAiB37B,EAAE,SAASk3B,EAAM,KAAK,GACjD5c,IAAOshB,GAAyBrc,CAAO,CAAC,CAAC,KAAK,MAAMwI,EAAE,KAAK,GAC3DiU,KAAU,GAAgB,MAAkB;IAChD,IAAM/T,IAAS1I,EAAQ6C,EAAO,EAAE,QAAQ5c;IACxC,IAAI,CAACyiB,KAAUA,EAAO,UAAU,OAAOiP;IAGvC,IAAM1/B,IAAQqkC,GAAQ77B,EAAE,SAAS;KAC/B,GAAGsa,EAAK,MAAM,GAAG8H,CAAM;KACvB6F,EAAO;KACP,GAAG3N,EAAK,MAAM8H,IAAS,CAAC;IAC1B,CAAC;IACD,OAAO0Z,GAAStkC,GAAO0/B,EAAM,KAAK,IAAIA,IAAQ,EAAE,SAAM;GACxD;GACA,QAAQ/Z,EAAM,MAAd;IACE,KAAK,UACH,OAAO6e,EAAO7e,EAAM,QAAQA,EAAM,KAAK;IACzC,KAAK,QAAQ;KACX,IAAMiF,IAAS7C,EAAQpC,EAAM;KAC7B,IAAI,CAACiF,KAAUjF,EAAM,UAAU,GAAG,OAAO+Z;KACzC,IAAMp7B,IAAOqhB,EAAM,QAAQ,IAAI,IAAI,IAC/B3X,IAAQ4c,EAAO,eACfzpB,IAAS6M;KACb,KAAK,IAAIy2B,IAAQ,GAAGA,IAAQ,KAAK,IAAI9e,EAAM,KAAK,MAC9C,KAASrhB,GACL,MAAQ,KAAK0J,KAAS4c,EAAO,QAAQ,WACzC,AAAKA,EAAO,QAAQ5c,EAAM,CAAC,aACzB,IAASA,GACT;KAGJ,OAAOw2B,EAAO7e,EAAM,QAAQxkB,CAAM;IACpC;IACA,KAAK,OAAO;KACV,IAAMnB,IAAQqkC,GAAQ77B,EAAE,SAASmd,EAAM,KAAK;KAC5C,OAAO2e,GAAStkC,GAAO0/B,EAAM,KAAK,IAAIA,IAAQ,EAAE,SAAM;IACxD;IACA,SACE,OAAOA;GACX;EACF;EACA,UAAU,GAAO,GAAG;GAClB,IAAM1/B,IAAQqkC,GAAQ77B,EAAE,SAASk3B,EAAM,KAAK;GAC5C,OAAO4E,GAAStkC,GAAO0/B,EAAM,KAAK,IAAIA,IAAQ,EAAE,SAAM;EACxD;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,IAAI4E,GAASrD,EAAU,OAAOhhC,EAAK,KAAK,GAAG;GAC3C,IAAMykC,IAAWN,GACfD,GAAiB37B,EAAE,SAASy4B,EAAU,KAAK,CAC7C;GACA,EAAE,gBAAgB,CAAC,GAAGA,EAAU,KAAK,GAAGyD,CAAQ;EAClD;CACF,GACAzE,CACF;AACF;;;AC5HA,IAAa0E,MAAqB,MAChC3kC,KACU,QACVA,MAAU,MACVA,MAAU,MACT,MAAM,QAAQA,CAAK,KAAKA,EAAM,WAAW,GAEtC4kC,MAAY,MAChB,OAAO5kC,KAAU,YAAY,MAAM,QAAQA,CAAK,IAAIA,EAAM,SAAS,KAAA,GAG/D6kC,KACJ,wIAMWC,KAAkB;CAE7B,WACG,IAAM,+BACN,MACCH,GAAkB3kC,CAAK,IAAI,EAAE,OAAI,IAAI;CAEzC,MACG,GAAa,IAAM,iCACnB,MACC,OAAOA,KAAU,YAAYA,IAAQ2H,IACjC;EAAE;EAAK,QAAQ,EAAE,OAAI;CAAE,IACvB;CAER,MACG,GAAa,IAAM,gCACnB,MACC,OAAO3H,KAAU,YAAYA,IAAQ0H,IACjC;EAAE;EAAK,QAAQ,EAAE,OAAI;CAAE,IACvB;CAER,YACG,GAAa,IAAM,2BACnB,MAAU;EACT,IAAMiH,IAASi2B,GAAS5kC,CAAK;EAC7B,OAAO2O,MAAW,KAAA,KAAaA,IAAS,KAAKA,IAAShH,IAClD;GAAE;GAAK,QAAQ,EAAE,OAAI;EAAE,IACvB;CACN;CAEF,YACG,GAAa,IAAM,0BACnB,MAAU;EACT,IAAMgH,IAASi2B,GAAS5kC,CAAK;EAC7B,OAAO2O,MAAW,KAAA,KAAaA,IAASjH,IACpC;GAAE;GAAK,QAAQ,EAAE,OAAI;EAAE,IACvB;CACN;CAEF,UACE,GACA,IAAM,iCACsB;EAC5B,IAAMka,IAAS,OAAOuO,KAAY,WAAWA,IAAUA,EAAQ,QACzD4U,IAAQ,OAAO5U,KAAY,WAAW,KAAKA,EAAQ,OAEnD6U,IAAS,OAAO,OAAOpjB,EAAO,KAAKmjB,EAAM,QAAQ,SAAS,EAAE,CAAC;EACnE,QAAQ,MACN,OAAO/kC,KAAU,YAAYA,MAAU,MAAM,CAACglC,EAAG,KAAKhlC,CAAK,IACvD,EAAE,OAAI,IACN;CACR;CAEA,QACG,IAAM,gCACN,MACC,OAAOA,KAAU,YAAYA,MAAU,MAAM,CAAC6kC,GAAS,KAAK7kC,CAAK,IAC7D,EAAE,OAAI,IACN;CAKR,SAEI,GACA,IAA8C,CAAC,OAEhD,MACCqQ,EAAKrQ,CAAK,IACN,OACA;EACE,KAAKR,EAAQ,OAAO;EACpB,SAASA,EAAQ;CACnB;AACV,GA+DMylC,KAAoC,mBAAiB;CACzD;CACA,UAAU;AACZ,CAAC,GAGYC,MACX,GACA,IAA+BD,QACf;CAChB,GAAG12B;CACH,SACEA,EAAO,WACP8U,EAAU9U,EAAO,KAAK;EAAE,GAAGA,EAAO;EAAQ,cAAcA,EAAO;CAAI,CAAC;AACxE,IAGa42B,MAAqB,MAChCzF,EAAM,OAAO,SAAS;AAGxB,SAAgB0F,GAAsB,GAAuC;CAC3E,IAAMC,KAAW,GAAU,MAAmC;EAC5D,IAAMC,IAAuB,CAAC;EAC9B,KAAK,IAAMC,KAAY/8B,EAAE,cAAc,CAAC,GAAG;GACzC,IAAM+F,IAASg3B,EAASvlC,CAAK;GAC7B,AAAIuO,KAAQ+2B,EAAO,KAAKJ,GAAa32B,GAAQ/F,EAAE,SAAS,CAAC;EAC3D;EACA,OAAO88B;CACT,GAEMC,KAAY,GAAsB,MAAoC;EAC1E,IAAMD,IAASD,EAAQ3F,EAAM,OAAOl3B,CAAC,GAC/Bg9B,IAAUF,EAAO,WAAW,MAAM98B,EAAE,iBAAiB,UAAU,KAAK;EAC1E,OAAO;GACL,GAAGk3B;GACH,WAAW;GACX;GACA,QAAQ8F,IAAU,eAAeF,EAAO,SAAS,YAAY;GAC7D,KAAK5F,EAAM,MAAM;EACnB;CACF,GAEM+F,IAAUvF,EACd;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO;GACf,OAAO13B,EAAE,UAAU,KAAA,IAAsBA,EAAE,eAAZA,EAAE;GACjC,SAAS;GACT,OAAO;GACP,WAAW;GACX,QAAQ;GACR,QAAQ,CAAC;GACT,KAAK;EACP;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,IAAMk9B,IAAal9B,EAAE,cAAc;GACnC,QAAQmd,EAAM,MAAd;IACE,KAAK,UAAU;KACb,IAAI,OAAO,GAAGA,EAAM,OAAO+Z,EAAM,KAAK,GAAG,OAAOA;KAChD,IAAMx/B,IAAO;MAAE,GAAGw/B;MAAO,OAAO/Z,EAAM;KAAM;KAC5C,OAAO+f,MAAe,YAAYhG,EAAM,YACpC6F,EAASrlC,GAAMsI,CAAC,IAChBtI;IACN;IACA,KAAK,QAAQ;KACX,IAAMA,IAAOw/B,EAAM,UAAUA,IAAQ;MAAE,GAAGA;MAAO,SAAS;KAAK;KAC/D,OAAOgG,MAAe,YAAY,CAAChG,EAAM,YACrCx/B,IACAqlC,EAASrlC,GAAMsI,CAAC;IACtB;IACA,KAAK,YACH,OAAO+8B,EAAS;KAAE,GAAG7F;KAAO,SAAS;IAAK,GAAGl3B,CAAC;IAChD,KAAK,SACH,OAAO;KACL,GAAGk3B;KACH,OAAO/Z,EAAM,UAAU,KAAA,IAA0Bnd,EAAE,eAAhBmd,EAAM;KACzC,SAAS;KACT,WAAW;KACX,QAAQ;KACR,QAAQ,CAAC;KACT,KAAK+Z,EAAM,MAAM;IACnB;IACF,KAAK,gBAIH,OAHI/Z,EAAM,QAAQ+Z,EAAM,OAAOA,EAAM,WAAW,eACvCA,IAEF;KACL,GAAGA;KACH,QAAQ/Z,EAAM;KACd,QAAQA,EAAM,OAAO,SAAS,YAAY;IAC5C;IACF,SACE,OAAO+Z;GACX;EACF;EACA,UAAU,GAAO,GAAG;GAElB,IAAMiG,IAAQ,EADCn9B,EAAE,UAAU,OAAO,GAAA,CACZk3B,EAAM,OAAOl3B,EAAE,YAAY;GACjD,OAAOm9B,MAAUjG,EAAM,QAAQA,IAAQ;IAAE,GAAGA;IAAO;GAAM;EAC3D;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAK,OAAO,GAAGuB,EAAU,OAAOhhC,EAAK,KAAK,KACxCuI,EAAE,gBAAgBy4B,EAAU,KAAK;EAErC;CACF,GACAhB,CACF,GAEI2F,IAAiC,MAE/BC,KAAc,MAAyB;EAC3C,IAAMr9B,IAAIi9B,EAAQ,SAAS,GACrB,EAAE,QAAK,aAAU/F,GACjBr/B,IAAU,QAAQ,KACrBmI,EAAE,mBAAmB,CAAC,EAAA,CAAG,KAAK,MAAa+8B,EAASvlC,CAAK,CAAC,CAC7D,CAAC,CAAC,MACC,MAAY;GACX,IAAMslC,IAASQ,EACZ,QAAQ,MAAkC,CAAC,CAACr9B,CAAC,CAAC,CAC9C,KAAK,MAAMy8B,GAAaz8B,GAAGg9B,EAAQ,SAAS,CAAC,CAAC,SAAS,CAAC;GAC3D,EAAQ,KAAK;IAAE,MAAM;IAAgB;IAAK;GAAO,CAAC;EACpD,SACM;GAEJ,EAAQ,KAAK;IACX,MAAM;IACN;IACA,QAAQ,CACNP,GACE,EAAE,KAAK,sBAAsB,GAC7BO,EAAQ,SAAS,CAAC,CAAC,SACrB,CACF;GACF,CAAC;EACH,CACF;EAEA,AADA,IAAWplC,GACXA,EAAQ,WAAW;GACjB,AAAIulC,MAAavlC,MAAS,IAAW;EACvC,CAAC;CACH;CAQA,OANAolC,EAAQ,WAAW,GAAO,MAAS;EACjC,AAAI/F,EAAM,WAAW,gBAAgBA,EAAM,QAAQz/B,EAAK,OACtD4lC,EAAWnG,CAAK;CAEpB,CAAC,GAEM;EACL,GAAG+F;EACH,MAAM,cAAc;GAClB,OAAOG,IAAU,MAAMA;GACvB,OAAOH,EAAQ,SAAS;EAC1B;CACF;AACF;;;ACrSA,IAAaM,MAAiB,GAAe,MAC3C,KAAK,IAAI,GAAGrf,IAAW,IAAI,KAAK,KAAK8D,IAAQ9D,CAAQ,IAAI,CAAC;AAM5D,SAAgBsf,GACd,GACA,GACA,GACkB;CAClB,IAAIxb,KAAS,GAAG,OAAO,CAAC,GAAG,CAAC;CAC5B,IAAMyb,IAAQ,KAAK,IAAI,KAAK,IAAI,GAAG/c,CAAI,GAAG6c,GAAcvb,GAAO9D,CAAQ,CAAC;CACxE,OAAO,EAAEuf,IAAQ,KAAKvf,IAAW,GAAG,KAAK,IAAIuf,IAAQvf,GAAU8D,CAAK,CAAC;AACvE;AAGA,IAAa0b,MACX,GACA,GACA,GACA,IAAW,OAEX,CAAC5C,KAAYniC,MAAW+nB,KAAQ/nB,KAAU,KAAKA,KAAU0nB;AAM3D,SAAgBsd,GACd,GACA,GACA,GACe;CACf,QAAQ7/B,GAAR;EACE,KAAK,aACH,OAAO4iB,IAAO;EAChB,KAAK,cACH,OAAOA,IAAO;EAChB,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAOL;EACT,SACE,OAAO;CACX;AACF;AAiCA,SAAgBud,GAAmB,EACjC,SACA,eACA,iBACA,kBACA,eAAY,MAC+B;CAC3C,IAAMC,KAAQ,MACZC,IACI,CAAC,IACD,CAAC;EAAE,KAAKn1B;EAAM;EAAM,MAAMA,MAAS,SAAS+X,IAAO,IAAIA,IAAO;CAAE,CAAC,GACjEqd,KAAY,OAA+B;EAC/C,KAAK,QAAQ/9B;EACb,MAAM;EACN,MAAMA;CACR;CAEA,IAAIg+B,MAAiB,KAAA,KAAaC,MAAkB,KAAA,GAAW;EAC7D,IAAMC,IAAU5d,GACdD,GACAK,GACA,KAAK,IAAI,GAAGsd,KAAgB,CAAC,GAC7B,KAAK,IAAI,GAAGC,KAAiB,CAAC,CAChC;EACA,OAAO;GACL,GAAGJ,EAAK,MAAM;GACd,GAAGK,EAAQ,KAAK,MACd,OAAO1gB,KAAS,WACZugB,EAASvgB,CAAI,IACb;IAAE,KAAKA;IAAM,MAAM;IAAqB,MAAM;GAAE,CACtD;GACA,GAAGqgB,EAAK,MAAM;EAChB;CACF;CAEA,IAAMnP,IAAQvO,GAAaO,GAAML,CAAU,GACrCvB,IAA0B,CAAC,GAAG+e,EAAK,MAAM,CAAC;CAChD,AAAInP,EAAM,SAAS,KAAKA,EAAM,KAAK,MACjC5P,EAAM,KAAKif,EAAS,CAAC,CAAC,GAClBrP,EAAM,KAAK,KACb5P,EAAM,KAAK;EACT,KAAK;EACL,MAAM;EACN,MAAM,KAAK,IAAI,GAAG4B,IAAA,CAA2B;CAC/C,CAAC;CAGL,KAAK,IAAM1gB,KAAK0uB,GAAO,EAAM,KAAKqP,EAAS/9B,CAAC,CAAC;CAC7C,IAAMgzB,IAAOtE,EAAMA,EAAM,SAAS;CAYlC,OAXIA,EAAM,SAAS,KAAKsE,IAAO3S,MACzB2S,IAAO3S,IAAa,KACtBvB,EAAM,KAAK;EACT,KAAK;EACL,MAAM;EACN,MAAM,KAAK,IAAIuB,GAAYK,IAAA,CAA2B;CACxD,CAAC,GAEH5B,EAAM,KAAKif,EAAS1d,CAAU,CAAC,IAEjCvB,EAAM,KAAK,GAAG+e,EAAK,MAAM,CAAC,GACnB/e;AACT;AAGA,SAAgBqf,GACd,IAAgC,CAAC,GACd;CACnB,OAAOzG,EAKL;EACE,YAAY,CAAC,QAAQ,UAAU;EAC/B,UAAU,OAAO;GACf,MAAM13B,EAAE,QAAQA,EAAE,eAAe;GACjC,UAAUA,EAAE,YAAYA,EAAE,mBAAmB;EAC/C;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,IAAIA,EAAE,UAAU,OAAOk3B;GACvB,IAAM7W,IAAakd,GAAcv9B,EAAE,SAAS,GAAGk3B,EAAM,QAAQ,GACvDkH,KAAQ,MACZzlC,MAAW,QAAQ+kC,GAAYxG,EAAM,MAAMv+B,GAAQ0nB,CAAU,IACzD;IAAE,GAAG6W;IAAO,MAAMv+B;GAAO,IACzBu+B;GACN,QAAQ/Z,EAAM,MAAd;IACE,KAAK,QACH,OAAOihB,EAAKjhB,EAAM,IAAI;IACxB,KAAK,QACH,OAAOihB,EAAKlH,EAAM,OAAO,CAAC;IAC5B,KAAK,QACH,OAAOkH,EAAKlH,EAAM,OAAO,CAAC;IAC5B,KAAK,SACH,OAAOkH,EAAK,CAAC;IACf,KAAK,QACH,OAAOA,EAAK/d,CAAU;IACxB,KAAK,OACH,OAAO+d,EACLT,GAAuBxgB,EAAM,KAAK+Z,EAAM,MAAM7W,CAAU,CAC1D;IACF,KAAK,iBACH,OAAO;KAAE,MAAM;KAAG,UAAUlD,EAAM;IAAS;IAC7C,SACE,OAAO+Z;GACX;EACF;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,CACEuB,EAAU,SAAShhC,EAAK,QACxBghC,EAAU,aAAahhC,EAAK,aAE5BuI,EAAE,WAAWy4B,EAAU,MAAMA,EAAU,QAAQ;EAEnD;CACF,GACAhB,CACF;AACF;;;AC/OA,IAAa4G,KAAoB,GAgD3BC,KAAa;AAMnB,SAAgBC,GACd,GACA,GACA,GACA,IAAY,IACG;CACf,IAAMziC,IAAOoD,KAAA,KAA4Bs/B,IAAY,IAAI,KACnDC,IAAYv/B,IAAA,IAA2Bo/B;CAC7C,QAAQxgC,GAAR;EACE,KAAK;EACL,KAAK,WACH,OAAO,KAAK,IAAIoB,GAAKgpB,EAAY1wB,IAAQsE,CAAI,CAAC;EAChD,KAAK;EACL,KAAK,aACH,OAAO,KAAK,IAAI,GAAGosB,EAAY1wB,IAAQsE,CAAI,CAAC;EAC9C,KAAK,UACH,OAAO,KAAK,IAAIoD,GAAKgpB,EAAY1wB,IAAQinC,CAAQ,CAAC;EACpD,KAAK,YACH,OAAO,KAAK,IAAI,GAAGvW,EAAY1wB,IAAQinC,CAAQ,CAAC;EAClD,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAOv/B;EACT,SACE,OAAO;CACX;AACF;AAGA,IAAaw/B,MACX,GACA,GACA,GACA,IAAY,OAEZxW,GACI1iB,KAAS+iB,KAAQiW,IAAY,KAAM,MAAA,IAA2Bt/B,CAClE,GAGWy/B,MACX,GACA,MACWzH,EAAM,cAAc/O,GAAmB+O,EAAM,OAAOh4B,CAAG,GAGvD0/B,MACX,GACA,MACqB;CACrB,IAAMnW,IAAYkW,GAAsBzH,GAAOh4B,CAAG;CAClD,OAAO,MAAM,KAAK,EAAE,QAAA,EAA0B,IAAI,GAAG,MACnDspB,GAAe/oB,GAAGgpB,CAAS,CAC7B;AACF;AAGA,SAAgBoW,GACd,IAA4B,CAAC,GACd;CACf,OAAOnH,EAKL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO;GACf,OAAO13B,EAAE,SAASA,EAAE,gBAAgB;GACpC,YAAY;EACd;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,IAAIA,EAAE,UAAU,OAAOk3B;GACvB,IAAMh4B,IAAMc,EAAE,OAAO,IACfw+B,IAAYx+B,EAAE,aAAa,IAC3B8+B,KAAY,MAChBtnC,MAAU0/B,EAAM,QAAQA,IAAQ;IAAE,GAAGA;IAAO;GAAM;GACpD,QAAQ/Z,EAAM,MAAd;IACE,KAAK,SAAS;KACZ,IAAM4hB,IAAQ5hB,EAAM,SAASA,EAAM,QAAQqhB,IAAY,KAAM;KAC7D,OAAOO,MAAU7H,EAAM,aACnBA,IACA;MAAE,GAAGA;MAAO,YAAY6H;KAAM;IACpC;IACA,KAAK,aACH,OAAO7H,EAAM,eAAe,OACxBA,IACA;KAAE,GAAGA;KAAO,YAAY;IAAK;IACnC,KAAK,QAAQ;KACX,IAAM1/B,IAAQknC,GACZvhB,EAAM,OACN,CAAC,CAACA,EAAM,MACRje,GACAs/B,CACF;KACA,OAAOM,EAAS9+B,EAAE,aAAaxI,MAAU0/B,EAAM,QAAQ,IAAI1/B,CAAK;IAClE;IACA,KAAK,OAAO;KACV,IAAMA,IAAQ+mC,GACZphB,EAAM,KACN+Z,EAAM,OACNh4B,GACAs/B,CACF;KACA,OAAOhnC,MAAU,OAAO0/B,IAAQ4H,EAAStnC,CAAK;IAChD;IACA,KAAK,OACH,OAAOsnC,EAAS,KAAK,IAAI5/B,GAAK,KAAK,IAAI,GAAGie,EAAM,KAAK,CAAC,CAAC;IACzD,KAAK,SACH,OAAO2hB,EAAS,CAAC;IACnB,SACE,OAAO5H;GACX;EACF;EAEA,YAAY,GAAO,MACjBl3B,EAAE,YAAYk3B,EAAM,eAAe,OAC/B;GAAE,GAAGA;GAAO,YAAY;EAAK,IAC7BA;EACN,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAIuB,EAAU,UAAUhhC,EAAK,SAAOuI,EAAE,gBAAgBy4B,EAAU,KAAK;EACvE;CACF,GACAhB,CACF;AACF;;;ACpIA,IAAMuH,MAAe,MACnBh/B,EAAE,aAAasjB,GAAmBtjB,EAAE,QAAQ,CAAC,GAGlCi/B,MACX,GACA,MAGOzb,GADS,OAAOjI,EAAE,QAAQyjB,GAAYh/B,CAAC,CAAC,CAC5B,GAASA,EAAE,KAAKA,EAAE,GAAG,GAI7Bk/B,MACX,GACA,MACWhI,EAAM,SAASzT,GAAkByT,EAAM,OAAO8H,GAAYvH,CAAK,CAAC,GAGhE0H,MACX,GACA,MAEA,CAACn/B,EAAE,YACH,CAACA,EAAE,aACFk3B,EAAM,UAAU,QAAQl3B,EAAE,QAAQ,KAAA,KAAak3B,EAAM,QAAQl3B,EAAE,MAGrDo/B,MACX,GACA,MAEA,CAACp/B,EAAE,YACH,CAACA,EAAE,aACFk3B,EAAM,UAAU,QAAQl3B,EAAE,QAAQ,KAAA,KAAak3B,EAAM,QAAQl3B,EAAE;AAGlE,SAAgBq/B,GACd,IAA4B,CAAC,GACP;CACtB,OAAO3H,EAKL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO;GACf,OAAO13B,EAAE,UAAU,KAAA,IAAuBA,EAAE,gBAAgB,OAA7BA,EAAE;GACjC,OAAO;EACT;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,IAAIA,EAAE,YAAYA,EAAE,UAAU,OAAOk3B;GACrC,IAAMp7B,IAAOkE,EAAE,QAAQ,GACjBs/B,KAAO,MACX,OAAO,GAAG9nC,GAAO0/B,EAAM,KAAK,KAAKA,EAAM,UAAU,OAC7CA,IACA;IAAE;IAAO,OAAO;GAAK,GACrB5Y,KAAQ,MAAkB;IAE9B,IAAMxkB,IAAOo9B,EAAM,SAAS1T,GAAY,GAAGxjB,EAAE,KAAKA,EAAE,GAAG,GACjDrH,IAASu+B,EAAM,UAAU,OAAOp9B,IAAOA,IAAOylC;IACpD,OAAOD,EAAIL,GAAsBtmC,GAAQqH,CAAC,CAAC;GAC7C;GACA,QAAQmd,EAAM,MAAd;IACE,KAAK,aACH,OAAOmB,EAAKxiB,KAAQqhB,EAAM,cAAc,EAAE;IAC5C,KAAK,aACH,OAAOmB,EAAK,CAACxiB,KAAQqhB,EAAM,cAAc,EAAE;IAC7C,KAAK,OACH,OAAOmiB,EACLniB,EAAM,UAAU,QAAQ,OAAO,MAAMA,EAAM,KAAK,IAC5C,OACA8hB,GAAsB9hB,EAAM,OAAOnd,CAAC,CAC1C;IACF,KAAK,SACH,OAAOmd,EAAM,SAAS+Z,EAAM,QACxBA,IACA;KAAE,GAAGA;KAAO,OAAO/Z,EAAM;IAAK;IACpC,KAAK,UAAU;KACb,IAAI+Z,EAAM,UAAU,MAAM,OAAOA;KACjC,IAAIA,EAAM,MAAM,KAAK,MAAM,IAAI,OAAOoI,EAAI,IAAI;KAC9C,IAAME,IAAS7b,GAAiBuT,EAAM,KAAK;KAE3C,IAAIsI,MAAW,MAAM,OAAO;MAAE,GAAGtI;MAAO,OAAO;KAAK;KACpD,IAAMuI,IAAU,OAAOD,EAAO,QAAQR,GAAYh/B,CAAC,CAAC,CAAC;KACrD,OAAOs/B,EACJt/B,EAAE,eAAe,KACdwjB,GAAYic,GAASz/B,EAAE,KAAKA,EAAE,GAAG,IACjCy/B,CACN;IACF;IACA,KAAK,OAAO;KACV,IAAM/e,IAAO1gB,EAAE,kBAAkB;KACjC,QAAQmd,EAAM,KAAd;MACE,KAAK,WACH,OAAOmB,EAAKxiB,CAAI;MAClB,KAAK,aACH,OAAOwiB,EAAK,CAACxiB,CAAI;MACnB,KAAK,UACH,OAAOwiB,EAAKxiB,IAAO4kB,CAAI;MACzB,KAAK,YACH,OAAOpC,EAAK,CAACxiB,IAAO4kB,CAAI;MAC1B,KAAK,QACH,OAAO1gB,EAAE,QAAQ,KAAA,IAAYk3B,IAAQoI,EAAIt/B,EAAE,GAAG;MAChD,KAAK,OACH,OAAOA,EAAE,QAAQ,KAAA,IAAYk3B,IAAQoI,EAAIt/B,EAAE,GAAG;MAChD,SACE,OAAOk3B;KACX;IACF;IACA,SACE,OAAOA;GACX;EACF;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAK,OAAO,GAAGuB,EAAU,OAAOhhC,EAAK,KAAK,KACxCuI,EAAE,gBAAgBy4B,EAAU,KAAK;EAErC;CACF,GACAhB,CACF;AACF;;;ACvIA,IAAaiI,MACX,MAEAxI,EAAM,gBAAgB,UAAUA,EAAM,UAAU,SAAS;AAG3D,SAAgByI,GACd,IAA8B,CAAC,GACd;CACjB,OAAOjI,EAKL;EACE,YAAY,CAAC,WAAW,eAAe;EACvC,UAAU,OAAO;GACf,SAAS13B,EAAE,WAAWA,EAAE,kBAAkB;GAC1C,eAAeA,EAAE,iBAAiBA,EAAE,wBAAwB;EAC9D;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,IAAIA,EAAE,YAAYA,EAAE,UAAU,OAAOk3B;GACrC,IAAM0I,IACJziB,EAAM,SAAS,WACX+Z,EAAM,iBAAiB,CAACA,EAAM,UAC9B/Z,EAAM;GACZ,OAAOyiB,MAAY1I,EAAM,WAAW,CAACA,EAAM,gBACvCA,IACA;IAAE;IAAS,eAAe;GAAM;EACtC;EACA,QAAQ,GAAW,GAAM,GAAG;GAI1B,CAHIuB,EAAU,YAAYhhC,EAAK,WAAWA,EAAK,kBAC7CuI,EAAE,kBAAkBy4B,EAAU,OAAO,GAEnCA,EAAU,kBAAkBhhC,EAAK,iBACnCuI,EAAE,wBAAwBy4B,EAAU,aAAa;EAErD;CACF,GACAhB,CACF;AACF;AA8BA,SAAgBoI,GACd,IAA4B,CAAC,GACd;CACf,OAAOnI,EAKL;EACE,YAAY,CAAC,SAAS;EACtB,UAAU,OAAO,EAAE,SAAS13B,EAAE,WAAWA,EAAE,kBAAkB,GAAM;EACnE,OAAO,GAAO,GAAO,GAAG;GACtB,IAAIA,EAAE,YAAYA,EAAE,UAAU,OAAOk3B;GACrC,IAAM0I,IACJziB,EAAM,SAAS,WAAW,CAAC+Z,EAAM,UAAU/Z,EAAM;GACnD,OAAOyiB,MAAY1I,EAAM,UAAUA,IAAQ,EAAE,WAAQ;EACvD;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAIuB,EAAU,YAAYhhC,EAAK,WAC7BuI,EAAE,kBAAkBy4B,EAAU,OAAO;EAEzC;CACF,GACAhB,CACF;AACF;AA2DA,IAAaqI,MACX,GACA,MAEAhhB,EAAM,MAAM,MAAStB,EAAK,UAAUhmB,KAAS,CAACgmB,EAAK,QAAQ,KAC3DsB,EAAM,MAAM,MAAS,CAACtB,EAAK,QAAQ;AAGrC,SAAgBuiB,GACd,IAAgC,CAAC,GACd;CACnB,IAAMC,KAAkB,GAA2B,MACjD,CAAC,CAAChgC,EAAE,OAAO,MAAM,MAASwd,EAAK,UAAUhmB,CAAK,CAAC,EAAE;CAEnD,OAAOkgC,EAKL;EACE,YAAY,CAAC,OAAO;EACpB,UAAU,OAAO;GACf,OAAO13B,EAAE,UAAU,KAAA,IAAuBA,EAAE,gBAAgB,OAA7BA,EAAE;GACjC,cAAc;EAChB;EACA,OAAO,GAAO,GAAO,GAAG;GACtB,QAAQmd,EAAM,MAAd;IACE,KAAK,UAIH,OAHInd,EAAE,YAAYA,EAAE,YAAYggC,EAAehgC,GAAGmd,EAAM,KAAK,KAGtDA,EAAM,UAAU+Z,EAAM,QAFpBA,IAIL;KAAE,GAAGA;KAAO,OAAO/Z,EAAM;IAAM;IACrC,KAAK,SACH,OAAOA,EAAM,UAAU+Z,EAAM,eACzBA,IACA;KAAE,GAAGA;KAAO,cAAc/Z,EAAM;IAAM;IAC5C,KAAK,QACH,OAAO+Z,EAAM,iBAAiB,OAC1BA,IACA;KAAE,GAAGA;KAAO,cAAc;IAAK;IACrC,KAAK,YAAY;KACf,IAAIl3B,EAAE,YAAYmd,EAAM,QAAQ,UAAUA,EAAM,QAAQ,OACtD,OAAO+Z;KAET,IAAMpY,IAAQ3B,EAAM,SAASnd,EAAE,SAAS,CAAC,GACnCjG,IAAOm9B,EAAM,gBAAgBA,EAAM,OACnCx/B,IAAO2mB,GAAa;MACxB,cAAcS,EAAM,WAAW,MAAStB,EAAK,UAAUzjB,CAAI;MAC3D,OAAO+kB,EAAM;MACb,KAAK3B,EAAM;MACX,aAAand,EAAE,eAAe;MAC9B,KAAKA,EAAE;MACP,MAAMA,EAAE;MACR,aAAa,MAAU,CAAC,CAAC8e,EAAMtZ,EAAM,CAAC;KACxC,CAAC;KACD,IAAI9N,MAAS,MAAM,OAAOw/B;KAC1B,IAAM1/B,IAAQsnB,EAAMpnB,EAAK,CAAC;KAC1B,OAAO;MACL,cAAcF;MACd,OAAOwI,EAAE,WAAWk3B,EAAM,QAAQ1/B;KACpC;IACF;IACA,SACE,OAAO0/B;GACX;EACF;EACA,QAAQ,GAAW,GAAM,GAAG;GAC1B,AAAIuB,EAAU,UAAUhhC,EAAK,SAASghC,EAAU,UAAU,QACxDz4B,EAAE,gBAAgBy4B,EAAU,KAAK;EAErC;CACF,GACAhB,CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["STANDARD","clamp","pxCss","paletteRules","diff","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","navTree","dashboard","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","enIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","dashboard","navTree","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","frIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","dashboard","navTree","monacoCodeEditor","mediaPlayer","flashcard","loadingState","codeBlock","toast","pageTabs","slider","numberInput","jsonField","keyValueEditor","tagInput","validation","answerSheet","steps","upload","monthCalendar","weekStrip","datePicker","appShell","actionSheet","picker","searchBar","navBar","tabBar","pullRefresh","swipeCell","datetimePicker","calendar","imagePreview","collapse","rating","progress","form","paginationSimple","stepStatus","presetToggle","modal","drawer","confirm","command","themeToggle","paletteToggle","messages","jaIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","tag","messages","zhIndex","data","display","feedback","forms","general","inputs","layout","mobile","overlays","theme","counter","createId","prefix","createControllableState","options","controlled","stored","listeners","isControlled","get","emit","listener","value","prev","next","equals","onChange","current","DEV_MESSAGE_PREFIX","formatDevMessage","subject","message","UNSAFE_SCHEMES","IGNORED","isSafeUrl","normalized","url","scheme","sanitizeUrl","linkRel","rel","target","PALETTES","isThemeMode","isPalette","DENSITIES","RADIUS_SCALES","SHADOW_SCALES","FONT_SCALES","DESIGN_PRESETS","designPresets","includes","values","isDensity","isRadiusScale","isShadowScale","isFontScale","isDesignPreset","resolveDesign","preset","base","from","presetPalette","DESIGN_ATTRIBUTES","STANDARD$1","designAttributes","design","attributes","axis","all","ref","mix","rem","px","clamp$1","shadow","layers","transition","cubicBezier","x1","y1","x2","y2","mergeBlocks","blocks","lengthCss","toCss","layer","text","codeTokensLight","codeTokensDark","space","step","standardDensity","mediumRadiusTheme","mediumRadiusScale","standardFontSizes","densityTokens","radiusTokens","faded","amount","shadowTokens","smallFontSizes","largeFontSizes","fontSizeTokens","smallLineHeights","standardLineHeights","largeLineHeights","lineHeightTokens","fontScaleTokens","baseTokens","fg","bg","surface","shadowColor","semanticTokens","ROLE_COLORS","roleTokens","c","color","allRoleTokens","defaultThemeTokens","pickCss","out","key","keys","block","light","dark","githubDark","uniqueKeys","themes","theme","themeKeys","isThemeName","palettes","paletteAccents","spaceTokens","fontFamilyTokens","scaleTokens","reducedMotionTokens","forcedColorsTokens","NAMED","clamp","max","min","parseHex","hex","digits","d","channel","i","component","match","pct","parseRgbFunction","parts","args","p","r","g","b","v","splitTopLevel","depth","start","char","separator","mixArgument","trailing","leading","colorText","pctText","parseColor","fn","name","first","second","a","mixRgba","p1","p2","w1","w2","sum","multiplier","alpha","c1","c2","ALPHA_DECIMALS","hex2","formatColor","R","G","B","colorMix","ca","cb","mixed","amountB","normalizeColor","linear","gamma","relativeLuminance","contrastRatio","hi","lo","y","x","toOklab","l","m","s","fromOklab","L","A","STEPS","derivePrimaryDark","background","reaches","minContrast","at","t","mid","validColor","resolvePrimaryColor","pair","darkColor","invalidPrimaryColorMessage","refsOf","dependents","found","grew","PRIMARY_DERIVED_TOKENS","accentTokens","accentTokenNames","accentFollowsPrimary","tokens","accent","formula","primary","primaryColorTokens","withAccent","closingParen","open","substituteVars","index","end","rest","fallback","lookup","LengthParser","context","result","left","op","right","length","number","scale","rootFontSize","viewportWidth","viewportHeight","evaluateLength","round","noShadow","pxCss$1","evaluateShadow","layerText","inset","lengths","part","blur","spread","css","evaluateTransition","duration","EASINGS","evaluateEasing","points","FAMILIES","COLOR_FAMILY","family","test","tokenKind","tokenCascade","designOptions","chosen","palette","apply","mode","brand","primaryColor","overrides","reducedMotion","pxCss","evaluate","kind","easing","resolveTokens","substituted","visiting","raw","group","tokenDeclarations","map","serializeRules","pad","rules","selectors","declarations","property","mediaBlock","query","attr","doubleQuotes","ROOT","srOnly","paletteRules$1","designRules","generateTokensCss","onRoot","media","body","MINI_CLASS_PREFIX","MINI_ROOT_SELECTOR","SHADOW_STEPS","cls","miniColorClass","axisClass","STANDARD","miniTokenClassNames","resolved","classes","shadowVar","colorTokens","standard","subtle","entries","diff$1","variant","HEADER","stylesheet","shadowRef","baseRules","defaults","root","resolvedBlock","density","radius","fontScale","paletteRules","generateMiniTokensCss","generateMiniTokensFiles","en_default","\"default\"","\"group\"","\"groupWithMore\"","\"jumpPrev\"","\"jumpNext\"","\"prev\"","\"next\"","\"page\"","\"total\"","\"jumpTo\"","\"jumpToInput\"","\"pageSize\"","\"pageSizeOption\"","\"currentPage\"","\"nav\"","\"placeholder\"","\"clear\"","\"noResults\"","\"level\"","\"options\"","\"label\"","\"hours\"","\"minutes\"","\"seconds\"","\"period\"","\"loading\"","\"close\"","\"expand\"","\"collapse\"","\"icon\"","\"info\"","\"success\"","\"warning\"","\"danger\"","\"description\"","\"closeWithLabel\"","\"showPassword\"","\"hidePassword\"","data_default$3","\"empty\"","\"retry\"","\"scrollRegion\"","\"selectAll\"","\"selectRow\"","\"columnLabel_one\"","\"columnLabel_other\"","\"dragHint\"","\"lifted\"","\"over\"","\"dropped\"","\"cancelled\"","\"moveTo\"","\"moveUp\"","\"moveDown\"","\"unavailable\"","\"retryLabel\"","display_default$3","\"play\"","\"pause\"","\"skipBack_one\"","\"skipBack_other\"","\"skipForward_one\"","\"skipForward_other\"","\"seek\"","\"timeOf\"","\"mute\"","\"unmute\"","\"volume\"","\"playbackRate\"","\"fullscreen\"","\"exitFullscreen\"","\"pictureInPicture\"","\"exitPictureInPicture\"","\"captions\"","\"captionsOff\"","\"error\"","\"frontLabel\"","\"backLabel\"","\"hint\"","\"copy\"","\"copied\"","\"copyFailed\"","feedback_default$3","\"region\"","\"regionWithHotkey\"","\"scrollLeft\"","\"scrollRight\"","forms_default$3","\"minimum\"","\"maximum\"","\"increment\"","\"decrement\"","\"notANumber\"","\"belowMin\"","\"aboveMax\"","\"format\"","\"valid\"","\"invalid\"","\"key\"","\"value\"","\"add\"","\"remove\"","\"create\"","\"valueMissing\"","\"selectMissing\"","\"checkMissing\"","\"radioMissing\"","\"fileMissing\"","\"tooShort\"","\"tooLong\"","\"rangeUnderflow\"","\"rangeOverflow\"","\"badInput\"","\"patternMismatch\"","\"emailMismatch\"","general_default$3","\"summary\"","\"item\"","\"itemFlagged\"","\"status\"","\"unanswered\"","\"answered\"","\"correct\"","\"wrong\"","\"skipped\"","\"legend\"","\"flagged\"","\"select\"","\"uploading\"","\"done\"","\"failed\"","\"tooMany\"","\"invalidType\"","\"tooLarge\"","inputs_default$3","\"previousMonth\"","\"nextMonth\"","\"today\"","\"weekdays\"","\"mon\"","\"tue\"","\"wed\"","\"thu\"","\"fri\"","\"sat\"","\"sun\"","\"dayWithEvents_one\"","\"dayWithEvents_other\"","\"eventsLabel\"","\"noEvents\"","\"previousWeek\"","\"nextWeek\"","\"dayWithMarkers_one\"","\"dayWithMarkers_other\"","\"dayMarked\"","layout_default$3","\"navigation\"","\"enableFloating\"","\"disableFloating\"","\"openNavigation\"","\"closeNavigation\"","\"skipToContent\"","mobile_default$3","\"cancel\"","\"confirm\"","\"selected\"","\"column\"","\"back\"","\"pulling\"","\"loosing\"","\"actions\"","\"title\"","\"titleTime\"","\"year\"","\"month\"","\"day\"","\"hour\"","\"minute\"","\"monthTitle\"","\"rangeStart\"","\"rangeEnd\"","\"counter\"","\"submit\"","\"reset\"","\"required\"","\"pageOf\"","\"finish\"","\"process\"","\"wait\"","\"minerva\"","\"editorial\"","\"compact\"","\"touch\"","overlays_default$3","\"delete\"","\"results\"","\"enter\"","theme_default$3","\"light\"","\"dark\"","\"system\"","\"tech\"","\"graphite\"","\"cool\"","isObject","mergeMessages","sources","source","messages$4","messages$3","messages$2","messages$1","DEFAULT_FALLBACK_LANGUAGE","hasOwn","object","hasPluralRules","fallbackPluralCategory","count","language","pluralRulesCache","getPluralRules","getPluralCategory","node","tree","readValue","path","PLACEHOLDER","interpolate","template","languageChain","chain","fallbackLanguage","translate","lng","messages","defaultValue","createTranslator","config","SUPPORTED_LANGUAGES","DEFAULT_LANGUAGE","isSupportedLanguage","TOKEN_PATTERN","n","formatTime","hours24","date","hours12","format","token","parseTimeInput","strict","numbers","period","numericTokens","twelveHour","hours","minutes","seconds","startOfToday","VALUE_PATTERN","parseTimeValue","toTimeValue","withSeconds","secondsOfDay","formatHasSeconds","resolveTimeFormat","showSecond","normalizeShortcuts","shortcut","matchesShortcut","event","has","names","normalizeSearchText","commandSearchText","item","MODIFIER_KEYS","matchesHotkey","hotkey","formatHotkey","keyToMove","vertical","orientation","horizontal","dir","pageSize","scan","isDisabled","getNextIndex","move","currentIndex","loop","resolveActiveOptionIndex","focusedValue","option","autoHighlight","createTypeahead","buffer","lastTime","now","timeout","items","startOffset","numericWidth","width","computeFixedColumnLayout","leftOffsets","rightOffsets","leftAcc","col","columns","rightAcc","lastLeftFixedKey","firstRightFixedKey","isEmpty","collator","compareTableValues","getColumnCompare","nextSortState","order","PAGINATION_JUMP_SIZE","rangeOf","getPageRange","windowSize","totalPages","getCompactPageItems","boundary","siblings","leftSibling","page","rightSibling","showStartGap","showEndGap","clusterSize","ANSWER_SHEET_STATUSES","answerSheetStatus","status","answerSheetSections","list","known","groups","buckets","sections","bucket","entry","answerSheetSummary","answerSheetLegend","present","answerSheetMoveIndex","sizes","section","total","size","cols","offset","column","lastRow","prevStart","rowStart","localDate","year","month","day","dayKey","addDays","days","monthStart","sameMonth","weekStart","firstDayOfWeek","STRICT_DAY_KEY","LOOSE_DAY_KEY","parseDayKey","decimalPlaces","fraction","exponent","inferStepPrecision","clampNumber","formatNumberValue","precision","parseNumberDraft","trimmed","input","resolveSpace","resolveSize","DASHBOARD_COLORS","DASHBOARD_COLUMN_WIDTH","DASHBOARD_GAP","dashboardAccent","dashboardAccentValue","custom","dashboardCount","dashboardLength","dashboardFind","layout","cardKey","dashboardSlots","columnKey","dashboardCardMove","slots","to","isDashboardNoop","dashboardInsertIndex","midpoints","position","dashboardKeyboardTarget","ok","accept","direction","dashboardKeyAction","rtl","moveDashboardCard","lists","keyOf","card","KANBAN_COLORS","KANBAN_COLUMN_WIDTH","KANBAN_GAP","kanbanAccent","kanbanAccentValue","kanbanCount","kanbanLength","kanbanFind","kanbanSlots","kanbanCardMove","isKanbanNoop","kanbanInsertIndex","kanbanKeyboardTarget","kanbanKeyAction","moveKanbanCard","getVirtualRange","itemHeight","extra","overscan","scrollTop","visibleCount","itemCount","matchesAccept","rule","file","type","DEFAULT_TAG_SEPARATORS","splitBySeparators","separators","pattern","sep","findCascaderPath","level","o","flattenCascaderOptions","roundRating","ratingDisplayStars","stars5","fullCount","half","ratingStarFill","displayed","DEFAULT_PLAYBACK_RATES","DEFAULT_SKIP_SECONDS","MEDIA_KEY_SEEK_STEP","MEDIA_KEY_VOLUME_STEP","AUDIO_EXTENSIONS","inferMediaType","mime","mimeType","src","dot","ext","finite","formatMediaTime","secs","ss","clampMediaTime","mediaProgress","currentTime","clampVolume","volume","nextPlaybackRate","rates","formatPlaybackRate","rate","bufferedEnd","ranges","stop","MEDIA_ICON_PATHS","mediaKeyAction","modifiers","TIMING","parseCueTime","ENTITIES","cueText","code","line","parseBlocks","cues","lines","head","timing","content","parseVtt","parseSrt","parseCaptions","activeCueText","time","cue","isSrtSource","BASE64","decodeBase64","clean","bits","byte","decodeDataUrl","meta","loadCaptions","fetchText","MEDIA_CAPTIONS_STORAGE_KEY","captionsPreference","track","lang","pickCaptionsTrack","tracks","preference","wanted","readCaptionsPreference","storage","writeCaptionsPreference","toggledCaptionsTrack","previous","SLIDER_MAX_STEP_MARKS","sliderPrecision","clampSliderValue","getSliderMarks","marks","closestMark","best","snapSliderValue","clamped","snapToMarks","snapped","sliderPercent","sliderRatioAt","ratio","reversed","sliderValueFromRatio","getSliderKeyValue","up","down","pageUp","pageDown","jump","unit","normalizeSliderValue","fix","range","sliderValues","setSliderThumb","closestSliderThumb","sliderValuesEqual","isSliderMarkActive","mark","append","cn","inputs","highlightTokenTypes","supportedCodeLanguages","SAMPLE_CHARS","SAMPLE_LINES","LINE_CHARS","THRESHOLD","CSS_TAGS","LINE_RULES","isProse","JSON_LINE","YAML_KEY_VALUE","YAML_KEY","YAML_ITEM","YAML_DOCUMENT","ORDER","sample","whole","cut","marker","detectCodeLanguage","decided","score","hits","nonBlank","jsonLines","yamlLines","yamlKeys","yamlItems","yamlDocuments","yamlNested","yamlParent","plus","minus","hunkLike","prose","cap","candidates","typed","bestScore","MAX_LENGTH","MAX_DEPTH","PUNCT","FN","PROP","STR","KW","VAR","NUM","CMT","OP","BUILTIN","ALIASES","normalizeCodeLanguage","codeLanguageLabel","splitHighlightLines","highlightCode","grammars","lex","stack","inner","last","solid","nl","grammar","pos","when","words","after","atLine","afterBlank","isPascal","word","closeBrace","ch","embed","close","exprStart","quoted","eq","blank","tag","h","attrs","js","json","html","bash","python","yaml","sql","diff","markdown","ts","keywords","globals","w","inBlock","variable","command","builtins","types","lower","e","indent","CODE_MARK_COLORS","CODE_MARK_DEFAULT_BACKGROUND","CODE_MARK_TINT","isHigh","isLow","clampCodeRange","applyCodeMarks","bounds","top","find","runs","interval","piece","splitCodeMarkLines","run","codeMarkBackground","resolveCodeMarkBackground","colors","shallowEqual","keysA","keysB","createStore","state","initial","defaultScheduler","callback","ms","handle","applyControlled","props","createMachine","definition","initialProps","normalize","store","project","partial","send","reduced","changedKey","settle","isDisclosurePresent","createDisclosureMachine","animated","phase","requested","engineScheduler","TOAST_DEFAULT_DURATION","TOAST_DEFAULT_EXIT_DURATION","getToastOverflow","toasts","createToastQueue","isClient","scheduler","defaultDuration","exitDuration","lifecycle","timers","idCounter","setToasts","notify","clearTimer","timer","id","schedule","dismiss","add","loading","updated","update","loadingChanged","previousDefault","closing","dismissAll","pause","resume","reset","isSelected","sameValues","createSelectionMachine","reduceValue","multiple","disabled","allowEmpty","locked","select","deselect","getTabsNavigationIndex","tabs","getTabsTabStop","tab","isTabDisabled","explicit","createTabsMachine","firstEnabled","getPickerColumns","getPickerSelectedOptions","resolve","samePath","createPickerMachine","choose","moved","selected","isEmptyFieldValue","lengthOf","EMAIL_RE","fieldValidators","flags","re","englishTranslator","toFieldError","isFieldInvalid","createFieldMachine","runSync","errors","validate","pending","machine","validateOn","dirty","inFlight","startAsync","results","getTotalPages","getPaginationVisibleRange","shown","canGoToPage","getPaginationKeyTarget","getPaginationItems","edge","hideEdges","pageItem","siblingCount","boundaryCount","compact","createPaginationMachine","goTo","RATING_STAR_COUNT","PAGE_STARS","getRatingKeyValue","allowHalf","pageStep","getRatingPickValue","getRatingDisplayStars","getRatingStarFills","createRatingMachine","setValue","stars","precisionOf","normalizeStepperValue","getNumberStepperText","canIncrementStepper","canDecrementStepper","createNumberStepperMachine","set","delta","parsed","rounded","getCheckboxAriaChecked","createCheckboxMachine","checked","createSwitchMachine","getRadioGroupTabStop","createRadioGroupMachine","isItemDisabled"],"sources":["../../../core/src/id.ts","../../../core/src/controllable.ts","../../../core/src/dev-message.ts","../../../core/src/url.ts","../../../core/src/theme/mode.ts","../../../core/src/theme/design.ts","../../../core/src/tokens/expr.ts","../../../core/src/tokens/code.ts","../../../core/src/tokens/design.ts","../../../core/src/tokens/default-theme.ts","../../../core/src/theme/themes.ts","../../../core/src/theme/palettes.ts","../../../core/src/theme/palette-accents.ts","../../../core/src/tokens/scales.ts","../../../core/src/tokens/accessibility.ts","../../../core/src/tokens/color.ts","../../../core/src/tokens/brand.ts","../../../core/src/tokens/values.ts","../../../core/src/tokens/resolve.ts","../../../core/src/tokens/css.ts","../../../core/src/tokens/mini.ts","../../../core/src/i18n/locales/en/index.json","../../../core/src/i18n/locales/en/groups/data.json","../../../core/src/i18n/locales/en/groups/display.json","../../../core/src/i18n/locales/en/groups/feedback.json","../../../core/src/i18n/locales/en/groups/forms.json","../../../core/src/i18n/locales/en/groups/general.json","../../../core/src/i18n/locales/en/groups/inputs.json","../../../core/src/i18n/locales/en/groups/layout.json","../../../core/src/i18n/locales/en/groups/mobile.json","../../../core/src/i18n/locales/en/groups/overlays.json","../../../core/src/i18n/locales/en/groups/theme.json","../../../core/src/i18n/merge.ts","../../../core/src/i18n/locales/en/index.ts","../../../core/src/i18n/locales/fr/index.json","../../../core/src/i18n/locales/fr/groups/data.json","../../../core/src/i18n/locales/fr/groups/display.json","../../../core/src/i18n/locales/fr/groups/feedback.json","../../../core/src/i18n/locales/fr/groups/forms.json","../../../core/src/i18n/locales/fr/groups/general.json","../../../core/src/i18n/locales/fr/groups/inputs.json","../../../core/src/i18n/locales/fr/groups/layout.json","../../../core/src/i18n/locales/fr/groups/mobile.json","../../../core/src/i18n/locales/fr/groups/overlays.json","../../../core/src/i18n/locales/fr/groups/theme.json","../../../core/src/i18n/locales/fr/index.ts","../../../core/src/i18n/locales/ja/index.json","../../../core/src/i18n/locales/ja/groups/data.json","../../../core/src/i18n/locales/ja/groups/display.json","../../../core/src/i18n/locales/ja/groups/feedback.json","../../../core/src/i18n/locales/ja/groups/forms.json","../../../core/src/i18n/locales/ja/groups/general.json","../../../core/src/i18n/locales/ja/groups/inputs.json","../../../core/src/i18n/locales/ja/groups/layout.json","../../../core/src/i18n/locales/ja/groups/mobile.json","../../../core/src/i18n/locales/ja/groups/overlays.json","../../../core/src/i18n/locales/ja/groups/theme.json","../../../core/src/i18n/locales/ja/index.ts","../../../core/src/i18n/locales/zh/index.json","../../../core/src/i18n/locales/zh/groups/data.json","../../../core/src/i18n/locales/zh/groups/display.json","../../../core/src/i18n/locales/zh/groups/feedback.json","../../../core/src/i18n/locales/zh/groups/forms.json","../../../core/src/i18n/locales/zh/groups/general.json","../../../core/src/i18n/locales/zh/groups/inputs.json","../../../core/src/i18n/locales/zh/groups/layout.json","../../../core/src/i18n/locales/zh/groups/mobile.json","../../../core/src/i18n/locales/zh/groups/overlays.json","../../../core/src/i18n/locales/zh/groups/theme.json","../../../core/src/i18n/locales/zh/index.ts","../../../core/src/i18n/translate.ts","../../../core/src/i18n/index.ts","../../../core/src/time.ts","../../../core/src/shortcuts.ts","../../../core/src/keyboard-navigation.ts","../../../core/src/typeahead.ts","../../../core/src/fixed-columns.ts","../../../core/src/table-sort.ts","../../../core/src/pagination.ts","../../../core/src/answer-sheet.ts","../../../core/src/calendar-date.ts","../../../core/src/decimal-places.ts","../../../core/src/number-input.ts","../../../core/src/spacing.ts","../../../core/src/dashboard-columns.ts","../../../core/src/virtual-range.ts","../../../core/src/file-accept.ts","../../../core/src/tag-separators.ts","../../../core/src/cascader-options.ts","../../../core/src/rating.ts","../../../core/src/media-player.ts","../../../core/src/media-captions.ts","../../../core/src/slider.ts","../../../core/src/cn.ts","../../../core/src/highlight/types.ts","../../../core/src/highlight/detect.ts","../../../core/src/highlight/highlight.ts","../../../core/src/highlight/marks.ts","../../../core/src/machines/store.ts","../../../core/src/machines/disclosure.ts","../../../core/src/machines/toast.ts","../../../core/src/machines/selection.ts","../../../core/src/machines/tabs.ts","../../../core/src/machines/picker.ts","../../../core/src/machines/field.ts","../../../core/src/machines/pagination.ts","../../../core/src/machines/rating.ts","../../../core/src/machines/number-stepper.ts","../../../core/src/machines/toggle.ts"],"sourcesContent":["let counter = 0;\n\n/**\n * Returns a new id that is unique for the lifetime of the page:\n * `\"<prefix>-<n>\"` with a monotonically increasing `n`.\n *\n * Intended for non-React consumers (vanilla JS, Web Components). React\n * adapters should prefer `React.useId()`, which is stable across server and\n * client renders; a module counter like this one is not SSR-hydration safe.\n *\n * @param prefix - Id prefix. @default \"minerva\"\n * @example\n * createId(); // \"minerva-1\"\n * createId(\"menu\"); // \"menu-2\"\n */\nexport function createId(prefix = \"minerva\"): string {\n counter += 1;\n return `${prefix}-${counter}`;\n}\n","/** A new value, or an updater receiving the current value. */\nexport type SetStateAction<T> = T | ((prev: T) => T);\n\nexport interface ControllableStateOptions<T> {\n /**\n * Controlled value. When not `undefined` the state is controlled: `set()`\n * only notifies `onChange` and the owner is expected to feed the new value\n * back through `setControlledValue()`.\n */\n value?: T;\n /** Initial value used while uncontrolled. */\n defaultValue: T;\n /** Called once per actual change (not when setting an equal value). */\n onChange?: (value: T) => void;\n /** Equality check used to skip no-op updates. @default Object.is */\n equals?: (a: T, b: T) => boolean;\n}\n\nexport interface ControllableState<T> {\n /** Current value (controlled value if controlled, else the stored one). */\n get(): T;\n /** Requests a change; fires `onChange` once if the value differs. */\n set(next: SetStateAction<T>): void;\n /**\n * Updates the controlled value (pass `undefined` to switch to uncontrolled\n * mode; the last controlled value then becomes the stored value).\n * Does NOT call `onChange` (the owner already knows), but notifies\n * subscribers when the visible value changes.\n */\n setControlledValue(value: T | undefined): void;\n /** Whether the state is currently controlled. */\n isControlled(): boolean;\n /**\n * Subscribes to visible value changes. Returns an unsubscribe function.\n * In controlled mode subscribers only fire on `setControlledValue`.\n */\n subscribe(listener: (value: T) => void): () => void;\n}\n\n/**\n * Framework-neutral \"controlled / uncontrolled\" state, the vanilla\n * equivalent of a `useControllableState` hook.\n *\n * - Uncontrolled: `set()` stores the value, notifies subscribers and calls\n * `onChange`.\n * - Controlled (`value !== undefined`): `set()` never stores, it only calls\n * `onChange` with the requested value; the owner decides whether to accept\n * it via `setControlledValue()`.\n *\n * @example\n * const open = createControllableState({ defaultValue: false, onChange: console.log });\n * open.set((v) => !v); // logs `true`\n */\nexport function createControllableState<T>(\n options: ControllableStateOptions<T>,\n): ControllableState<T> {\n const { onChange, equals = Object.is } = options;\n let controlled: T | undefined = options.value;\n let stored: T = options.defaultValue;\n const listeners = new Set<(value: T) => void>();\n\n const isControlled = () => controlled !== undefined;\n const get = (): T => (isControlled() ? (controlled as T) : stored);\n const emit = (value: T) => {\n for (const listener of [...listeners]) listener(value);\n };\n\n return {\n get,\n isControlled,\n set(next) {\n const prev = get();\n const value =\n typeof next === \"function\" ? (next as (prev: T) => T)(prev) : next;\n if (equals(prev, value)) return;\n if (!isControlled()) {\n stored = value;\n emit(value);\n }\n onChange?.(value);\n },\n setControlledValue(value) {\n const prev = get();\n if (value === undefined && controlled !== undefined) {\n // keep showing the last controlled value once uncontrolled\n stored = controlled;\n }\n controlled = value;\n const current = get();\n if (!equals(prev, current)) emit(current);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","/**\n * Shared format of the development-only diagnostics of every Minerva\n * library (`minerva-design` and `minerva-design/web-components`).\n *\n * Both libraries log them with `console.error` (React's convention for prop\n * warnings such as controlled / uncontrolled switches), once per message, as\n * `[minerva] <subject>: <message>` where `subject` is the React component\n * name (`Tabs`) or the custom element tag (`<minerva-tabs>`).\n */\n\n/** Prefix of every Minerva development message. */\nexport const DEV_MESSAGE_PREFIX = \"[minerva]\";\n\n/** `[minerva] <subject>: <message>` */\nexport function formatDevMessage(subject: string, message: string): string {\n return `${DEV_MESSAGE_PREFIX} ${subject}: ${message}`;\n}\n","/**\n * URL safety for links built from caller data (NavTree items, TextLink /\n * Card `href`...). React 19 already neutralises `javascript:` URLs in `href`,\n * Lit does not: both libraries run link URLs through `sanitizeUrl` so a\n * `javascript:` (or `vbscript:`) link never reaches the DOM.\n */\n\n/**\n * Schemes that run script in the page when a link is followed. Relative URLs,\n * fragments and every other scheme (`https:`, `mailto:`, `tel:`, `blob:`,\n * custom app schemes...) are allowed; `data:` stays allowed for `download`\n * links (browsers refuse top-level navigation to `data:` documents).\n */\nconst UNSAFE_SCHEMES = new Set([\"javascript\", \"vbscript\"]);\n\n/**\n * Browsers ignore leading / trailing C0 controls and spaces and strip tabs\n * and line breaks anywhere in a URL (`java\\tscript:` is `javascript:`), so the\n * scheme is read the same way before it is checked.\n */\n// eslint-disable-next-line no-control-regex -- matching control characters is the point\nconst IGNORED = /[\\x00-\\x20\\x7f]/g;\n\n/** Whether following `url` as a link is safe (no script-running scheme). */\nexport function isSafeUrl(url: string): boolean {\n const normalized = url.replace(IGNORED, \"\");\n const scheme = /^([a-z][a-z\\d+.-]*):/i.exec(normalized);\n return !scheme || !UNSAFE_SCHEMES.has(scheme[1].toLowerCase());\n}\n\n/**\n * `url` when it is safe to put in an `href`, otherwise `undefined` (the link\n * renders without a destination). `null` / `undefined` pass through as\n * `undefined`.\n */\nexport function sanitizeUrl(\n url: string | null | undefined,\n): string | undefined {\n if (url == null) return undefined;\n return isSafeUrl(url) ? url : undefined;\n}\n\n/**\n * `rel` of a link: the caller's value, or `\"noopener noreferrer\"` when the\n * link opens a new browsing context (`target=\"_blank\"`) without one.\n */\nexport function linkRel(\n target: string | null | undefined,\n rel: string | null | undefined,\n): string | undefined {\n if (rel != null) return rel;\n return target?.toLowerCase() === \"_blank\" ? \"noopener noreferrer\" : undefined;\n}\n","// Theme mode and palette names: the two orthogonal axes of the theme model,\n// shared by every renderer (web, React Native, mini-programs). Pure data and\n// guards; the web-only cookie helpers and no-flash init script live in\n// `@minerva/dom` (theme/cookies.ts).\n\n/** Color mode chosen by the user (\"system\" follows the OS). */\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/** Color mode actually applied. */\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\n/** Built-in palettes (orthogonal to the light / dark mode). */\nexport const PALETTES = [\"editorial\", \"tech\", \"graphite\", \"cool\"] as const;\n\n/** A built-in palette name. */\nexport type Palette = (typeof PALETTES)[number];\n\nexport const isThemeMode = (value: unknown): value is ThemeMode =>\n value === \"light\" || value === \"dark\" || value === \"system\";\n\nexport const isPalette = (value: unknown): value is Palette =>\n typeof value === \"string\" && (PALETTES as readonly string[]).includes(value);\n","/**\n * Design axes: app-wide look switches, orthogonal to the color mode and the\n * palette. Each axis maps to a data attribute selecting a token block of\n * `tokens.css` (token data: `../tokens/design.ts`):\n *\n * density data-density control heights / paddings, row paddings,\n * minimum touch target (--touch-target-min)\n * radius data-radius --radius-sm ... --radius-2xl\n * shadow data-shadow --shadow-sm ... --shadow-xl\n * fontScale data-font-scale --font-size-* and line heights\n *\n * A preset is a named combination of the four axes plus a default palette;\n * explicit axes override the preset.\n *\n * Server-safe: no framework import, no DOM access at load time.\n */\nimport type { Palette } from \"./mode\";\n\nexport const DENSITIES = [\"compact\", \"standard\", \"comfortable\"] as const;\n/** Spacing density of controls and rows. */\nexport type Density = (typeof DENSITIES)[number];\n\nexport const RADIUS_SCALES = [\"none\", \"small\", \"medium\", \"large\"] as const;\n/** Corner radius scale. */\nexport type RadiusScale = (typeof RADIUS_SCALES)[number];\n\nexport const SHADOW_SCALES = [\"none\", \"subtle\", \"standard\"] as const;\n/** Elevation shadow scale (\"standard\" keeps the theme / palette shadows). */\nexport type ShadowScale = (typeof SHADOW_SCALES)[number];\n\nexport const FONT_SCALES = [\"small\", \"standard\", \"large\"] as const;\n/** Type scale (\"large\" is reading-oriented). */\nexport type FontScale = (typeof FONT_SCALES)[number];\n\nexport const DESIGN_PRESETS = [\n \"minerva\",\n \"editorial\",\n \"compact\",\n \"touch\",\n] as const;\n/** A built-in design preset. */\nexport type DesignPreset = (typeof DESIGN_PRESETS)[number];\n\n/** Design axes chosen by the app; unset axes come from the preset. */\nexport interface DesignOptions {\n /**\n * Named combination of the axes below and a default palette:\n * \"minerva\" (default look), \"editorial\" (restrained, reading-oriented),\n * \"compact\" (dense, data-heavy screens) or \"touch\" (consumer mobile apps:\n * comfortable density with 44px touch targets, large radius)\n * @default \"minerva\"\n */\n preset?: DesignPreset;\n /** Spacing density of controls and rows */\n density?: Density;\n /** Corner radius scale */\n radius?: RadiusScale;\n /** Elevation shadow scale */\n shadow?: ShadowScale;\n /** Type scale */\n fontScale?: FontScale;\n}\n\n/** Fully resolved design axes. */\nexport interface ResolvedDesign {\n preset: DesignPreset;\n density: Density;\n radius: RadiusScale;\n shadow: ShadowScale;\n fontScale: FontScale;\n}\n\n/** Axis values and default palette of a preset. */\nexport interface DesignPresetDefinition {\n density: Density;\n radius: RadiusScale;\n shadow: ShadowScale;\n fontScale: FontScale;\n /** Palette used when the app does not choose one (`null` = default look) */\n palette: Palette | null;\n}\n\nexport const designPresets: Record<DesignPreset, DesignPresetDefinition> = {\n minerva: {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n palette: null,\n },\n editorial: {\n density: \"comfortable\",\n radius: \"small\",\n shadow: \"subtle\",\n fontScale: \"large\",\n palette: \"editorial\",\n },\n compact: {\n density: \"compact\",\n radius: \"small\",\n shadow: \"standard\",\n fontScale: \"small\",\n palette: null,\n },\n // Consumer (toC) mobile apps: larger controls and rows, 44px minimum touch\n // targets (`--touch-target-min`, Apple HIG / WCAG 2.5.5), rounder corners\n touch: {\n density: \"comfortable\",\n radius: \"large\",\n shadow: \"standard\",\n fontScale: \"standard\",\n palette: null,\n },\n};\n\nconst includes = <T extends string>(\n values: readonly T[],\n value: unknown,\n): value is T =>\n typeof value === \"string\" && (values as readonly string[]).includes(value);\n\nexport const isDensity = (value: unknown): value is Density =>\n includes(DENSITIES, value);\nexport const isRadiusScale = (value: unknown): value is RadiusScale =>\n includes(RADIUS_SCALES, value);\nexport const isShadowScale = (value: unknown): value is ShadowScale =>\n includes(SHADOW_SCALES, value);\nexport const isFontScale = (value: unknown): value is FontScale =>\n includes(FONT_SCALES, value);\nexport const isDesignPreset = (value: unknown): value is DesignPreset =>\n includes(DESIGN_PRESETS, value);\n\n/**\n * Resolves the four axes: explicit (valid) values win, the others come from\n * the preset (default \"minerva\"). Invalid values are ignored.\n */\nexport function resolveDesign(\n options: DesignOptions = {},\n base?: ResolvedDesign,\n): ResolvedDesign {\n const preset = isDesignPreset(options.preset)\n ? options.preset\n : (base?.preset ?? \"minerva\");\n // A new preset resets the axes; otherwise unset axes follow `base`\n const from =\n base && !isDesignPreset(options.preset) ? base : designPresets[preset];\n return {\n preset,\n density: isDensity(options.density) ? options.density : from.density,\n radius: isRadiusScale(options.radius) ? options.radius : from.radius,\n shadow: isShadowScale(options.shadow) ? options.shadow : from.shadow,\n fontScale: isFontScale(options.fontScale)\n ? options.fontScale\n : from.fontScale,\n };\n}\n\n/** Default palette of a preset (`null` = Minerva's default look). */\nexport const presetPalette = (preset: DesignPreset | undefined) =>\n isDesignPreset(preset) ? designPresets[preset].palette : null;\n\n/** Data attribute of each axis. */\nexport const DESIGN_ATTRIBUTES = {\n density: \"data-density\",\n radius: \"data-radius\",\n shadow: \"data-shadow\",\n fontScale: \"data-font-scale\",\n} as const satisfies Record<Exclude<keyof ResolvedDesign, \"preset\">, string>;\n\n/** Value of each axis that matches the `:root` tokens (no attribute needed). */\nconst STANDARD = {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n} as const;\n\n/**\n * Data attributes for a design, e.g. to spread on `<html>` in a server\n * rendered root layout so the first paint has the right look:\n *\n * <html {...designAttributes({ preset: \"editorial\" })}>\n *\n * Standard values are omitted unless `all` is set (a nested scope must be\n * able to switch back to \"standard\").\n */\nexport function designAttributes(\n options: DesignOptions | ResolvedDesign = {},\n { all = false }: { all?: boolean } = {},\n): Record<string, string> {\n const design = resolveDesign(options);\n const attributes: Record<string, string> = {};\n for (const axis of Object.keys(DESIGN_ATTRIBUTES) as Array<\n keyof typeof DESIGN_ATTRIBUTES\n >) {\n if (all || design[axis] !== STANDARD[axis]) {\n attributes[DESIGN_ATTRIBUTES[axis]] = design[axis];\n }\n }\n return attributes;\n}\n","// Token values as data. A token is either a plain CSS value (string / number)\n// or a small formula object (a `var()` reference, an sRGB `color-mix()`, a\n// length, a shadow list, a transition...). Formulas serialize to exactly the\n// CSS text of `tokens.css` (`toCss`) and are evaluated by `resolveTokens` for\n// platforms without CSS variables / color-mix() (React Native, mini-programs).\n//\n// Platform-neutral: pure data and string building.\n\n/** `var(--name)`: the value of another token. */\nexport interface TokenRef {\n kind: \"ref\";\n /** Token name without the leading `--` */\n name: string;\n}\n\n/** `color-mix(in srgb, a p%, b)` */\nexport interface TokenMix {\n kind: \"mix\";\n a: TokenValue;\n /** Percentage of `a` (0-100); `b` gets the rest */\n amount: number;\n b: TokenValue;\n}\n\n/** A length: `0` (unitless zero), `<n>px` or `<n>rem`. */\nexport interface TokenLength {\n kind: \"length\";\n value: number;\n unit: \"px\" | \"rem\";\n}\n\n/** `clamp(min, <n>vw, max)`: a viewport-relative fluid length. */\nexport interface TokenClamp {\n kind: \"clamp\";\n min: TokenLength;\n /** Preferred value, in `vw` */\n vw: number;\n max: TokenLength;\n}\n\n/** One layer of a `box-shadow`. */\nexport interface TokenShadowLayer {\n x: number;\n y: number;\n blur: number;\n /** Written only when set (`0 1px 2px 0 <color>` vs `0 1px 2px <color>`) */\n spread?: number;\n color: TokenValue;\n}\n\n/** A `box-shadow` value (`none` when there is no layer). */\nexport interface TokenShadow {\n kind: \"shadow\";\n layers: TokenShadowLayer[];\n}\n\n/** `<duration>ms <easing>` */\nexport interface TokenTransition {\n kind: \"transition\";\n /** Milliseconds */\n duration: number;\n easing: string;\n}\n\n/** `cubic-bezier(x1, y1, x2, y2)` */\nexport interface TokenCubicBezier {\n kind: \"cubic-bezier\";\n points: readonly [number, number, number, number];\n}\n\n/** A token formula (data, not an opaque string). */\nexport type TokenFormula =\n | TokenRef\n | TokenMix\n | TokenLength\n | TokenClamp\n | TokenShadow\n | TokenTransition\n | TokenCubicBezier;\n\n/** A token value: plain CSS text, a number or a formula. */\nexport type TokenValue = string | number | TokenFormula;\n\n/** An ordered block of token declarations (`name` without `--`). */\nexport type TokenBlock = Readonly<Record<string, TokenValue>>;\n\n// ---- Constructors ----\n// Pure (`__NO_SIDE_EFFECTS__`): the token tables built with them at module\n// level are dropped by bundlers when unused.\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const ref = (name: string): TokenRef => ({ kind: \"ref\", name });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const mix = (\n a: TokenValue,\n amount: number,\n b: TokenValue,\n): TokenMix => ({\n kind: \"mix\",\n a,\n amount,\n b,\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const rem = (value: number): TokenLength => ({\n kind: \"length\",\n value,\n unit: \"rem\",\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const px = (value: number): TokenLength => ({\n kind: \"length\",\n value,\n unit: \"px\",\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const clamp = (\n min: TokenLength,\n vw: number,\n max: TokenLength,\n): TokenClamp => ({ kind: \"clamp\", min, vw, max });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const shadow = (...layers: TokenShadowLayer[]): TokenShadow => ({\n kind: \"shadow\",\n layers,\n});\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const transition = (\n duration: number,\n easing: string,\n): TokenTransition => ({ kind: \"transition\", duration, easing });\n\n/*#__NO_SIDE_EFFECTS__*/\nexport const cubicBezier = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): TokenCubicBezier => ({ kind: \"cubic-bezier\", points: [x1, y1, x2, y2] });\n\n/**\n * Merges token blocks in order (later blocks win). Pure, unlike a module-level\n * object spread, which bundlers must keep (it could run getters).\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function mergeBlocks<T extends object>(...blocks: T[]): T {\n return Object.assign({}, ...blocks);\n}\n\n// ---- Serialization ----\n\nconst lengthCss = (value: number) => (value === 0 ? \"0\" : `${value}px`);\n\n/** CSS text of a token value, exactly as written in `tokens.css`. */\n/*#__NO_SIDE_EFFECTS__*/\nexport function toCss(value: TokenValue): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n switch (value.kind) {\n case \"ref\":\n return `var(--${value.name})`;\n case \"mix\":\n return `color-mix(in srgb, ${toCss(value.a)} ${value.amount}%, ${toCss(value.b)})`;\n case \"length\":\n return value.value === 0 ? \"0\" : `${value.value}${value.unit}`;\n case \"clamp\":\n return `clamp(${toCss(value.min)}, ${value.vw}vw, ${toCss(value.max)})`;\n case \"shadow\":\n return value.layers.length === 0\n ? \"none\"\n : value.layers\n .map((layer) =>\n [\n lengthCss(layer.x),\n lengthCss(layer.y),\n lengthCss(layer.blur),\n ...(layer.spread === undefined\n ? []\n : [lengthCss(layer.spread)]),\n toCss(layer.color),\n ].join(\" \"),\n )\n .join(\", \");\n case \"transition\":\n return `${value.duration}ms ${value.easing}`;\n case \"cubic-bezier\":\n return `cubic-bezier(${value.points.join(\", \")})`;\n }\n}\n","// Syntax highlighting colors of the code blocks: `--code-token-<type>-color`\n// for every token type of `highlightCode` (../highlight). GitHub-like\n// palettes: the light values are declared with the default theme (every\n// palette's light mode), the dark values for `[data-theme=dark]` (every\n// palette's dark mode; `resolveTokens({ mode: \"dark\" })` for React Native and\n// the mini-programs). Both keep a contrast of at least 4.5:1 on the code\n// block background (`--control-color`) of every palette (tokens test).\nimport type { HighlightTokenType } from \"../highlight/types\";\nimport { ref, type TokenBlock, type TokenValue } from \"./expr\";\n\ntype CodeTokens = Record<`code-token-${HighlightTokenType}-color`, TokenValue>;\n\nconst text = ref(\"text-color\");\n\n/** Light mode syntax colors (GitHub light). */\nexport const codeTokensLight = {\n \"code-token-comment-color\": \"#59636e\",\n \"code-token-keyword-color\": \"#b62324\",\n \"code-token-string-color\": \"#0a3069\",\n \"code-token-number-color\": \"#0550ae\",\n \"code-token-boolean-color\": \"#0550ae\",\n \"code-token-null-color\": \"#0550ae\",\n \"code-token-property-color\": \"#0550ae\",\n \"code-token-function-color\": \"#6639ba\",\n \"code-token-tag-color\": \"#116329\",\n \"code-token-attr-name-color\": \"#0550ae\",\n \"code-token-attr-value-color\": \"#0a3069\",\n \"code-token-punctuation-color\": text,\n \"code-token-operator-color\": \"#b62324\",\n \"code-token-regex-color\": \"#116329\",\n \"code-token-variable-color\": \"#953800\",\n \"code-token-builtin-color\": \"#953800\",\n \"code-token-inserted-color\": \"#116329\",\n \"code-token-deleted-color\": \"#82071e\",\n \"code-token-heading-color\": \"#0550ae\",\n} as const satisfies CodeTokens & TokenBlock;\n\n/** Dark mode syntax colors (GitHub dark). */\nexport const codeTokensDark = {\n \"code-token-comment-color\": \"#9ea6b0\",\n \"code-token-keyword-color\": \"#ff7b72\",\n \"code-token-string-color\": \"#a5d6ff\",\n \"code-token-number-color\": \"#79c0ff\",\n \"code-token-boolean-color\": \"#79c0ff\",\n \"code-token-null-color\": \"#79c0ff\",\n \"code-token-property-color\": \"#79c0ff\",\n \"code-token-function-color\": \"#d2a8ff\",\n \"code-token-tag-color\": \"#7ee787\",\n \"code-token-attr-name-color\": \"#79c0ff\",\n \"code-token-attr-value-color\": \"#a5d6ff\",\n \"code-token-punctuation-color\": text,\n \"code-token-operator-color\": \"#ff7b72\",\n \"code-token-regex-color\": \"#7ee787\",\n \"code-token-variable-color\": \"#ffa657\",\n \"code-token-builtin-color\": \"#ffa657\",\n \"code-token-inserted-color\": \"#7ee787\",\n \"code-token-deleted-color\": \"#ffa198\",\n \"code-token-heading-color\": \"#79c0ff\",\n} as const satisfies CodeTokens & TokenBlock;\n","// Design axes token blocks: the values selected by `data-density`,\n// `data-radius`, `data-shadow` and `data-font-scale` (see ../theme/design.ts\n// for the axes and presets). The `:root` scales use the \"standard\" /\n// \"medium\" values.\nimport type {\n Density,\n FontScale,\n RadiusScale,\n ShadowScale,\n} from \"../theme/design\";\nimport {\n mergeBlocks,\n mix,\n px,\n ref,\n rem,\n shadow,\n type TokenBlock,\n} from \"./expr\";\n\n/*#__NO_SIDE_EFFECTS__*/\nconst space = (step: string) => ref(`space-${step}`);\n\n/** \"standard\" density (also the `:root` values) */\nexport const standardDensity = {\n \"control-height-xs\": rem(1.5),\n \"control-height-sm\": rem(2),\n \"control-height-md\": rem(2.5),\n \"control-height-lg\": rem(3),\n \"control-height-xl\": rem(3.5),\n \"control-padding-x-xs\": space(\"2\"),\n \"control-padding-x-sm\": space(\"3\"),\n \"control-padding-x-md\": space(\"4\"),\n \"control-padding-x-lg\": space(\"5\"),\n \"control-padding-x-xl\": space(\"6\"),\n \"row-padding-y\": space(\"2\"),\n \"row-padding-x\": space(\"3\"),\n \"touch-target-min\": px(32),\n} as const satisfies TokenBlock;\n\n/**\n * \"medium\" radius scale, in the two halves `tokens.css` declares on `:root`:\n * sm / md / lg with the theme tokens, xl / 2xl with the scales.\n */\nexport const mediumRadiusTheme = {\n \"radius-sm\": px(4),\n \"radius-md\": px(6),\n \"radius-lg\": px(8),\n} as const satisfies TokenBlock;\nexport const mediumRadiusScale = {\n \"radius-xl\": px(12),\n \"radius-2xl\": px(16),\n} as const satisfies TokenBlock;\n\n/** \"standard\" font sizes (also the `:root` values) */\nexport const standardFontSizes = {\n \"font-size-xs\": rem(0.75),\n \"font-size-sm\": rem(0.8125),\n \"font-size-md\": rem(0.875),\n \"font-size-lg\": rem(1),\n \"font-size-xl\": rem(1.125),\n \"font-size-2xl\": rem(1.375),\n \"font-size-3xl\": rem(1.75),\n \"font-size-4xl\": rem(2.25),\n \"font-size-5xl\": rem(3),\n \"font-size-6xl\": rem(3.75),\n} as const satisfies TokenBlock;\n\n/** Density: control heights / paddings, row paddings, touch target. */\nexport const densityTokens: Record<Density, TokenBlock> = {\n standard: standardDensity,\n compact: {\n \"control-height-xs\": rem(1.25),\n \"control-height-sm\": rem(1.75),\n \"control-height-md\": rem(2),\n \"control-height-lg\": rem(2.5),\n \"control-height-xl\": rem(3),\n \"control-padding-x-xs\": space(\"1-5\"),\n \"control-padding-x-sm\": space(\"2\"),\n \"control-padding-x-md\": space(\"3\"),\n \"control-padding-x-lg\": space(\"4\"),\n \"control-padding-x-xl\": space(\"5\"),\n \"row-padding-y\": space(\"1\"),\n \"row-padding-x\": space(\"2\"),\n // WCAG 2.2 target size (minimum), 2.5.8\n \"touch-target-min\": px(24),\n },\n comfortable: {\n \"control-height-xs\": rem(1.75),\n \"control-height-sm\": rem(2.25),\n \"control-height-md\": rem(2.75),\n \"control-height-lg\": rem(3.25),\n \"control-height-xl\": rem(3.75),\n \"control-padding-x-xs\": space(\"2-5\"),\n \"control-padding-x-sm\": space(\"3\"),\n \"control-padding-x-md\": space(\"5\"),\n \"control-padding-x-lg\": space(\"6\"),\n \"control-padding-x-xl\": space(\"7\"),\n \"row-padding-y\": space(\"3\"),\n \"row-padding-x\": space(\"4\"),\n // Apple HIG / WCAG 2.5.5 target size (enhanced): the `touch` preset\n \"touch-target-min\": px(44),\n },\n};\n\n/** Corner radius scale. */\nexport const radiusTokens: Record<RadiusScale, TokenBlock> = {\n none: {\n \"radius-sm\": px(0),\n \"radius-md\": px(0),\n \"radius-lg\": px(0),\n \"radius-xl\": px(0),\n \"radius-2xl\": px(0),\n },\n small: {\n \"radius-sm\": px(2),\n \"radius-md\": px(3),\n \"radius-lg\": px(4),\n \"radius-xl\": px(6),\n \"radius-2xl\": px(8),\n },\n medium: mergeBlocks<TokenBlock>(mediumRadiusTheme, mediumRadiusScale),\n large: {\n \"radius-sm\": px(6),\n \"radius-md\": px(10),\n \"radius-lg\": px(14),\n \"radius-xl\": px(18),\n \"radius-2xl\": px(24),\n },\n};\n\n/*#__NO_SIDE_EFFECTS__*/\nconst faded = (amount: number) =>\n mix(ref(\"shadow-color\"), amount, \"transparent\");\n\n/** Shadow scale (\"standard\" keeps the theme / palette shadows: no block). */\nexport const shadowTokens: Record<\n Exclude<ShadowScale, \"standard\">,\n TokenBlock\n> = {\n none: {\n \"shadow-sm\": shadow(),\n \"shadow-md\": shadow(),\n \"shadow-lg\": shadow(),\n \"shadow-xl\": shadow(),\n },\n subtle: {\n \"shadow-sm\": shadow({ x: 0, y: 1, blur: 1, color: faded(45) }),\n \"shadow-md\": shadow({ x: 0, y: 2, blur: 6, color: faded(45) }),\n \"shadow-lg\": shadow({ x: 0, y: 6, blur: 16, color: faded(50) }),\n \"shadow-xl\": shadow({ x: 0, y: 10, blur: 24, color: faded(55) }),\n },\n};\n\nconst smallFontSizes = {\n \"font-size-xs\": rem(0.6875),\n \"font-size-sm\": rem(0.75),\n \"font-size-md\": rem(0.8125),\n \"font-size-lg\": rem(0.9375),\n \"font-size-xl\": rem(1.0625),\n \"font-size-2xl\": rem(1.25),\n \"font-size-3xl\": rem(1.5),\n \"font-size-4xl\": rem(2),\n \"font-size-5xl\": rem(2.625),\n \"font-size-6xl\": rem(3.25),\n} as const satisfies TokenBlock;\n\nconst largeFontSizes = {\n \"font-size-xs\": rem(0.8125),\n \"font-size-sm\": rem(0.875),\n \"font-size-md\": rem(1),\n \"font-size-lg\": rem(1.125),\n \"font-size-xl\": rem(1.25),\n \"font-size-2xl\": rem(1.5),\n \"font-size-3xl\": rem(2),\n \"font-size-4xl\": rem(2.5),\n \"font-size-5xl\": rem(3.25),\n \"font-size-6xl\": rem(4),\n} as const satisfies TokenBlock;\n\n/** Font sizes of each type scale. */\nexport const fontSizeTokens: Record<FontScale, TokenBlock> = {\n small: smallFontSizes,\n standard: standardFontSizes,\n large: largeFontSizes,\n};\n\nconst smallLineHeights = { \"line-height-base\": 1.45 } as const;\nconst standardLineHeights = {\n \"line-height-base\": 1.5,\n \"line-height-relaxed\": 1.7,\n} as const;\nconst largeLineHeights = {\n \"line-height-base\": 1.6,\n \"line-height-relaxed\": 1.8,\n} as const;\n\n/** Line heights of each type scale (\"small\" keeps the relaxed one). */\nexport const lineHeightTokens: Record<FontScale, TokenBlock> = {\n small: smallLineHeights,\n standard: standardLineHeights,\n large: largeLineHeights,\n};\n\n/** Type scale: font sizes and line heights. */\nexport const fontScaleTokens: Record<FontScale, TokenBlock> = {\n small: mergeBlocks<TokenBlock>(smallFontSizes, smallLineHeights),\n standard: mergeBlocks<TokenBlock>(standardFontSizes, standardLineHeights),\n large: mergeBlocks<TokenBlock>(largeFontSizes, largeLineHeights),\n};\n","// Default (light) color tokens: the `:root, [data-minerva-theme-scope]` block\n// of tokens.css.\n//\n// The base tokens are the `light` theme (../theme/themes.ts builds it from\n// them). Semantic tokens are formulas over the base tokens (`color-mix()`\n// in CSS), so they follow any theme automatically, custom ones included.\n// Themes may still set them explicitly (the built-in dark themes do for\n// surfaces and text).\n//\n// The scope elements of nested ConfigProviders (`[data-minerva-theme-scope]`)\n// redeclare every token: custom properties resolve their `var()` references\n// where they are declared, so the derived tokens must be recomputed from the\n// scope's own base tokens.\nimport type { ThemeProps } from \"../theme/types\";\nimport { codeTokensLight } from \"./code\";\nimport { mediumRadiusTheme } from \"./design\";\nimport {\n mergeBlocks,\n mix,\n ref,\n shadow,\n type TokenBlock,\n type TokenValue,\n} from \"./expr\";\n\n/** Base tokens (`ThemeProps`) of the default light theme. */\nexport const baseTokens = {\n \"primary-color\": \"#2563eb\",\n \"secondary-color\": \"#475569\",\n \"success-color\": \"#15803d\",\n \"danger-color\": \"#dc2626\",\n \"warning-color\": \"#b45309\",\n \"info-color\": \"#0e7490\",\n \"light-color\": \"#f7f7f7\",\n \"dark-color\": \"#4a4a4a\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#1f2937\",\n \"border-color\": \"#d9dde3\",\n \"text-gray\": \"#6b7280\",\n \"primary-gradient-start\": \"#6a11cb\",\n \"primary-gradient-end\": \"#2575fc\",\n \"secondary-gradient-start\": \"#42e695\",\n \"secondary-gradient-end\": \"#3bb2b8\",\n \"highlight-color\": \"#ffeb3b\",\n \"shadow-color\": \"rgba(15, 23, 42, 0.16)\",\n \"muted-color\": \"#64748b\",\n \"link-color\": \"#1d4ed8\",\n \"link-hover-color\": \"#1e40af\",\n \"link-active-color\": \"#1e3a8a\",\n \"link-visited-color\": \"#6d28d9\",\n} as const satisfies ThemeProps;\n\nconst fg = ref(\"foreground-color\");\nconst bg = ref(\"background-color\");\nconst surface = ref(\"surface-color\");\nconst shadowColor = ref(\"shadow-color\");\n\n/** Semantic tokens derived from the base tokens. */\nexport const semanticTokens = {\n // ---- Surfaces ----\n \"surface-color\": bg,\n \"surface-muted-color\": mix(fg, 6, bg),\n \"surface-elevated-color\": bg,\n \"surface-subtle-color\": mix(fg, 3, bg),\n \"canvas-color\": ref(\"surface-subtle-color\"),\n \"control-color\": ref(\"surface-subtle-color\"),\n \"hover-color\": ref(\"surface-muted-color\"),\n \"selected-color\": mix(ref(\"primary-color\"), 14, surface),\n \"overlay-color\": mix(\"#000000\", 45, \"transparent\"),\n // ---- Borders ----\n \"border-strong-color\": mix(fg, 35, bg),\n // ---- Text ----\n \"text-color\": fg,\n \"text-secondary-color\": mix(fg, 75, bg),\n \"text-muted-color\": mix(fg, 62, bg),\n \"text-disabled-color\": mix(fg, 45, bg),\n \"text-inverse-color\": \"#ffffff\",\n // ---- Misc ----\n \"focus-ring-color\": mix(ref(\"primary-color\"), 45, \"transparent\"),\n \"shadow-sm\": shadow({ x: 0, y: 1, blur: 2, color: shadowColor }),\n \"shadow-md\": shadow({ x: 0, y: 4, blur: 12, color: shadowColor }),\n \"shadow-lg\": shadow({ x: 0, y: 12, blur: 32, color: shadowColor }),\n \"shadow-xl\": shadow({ x: 0, y: 20, blur: 48, color: shadowColor }),\n \"accent-color\": ref(\"primary-color\"),\n} as const satisfies TokenBlock;\n\n/** Colors with hover / active / subtle / border / text role tokens. */\nexport const ROLE_COLORS = [\n \"primary\",\n \"secondary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"accent\",\n] as const;\n\n/** Role tokens of one color: `--<color>-color-<role>`. */\n/*#__NO_SIDE_EFFECTS__*/\nexport const roleTokens = (color: string): Record<string, TokenValue> => {\n const c = ref(`${color}-color`);\n return {\n [`${color}-color-hover`]: mix(c, 85, fg),\n [`${color}-color-active`]: mix(c, 72, fg),\n [`${color}-color-subtle`]: mix(c, 12, surface),\n [`${color}-color-border`]: mix(c, 40, surface),\n [`${color}-color-text`]: mix(c, 80, fg),\n };\n};\n\n/** Role tokens of every role color. */\n/*#__NO_SIDE_EFFECTS__*/\nfunction allRoleTokens(): Record<string, TokenValue> {\n return mergeBlocks({}, ...ROLE_COLORS.map(roleTokens));\n}\n\n/** The `:root, [data-minerva-theme-scope]` block (default light theme). */\nexport const defaultThemeTokens: TokenBlock = mergeBlocks<TokenBlock>(\n baseTokens,\n semanticTokens,\n // default radii, declared with the theme tokens\n mediumRadiusTheme,\n allRoleTokens(),\n // syntax highlighting (dark values: tokens/code.ts)\n codeTokensLight,\n);\n","import type { ComponentTheme, ThemeName } from \"./types\";\nimport { baseTokens, semanticTokens } from \"../tokens/default-theme\";\nimport { mergeBlocks, toCss, type TokenValue } from \"../tokens/expr\";\n\n/** CSS text of some tokens of a block. */\n/*#__NO_SIDE_EFFECTS__*/\nfunction pickCss<K extends string>(\n block: Record<K, TokenValue>,\n keys: readonly K[],\n): Record<K, string> {\n const out = {} as Record<K, string>;\n for (const key of keys) out[key] = toCss(block[key]);\n return out;\n}\n\n/**\n * Semantic token defaults, expressed in terms of the base tokens: the same\n * formulas as the `:root` block of `tokens.css` (../tokens/default-theme.ts).\n * The light theme uses them as-is so they keep following the base colors.\n */\nconst derivedSemantic = /* @__PURE__ */ pickCss(semanticTokens, [\n \"surface-color\",\n \"surface-muted-color\",\n \"surface-elevated-color\",\n \"overlay-color\",\n \"border-strong-color\",\n \"text-color\",\n \"text-secondary-color\",\n \"text-disabled-color\",\n \"text-inverse-color\",\n \"focus-ring-color\",\n] as const);\n\nexport const light: ComponentTheme = /* @__PURE__ */ mergeBlocks<\n Partial<ComponentTheme>\n>(baseTokens, derivedSemantic) as ComponentTheme;\n\nexport const dark: ComponentTheme = {\n \"primary-color\": \"#818cf8\",\n \"secondary-color\": \"#94a3b8\",\n \"success-color\": \"#4ade80\",\n \"danger-color\": \"#f87171\",\n \"warning-color\": \"#fbbf24\",\n \"info-color\": \"#22d3ee\",\n \"light-color\": \"#2d3748\",\n \"dark-color\": \"#f8f9fa\",\n \"background-color\": \"#1a202c\",\n \"foreground-color\": \"#f1f5f9\",\n \"border-color\": \"#3a4556\",\n \"text-gray\": \"#a0aec0\",\n \"primary-gradient-start\": \"#6a11cb\",\n \"primary-gradient-end\": \"#2575fc\",\n \"secondary-gradient-start\": \"#42e695\",\n \"secondary-gradient-end\": \"#3bb2b8\",\n \"highlight-color\": \"#ffeb3b\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#94a3b8\",\n \"link-color\": \"#63b3ed\",\n \"link-hover-color\": \"#90cdf4\",\n \"link-active-color\": \"#bee3f8\",\n \"link-visited-color\": \"#b794f4\",\n \"surface-color\": \"#212937\",\n \"surface-muted-color\": \"#2a3342\",\n \"surface-elevated-color\": \"#262f3e\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.6)\",\n \"border-strong-color\": \"#5a677d\",\n \"text-color\": \"#f1f5f9\",\n \"text-secondary-color\": \"#cbd5e0\",\n \"text-disabled-color\": \"#718096\",\n \"text-inverse-color\": \"#111827\",\n \"focus-ring-color\": \"rgba(129, 140, 248, 0.55)\",\n};\n\nexport const githubDark: ComponentTheme = {\n \"primary-color\": \"#58a6ff\",\n \"secondary-color\": \"#8b949e\",\n \"success-color\": \"#3fb950\",\n \"danger-color\": \"#f85149\",\n \"warning-color\": \"#d29922\",\n \"info-color\": \"#39c5cf\",\n \"light-color\": \"#161b22\",\n \"dark-color\": \"#e6edf3\",\n \"background-color\": \"#0d1117\",\n \"foreground-color\": \"#e6edf3\",\n \"border-color\": \"#30363d\",\n \"text-gray\": \"#8b949e\",\n \"primary-gradient-start\": \"#58a6ff\",\n \"primary-gradient-end\": \"#1f6feb\",\n \"secondary-gradient-start\": \"#1f6feb\",\n \"secondary-gradient-end\": \"#58a6ff\",\n \"highlight-color\": \"#bb800926\",\n \"shadow-color\": \"rgba(1, 4, 9, 0.8)\",\n \"muted-color\": \"#8b949e\",\n \"link-color\": \"#58a6ff\",\n \"link-hover-color\": \"#79c0ff\",\n \"link-active-color\": \"#a5d6ff\",\n \"link-visited-color\": \"#bc8cff\",\n \"surface-color\": \"#161b22\",\n \"surface-muted-color\": \"#21262d\",\n \"surface-elevated-color\": \"#1c2128\",\n \"overlay-color\": \"rgba(1, 4, 9, 0.7)\",\n \"border-strong-color\": \"#484f58\",\n \"text-color\": \"#e6edf3\",\n \"text-secondary-color\": \"#8b949e\",\n \"text-disabled-color\": \"#6e7681\",\n \"text-inverse-color\": \"#0d1117\",\n \"focus-ring-color\": \"rgba(31, 111, 235, 0.6)\",\n};\n\n/** Union of the keys of `themes` (pure: dropped when `themeKeys` is unused). */\nfunction uniqueKeys(...themes: object[]): string[] {\n const keys = new Set<string>();\n for (const theme of themes) for (const key in theme) keys.add(key);\n return Array.from(keys);\n}\n\n/**\n * Every CSS custom property name (without the leading `--`) that a built-in\n * theme may write. Used to clear stale inline variables when switching themes.\n */\nexport const themeKeys: readonly string[] = /* @__PURE__ */ uniqueKeys(\n light,\n dark,\n githubDark,\n);\n\n/**\n * Built-in themes, keyed by the name accepted by `ConfigProvider`'s `theme` prop.\n * This map is the single source of truth for theme name -> theme values.\n */\nexport const themes = {\n light,\n dark,\n \"github-dark\": githubDark,\n} as const satisfies Record<ThemeName, ComponentTheme>;\n\nexport const isThemeName = (value: unknown): value is ThemeName =>\n typeof value === \"string\" &&\n Object.prototype.hasOwnProperty.call(themes, value);\n","// Minerva's built-in palettes (palette x mode) as theme token values: the\n// source of the [data-palette][data-theme] blocks of `tokens.css`\n// (../tokens/css.ts), so the SSR init script can select a palette before\n// hydration without any JavaScript theme application, and of\n// `resolveTokens({ palette })` / the mini-program palette classes.\nimport type { ComponentTheme } from \"./types\";\nimport type { Palette, ResolvedThemeMode } from \"./mode\";\n\nexport const palettes = {\n editorial: {\n light: {\n \"primary-color\": \"#1e3a5f\",\n \"secondary-color\": \"#57534e\",\n \"success-color\": \"#5a7c2f\",\n \"danger-color\": \"#b53a2c\",\n \"warning-color\": \"#c47b1e\",\n \"info-color\": \"#3a7a92\",\n \"light-color\": \"#faf8f5\",\n \"dark-color\": \"#292524\",\n \"background-color\": \"#fdfbf6\",\n \"foreground-color\": \"#1c1917\",\n \"border-color\": \"#e7e2d4\",\n \"text-gray\": \"#57534e\",\n \"primary-gradient-start\": \"#4f7da9\",\n \"primary-gradient-end\": \"#16304f\",\n \"secondary-gradient-start\": \"#c5613a\",\n \"secondary-gradient-end\": \"#913e22\",\n \"highlight-color\": \"#fbf2dc\",\n \"shadow-color\": \"rgba(28, 25, 23, 0.16)\",\n \"muted-color\": \"#78716c\",\n \"link-color\": \"#1e3a5f\",\n \"link-hover-color\": \"#0f2742\",\n \"link-active-color\": \"#0a1d33\",\n \"link-visited-color\": \"#913e22\",\n \"surface-color\": \"#fdfbf6\",\n \"surface-subtle-color\": \"#f5f1e8\",\n \"surface-muted-color\": \"#ebe5d4\",\n \"surface-elevated-color\": \"#fdfbf6\",\n \"canvas-color\": \"#f5f1e8\",\n \"control-color\": \"#f5f1e8\",\n \"hover-color\": \"#ebe5d4\",\n \"selected-color\": \"color-mix(in srgb, #1e3a5f 14%, #fdfbf6)\",\n \"overlay-color\": \"rgba(28, 25, 23, 0.5)\",\n \"border-strong-color\": \"#c8bfac\",\n \"text-color\": \"#1c1917\",\n \"text-secondary-color\": \"#44403c\",\n \"text-muted-color\": \"#57534e\",\n \"text-disabled-color\": \"#a8a29e\",\n \"text-inverse-color\": \"#fdfbf6\",\n \"focus-ring-color\": \"color-mix(in srgb, #1e3a5f 45%, transparent)\",\n \"accent-color\": \"#b04e2b\",\n \"primary-color-hover\": \"#16304f\",\n \"primary-color-active\": \"#0f2742\",\n \"primary-color-subtle\": \"#eef3f8\",\n \"primary-color-border\": \"#a8bfd6\",\n \"primary-color-text\": \"#0f2742\",\n \"accent-color-hover\": \"#913e22\",\n \"accent-color-active\": \"#6f2e19\",\n \"accent-color-subtle\": \"#fbeae3\",\n \"accent-color-border\": \"#eaa180\",\n \"accent-color-text\": \"#6f2e19\",\n \"success-color-hover\": \"#466123\",\n \"success-color-active\": \"#34471a\",\n \"success-color-subtle\": \"#f0f5e8\",\n \"success-color-text\": \"#34471a\",\n \"warning-color-hover\": \"#a36215\",\n \"warning-color-active\": \"#804b0e\",\n \"warning-color-subtle\": \"#fbf2dc\",\n \"warning-color-text\": \"#804b0e\",\n \"danger-color-hover\": \"#952d20\",\n \"danger-color-active\": \"#732015\",\n \"danger-color-subtle\": \"#fbecea\",\n \"danger-color-text\": \"#732015\",\n \"info-color-hover\": \"#2c6075\",\n \"info-color-active\": \"#1f4858\",\n \"info-color-subtle\": \"#ecf3f5\",\n \"info-color-text\": \"#1f4858\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(28, 25, 23, 0.06)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(28, 25, 23, 0.08), 0 2px 4px -2px rgba(28, 25, 23, 0.05)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(28, 25, 23, 0.1), 0 4px 6px -4px rgba(28, 25, 23, 0.05)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(28, 25, 23, 0.12), 0 8px 10px -6px rgba(28, 25, 23, 0.06)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#7a9bc4\",\n \"secondary-color\": \"#c8bfac\",\n \"success-color\": \"#a3c971\",\n \"danger-color\": \"#e07a6c\",\n \"warning-color\": \"#e8a85a\",\n \"info-color\": \"#6ba8bd\",\n \"light-color\": \"#1c1917\",\n \"dark-color\": \"#f0ece4\",\n \"background-color\": \"#1a1612\",\n \"foreground-color\": \"#f5f1e8\",\n \"border-color\": \"#3a342d\",\n \"text-gray\": \"#a8a29e\",\n \"primary-gradient-start\": \"#4d7faf\",\n \"primary-gradient-end\": \"#9bb5d4\",\n \"secondary-gradient-start\": \"#d97c52\",\n \"secondary-gradient-end\": \"#f5cfb9\",\n \"highlight-color\": \"#3a2406\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#a8a29e\",\n \"link-color\": \"#7a9bc4\",\n \"link-hover-color\": \"#bdcde3\",\n \"link-active-color\": \"#d8e3ee\",\n \"link-visited-color\": \"#f5cfb9\",\n \"surface-color\": \"#1a1612\",\n \"surface-subtle-color\": \"#221d18\",\n \"surface-muted-color\": \"#2a241e\",\n \"surface-elevated-color\": \"#1a1612\",\n \"canvas-color\": \"#221d18\",\n \"control-color\": \"#221d18\",\n \"hover-color\": \"#2a241e\",\n \"selected-color\": \"color-mix(in srgb, #7a9bc4 14%, #1a1612)\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.7)\",\n \"border-strong-color\": \"#52483e\",\n \"text-color\": \"#f5f1e8\",\n \"text-secondary-color\": \"#c8bfac\",\n \"text-muted-color\": \"#a8a29e\",\n \"text-disabled-color\": \"#78716c\",\n \"text-inverse-color\": \"#1c1917\",\n \"focus-ring-color\": \"color-mix(in srgb, #7a9bc4 45%, transparent)\",\n \"accent-color\": \"#eaa180\",\n \"primary-color-hover\": \"#9bb5d4\",\n \"primary-color-active\": \"#bdcde3\",\n \"primary-color-subtle\": \"#061425\",\n \"primary-color-border\": \"#0f2742\",\n \"primary-color-text\": \"#bdcde3\",\n \"accent-color-hover\": \"#f5cfb9\",\n \"accent-color-active\": \"#fbeae3\",\n \"accent-color-subtle\": \"#6f2e19\",\n \"accent-color-border\": \"#b04e2b\",\n \"accent-color-text\": \"#fbeae3\",\n \"success-color-hover\": \"#b8d68c\",\n \"success-color-active\": \"#cee0a8\",\n \"success-color-subtle\": \"#1f3010\",\n \"success-color-text\": \"#cee0a8\",\n \"warning-color-hover\": \"#f0bb7d\",\n \"warning-color-active\": \"#f5cda0\",\n \"warning-color-subtle\": \"#3a2406\",\n \"warning-color-text\": \"#f5cda0\",\n \"danger-color-hover\": \"#ea968a\",\n \"danger-color-active\": \"#f3b3a8\",\n \"danger-color-subtle\": \"#3a0f0a\",\n \"danger-color-text\": \"#f3b3a8\",\n \"info-color-hover\": \"#88bdce\",\n \"info-color-active\": \"#a8d2df\",\n \"info-color-subtle\": \"#0e2530\",\n \"info-color-text\": \"#a8d2df\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.4)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.4)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n tech: {\n light: {\n \"primary-color\": \"#2364c4\",\n \"secondary-color\": \"#424c5c\",\n \"success-color\": \"#10b981\",\n \"danger-color\": \"#ef4444\",\n \"warning-color\": \"#f59e0b\",\n \"info-color\": \"#06b6d4\",\n \"light-color\": \"#f7f8fa\",\n \"dark-color\": \"#1f2630\",\n \"background-color\": \"#fafbfc\",\n \"foreground-color\": \"#131820\",\n \"border-color\": \"#dee0e3\",\n \"text-gray\": \"#5d6877\",\n \"primary-gradient-start\": \"#3479d8\",\n \"primary-gradient-end\": \"#1a4f9e\",\n \"secondary-gradient-start\": \"#3479d8\",\n \"secondary-gradient-end\": \"#1a4f9e\",\n \"highlight-color\": \"#fffbeb\",\n \"shadow-color\": \"rgba(15, 23, 42, 0.16)\",\n \"muted-color\": \"#5d6877\",\n \"link-color\": \"#2364c4\",\n \"link-hover-color\": \"#143d7a\",\n \"link-active-color\": \"#0f2c5b\",\n \"link-visited-color\": \"#1a4f9e\",\n \"surface-color\": \"#fafbfc\",\n \"surface-subtle-color\": \"#f1f3f5\",\n \"surface-muted-color\": \"#e6e8eb\",\n \"surface-elevated-color\": \"#fafbfc\",\n \"canvas-color\": \"#f1f3f5\",\n \"control-color\": \"#f1f3f5\",\n \"hover-color\": \"#e6e8eb\",\n \"selected-color\": \"color-mix(in srgb, #2364c4 14%, #fafbfc)\",\n \"overlay-color\": \"rgba(15, 23, 42, 0.5)\",\n \"border-strong-color\": \"#b8c0cc\",\n \"text-color\": \"#131820\",\n \"text-secondary-color\": \"#2f3845\",\n \"text-muted-color\": \"#5d6877\",\n \"text-disabled-color\": \"#8a94a3\",\n \"text-inverse-color\": \"#fafbfc\",\n \"focus-ring-color\": \"color-mix(in srgb, #2364c4 45%, transparent)\",\n \"accent-color\": \"#2364c4\",\n \"primary-color-hover\": \"#1a4f9e\",\n \"primary-color-active\": \"#143d7a\",\n \"primary-color-subtle\": \"#eaf2fe\",\n \"primary-color-border\": \"#91bcf8\",\n \"primary-color-text\": \"#143d7a\",\n \"accent-color-hover\": \"#1a4f9e\",\n \"accent-color-active\": \"#143d7a\",\n \"accent-color-subtle\": \"#eaf2fe\",\n \"accent-color-border\": \"#91bcf8\",\n \"accent-color-text\": \"#143d7a\",\n \"success-color-hover\": \"#059669\",\n \"success-color-active\": \"#047857\",\n \"success-color-subtle\": \"#ecfdf5\",\n \"success-color-text\": \"#047857\",\n \"warning-color-hover\": \"#d97706\",\n \"warning-color-active\": \"#b45309\",\n \"warning-color-subtle\": \"#fffbeb\",\n \"warning-color-text\": \"#b45309\",\n \"danger-color-hover\": \"#dc2626\",\n \"danger-color-active\": \"#b91c1c\",\n \"danger-color-subtle\": \"#fef2f2\",\n \"danger-color-text\": \"#b91c1c\",\n \"info-color-hover\": \"#0891b2\",\n \"info-color-active\": \"#0e7490\",\n \"info-color-subtle\": \"#ecfeff\",\n \"info-color-text\": \"#0e7490\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(15, 23, 42, 0.05)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(15, 23, 42, 0.08), 0 2px 4px -2px rgba(15, 23, 42, 0.05)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(15, 23, 42, 0.1), 0 4px 6px -4px rgba(15, 23, 42, 0.05)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(15, 23, 42, 0.12), 0 8px 10px -6px rgba(15, 23, 42, 0.06)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Inter', system-ui, -apple-system, 'PingFang SC', sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#5c8ee6\",\n \"secondary-color\": \"#b8c0cc\",\n \"success-color\": \"#34d399\",\n \"danger-color\": \"#f87171\",\n \"warning-color\": \"#fbbf24\",\n \"info-color\": \"#22d3ee\",\n \"light-color\": \"#131820\",\n \"dark-color\": \"#eef0f4\",\n \"background-color\": \"#08090d\",\n \"foreground-color\": \"#f5f7fa\",\n \"border-color\": \"#1e242e\",\n \"text-gray\": \"#7a838e\",\n \"primary-gradient-start\": \"#2364c4\",\n \"primary-gradient-end\": \"#7ba5ed\",\n \"secondary-gradient-start\": \"#2364c4\",\n \"secondary-gradient-end\": \"#7ba5ed\",\n \"highlight-color\": \"#422006\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#8a94a3\",\n \"link-color\": \"#5c8ee6\",\n \"link-hover-color\": \"#9bbcf2\",\n \"link-active-color\": \"#c0d3f7\",\n \"link-visited-color\": \"#7ba5ed\",\n \"surface-color\": \"#08090d\",\n \"surface-subtle-color\": \"#11141a\",\n \"surface-muted-color\": \"#1a1f28\",\n \"surface-elevated-color\": \"#08090d\",\n \"canvas-color\": \"#11141a\",\n \"control-color\": \"#11141a\",\n \"hover-color\": \"#1a1f28\",\n \"selected-color\": \"color-mix(in srgb, #5c8ee6 14%, #08090d)\",\n \"overlay-color\": \"rgba(0, 0, 0, 0.7)\",\n \"border-strong-color\": \"#2e3744\",\n \"text-color\": \"#f5f7fa\",\n \"text-secondary-color\": \"#c1c8d0\",\n \"text-muted-color\": \"#7a838e\",\n \"text-disabled-color\": \"#4a5360\",\n \"text-inverse-color\": \"#131820\",\n \"focus-ring-color\": \"color-mix(in srgb, #5c8ee6 45%, transparent)\",\n \"accent-color\": \"#5c8ee6\",\n \"primary-color-hover\": \"#7ba5ed\",\n \"primary-color-active\": \"#9bbcf2\",\n \"primary-color-subtle\": \"#091d3c\",\n \"primary-color-border\": \"#143d7a\",\n \"primary-color-text\": \"#9bbcf2\",\n \"accent-color-hover\": \"#7ba5ed\",\n \"accent-color-active\": \"#9bbcf2\",\n \"accent-color-subtle\": \"#091d3c\",\n \"accent-color-border\": \"#143d7a\",\n \"accent-color-text\": \"#9bbcf2\",\n \"success-color-hover\": \"#6ee7b7\",\n \"success-color-active\": \"#a7f3d0\",\n \"success-color-subtle\": \"#022c22\",\n \"success-color-text\": \"#a7f3d0\",\n \"warning-color-hover\": \"#fcd34d\",\n \"warning-color-active\": \"#fde68a\",\n \"warning-color-subtle\": \"#422006\",\n \"warning-color-text\": \"#fde68a\",\n \"danger-color-hover\": \"#fca5a5\",\n \"danger-color-active\": \"#fecaca\",\n \"danger-color-subtle\": \"#450a0a\",\n \"danger-color-text\": \"#fecaca\",\n \"info-color-hover\": \"#67e8f9\",\n \"info-color-active\": \"#a5f3fc\",\n \"info-color-subtle\": \"#022c30\",\n \"info-color-text\": \"#a5f3fc\",\n \"shadow-sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.4)\",\n \"shadow-md\":\n \"0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.4)\",\n \"shadow-lg\":\n \"0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4)\",\n \"shadow-xl\":\n \"0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45)\",\n \"font-family-sans\":\n \"'Inter', system-ui, -apple-system, 'Segoe UI', '思源黑体 CN', 'Source Han Sans CN', 'PingFang SC', 'Microsoft YaHei', sans-serif\",\n \"font-family-display\":\n \"'Spectral', 'Source Serif Pro', 'Noto Serif CJK SC', '思源宋体', 'Songti SC', Georgia, 'Times New Roman', serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n graphite: {\n light: {\n \"primary-color\": \"#315fce\",\n \"secondary-color\": \"#505761\",\n \"success-color\": \"#25865a\",\n \"danger-color\": \"#c24141\",\n \"warning-color\": \"#a86618\",\n \"info-color\": \"#327da3\",\n \"light-color\": \"#f7f7f8\",\n \"dark-color\": \"#292d32\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#1f2328\",\n \"border-color\": \"#dfe2e6\",\n \"text-gray\": \"#606873\",\n \"primary-gradient-start\": \"#6486e3\",\n \"primary-gradient-end\": \"#294eaa\",\n \"secondary-gradient-start\": \"#6486e3\",\n \"secondary-gradient-end\": \"#294eaa\",\n \"highlight-color\": \"#fff7e6\",\n \"shadow-color\": \"rgba(31, 35, 40, 0.16)\",\n \"muted-color\": \"#6f7680\",\n \"link-color\": \"#315fce\",\n \"link-hover-color\": \"#223f87\",\n \"link-active-color\": \"#1b326b\",\n \"link-visited-color\": \"#294eaa\",\n \"surface-color\": \"#ffffff\",\n \"surface-subtle-color\": \"#f5f6f7\",\n \"surface-muted-color\": \"#eceef1\",\n \"surface-elevated-color\": \"#ffffff\",\n \"canvas-color\": \"#f5f6f7\",\n \"control-color\": \"#f0f1f3\",\n \"hover-color\": \"#e8eaed\",\n \"selected-color\": \"#e5ecff\",\n \"overlay-color\": \"rgba(31, 35, 40, 0.52)\",\n \"border-strong-color\": \"#b7bdc5\",\n \"text-color\": \"#1f2328\",\n \"text-secondary-color\": \"#3b4149\",\n \"text-muted-color\": \"#606873\",\n \"text-disabled-color\": \"#9ca1aa\",\n \"text-inverse-color\": \"#ffffff\",\n \"focus-ring-color\": \"color-mix(in srgb, #315fce 45%, transparent)\",\n \"accent-color\": \"#315fce\",\n \"primary-color-hover\": \"#294eaa\",\n \"primary-color-active\": \"#223f87\",\n \"primary-color-subtle\": \"#eef3ff\",\n \"primary-color-border\": \"#bdceff\",\n \"primary-color-text\": \"#223f87\",\n \"accent-color-hover\": \"#294eaa\",\n \"accent-color-active\": \"#223f87\",\n \"accent-color-subtle\": \"#eef3ff\",\n \"accent-color-border\": \"#bdceff\",\n \"accent-color-text\": \"#223f87\",\n \"success-color-hover\": \"#1e704b\",\n \"success-color-active\": \"#195a3e\",\n \"success-color-subtle\": \"#edf8f1\",\n \"success-color-text\": \"#195a3e\",\n \"warning-color-hover\": \"#8b5313\",\n \"warning-color-active\": \"#70420f\",\n \"warning-color-subtle\": \"#fff7e6\",\n \"warning-color-text\": \"#70420f\",\n \"danger-color-hover\": \"#a63333\",\n \"danger-color-active\": \"#852828\",\n \"danger-color-subtle\": \"#fff0f0\",\n \"danger-color-text\": \"#852828\",\n \"info-color-hover\": \"#286687\",\n \"info-color-active\": \"#20516c\",\n \"info-color-subtle\": \"#edf6fb\",\n \"info-color-text\": \"#20516c\",\n \"shadow-sm\": \"0 1px 2px rgba(31, 35, 40, 0.06)\",\n \"shadow-md\": \"0 4px 12px rgba(31, 35, 40, 0.09)\",\n \"shadow-lg\": \"0 12px 28px rgba(31, 35, 40, 0.12)\",\n \"shadow-xl\": \"0 20px 42px rgba(31, 35, 40, 0.16)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#7b9cff\",\n \"secondary-color\": \"#a7adb7\",\n \"success-color\": \"#65c18c\",\n \"danger-color\": \"#e47b7b\",\n \"warning-color\": \"#e4ad5f\",\n \"info-color\": \"#6cb6d9\",\n \"light-color\": \"#17181b\",\n \"dark-color\": \"#e0e3e8\",\n \"background-color\": \"#1e2024\",\n \"foreground-color\": \"#f2f4f7\",\n \"border-color\": \"#34383f\",\n \"text-gray\": \"#a7adb7\",\n \"primary-gradient-start\": \"#587bd2\",\n \"primary-gradient-end\": \"#99b2ff\",\n \"secondary-gradient-start\": \"#587bd2\",\n \"secondary-gradient-end\": \"#99b2ff\",\n \"highlight-color\": \"#382b18\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#6f7680\",\n \"link-color\": \"#7b9cff\",\n \"link-hover-color\": \"#b7c8ff\",\n \"link-active-color\": \"#d5deff\",\n \"link-visited-color\": \"#99b2ff\",\n \"surface-color\": \"#1e2024\",\n \"surface-subtle-color\": \"#17181b\",\n \"surface-muted-color\": \"#25282d\",\n \"surface-elevated-color\": \"#1e2024\",\n \"canvas-color\": \"#17181b\",\n \"control-color\": \"#292d33\",\n \"hover-color\": \"#30343a\",\n \"selected-color\": \"#29334d\",\n \"overlay-color\": \"rgba(10, 11, 13, 0.7)\",\n \"border-strong-color\": \"#494f59\",\n \"text-color\": \"#f2f4f7\",\n \"text-secondary-color\": \"#c7ccd3\",\n \"text-muted-color\": \"#a7adb7\",\n \"text-disabled-color\": \"#6f7680\",\n \"text-inverse-color\": \"#17181b\",\n \"focus-ring-color\": \"color-mix(in srgb, #7b9cff 45%, transparent)\",\n \"accent-color\": \"#7b9cff\",\n \"primary-color-hover\": \"#99b2ff\",\n \"primary-color-active\": \"#b7c8ff\",\n \"primary-color-subtle\": \"#17213a\",\n \"primary-color-border\": \"#2d4270\",\n \"primary-color-text\": \"#b7c8ff\",\n \"accent-color-hover\": \"#99b2ff\",\n \"accent-color-active\": \"#b7c8ff\",\n \"accent-color-subtle\": \"#17213a\",\n \"accent-color-border\": \"#2d4270\",\n \"accent-color-text\": \"#b7c8ff\",\n \"success-color-hover\": \"#83d3a3\",\n \"success-color-active\": \"#a7e2bc\",\n \"success-color-subtle\": \"#183126\",\n \"success-color-text\": \"#a7e2bc\",\n \"warning-color-hover\": \"#efc27f\",\n \"warning-color-active\": \"#f4d39f\",\n \"warning-color-subtle\": \"#382b18\",\n \"warning-color-text\": \"#f4d39f\",\n \"danger-color-hover\": \"#ee9999\",\n \"danger-color-active\": \"#f4b8b8\",\n \"danger-color-subtle\": \"#3a2022\",\n \"danger-color-text\": \"#f4b8b8\",\n \"info-color-hover\": \"#8bc8e3\",\n \"info-color-active\": \"#add9eb\",\n \"info-color-subtle\": \"#1b2e38\",\n \"info-color-text\": \"#add9eb\",\n \"shadow-sm\": \"0 1px 2px rgba(0, 0, 0, 0.24)\",\n \"shadow-md\": \"0 5px 16px rgba(0, 0, 0, 0.28)\",\n \"shadow-lg\": \"0 14px 34px rgba(0, 0, 0, 0.34)\",\n \"shadow-xl\": \"0 24px 52px rgba(0, 0, 0, 0.4)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n cool: {\n light: {\n \"primary-color\": \"#2864c7\",\n \"secondary-color\": \"#485a6b\",\n \"success-color\": \"#23845a\",\n \"danger-color\": \"#c43f4e\",\n \"warning-color\": \"#a76717\",\n \"info-color\": \"#287f9e\",\n \"light-color\": \"#f5f8fb\",\n \"dark-color\": \"#24323f\",\n \"background-color\": \"#ffffff\",\n \"foreground-color\": \"#17202b\",\n \"border-color\": \"#d8e1e9\",\n \"text-gray\": \"#5e7081\",\n \"primary-gradient-start\": \"#568cde\",\n \"primary-gradient-end\": \"#2253a6\",\n \"secondary-gradient-start\": \"#568cde\",\n \"secondary-gradient-end\": \"#2253a6\",\n \"highlight-color\": \"#fff7e8\",\n \"shadow-color\": \"rgba(23, 32, 43, 0.16)\",\n \"muted-color\": \"#647687\",\n \"link-color\": \"#2864c7\",\n \"link-hover-color\": \"#1c4385\",\n \"link-active-color\": \"#17366b\",\n \"link-visited-color\": \"#2253a6\",\n \"surface-color\": \"#ffffff\",\n \"surface-subtle-color\": \"#f3f6f9\",\n \"surface-muted-color\": \"#e8eef4\",\n \"surface-elevated-color\": \"#ffffff\",\n \"canvas-color\": \"#f3f6f9\",\n \"control-color\": \"#edf2f6\",\n \"hover-color\": \"#e3eaf1\",\n \"selected-color\": \"#dfebff\",\n \"overlay-color\": \"rgba(23, 32, 43, 0.54)\",\n \"border-strong-color\": \"#afbdca\",\n \"text-color\": \"#17202b\",\n \"text-secondary-color\": \"#344554\",\n \"text-muted-color\": \"#5e7081\",\n \"text-disabled-color\": \"#8fa0b0\",\n \"text-inverse-color\": \"#ffffff\",\n \"focus-ring-color\": \"color-mix(in srgb, #2864c7 45%, transparent)\",\n \"accent-color\": \"#2864c7\",\n \"primary-color-hover\": \"#2253a6\",\n \"primary-color-active\": \"#1c4385\",\n \"primary-color-subtle\": \"#edf4ff\",\n \"primary-color-border\": \"#b6d1ff\",\n \"primary-color-text\": \"#1c4385\",\n \"accent-color-hover\": \"#2253a6\",\n \"accent-color-active\": \"#1c4385\",\n \"accent-color-subtle\": \"#edf4ff\",\n \"accent-color-border\": \"#b6d1ff\",\n \"accent-color-text\": \"#1c4385\",\n \"success-color-hover\": \"#1d6e4b\",\n \"success-color-active\": \"#17583d\",\n \"success-color-subtle\": \"#edf9f3\",\n \"success-color-text\": \"#17583d\",\n \"warning-color-hover\": \"#8b5413\",\n \"warning-color-active\": \"#70420f\",\n \"warning-color-subtle\": \"#fff7e8\",\n \"warning-color-text\": \"#70420f\",\n \"danger-color-hover\": \"#a6313f\",\n \"danger-color-active\": \"#862732\",\n \"danger-color-subtle\": \"#fff0f1\",\n \"danger-color-text\": \"#862732\",\n \"info-color-hover\": \"#216883\",\n \"info-color-active\": \"#1a5369\",\n \"info-color-subtle\": \"#eaf7fb\",\n \"info-color-text\": \"#1a5369\",\n \"shadow-sm\": \"0 1px 2px rgba(23, 32, 43, 0.06)\",\n \"shadow-md\": \"0 4px 12px rgba(23, 32, 43, 0.09)\",\n \"shadow-lg\": \"0 12px 28px rgba(23, 32, 43, 0.13)\",\n \"shadow-xl\": \"0 20px 42px rgba(23, 32, 43, 0.17)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n dark: {\n \"primary-color\": \"#79a9ff\",\n \"secondary-color\": \"#a2afbd\",\n \"success-color\": \"#62c28e\",\n \"danger-color\": \"#e37b88\",\n \"warning-color\": \"#e4ad5e\",\n \"info-color\": \"#65bad5\",\n \"light-color\": \"#151a21\",\n \"dark-color\": \"#dce4eb\",\n \"background-color\": \"#1b222c\",\n \"foreground-color\": \"#eef3f8\",\n \"border-color\": \"#344354\",\n \"text-gray\": \"#a2afbd\",\n \"primary-gradient-start\": \"#5483c3\",\n \"primary-gradient-end\": \"#98bcff\",\n \"secondary-gradient-start\": \"#5483c3\",\n \"secondary-gradient-end\": \"#98bcff\",\n \"highlight-color\": \"#392c19\",\n \"shadow-color\": \"rgba(0, 0, 0, 0.5)\",\n \"muted-color\": \"#708397\",\n \"link-color\": \"#79a9ff\",\n \"link-hover-color\": \"#b7d0ff\",\n \"link-active-color\": \"#d4e2ff\",\n \"link-visited-color\": \"#98bcff\",\n \"surface-color\": \"#1b222c\",\n \"surface-subtle-color\": \"#151a21\",\n \"surface-muted-color\": \"#222c38\",\n \"surface-elevated-color\": \"#1b222c\",\n \"canvas-color\": \"#151a21\",\n \"control-color\": \"#273341\",\n \"hover-color\": \"#2e3c4c\",\n \"selected-color\": \"#263a57\",\n \"overlay-color\": \"rgba(7, 11, 16, 0.72)\",\n \"border-strong-color\": \"#4a5d72\",\n \"text-color\": \"#eef3f8\",\n \"text-secondary-color\": \"#c5ced7\",\n \"text-muted-color\": \"#a2afbd\",\n \"text-disabled-color\": \"#708397\",\n \"text-inverse-color\": \"#151a21\",\n \"focus-ring-color\": \"color-mix(in srgb, #79a9ff 45%, transparent)\",\n \"accent-color\": \"#79a9ff\",\n \"primary-color-hover\": \"#98bcff\",\n \"primary-color-active\": \"#b7d0ff\",\n \"primary-color-subtle\": \"#172943\",\n \"primary-color-border\": \"#294a75\",\n \"primary-color-text\": \"#b7d0ff\",\n \"accent-color-hover\": \"#98bcff\",\n \"accent-color-active\": \"#b7d0ff\",\n \"accent-color-subtle\": \"#172943\",\n \"accent-color-border\": \"#294a75\",\n \"accent-color-text\": \"#b7d0ff\",\n \"success-color-hover\": \"#81d4a5\",\n \"success-color-active\": \"#a5e3bd\",\n \"success-color-subtle\": \"#183328\",\n \"success-color-text\": \"#a5e3bd\",\n \"warning-color-hover\": \"#efc17d\",\n \"warning-color-active\": \"#f5d39e\",\n \"warning-color-subtle\": \"#392c19\",\n \"warning-color-text\": \"#f5d39e\",\n \"danger-color-hover\": \"#ed9aa4\",\n \"danger-color-active\": \"#f4b9c0\",\n \"danger-color-subtle\": \"#3b2026\",\n \"danger-color-text\": \"#f4b9c0\",\n \"info-color-hover\": \"#85cce1\",\n \"info-color-active\": \"#a8ddeb\",\n \"info-color-subtle\": \"#17313c\",\n \"info-color-text\": \"#a8ddeb\",\n \"shadow-sm\": \"0 1px 2px rgba(0, 0, 0, 0.25)\",\n \"shadow-md\": \"0 5px 16px rgba(0, 0, 0, 0.3)\",\n \"shadow-lg\": \"0 14px 34px rgba(0, 0, 0, 0.36)\",\n \"shadow-xl\": \"0 24px 52px rgba(0, 0, 0, 0.42)\",\n \"font-family-sans\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-display\":\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', Arial, sans-serif\",\n \"font-family-mono\":\n \"'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n },\n },\n} as const satisfies Record<Palette, Record<ResolvedThemeMode, ComponentTheme>>;\n","// The primary / accent colors of each built-in palette: the base\n// `primaryColorTokens` / `accentFollowsPrimary` need, without the full\n// `palettes` token tables (~25 kB minified) for renderers under a size\n// budget (the `<minerva-config>` element). Kept equal to `palettes` by\n// palette-accents.test.ts.\nimport type { Palette, ResolvedThemeMode } from \"./mode\";\n\n/** Primary and accent color of a palette in one mode. */\nexport interface PaletteAccent {\n \"primary-color\": string;\n \"accent-color\": string;\n}\n\n/** Primary and accent color of each built-in palette, per mode. */\nexport const paletteAccents: Readonly<\n Record<Palette, Readonly<Record<ResolvedThemeMode, PaletteAccent>>>\n> = {\n editorial: {\n light: { \"primary-color\": \"#1e3a5f\", \"accent-color\": \"#b04e2b\" },\n dark: { \"primary-color\": \"#7a9bc4\", \"accent-color\": \"#eaa180\" },\n },\n tech: {\n light: { \"primary-color\": \"#2364c4\", \"accent-color\": \"#2364c4\" },\n dark: { \"primary-color\": \"#5c8ee6\", \"accent-color\": \"#5c8ee6\" },\n },\n graphite: {\n light: { \"primary-color\": \"#315fce\", \"accent-color\": \"#315fce\" },\n dark: { \"primary-color\": \"#7b9cff\", \"accent-color\": \"#7b9cff\" },\n },\n cool: {\n light: { \"primary-color\": \"#2864c7\", \"accent-color\": \"#2864c7\" },\n dark: { \"primary-color\": \"#79a9ff\", \"accent-color\": \"#79a9ff\" },\n },\n};\n","// Scale tokens: spacing, radius, typography, layering, motion, rhythm,\n// controls and focus (the second `:root` block of tokens.css).\n//\n// Unlike the color tokens these do not change with the theme (palettes may\n// override the font families; the design axes switch the control, radius,\n// shadow and type values). Components consume them as CSS variables; numeric\n// `gap` / `padding` props resolve to `var(--space-<n>)`.\nimport {\n clamp,\n cubicBezier,\n mergeBlocks,\n px,\n ref,\n rem,\n transition,\n type TokenBlock,\n} from \"./expr\";\nimport {\n mediumRadiusScale,\n standardDensity,\n standardFontSizes,\n} from \"./design\";\n\n/** Spacing steps (rem; fractional keys use \"-\": `0-5` = 0.5). */\nexport const spaceTokens = {\n \"space-0\": rem(0),\n \"space-0-5\": rem(0.125),\n \"space-1\": rem(0.25),\n \"space-1-5\": rem(0.375),\n \"space-2\": rem(0.5),\n \"space-2-5\": rem(0.625),\n \"space-3\": rem(0.75),\n \"space-4\": rem(1),\n \"space-5\": rem(1.25),\n \"space-6\": rem(1.5),\n \"space-7\": rem(1.75),\n \"space-8\": rem(2),\n \"space-10\": rem(2.5),\n \"space-12\": rem(3),\n \"space-14\": rem(3.5),\n \"space-16\": rem(4),\n \"space-20\": rem(5),\n \"space-24\": rem(6),\n} as const satisfies TokenBlock;\n\n/** Font family stacks of the default look (palettes override them). */\nexport const fontFamilyTokens = {\n \"font-family-sans\":\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n \"font-family-display\": ref(\"font-family-sans\"),\n \"font-family-mono\":\n 'ui-monospace, \"SF Mono\", \"JetBrains Mono\", Menlo, Consolas, monospace',\n} as const satisfies TokenBlock;\n\n/** The scales `:root` block. */\nexport const scaleTokens: TokenBlock = mergeBlocks<TokenBlock>(\n spaceTokens,\n // ---- Radius (sm / md / lg live with the theme tokens) ----\n { \"radius-none\": px(0) },\n mediumRadiusScale,\n { \"radius-full\": px(9999) },\n // ---- Typography ----\n fontFamilyTokens,\n standardFontSizes,\n {\n \"font-weight-regular\": 400,\n \"font-weight-medium\": 500,\n \"font-weight-semibold\": 600,\n \"font-weight-bold\": 700,\n \"line-height-tight\": 1.2,\n \"line-height-base\": 1.5,\n \"line-height-relaxed\": 1.7,\n // ---- Layering ----\n \"z-base\": 0,\n \"z-raised\": 10,\n \"z-dropdown\": 1000,\n \"z-sticky\": 1100,\n \"z-overlay\": 1300,\n \"z-modal\": 1400,\n \"z-popover\": 1500,\n \"z-toast\": 1700,\n // ---- Motion ----\n \"transition-fast\": transition(120, \"ease-out\"),\n \"transition-base\": transition(200, \"ease-out\"),\n \"transition-slow\": transition(360, \"ease-out\"),\n \"ease-out\": cubicBezier(0.22, 1, 0.36, 1),\n \"ease-spring\": cubicBezier(0.34, 1.56, 0.64, 1),\n \"ease-in\": cubicBezier(0.5, 0, 0.75, 0),\n // ---- Rhythm & elevation ----\n \"rhythm-section\": clamp(rem(3), 6, rem(5)),\n \"rhythm-block\": clamp(rem(1.5), 3, rem(2.5)),\n \"rhythm-tight\": rem(0.75),\n \"elevation-flat\": \"none\",\n \"elevation-subtle\": ref(\"shadow-sm\"),\n \"elevation-raised\": ref(\"shadow-md\"),\n \"elevation-floating\": ref(\"shadow-lg\"),\n },\n // ---- Controls & rows (density) ----\n standardDensity,\n {\n // ---- Focus ----\n \"focus-ring-width\": px(2),\n \"focus-ring-offset\": px(2),\n },\n);\n","// User preferences that apply to every component (media-query blocks of\n// tokens.css).\nimport type { TokenBlock } from \"./expr\";\n\n/**\n * `prefers-reduced-motion: reduce`: transitions become instant. Components\n * additionally stop their keyframe animations (spinners slow down instead of\n * stopping, so a pending state stays perceivable).\n */\nexport const reducedMotionTokens = {\n \"transition-fast\": \"0s\",\n \"transition-base\": \"0s\",\n \"transition-slow\": \"0s\",\n} as const satisfies TokenBlock;\n\n/**\n * `forced-colors: active` (Windows high contrast): the system palette replaces\n * colors, so the focus ring must not rely on a mixed color.\n */\nexport const forcedColorsTokens = {\n \"focus-ring-color\": \"Highlight\",\n} as const satisfies TokenBlock;\n","// sRGB colors for platforms without CSS color functions: parsing of the color\n// syntaxes used by the tokens, `color-mix(in srgb, ...)` per CSS Color 5, and\n// serialization to hex / rgba() strings (React Native, mini-programs).\n\n/** An sRGB color: channels 0-255 (unrounded), alpha 0-1. */\nexport interface Rgba {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/** CSS basic named colors (+ `transparent`) */\nconst NAMED: Record<string, string> = {\n black: \"#000000\",\n silver: \"#c0c0c0\",\n gray: \"#808080\",\n grey: \"#808080\",\n white: \"#ffffff\",\n maroon: \"#800000\",\n red: \"#ff0000\",\n purple: \"#800080\",\n fuchsia: \"#ff00ff\",\n magenta: \"#ff00ff\",\n green: \"#008000\",\n lime: \"#00ff00\",\n olive: \"#808000\",\n yellow: \"#ffff00\",\n navy: \"#000080\",\n blue: \"#0000ff\",\n teal: \"#008080\",\n aqua: \"#00ffff\",\n cyan: \"#00ffff\",\n orange: \"#ffa500\",\n transparent: \"#00000000\",\n};\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\nfunction parseHex(hex: string): Rgba | undefined {\n if (!/^[\\da-f]+$/i.test(hex)) return undefined;\n const digits =\n hex.length === 3 || hex.length === 4\n ? hex.replace(/./g, (d) => d + d)\n : hex;\n if (digits.length !== 6 && digits.length !== 8) return undefined;\n const channel = (i: number) => parseInt(digits.slice(i, i + 2), 16);\n return {\n r: channel(0),\n g: channel(2),\n b: channel(4),\n a: digits.length === 8 ? channel(6) / 255 : 1,\n };\n}\n\n/** A number or percentage component (`pct` = value of 100%). */\nfunction component(text: string, pct: number): number | undefined {\n const match = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(%?)$/.exec(text);\n if (!match) return undefined;\n const value = Number(match[1]);\n return match[2] ? (value / 100) * pct : value;\n}\n\nfunction parseRgbFunction(args: string): Rgba | undefined {\n // rgb(r, g, b[, a]) or rgb(r g b[ / a])\n const parts = args.includes(\",\")\n ? args.split(\",\").map((p) => p.trim())\n : args\n .replace(\"/\", \" / \")\n .trim()\n .split(/\\s+/)\n .filter((p) => p !== \"/\");\n if (parts.length !== 3 && parts.length !== 4) return undefined;\n const [r, g, b] = parts.slice(0, 3).map((p) => component(p, 255));\n const a = parts.length === 4 ? component(parts[3], 1) : 1;\n if ([r, g, b, a].some((v) => v === undefined || Number.isNaN(v))) {\n return undefined;\n }\n return {\n r: clamp(r!, 0, 255),\n g: clamp(g!, 0, 255),\n b: clamp(b!, 0, 255),\n a: clamp(a!, 0, 1),\n };\n}\n\n/** Splits `text` on top-level commas (outside parentheses). */\nexport function splitTopLevel(text: string, separator = \",\"): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"(\") depth++;\n else if (char === \")\") depth--;\n else if (depth === 0 && char === separator) {\n parts.push(text.slice(start, i).trim());\n start = i + 1;\n }\n }\n parts.push(text.slice(start).trim());\n return parts;\n}\n\n/** `<color> [<percentage>]` of a color-mix() argument */\nfunction mixArgument(\n text: string,\n): { color: Rgba; pct: number | undefined } | undefined {\n const trailing = /^(.+?)\\s+(-?[\\d.]+)%$/s.exec(text);\n const leading = /^(-?[\\d.]+)%\\s+(.+)$/s.exec(text);\n const [colorText, pctText] = trailing\n ? [trailing[1], trailing[2]]\n : leading\n ? [leading[2], leading[1]]\n : [text, undefined];\n const color = parseColor(colorText);\n if (!color) return undefined;\n return { color, pct: pctText === undefined ? undefined : Number(pctText) };\n}\n\n/**\n * Parses a CSS color: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` /\n * `rgba()` (legacy comma or modern space syntax), the basic named colors,\n * `transparent` and `color-mix(in srgb, ...)` (nested mixes included).\n * Returns `undefined` for anything else (system colors, other color spaces).\n */\nexport function parseColor(text: string): Rgba | undefined {\n const value = text.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value.slice(1));\n if (value in NAMED) return parseHex(NAMED[value].slice(1));\n const fn = /^([a-z-]+)\\((.*)\\)$/s.exec(value);\n if (!fn) return undefined;\n const [, name, args] = fn;\n if (name === \"rgb\" || name === \"rgba\") return parseRgbFunction(args);\n if (name !== \"color-mix\") return undefined;\n const [space, first, second] = splitTopLevel(args);\n if (space !== \"in srgb\" || first === undefined || second === undefined) {\n return undefined;\n }\n const a = mixArgument(first);\n const b = mixArgument(second);\n if (!a || !b) return undefined;\n return mixRgba(a.color, b.color, a.pct, b.pct);\n}\n\n/**\n * `color-mix(in srgb, a p1%, b p2%)` on parsed colors, per CSS Color 5:\n *\n * - percentages: both omitted = 50 / 50; one omitted = 100 minus the other;\n * both given and summing to 0 = invalid (`undefined`); a sum other than 100\n * is scaled to 100, and a sum below 100 also multiplies the result alpha by\n * `sum / 100`;\n * - channels are interpolated premultiplied by alpha (so `transparent` adds\n * no color, only transparency), then un-premultiplied.\n *\n * Channels are not rounded (see `formatColor`).\n */\nexport function mixRgba(\n a: Rgba,\n b: Rgba,\n p1?: number,\n p2?: number,\n): Rgba | undefined {\n if ([p1, p2].some((p) => p !== undefined && (p < 0 || p > 100))) {\n return undefined;\n }\n let w1 = p1 ?? (p2 === undefined ? 50 : 100 - p2);\n let w2 = p2 ?? 100 - w1;\n const sum = w1 + w2;\n if (sum === 0) return undefined;\n const multiplier = sum < 100 ? sum / 100 : 1;\n w1 /= sum;\n w2 /= sum;\n const alpha = a.a * w1 + b.a * w2;\n const channel = (c1: number, c2: number) =>\n alpha === 0 ? 0 : (c1 * a.a * w1 + c2 * b.a * w2) / alpha;\n return {\n r: channel(a.r, b.r),\n g: channel(a.g, b.g),\n b: channel(a.b, b.b),\n a: alpha * multiplier,\n };\n}\n\nconst ALPHA_DECIMALS = 1000;\n\nconst hex2 = (value: number) => value.toString(16).padStart(2, \"0\");\n\n/**\n * Serializes a color: `#rrggbb` (lowercase) when opaque, `rgba(r, g, b, a)`\n * otherwise. Channels are rounded half up to integers (127.5 -> 128) and\n * clamped to 0-255; alpha is rounded to 3 decimals (an alpha that rounds to 1\n * is opaque).\n */\nexport function formatColor({ r, g, b, a }: Rgba): string {\n const [R, G, B] = [r, g, b].map((c) => clamp(Math.round(c), 0, 255));\n const alpha = Math.round(clamp(a, 0, 1) * ALPHA_DECIMALS) / ALPHA_DECIMALS;\n return alpha === 1\n ? `#${hex2(R)}${hex2(G)}${hex2(B)}`\n : `rgba(${R}, ${G}, ${B}, ${alpha})`;\n}\n\n/**\n * `color-mix(in srgb, a <amount>%, b)` as a hex / rgba() string (see\n * `mixRgba` for the mixing rules and `formatColor` for the rounding).\n * `amountB` sets the second percentage explicitly. Returns `undefined` when a\n * color cannot be parsed or the percentages are invalid.\n */\nexport function colorMix(\n a: string,\n b: string,\n amount?: number,\n amountB?: number,\n): string | undefined {\n const ca = parseColor(a);\n const cb = parseColor(b);\n const mixed = ca && cb ? mixRgba(ca, cb, amount, amountB) : undefined;\n return mixed && formatColor(mixed);\n}\n\n/** Normalizes any supported color to `formatColor` output. */\nexport function normalizeColor(text: string): string | undefined {\n const color = parseColor(text);\n return color && formatColor(color);\n}\n","// Brand (primary) color: the `primaryColor` option of the theme providers.\n//\n// - `resolvePrimaryColor` validates / normalizes the option to a light / dark\n// pair; a single color gets its dark-mode value from `derivePrimaryDark`.\n// - `primaryColorTokens` is the token block a brand color sets: the primary\n// color and every token the default theme derives from it, with the same\n// formulas as `tokens.css` (default-theme.ts), so the web renderers can\n// write it as CSS variables and the native ones evaluate it\n// (`resolveTokens({ primaryColor })`).\n//\n// Platform-neutral: pure functions, no DOM.\nimport { dark } from \"../theme/themes\";\n\nimport { formatColor, parseColor, type Rgba } from \"./color\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport type { TokenValue } from \"./expr\";\n\n/** Brand color per color mode. */\nexport interface PrimaryColorPair {\n light: string;\n dark: string;\n}\n\n/**\n * Brand color: one CSS color for both modes (the dark-mode value is derived\n * with `derivePrimaryDark`), or one per mode.\n */\nexport type PrimaryColor = string | PrimaryColorPair;\n\n// ---- Contrast (WCAG 2.x) ----\n\nconst linear = (channel: number) => {\n const c = channel / 255;\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n};\n\nconst gamma = (c: number) =>\n 255 * (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\n/** WCAG relative luminance of an sRGB color (alpha ignored), 0-1. */\nexport function relativeLuminance({ r, g, b }: Rgba): number {\n return 0.2126 * linear(r) + 0.7152 * linear(g) + 0.0722 * linear(b);\n}\n\n/**\n * WCAG contrast ratio (1-21) of two colors (any `parseColor` syntax; alpha\n * ignored). `undefined` when a color cannot be parsed.\n */\nexport function contrastRatio(a: string, b: string): number | undefined {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return undefined;\n const [hi, lo] = [relativeLuminance(ca), relativeLuminance(cb)].sort(\n (x, y) => y - x,\n );\n return (hi + 0.05) / (lo + 0.05);\n}\n\n// ---- OKLab (Björn Ottosson) ----\n\ntype Lab = [l: number, a: number, b: number];\n\nfunction toOklab({ r, g, b }: Rgba): Lab {\n const [R, G, B] = [linear(r), linear(g), linear(b)];\n const l = Math.cbrt(0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B);\n const m = Math.cbrt(0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B);\n const s = Math.cbrt(0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\nfunction fromOklab([L, A, B]: Lab, alpha: number): Rgba {\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n const channel = (c: number) => Math.min(255, Math.max(0, gamma(c)));\n return {\n r: channel(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n g: channel(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n b: channel(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n a: alpha,\n };\n}\n\n/** Options of `derivePrimaryDark`. */\nexport interface DerivePrimaryDarkOptions {\n /**\n * Dark surface the color must stand out on\n * @default the dark theme's `surface-color` (\"#212937\")\n */\n background?: string;\n /**\n * Minimum WCAG contrast ratio against `background`\n * @default 4.5\n */\n minContrast?: number;\n}\n\n/** Bisection steps of `derivePrimaryDark` (precision 2^-20 of the mix). */\nconst STEPS = 20;\n\n/**\n * Dark-mode variant of a brand color: the color mixed toward white in OKLab\n * (lightness up, chroma down proportionally, hue kept) by the smallest amount\n * that reaches `minContrast` (WCAG, 4.5:1 by default) against the dark\n * theme's surface, so it stays readable as text and links and keeps the dark\n * `--text-inverse-color` readable on filled controls. A color that already\n * reaches it is returned unchanged (normalized). Deterministic; alpha is\n * kept. `undefined` when the color cannot be parsed.\n *\n * derivePrimaryDark(\"#4f46e5\"); // \"#7b85f2\"\n */\nexport function derivePrimaryDark(\n color: string,\n {\n background = dark[\"surface-color\"]!,\n minContrast = 4.5,\n }: DerivePrimaryDarkOptions = {},\n): string | undefined {\n const base = parseColor(color);\n const surface = parseColor(background);\n if (!base || !surface) return undefined;\n const target = relativeLuminance(surface);\n const reaches = (c: Rgba) => {\n const y = relativeLuminance(c);\n return (\n (Math.max(y, target) + 0.05) / (Math.min(y, target) + 0.05) >= minContrast\n );\n };\n // rounded like the serialized result, so the check holds for the output\n const at = (t: number): Rgba => {\n const [l, a, b] = toOklab(base);\n const mixed = fromOklab(\n [l + (1 - l) * t, a * (1 - t), b * (1 - t)],\n base.a,\n );\n return {\n ...mixed,\n r: Math.round(mixed.r),\n g: Math.round(mixed.g),\n b: Math.round(mixed.b),\n };\n };\n if (reaches(base)) return formatColor(base);\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < STEPS; i++) {\n const mid = (lo + hi) / 2;\n if (reaches(at(mid))) hi = mid;\n else lo = mid;\n }\n return formatColor(at(hi));\n}\n\n// ---- Validation ----\n\n/** Normalized color, `undefined` when it is not a supported CSS color. */\nconst validColor = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n const color = parseColor(value);\n return color && formatColor(color);\n};\n\n/**\n * Validates and normalizes a `primaryColor` option to a light / dark pair:\n * a single color applies to light mode and gets its dark value from\n * `derivePrimaryDark`; a `{ light, dark }` pair is used as-is. Colors are\n * normalized (`#rrggbb` / `rgba()`). Supported syntaxes: hex, `rgb()` /\n * `rgba()`, the basic named colors and `color-mix(in srgb, ...)`.\n * Returns `null` for `null` / `undefined` (no brand color) and `undefined`\n * for an invalid value (renderers ignore it with a development warning,\n * see `invalidPrimaryColorMessage`).\n */\nexport function resolvePrimaryColor(\n value: unknown,\n): PrimaryColorPair | null | undefined {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") {\n const light = validColor(value);\n return light === undefined\n ? undefined\n : { light, dark: derivePrimaryDark(light)! };\n }\n if (typeof value === \"object\") {\n const pair = value as Partial<PrimaryColorPair>;\n const light = validColor(pair.light);\n const darkColor = validColor(pair.dark);\n return light !== undefined && darkColor !== undefined\n ? { light, dark: darkColor }\n : undefined;\n }\n return undefined;\n}\n\n/** Message of the development warning for an invalid `primaryColor`. */\nexport function invalidPrimaryColorMessage(value: unknown): string {\n let text: string;\n try {\n text = JSON.stringify(value) ?? String(value);\n } catch {\n text = String(value);\n }\n return `ignored an invalid primaryColor (${text}): expected a CSS color (hex, rgb() / rgba(), a basic named color) or a { light, dark } pair of them.`;\n}\n\n// ---- Tokens ----\n\n/** Names of the tokens a formula references (`var(--x)`). */\nfunction refsOf(value: TokenValue): string[] {\n if (typeof value !== \"object\") return [];\n switch (value.kind) {\n case \"ref\":\n return [value.name];\n case \"mix\":\n return [...refsOf(value.a), ...refsOf(value.b)];\n case \"shadow\":\n return value.layers.flatMap((layer) => refsOf(layer.color));\n default:\n return [];\n }\n}\n\n/** Tokens of `block` that depend on `name`, directly or transitively. */\nfunction dependents(\n block: Readonly<Record<string, TokenValue>>,\n name: string,\n): string[] {\n const found = new Set([name]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const [key, value] of Object.entries(block)) {\n if (!found.has(key) && refsOf(value).some((ref) => found.has(ref))) {\n found.add(key);\n grew = true;\n }\n }\n }\n found.delete(name);\n return Object.keys(block).filter((key) => found.has(key));\n}\n\n/**\n * Every token the default theme derives from `--primary-color` (directly or\n * through `--accent-color`): the `primary` and `accent` role tokens (hover,\n * active, subtle, border, text), `selected-color`, `focus-ring-color` and\n * `accent-color`. Computed from the token formulas of `tokens.css`.\n */\nexport const PRIMARY_DERIVED_TOKENS: readonly string[] =\n /* @__PURE__ */ dependents(defaultThemeTokens, \"primary-color\");\n\nlet accentTokens: ReadonlySet<string> | undefined;\n\n/**\n * `accent-color` and the tokens derived from it. Computed on first use: a\n * module-level `new Set([...spread])` is not tree-shakable.\n */\nfunction accentTokenNames(): ReadonlySet<string> {\n accentTokens ??= new Set([\n \"accent-color\",\n ...dependents(defaultThemeTokens, \"accent-color\"),\n ]);\n return accentTokens;\n}\n\n/**\n * Whether a theme / palette lets its accent follow the primary color (the\n * default): its `accent-color` is unset, `var(--primary-color)` or the same\n * color as its `primary-color`. Palettes with a distinct accent (e.g.\n * \"editorial\") keep it when a brand color is set.\n */\nexport function accentFollowsPrimary(theme?: object | null): boolean {\n const tokens = (theme ?? {}) as Readonly<Record<string, unknown>>;\n const accent = tokens[\"accent-color\"];\n if (accent === undefined || accent === null) return true;\n if (typeof accent === \"object\") {\n const formula = accent as { kind?: string; name?: string };\n return formula.kind === \"ref\" && formula.name === \"primary-color\";\n }\n const text = String(accent).replace(/\\s+/g, \"\");\n if (text === \"var(--primary-color)\") return true;\n const primary = tokens[\"primary-color\"];\n if (typeof primary !== \"string\") return false;\n const a = parseColor(String(accent));\n const p = parseColor(primary);\n return !!a && !!p && formatColor(a) === formatColor(p);\n}\n\n/**\n * Token block of a brand color (names without `--`): `primary-color` and\n * every token derived from it (`PRIMARY_DERIVED_TOKENS`), with the formulas\n * of the default theme (e.g. `--primary-color-hover` is\n * `color-mix(in srgb, var(--primary-color) 85%, var(--foreground-color))`),\n * so the derived values follow the surface / foreground of the mode or\n * palette they are applied in. The accent tokens are included only when\n * `theme` (the theme or palette the block is applied over) lets its accent\n * follow the primary color (`accentFollowsPrimary`).\n *\n * Web: write `tokenToCss(value)` as `--<name>` CSS variables. Native /\n * mini-programs: evaluate with `resolveTokens({ primaryColor })` (or pass\n * the block as `overrides`).\n */\nexport function primaryColorTokens(\n color: string,\n theme?: object | null,\n): Record<string, TokenValue> {\n const withAccent = accentFollowsPrimary(theme);\n const block: Record<string, TokenValue> = { \"primary-color\": color };\n for (const name of PRIMARY_DERIVED_TOKENS) {\n if (!withAccent && accentTokenNames().has(name)) continue;\n block[name] = defaultThemeTokens[name];\n }\n return block;\n}\n","// Evaluation of the CSS values used by the tokens, without a CSS engine:\n// `var()` substitution, lengths (px / rem / em / vw / vh, calc(), min(),\n// max(), clamp()), box-shadow lists, transitions and easing curves.\nimport { formatColor, parseColor, splitTopLevel } from \"./color\";\n\n/** Context of length evaluation. */\nexport interface LengthContext {\n /** px per rem / em */\n rootFontSize: number;\n /** px per 100vw */\n viewportWidth: number;\n /** px per 100vh */\n viewportHeight: number;\n}\n\n/** Index of the `)` closing the `(` at `open`, or -1. */\nfunction closingParen(text: string, open: number): number {\n let depth = 0;\n for (let i = open; i < text.length; i++) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\" && --depth === 0) return i;\n }\n return -1;\n}\n\n/**\n * Replaces every `var(--name[, fallback])` of `text` using `lookup` (which\n * returns the substituted value of a token, or `undefined`). Returns\n * `undefined` when a reference cannot be resolved and has no fallback (the\n * CSS \"guaranteed-invalid\" value).\n */\nexport function substituteVars(\n text: string,\n lookup: (name: string) => string | undefined,\n): string | undefined {\n let out = \"\";\n let index = 0;\n for (;;) {\n const start = text.indexOf(\"var(\", index);\n if (start < 0) return out + text.slice(index);\n const end = closingParen(text, start + 3);\n if (end < 0) return undefined;\n const [name, ...rest] = splitTopLevel(text.slice(start + 4, end));\n const fallback = rest.length ? rest.join(\",\") : undefined;\n const value =\n (name.startsWith(\"--\") ? lookup(name.slice(2)) : undefined) ??\n (fallback === undefined ? undefined : substituteVars(fallback, lookup));\n if (value === undefined) return undefined;\n out += text.slice(index, start) + value;\n index = end + 1;\n }\n}\n\n// ---- Lengths ----\n\ntype Num = { value: number; length: boolean };\n\n/** Tiny recursive-descent evaluator of length expressions. */\nclass LengthParser {\n private i = 0;\n constructor(\n private readonly text: string,\n private readonly context: LengthContext,\n ) {}\n\n parse(): number | undefined {\n const result = this.sum();\n this.space();\n if (!result || this.i !== this.text.length) return undefined;\n // a unitless number is a length only when it is 0\n return result.length || result.value === 0 ? result.value : undefined;\n }\n\n private space() {\n while (/\\s/.test(this.text[this.i] ?? \"\")) this.i++;\n }\n\n private sum(): Num | undefined {\n let left = this.product();\n for (;;) {\n this.space();\n const op = this.text[this.i];\n if (!left || (op !== \"+\" && op !== \"-\")) return left;\n this.i++;\n const right = this.product();\n if (!right || right.length !== left.length) return undefined;\n left = {\n value: op === \"+\" ? left.value + right.value : left.value - right.value,\n length: left.length,\n };\n }\n }\n\n private product(): Num | undefined {\n let left = this.atom();\n for (;;) {\n this.space();\n const op = this.text[this.i];\n if (!left || (op !== \"*\" && op !== \"/\")) return left;\n this.i++;\n const right = this.atom();\n if (!right) return undefined;\n if (op === \"*\") {\n if (left.length && right.length) return undefined;\n left = {\n value: left.value * right.value,\n length: left.length || right.length,\n };\n } else {\n if (right.length || right.value === 0) return undefined;\n left = { value: left.value / right.value, length: left.length };\n }\n }\n }\n\n private args(): Num[] | undefined {\n const values: Num[] = [];\n for (;;) {\n const value = this.sum();\n if (!value) return undefined;\n values.push(value);\n this.space();\n const char = this.text[this.i++];\n if (char === \")\") return values;\n if (char !== \",\") return undefined;\n }\n }\n\n private atom(): Num | undefined {\n this.space();\n const rest = this.text.slice(this.i);\n const fn = /^(calc|min|max|clamp)?\\(/.exec(rest);\n if (fn) {\n this.i += fn[0].length;\n const args = this.args();\n if (!args || args.some((a) => a.length !== args[0].length)) {\n return undefined;\n }\n const values = args.map((a) => a.value);\n const length = args[0].length;\n switch (fn[1]) {\n case \"min\":\n return { value: Math.min(...values), length };\n case \"max\":\n return { value: Math.max(...values), length };\n case \"clamp\":\n return values.length === 3\n ? {\n value: Math.max(values[0], Math.min(values[1], values[2])),\n length,\n }\n : undefined;\n default:\n return values.length === 1 ? args[0] : undefined;\n }\n }\n const number = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(px|rem|em|vw|vh)?/.exec(rest);\n if (!number) return undefined;\n this.i += number[0].length;\n const value = Number(number[1]);\n const { rootFontSize, viewportWidth, viewportHeight } = this.context;\n const scale = {\n px: 1,\n rem: rootFontSize,\n em: rootFontSize,\n vw: viewportWidth / 100,\n vh: viewportHeight / 100,\n };\n return number[2]\n ? { value: value * scale[number[2] as keyof typeof scale], length: true }\n : { value, length: false };\n }\n}\n\n/**\n * A length in px: `0`, `<n>px|rem|em|vw|vh` and `calc()` / `min()` / `max()`\n * / `clamp()` of those. `undefined` when not a length.\n */\nexport const evaluateLength = (\n text: string,\n context: LengthContext,\n): number | undefined => new LengthParser(text.trim(), context).parse();\n\n/** Rounds to 4 decimals (removes floating point noise). */\nexport const round = (value: number) => Math.round(value * 1e4) / 1e4;\n\n// ---- Shadows ----\n\n/** One resolved `box-shadow` layer (px, normalized color). */\nexport interface ResolvedShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset: boolean;\n}\n\n/**\n * A resolved shadow: the layers, the CSS text and React Native's shadow props\n * (from the first layer): `color` is opaque and `opacity` carries its alpha,\n * `radius` is half the blur, `elevation` (Android) the rounded half blur.\n */\nexport interface ResolvedShadow {\n css: string;\n layers: ResolvedShadowLayer[];\n color: string;\n offset: { width: number; height: number };\n opacity: number;\n radius: number;\n elevation: number;\n}\n\nconst noShadow = (): ResolvedShadow => ({\n css: \"none\",\n layers: [],\n color: \"#000000\",\n offset: { width: 0, height: 0 },\n opacity: 0,\n radius: 0,\n elevation: 0,\n});\n\nconst pxCss = (value: number) => `${round(value)}px`;\n\n/** Parses a `box-shadow` value (`undefined` when invalid). */\nexport function evaluateShadow(\n text: string,\n context: LengthContext,\n): ResolvedShadow | undefined {\n if (text.trim() === \"none\") return noShadow();\n const layers: ResolvedShadowLayer[] = [];\n for (const layerText of splitTopLevel(text)) {\n const parts = splitTopLevel(layerText.replace(/\\s+/g, \" \"), \" \");\n const inset = parts.includes(\"inset\");\n const lengths: number[] = [];\n const rest: string[] = [];\n for (const part of parts) {\n if (part === \"inset\") continue;\n const length = rest.length ? undefined : evaluateLength(part, context);\n if (length === undefined) rest.push(part);\n else lengths.push(length);\n }\n const color = parseColor(rest.length ? rest.join(\" \") : \"black\");\n if (lengths.length < 2 || lengths.length > 4 || !color) return undefined;\n const [x, y, blur = 0, spread = 0] = lengths;\n layers.push({ x, y, blur, spread, color: formatColor(color), inset });\n }\n const css = layers\n .map((l) =>\n [\n ...(l.inset ? [\"inset\"] : []),\n pxCss(l.x),\n pxCss(l.y),\n pxCss(l.blur),\n ...(l.spread ? [pxCss(l.spread)] : []),\n l.color,\n ].join(\" \"),\n )\n .join(\", \");\n const first = layers[0];\n const color = parseColor(first.color)!;\n return {\n css,\n layers,\n color: formatColor({ ...color, a: 1 }),\n offset: { width: first.x, height: first.y },\n opacity: round(color.a),\n radius: round(first.blur / 2),\n elevation: Math.round(first.blur / 2),\n };\n}\n\n// ---- Motion ----\n\n/** A resolved transition shorthand (`120ms ease-out`). */\nexport interface ResolvedTransition {\n css: string;\n /** Milliseconds */\n duration: number;\n easing: string;\n}\n\n/** Parses `<duration> [<easing>]` (`undefined` when invalid). */\nexport function evaluateTransition(\n text: string,\n): ResolvedTransition | undefined {\n const match = /^(\\d*\\.?\\d+)(ms|s)(?:\\s+(.+))?$/.exec(text.trim());\n if (!match) return undefined;\n const duration = Number(match[1]) * (match[2] === \"s\" ? 1000 : 1);\n return { css: text.trim(), duration, easing: match[3] ?? \"ease\" };\n}\n\n/** Control points of the CSS easing keywords. */\nconst EASINGS: Record<string, [number, number, number, number]> = {\n linear: [0, 0, 1, 1],\n ease: [0.25, 0.1, 0.25, 1],\n \"ease-in\": [0.42, 0, 1, 1],\n \"ease-out\": [0, 0, 0.58, 1],\n \"ease-in-out\": [0.42, 0, 0.58, 1],\n};\n\n/** Control points of a `cubic-bezier()` or easing keyword. */\nexport function evaluateEasing(\n text: string,\n): [number, number, number, number] | undefined {\n const value = text.trim();\n if (value in EASINGS) return [...EASINGS[value]];\n const match = /^cubic-bezier\\((.*)\\)$/.exec(value);\n const points = match?.[1].split(\",\").map(Number);\n return points?.length === 4 && points.every(Number.isFinite)\n ? (points as [number, number, number, number])\n : undefined;\n}\n","// Concrete token values for platforms without CSS variables / color-mix()\n// (React Native, mini-programs, canvas / native drawing): applies the same\n// cascade as tokens.css for a mode x palette x design, substitutes `var()`\n// references and evaluates colors, lengths, shadows and motion.\nimport {\n presetPalette,\n resolveDesign,\n type DesignOptions,\n type ResolvedDesign,\n} from \"../theme/design\";\nimport type { Palette, ResolvedThemeMode } from \"../theme/mode\";\nimport { palettes } from \"../theme/palettes\";\nimport { dark } from \"../theme/themes\";\nimport type { ComponentTheme } from \"../theme/types\";\nimport { reducedMotionTokens } from \"./accessibility\";\nimport {\n primaryColorTokens,\n resolvePrimaryColor,\n type PrimaryColor,\n} from \"./brand\";\nimport { formatColor, parseColor } from \"./color\";\nimport { codeTokensDark } from \"./code\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport {\n densityTokens,\n fontScaleTokens,\n radiusTokens,\n shadowTokens,\n} from \"./design\";\nimport { toCss, type TokenValue } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\nimport {\n evaluateEasing,\n evaluateLength,\n evaluateShadow,\n evaluateTransition,\n round,\n substituteVars,\n type LengthContext,\n type ResolvedShadow,\n type ResolvedTransition,\n} from \"./values\";\n\n/** Options of `resolveTokens`. */\nexport interface ResolveTokensOptions {\n /** @default \"light\" */\n mode?: ResolvedThemeMode;\n /**\n * Built-in palette (`null`: Minerva's default look). Defaults to the\n * preset's palette.\n */\n palette?: Palette | null;\n /** Design preset and axes (see `resolveDesign`) */\n design?: DesignOptions | ResolvedDesign;\n /**\n * Token overrides (name without `--`, e.g. a custom theme object), applied\n * last like the inline variables of `applyThemeStyles`. Values may\n * reference other tokens (`var(--x)`) and use `color-mix()` / `calc()`.\n */\n overrides?:\n Readonly<Record<string, TokenValue | undefined>> | Partial<ComponentTheme>;\n /**\n * Brand color (see `resolvePrimaryColor`): sets `primary-color` for the\n * mode and recomputes every token derived from it\n * (`primaryColorTokens`). Wins over the palette / dark theme; `overrides`\n * still win over it. An invalid color is ignored.\n */\n primaryColor?: PrimaryColor | null;\n /** Applies the `prefers-reduced-motion` tokens (instant transitions) */\n reducedMotion?: boolean;\n /** px per rem @default 16 */\n rootFontSize?: number;\n /** Viewport width in px (for `vw` / `clamp()` tokens) @default 375 */\n viewportWidth?: number;\n /** Viewport height in px (for `vh`) @default 667 */\n viewportHeight?: number;\n}\n\n/**\n * Every token as a concrete value. Scale groups are keyed without their\n * prefix (`space[\"1-5\"]` is `--space-1-5`, `radius.sm` is `--radius-sm`);\n * `colors` and `sizes` keep the full token name.\n */\nexport interface ResolvedTokens {\n mode: ResolvedThemeMode;\n palette: Palette | null;\n design: ResolvedDesign;\n /** Colors as `#rrggbb` or `rgba(r, g, b, a)` (see `formatColor`) */\n colors: Record<string, string>;\n /** `--space-*` in px */\n space: Record<string, number>;\n /** `--radius-*` in px */\n radius: Record<string, number>;\n /** `--font-size-*` in px */\n fontSize: Record<string, number>;\n /** `--line-height-*` (unitless multipliers) */\n lineHeight: Record<string, number>;\n /** `--font-weight-*` */\n fontWeight: Record<string, number>;\n /** `--font-family-*` (CSS font stacks) */\n fontFamily: Record<string, string>;\n /** `--z-*` */\n zIndex: Record<string, number>;\n /** `--shadow-*` */\n shadows: Record<string, ResolvedShadow>;\n /** `--elevation-*` */\n elevation: Record<string, ResolvedShadow>;\n /** `--transition-*` */\n transitions: Record<string, ResolvedTransition>;\n /** `--ease-*`: cubic-bezier control points */\n easings: Record<string, [number, number, number, number]>;\n /** Other lengths in px: control heights / paddings, rows, rhythm, focus ring, touch target */\n sizes: Record<string, number>;\n /** `--touch-target-min` in px: minimum size of a touch target */\n touchTargetMin: number;\n /**\n * Every token as CSS text without `var()` / `color-mix()`: lengths in px,\n * normalized colors, resolved shadows (what `tokens.mini.css` declares)\n */\n css: Record<string, string>;\n /** Tokens that could not be evaluated (cycle, unknown syntax) */\n unresolved: string[];\n}\n\ntype Kind =\n \"color\" | \"length\" | \"number\" | \"string\" | \"shadow\" | \"transition\" | \"easing\";\n\ntype Group = Exclude<\n {\n [K in keyof ResolvedTokens]: ResolvedTokens[K] extends Record<\n string,\n unknown\n >\n ? K\n : never;\n }[keyof ResolvedTokens],\n \"css\" | \"design\" | \"unresolved\"\n>;\n\n/**\n * Token families: kind, result group and the prefix stripped from the group\n * keys (first match wins; anything else is a color).\n */\nconst FAMILIES: ReadonlyArray<\n readonly [test: RegExp, kind: Kind, group: Group, prefix: string]\n> = [\n [/^space-/, \"length\", \"space\", \"space-\"],\n [/^radius-/, \"length\", \"radius\", \"radius-\"],\n [/^font-size-/, \"length\", \"fontSize\", \"font-size-\"],\n [/^line-height-/, \"number\", \"lineHeight\", \"line-height-\"],\n [/^font-weight-/, \"number\", \"fontWeight\", \"font-weight-\"],\n [/^font-family-/, \"string\", \"fontFamily\", \"font-family-\"],\n [/^z-/, \"number\", \"zIndex\", \"z-\"],\n [/^shadow-color$/, \"color\", \"colors\", \"\"],\n [/^shadow-/, \"shadow\", \"shadows\", \"shadow-\"],\n [/^elevation-/, \"shadow\", \"elevation\", \"elevation-\"],\n [/^transition-/, \"transition\", \"transitions\", \"transition-\"],\n [/^ease-/, \"easing\", \"easings\", \"ease-\"],\n [\n /^(control-(height|padding)-|row-padding-|rhythm-|focus-ring-(width|offset)$|touch-target-)/,\n \"length\",\n \"sizes\",\n \"\",\n ],\n];\n\nconst COLOR_FAMILY = [/./, \"color\", \"colors\", \"\"] as const;\n\nconst family = (name: string) =>\n FAMILIES.find(([test]) => test.test(name)) ?? COLOR_FAMILY;\n\n/** Kind of a token, from its name (anything not a scale is a color). */\nexport const tokenKind = (name: string): Kind => family(name)[1];\n\n/** The cascade of token blocks for a mode x palette x design (CSS text). */\nexport function tokenCascade({\n mode = \"light\",\n palette,\n design: designOptions,\n overrides = {},\n primaryColor,\n reducedMotion = false,\n}: ResolveTokensOptions = {}): {\n values: Map<string, string>;\n palette: Palette | null;\n design: ResolvedDesign;\n} {\n const design = resolveDesign(designOptions);\n const chosen = palette === undefined ? presetPalette(design.preset) : palette;\n const values = new Map<string, string>();\n const apply = (block: object) => {\n for (const [name, value] of Object.entries(\n block as Record<string, TokenValue | undefined>,\n )) {\n if (value !== undefined) values.set(name, toCss(value));\n }\n };\n apply(defaultThemeTokens);\n apply(scaleTokens);\n const base = chosen\n ? palettes[chosen][mode]\n : mode === \"dark\"\n ? dark\n : undefined;\n if (base) apply(base);\n // `[data-theme=dark]` syntax highlighting block of tokens.css\n if (mode === \"dark\") apply(codeTokensDark);\n const brand = resolvePrimaryColor(primaryColor);\n if (brand) {\n apply(primaryColorTokens(brand[mode], { ...base, ...overrides }));\n }\n apply(densityTokens[design.density]);\n apply(radiusTokens[design.radius]);\n if (design.shadow !== \"standard\") apply(shadowTokens[design.shadow]);\n apply(fontScaleTokens[design.fontScale]);\n if (reducedMotion) apply(reducedMotionTokens);\n apply(overrides);\n return { values, palette: chosen, design };\n}\n\nconst pxCss = (value: number) => `${round(value)}px`;\n\n/** Value of one token of a kind, and its CSS text. */\nfunction evaluate(\n kind: Kind,\n text: string,\n context: LengthContext,\n): { value: unknown; css: string } | undefined {\n switch (kind) {\n case \"color\": {\n const color = parseColor(text);\n if (!color) return undefined;\n const css = formatColor(color);\n return { value: css, css };\n }\n case \"length\": {\n const length = evaluateLength(text, context);\n return length === undefined\n ? undefined\n : { value: round(length), css: pxCss(length) };\n }\n case \"number\": {\n const number = text.trim() === \"\" ? NaN : Number(text);\n return Number.isFinite(number)\n ? { value: number, css: String(number) }\n : undefined;\n }\n case \"string\": {\n // font stacks: double quotes, like tokens.css\n const css = text.trim().replace(/'/g, '\"');\n return { value: css, css };\n }\n case \"shadow\": {\n const shadow = evaluateShadow(text, context);\n return shadow && { value: shadow, css: shadow.css };\n }\n case \"transition\": {\n const transition = evaluateTransition(text);\n return transition && { value: transition, css: transition.css };\n }\n case \"easing\": {\n const easing = evaluateEasing(text);\n return easing && { value: easing, css: text.trim() };\n }\n }\n}\n\n/**\n * Concrete design token values for a color mode, palette and design: what a\n * browser computes from `tokens.css`, for renderers that have no CSS\n * variables or `color-mix()` (React Native, mini-programs).\n *\n * const t = resolveTokens({ mode: \"dark\", palette: \"tech\", design: { preset: \"touch\" } });\n * t.colors[\"primary-color\"]; // \"#5c8ee6\"\n * t.space[\"4\"]; // 16\n * t.shadows.md; // { css, color, offset, opacity, radius, elevation, layers }\n */\nexport function resolveTokens(\n options: ResolveTokensOptions = {},\n): ResolvedTokens {\n const { mode = \"light\" } = options;\n const context: LengthContext = {\n rootFontSize: options.rootFontSize ?? 16,\n viewportWidth: options.viewportWidth ?? 375,\n viewportHeight: options.viewportHeight ?? 667,\n };\n const { values, palette, design } = tokenCascade(options);\n\n // var() substitution with cycle detection (a cycle is guaranteed-invalid)\n const substituted = new Map<string, string | undefined>();\n const visiting = new Set<string>();\n const lookup = (name: string): string | undefined => {\n if (substituted.has(name)) return substituted.get(name);\n const raw = values.get(name);\n if (raw === undefined || visiting.has(name)) return undefined;\n visiting.add(name);\n const value = substituteVars(raw, lookup);\n visiting.delete(name);\n substituted.set(name, value);\n return value;\n };\n\n const out: ResolvedTokens = {\n mode,\n palette,\n design,\n colors: {},\n space: {},\n radius: {},\n fontSize: {},\n lineHeight: {},\n fontWeight: {},\n fontFamily: {},\n zIndex: {},\n shadows: {},\n elevation: {},\n transitions: {},\n easings: {},\n sizes: {},\n touchTargetMin: 0,\n css: {},\n unresolved: [],\n };\n for (const name of values.keys()) {\n const text = lookup(name);\n const [, kind, group, prefix] = family(name);\n const value =\n text === undefined ? undefined : evaluate(kind, text, context);\n if (value === undefined) {\n out.unresolved.push(name);\n continue;\n }\n (out[group] as Record<string, unknown>)[name.slice(prefix.length)] =\n value.value;\n out.css[name] = value.css;\n }\n out.touchTargetMin = out.sizes[\"touch-target-min\"] ?? 0;\n return out;\n}\n","// `tokens.css` (published as `minerva-design/tokens.css`), generated from the\n// token data. The output is byte-identical to what the former Sass sources\n// compiled to (`tokens.golden.css` test).\n//\n// Order matters: default (light) color tokens, scale tokens, then the palette\n// blocks ([data-palette] x [data-theme]), which must come after :root, then\n// the design axes ([data-density] / [data-radius] / [data-shadow] /\n// [data-font-scale]), which win over both, and the user preference media\n// queries.\nimport { DESIGN_ATTRIBUTES } from \"../theme/design\";\nimport { PALETTES } from \"../theme/mode\";\nimport { palettes } from \"../theme/palettes\";\nimport { dark } from \"../theme/themes\";\nimport type { ComponentTheme } from \"../theme/types\";\nimport { forcedColorsTokens, reducedMotionTokens } from \"./accessibility\";\nimport { codeTokensDark } from \"./code\";\nimport { defaultThemeTokens } from \"./default-theme\";\nimport {\n densityTokens,\n fontScaleTokens,\n radiusTokens,\n shadowTokens,\n} from \"./design\";\nimport { toCss, type TokenBlock } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\n\n/** One style rule: selectors and `property: value` declarations. */\nexport interface CssRule {\n selectors: readonly string[];\n declarations: ReadonlyArray<readonly [property: string, value: string]>;\n}\n\n/** Declarations of a token block (`--name: value`). */\nexport const tokenDeclarations = (\n /** A token block or a theme object */\n block: TokenBlock | ComponentTheme,\n /** Rewrites each value (e.g. quote normalization) */\n map: (css: string) => string = (css) => css,\n): CssRule[\"declarations\"] =>\n Object.entries(block as TokenBlock).map(([name, value]) => [\n `--${name}`,\n map(toCss(value)),\n ]);\n\n/** Serializes rules in the expanded style (`depth` = nesting depth). */\nexport function serializeRules(rules: readonly CssRule[], depth = 0): string[] {\n const pad = \" \".repeat(depth);\n return rules.map(\n ({ selectors, declarations }) =>\n `${pad}${selectors.join(`,\\n${pad}`)} {\\n${declarations\n .map(([property, value]) => `${pad} ${property}: ${value};`)\n .join(\"\\n\")}\\n${pad}}`,\n );\n}\n\n/** `@media <query> { <rules> }` */\nconst mediaBlock = (query: string, rules: readonly CssRule[]) =>\n `@media ${query} {\\n${serializeRules(rules, 1).join(\"\\n\\n\")}\\n}`;\n\n/** `[name=value]` (unquoted: every value is an identifier) */\nconst attr = (name: string, value?: string) =>\n value === undefined ? `[${name}]` : `[${name}=${value}]`;\n\n/** Font stacks are written with double quotes in the stylesheet. */\nconst doubleQuotes = (css: string) => css.replace(/'/g, '\"');\n\nconst ROOT = [\":root\", \"[data-minerva-theme-scope]\"];\n\n/** Visually hidden but available to assistive technology. */\nconst srOnly = (): CssRule => ({\n selectors: [\".minerva-sr-only\"],\n declarations: (\n [\n [\"position\", \"absolute\"],\n [\"width\", \"1px\"],\n [\"height\", \"1px\"],\n [\"padding\", \"0\"],\n [\"margin\", \"-1px\"],\n [\"overflow\", \"hidden\"],\n [\"clip\", \"rect(0, 0, 0, 0)\"],\n [\"white-space\", \"nowrap\"],\n [\"border\", \"0\"],\n ] as const\n ).map(([property, value]) => [property, `${value} !important`] as const),\n});\n\n/** Palette blocks: light (also the default mode) and dark of each palette. */\nfunction paletteRules(): CssRule[] {\n const theme = attr.bind(null, \"data-theme\");\n return PALETTES.flatMap((name) => {\n const palette = attr(\"data-palette\", name);\n return [\n {\n selectors: [\n `${palette}${theme(\"light\")}`,\n `${palette}:not(${theme(\"dark\")})`,\n ],\n declarations: tokenDeclarations(palettes[name].light, doubleQuotes),\n },\n {\n selectors: [`${palette}${theme(\"dark\")}`],\n declarations: tokenDeclarations(palettes[name].dark, doubleQuotes),\n },\n ];\n });\n}\n\n/** Design axes blocks; selectors doubled to outrank the palette blocks. */\nfunction designRules(): CssRule[] {\n const axes: Array<\n [keyof typeof DESIGN_ATTRIBUTES, Record<string, TokenBlock>]\n > = [\n [\"density\", densityTokens],\n [\"radius\", radiusTokens],\n [\"shadow\", shadowTokens],\n [\"fontScale\", fontScaleTokens],\n ];\n return axes.flatMap(([axis, blocks]) => {\n const name = DESIGN_ATTRIBUTES[axis];\n return Object.entries(blocks).map(([value, block]) => ({\n selectors: [`${attr(name, value)}${attr(name)}`],\n declarations: tokenDeclarations(block),\n }));\n });\n}\n\n/** Options of `generateTokensCss`. */\nexport interface GenerateTokensCssOptions {\n /**\n * Cascade layer wrapping the stylesheet (`false`: unlayered, as consumed by\n * bundlers that layer the CSS themselves)\n * @default \"minerva\"\n */\n layer?: string | false;\n}\n\n/**\n * The design tokens stylesheet (`minerva-design/tokens.css`), ending with a\n * newline.\n */\nexport function generateTokensCss({\n layer = \"minerva\",\n}: GenerateTokensCssOptions = {}): string {\n const rules: CssRule[] = [\n { selectors: ROOT, declarations: tokenDeclarations(defaultThemeTokens) },\n { selectors: [\":root\"], declarations: tokenDeclarations(scaleTokens) },\n srOnly(),\n ...paletteRules(),\n // Minerva's own dark mode without a palette: lets the init script (which\n // only sets data-theme) render the dark theme before hydration.\n {\n selectors: [`${attr(\"data-theme\", \"dark\")}:not(${attr(\"data-palette\")})`],\n declarations: tokenDeclarations(dark),\n },\n // Syntax highlighting in dark mode, any palette (after the :root block).\n {\n selectors: [attr(\"data-theme\", \"dark\")],\n declarations: tokenDeclarations(codeTokensDark),\n },\n ...designRules(),\n ];\n const onRoot = (block: TokenBlock): CssRule[] => [\n { selectors: [\":root\"], declarations: tokenDeclarations(block) },\n ];\n const media = [\n mediaBlock(\"(prefers-reduced-motion: reduce)\", onRoot(reducedMotionTokens)),\n mediaBlock(\"(forced-colors: active)\", onRoot(forcedColorsTokens)),\n ].join(\"\\n\");\n const body = [...serializeRules(rules), media].join(\"\\n\\n\");\n return layer ? `@layer ${layer} {\\n${body}\\n}\\n` : `${body}\\n`;\n}\n","// Design tokens for mini-programs (WeChat / Taro / uni-app): `tokens.mini.css`.\n//\n// Mini-program style engines (WXSS, Skyline) support CSS variables but not\n// attribute selectors, `color-mix()`, `@layer` or `:where()` / `:is()`, and\n// `rem` is not tied to a configurable root size. So the tokens are scoped by\n// classes and pre-resolved with `resolveTokens` (colors as hex / rgba, lengths\n// in px):\n//\n// page, .mn-root defaults (light, standard design)\n// .mn-theme-dark Minerva's dark mode (no palette)\n// .mn-palette-<p> palette <p>, light\n// .mn-palette-<p>-dark palette <p>, dark\n// .mn-density-<v> .mn-radius-<v> .mn-shadow-<v> .mn-font-scale-<v>\n//\n// One color class at a time (`miniTokenClassNames` builds the list); every\n// class goes on an element that also carries `mn-root` (the tokens are\n// recomputed there, like `[data-minerva-theme-scope]` on the web).\n//\n// Color classes only declare what differs from the defaults and never touch\n// the tokens of the design axes: the shadows of a palette are declared as\n// `--mn-shadow-standard-*` / `--mn-shadow-subtle-*`, which the shadow axis\n// selects (`--shadow-sm: var(--mn-shadow-standard-sm)`). So the palette files\n// can be loaded after the base file in any order without specificity tricks.\nimport {\n DENSITIES,\n FONT_SCALES,\n RADIUS_SCALES,\n SHADOW_SCALES,\n resolveDesign,\n type DesignOptions,\n type ResolvedDesign,\n} from \"../theme/design\";\nimport { PALETTES, type Palette, type ResolvedThemeMode } from \"../theme/mode\";\nimport { serializeRules, type CssRule } from \"./css\";\nimport { densityTokens, fontScaleTokens, radiusTokens } from \"./design\";\nimport { toCss } from \"./expr\";\nimport { scaleTokens } from \"./scales\";\nimport { resolveTokens, tokenKind, type ResolveTokensOptions } from \"./resolve\";\n\n/** Class prefix of the mini-program tokens. */\nexport const MINI_CLASS_PREFIX = \"mn-\";\n\n/** Selector of the default tokens. */\nexport const MINI_ROOT_SELECTOR = `page, .${MINI_CLASS_PREFIX}root`;\n\nconst SHADOW_STEPS = [\"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nconst cls = (...parts: string[]) => `${MINI_CLASS_PREFIX}${parts.join(\"-\")}`;\n\n/** Class of a mode x palette (`null` palette: Minerva's default colors). */\nexport const miniColorClass = (\n mode: ResolvedThemeMode,\n palette: Palette | null,\n): string | null =>\n palette\n ? cls(\"palette\", palette, ...(mode === \"dark\" ? [\"dark\"] : []))\n : mode === \"dark\"\n ? cls(\"theme\", \"dark\")\n : null;\n\n/** Kebab-case class segment of an axis (`fontScale` -> `font-scale`). */\nconst axisClass = (axis: keyof Omit<ResolvedDesign, \"preset\">, value: string) =>\n cls(axis === \"fontScale\" ? \"font-scale\" : axis, value);\n\n/** Standard axis values (declared by the root block: no class needed). */\nconst STANDARD: Omit<ResolvedDesign, \"preset\"> = {\n density: \"standard\",\n radius: \"medium\",\n shadow: \"standard\",\n fontScale: \"standard\",\n};\n\n/**\n * Class list of a mini-program token scope, e.g. for the root `<view>` of a\n * page: `mn-root` plus the color class and the non-standard design axes.\n *\n * miniTokenClassNames({ mode: \"dark\", palette: \"tech\", design: { preset: \"touch\" } })\n * // \"mn-root mn-palette-tech-dark mn-density-comfortable mn-radius-large\"\n */\nexport function miniTokenClassNames({\n mode = \"light\",\n palette,\n design,\n}: Pick<ResolveTokensOptions, \"mode\" | \"palette\"> & {\n design?: DesignOptions | ResolvedDesign;\n} = {}): string {\n const resolved = resolveDesign(design);\n const chosen =\n palette === undefined\n ? resolveTokens({ design: resolved }).palette\n : palette;\n const classes = [cls(\"root\")];\n const color = miniColorClass(mode, chosen);\n if (color) classes.push(color);\n for (const axis of Object.keys(STANDARD) as Array<keyof typeof STANDARD>) {\n if (resolved[axis] !== STANDARD[axis]) {\n classes.push(axisClass(axis, resolved[axis]));\n }\n }\n return classes.join(\" \");\n}\n\nconst shadowVar = (scale: \"standard\" | \"subtle\", step: string) =>\n `mn-shadow-${scale}-${step}`;\n\n/**\n * The tokens that vary with the mode x palette (colors, font stacks and the\n * standard / subtle shadows), resolved.\n */\nfunction colorTokens(\n mode: ResolvedThemeMode,\n palette: Palette | null,\n): Map<string, string> {\n const standard = resolveTokens({ mode, palette });\n const subtle = resolveTokens({ mode, palette, design: { shadow: \"subtle\" } });\n const out = new Map<string, string>();\n for (const [name, css] of Object.entries(standard.css)) {\n const kind = tokenKind(name);\n if (kind === \"color\" || name.startsWith(\"font-family-\")) out.set(name, css);\n }\n for (const step of SHADOW_STEPS) {\n out.set(shadowVar(\"standard\", step), standard.css[`shadow-${step}`]);\n out.set(shadowVar(\"subtle\", step), subtle.css[`shadow-${step}`]);\n }\n return out;\n}\n\nconst declarations = (\n entries: Iterable<readonly [string, string]>,\n): CssRule[\"declarations\"] =>\n [...entries].map(([name, value]) => [`--${name}`, value] as const);\n\n/** Entries of `variant` that differ from `base`. */\nconst diff = (variant: Map<string, string>, base: Map<string, string>) =>\n [...variant].filter(([name, value]) => base.get(name) !== value);\n\nconst HEADER = \"/* Minerva design tokens for mini-programs (generated) */\";\n\nconst stylesheet = (rules: CssRule[]) =>\n `${HEADER}\\n${serializeRules(rules).join(\"\\n\\n\")}\\n`;\n\n/** `var(--shadow-*)` when a scale token references a shadow token. */\nfunction shadowRef(name: string): string | undefined {\n const value = scaleTokens[name];\n return typeof value === \"object\" &&\n value.kind === \"ref\" &&\n value.name.startsWith(\"shadow-\")\n ? toCss(value)\n : undefined;\n}\n\n/** Rules of the base file: defaults, dark mode, design axes. */\nfunction baseRules(): CssRule[] {\n const defaults = resolveTokens();\n const light = colorTokens(\"light\", null);\n const root = new Map<string, string>();\n for (const [name, css] of Object.entries(defaults.css)) {\n if (/^shadow-(sm|md|lg|xl)$/.test(name)) {\n root.set(name, `var(--${shadowVar(\"standard\", name.slice(7))})`);\n } else if (shadowRef(name)) {\n // `--elevation-*: var(--shadow-*)` follows the shadow axis\n root.set(name, shadowRef(name)!);\n } else {\n root.set(name, css);\n }\n }\n for (const [name, css] of light) root.set(name, css);\n\n const axis = <V extends string>(\n name: keyof typeof STANDARD,\n values: readonly V[],\n tokens: (value: V) => Map<string, string>,\n ): CssRule[] =>\n values.map((value) => ({\n selectors: [`.${axisClass(name, value)}`],\n declarations: declarations(tokens(value)),\n }));\n const resolvedBlock = (\n block: Record<string, unknown>,\n design: DesignOptions,\n ) => {\n const { css } = resolveTokens({ design });\n return new Map(Object.keys(block).map((name) => [name, css[name]]));\n };\n\n return [\n { selectors: [MINI_ROOT_SELECTOR], declarations: declarations(root) },\n {\n selectors: [`.${miniColorClass(\"dark\", null)}`],\n declarations: declarations(diff(colorTokens(\"dark\", null), light)),\n },\n ...axis(\"density\", DENSITIES, (density) =>\n resolvedBlock(densityTokens[density], { density }),\n ),\n ...axis(\"radius\", RADIUS_SCALES, (radius) =>\n resolvedBlock(radiusTokens[radius], { radius }),\n ),\n ...axis(\n \"shadow\",\n SHADOW_SCALES,\n (shadow) =>\n new Map(\n SHADOW_STEPS.map((step) => [\n `shadow-${step}`,\n shadow === \"none\" ? \"none\" : `var(--${shadowVar(shadow, step)})`,\n ]),\n ),\n ),\n ...axis(\"fontScale\", FONT_SCALES, (fontScale) =>\n resolvedBlock(fontScaleTokens[fontScale], { fontScale }),\n ),\n ];\n}\n\n/** Rules of a palette file: the light and dark color classes. */\nfunction paletteRules(palette: Palette): CssRule[] {\n const light = colorTokens(\"light\", null);\n return ([\"light\", \"dark\"] as const).map((mode) => ({\n selectors: [`.${miniColorClass(mode, palette)}`],\n declarations: declarations(diff(colorTokens(mode, palette), light)),\n }));\n}\n\n/** Options of `generateMiniTokensCss`. */\nexport interface GenerateMiniTokensCssOptions {\n /** Palettes to include (default: all) */\n palettes?: readonly Palette[];\n}\n\n/**\n * `tokens.mini.css`: the class-scoped, pre-resolved tokens for\n * mini-programs (base + the chosen palettes).\n */\nexport function generateMiniTokensCss({\n palettes = PALETTES,\n}: GenerateMiniTokensCssOptions = {}): string {\n return stylesheet([...baseRules(), ...palettes.flatMap(paletteRules)]);\n}\n\n/**\n * The mini-program token files, split for package size budgets:\n *\n * tokens.mini.css everything (base + every palette)\n * tokens.mini.base.css defaults, dark mode, design axes\n * tokens.mini.palette-<name>.css one palette (light + dark); load after\n * the base file\n */\nexport function generateMiniTokensFiles(): Record<string, string> {\n return {\n \"tokens.mini.css\": generateMiniTokensCss(),\n \"tokens.mini.base.css\": generateMiniTokensCss({ palettes: [] }),\n ...Object.fromEntries(\n PALETTES.map((palette) => [\n `tokens.mini.palette-${palette}.css`,\n stylesheet(paletteRules(palette)),\n ]),\n ),\n };\n}\n","{\n \"avatar\": {\n \"default\": \"avatar\",\n \"group\": \"Avatar group\",\n \"groupWithMore\": \"Avatar group with {{count}} more\"\n },\n \"pagination\": {\n \"jumpPrev\": \"Previous 5 pages\",\n \"jumpNext\": \"Next 5 pages\",\n \"prev\": \"Previous page\",\n \"next\": \"Next page\",\n \"page\": \"Page {{page}}\",\n \"total\": \"Total {{total}} items\",\n \"jumpTo\": \"Go to\",\n \"jumpToInput\": \"Jump to page\",\n \"pageSize\": \"Items per page\",\n \"pageSizeOption\": \"{{size}} / page\",\n \"currentPage\": \"Current page\",\n \"nav\": \"Pagination\"\n },\n \"cascader\": {\n \"placeholder\": \"Please select\",\n \"clear\": \"Clear selection\",\n \"noResults\": \"No results found\",\n \"level\": \"{{label}}, level {{level}}\",\n \"options\": \"Options\"\n },\n \"timePicker\": {\n \"placeholder\": \"Select time\",\n \"label\": \"Time\",\n \"clear\": \"Clear time\",\n \"hours\": \"Hours\",\n \"minutes\": \"Minutes\",\n \"seconds\": \"Seconds\",\n \"period\": \"AM/PM\"\n },\n \"common\": {\n \"loading\": \"Loading\"\n },\n \"alert\": {\n \"close\": \"Close\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"icon\": {\n \"info\": \"info icon\",\n \"success\": \"success icon\",\n \"warning\": \"warning icon\",\n \"danger\": \"danger icon\"\n }\n },\n \"badge\": {\n \"default\": \"Badge\"\n },\n \"empty\": {\n \"description\": \"No Data\"\n },\n \"tag\": {\n \"close\": \"Close\",\n \"closeWithLabel\": \"Remove {{label}}\"\n },\n \"input\": {\n \"clear\": \"Clear\",\n \"showPassword\": \"Show password\",\n \"hidePassword\": \"Hide password\"\n },\n \"iconButton\": {\n \"default\": \"icon button\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"No data\",\n \"retry\": \"Retry\",\n \"scrollRegion\": \"Scrollable table\",\n \"selectAll\": \"Select all rows\",\n \"selectRow\": \"Select row {{row}}\"\n },\n \"navTree\": {\n \"label\": \"Navigation\"\n },\n \"dashboard\": {\n \"label\": \"Board\",\n \"empty\": \"No items\",\n \"columnLabel_one\": \"{{title}}, {{count}} item\",\n \"columnLabel_other\": \"{{title}}, {{count}} items\",\n \"dragHint\": \"Press Space or Enter to pick up the card, the arrow keys to move it, Space or Enter to drop it and Escape to cancel.\",\n \"lifted\": \"Picked up {{card}}: position {{position}} of {{total}} in {{column}}.\",\n \"over\": \"{{card}}: position {{position}} of {{total}} in {{column}}.\",\n \"dropped\": \"Dropped {{card}} at position {{position}} of {{total}} in {{column}}.\",\n \"cancelled\": \"Move cancelled: {{card}} stays in {{column}}.\",\n \"moveTo\": \"Move to {{column}}\",\n \"moveUp\": \"Move up\",\n \"moveDown\": \"Move down\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"The editor is unavailable\",\n \"retry\": \"Retry\",\n \"retryLabel\": \"Retry editor\",\n \"loading\": \"Loading editor\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"Media player\",\n \"play\": \"Play\",\n \"pause\": \"Pause\",\n \"skipBack_one\": \"Back {{count}} second\",\n \"skipBack_other\": \"Back {{count}} seconds\",\n \"skipForward_one\": \"Forward {{count}} second\",\n \"skipForward_other\": \"Forward {{count}} seconds\",\n \"seek\": \"Seek\",\n \"timeOf\": \"{{current}} of {{duration}}\",\n \"mute\": \"Mute\",\n \"unmute\": \"Unmute\",\n \"volume\": \"Volume\",\n \"playbackRate\": \"Playback speed {{rate}}\",\n \"fullscreen\": \"Full screen\",\n \"exitFullscreen\": \"Exit full screen\",\n \"pictureInPicture\": \"Picture in picture\",\n \"exitPictureInPicture\": \"Exit picture in picture\",\n \"captions\": \"Captions\",\n \"captionsOff\": \"Off\",\n \"loading\": \"Loading\",\n \"error\": \"This media can't be played\"\n },\n \"flashcard\": {\n \"frontLabel\": \"Question\",\n \"backLabel\": \"Answer\",\n \"hint\": \"Click or press Space to flip\",\n \"label\": \"Flashcard, showing {{face}}\"\n },\n \"loadingState\": {\n \"label\": \"Loading...\"\n },\n \"codeBlock\": {\n \"label\": \"Code\",\n \"copy\": \"Copy code\",\n \"copied\": \"Copied\",\n \"copyFailed\": \"Copy failed\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"Notifications\",\n \"close\": \"Close\",\n \"regionWithHotkey\": \"Notifications ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"Scroll pages left\",\n \"scrollRight\": \"Scroll pages right\",\n \"close\": \"Close {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"Slider\",\n \"minimum\": \"Minimum\",\n \"maximum\": \"Maximum\"\n },\n \"numberInput\": {\n \"increment\": \"Increase\",\n \"decrement\": \"Decrease\",\n \"notANumber\": \"Enter a number\",\n \"belowMin\": \"Minimum {{min}}\",\n \"aboveMax\": \"Maximum {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"Format JSON\",\n \"valid\": \"Valid JSON\",\n \"invalid\": \"Invalid JSON\"\n },\n \"keyValueEditor\": {\n \"key\": \"Key\",\n \"value\": \"Value\",\n \"add\": \"Add entry\",\n \"remove\": \"Remove entry\"\n },\n \"tagInput\": {\n \"add\": \"Add tag\",\n \"clear\": \"Clear tags\",\n \"remove\": \"Remove {{tag}}\",\n \"create\": \"Add \\\"{{tag}}\\\"\",\n \"empty\": \"No matches\"\n },\n \"validation\": {\n \"valueMissing\": \"Please fill out this field.\",\n \"selectMissing\": \"Please select an item in the list.\",\n \"checkMissing\": \"Please check this box if you want to proceed.\",\n \"radioMissing\": \"Please select one of these options.\",\n \"fileMissing\": \"Please select a file.\",\n \"tooShort\": \"Please use at least {{min}} characters.\",\n \"tooLong\": \"Please use at most {{max}} characters.\",\n \"rangeUnderflow\": \"Value must be {{min}} or more.\",\n \"rangeOverflow\": \"Value must be {{max}} or less.\",\n \"badInput\": \"Please enter a valid value.\",\n \"patternMismatch\": \"Please match the requested format.\",\n \"emailMismatch\": \"Please enter a valid email address.\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"Questions\",\n \"summary\": \"{{answered}} / {{total}} answered\",\n \"item\": \"Question {{number}}, {{status}}\",\n \"itemFlagged\": \"Question {{number}}, {{status}}, flagged\",\n \"status\": {\n \"unanswered\": \"unanswered\",\n \"answered\": \"answered\",\n \"correct\": \"correct\",\n \"wrong\": \"wrong\",\n \"skipped\": \"skipped\"\n },\n \"legend\": {\n \"unanswered\": \"Unanswered\",\n \"answered\": \"Answered\",\n \"correct\": \"Correct\",\n \"wrong\": \"Wrong\",\n \"skipped\": \"Skipped\",\n \"flagged\": \"Flagged\"\n }\n },\n \"steps\": {\n \"label\": \"Steps\"\n },\n \"upload\": {\n \"select\": \"Select files\",\n \"uploading\": \"Uploading\",\n \"done\": \"Uploaded\",\n \"failed\": \"Upload failed\",\n \"tooMany\": \"You can select up to {{count}} files\",\n \"invalidType\": \"{{name}}: unsupported file type\",\n \"tooLarge\": \"{{name}}: file exceeds the size limit\",\n \"retry\": \"Retry {{name}}\",\n \"remove\": \"Remove {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"Month calendar\",\n \"previousMonth\": \"Previous month\",\n \"nextMonth\": \"Next month\",\n \"today\": \"Today\",\n \"weekdays\": {\n \"mon\": \"Mon\",\n \"tue\": \"Tue\",\n \"wed\": \"Wed\",\n \"thu\": \"Thu\",\n \"fri\": \"Fri\",\n \"sat\": \"Sat\",\n \"sun\": \"Sun\"\n },\n \"dayWithEvents_one\": \"{{date}}, {{count}} event\",\n \"dayWithEvents_other\": \"{{date}}, {{count}} events\",\n \"eventsLabel\": \"Events on {{date}}\",\n \"noEvents\": \"No events\"\n },\n \"weekStrip\": {\n \"label\": \"Week\",\n \"previousWeek\": \"Previous week\",\n \"nextWeek\": \"Next week\",\n \"dayWithMarkers_one\": \"{{date}}, {{count}} item\",\n \"dayWithMarkers_other\": \"{{date}}, {{count}} items\",\n \"dayMarked\": \"{{date}}, marked\"\n },\n \"datePicker\": {\n \"placeholder\": \"Select date\",\n \"label\": \"Date\",\n \"clear\": \"Clear date\",\n \"today\": \"Today\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"Navigation\",\n \"expand\": \"Expand sidebar\",\n \"collapse\": \"Collapse sidebar\",\n \"enableFloating\": \"Enable floating sidebar\",\n \"disableFloating\": \"Disable floating sidebar\",\n \"openNavigation\": \"Open navigation\",\n \"closeNavigation\": \"Close navigation\",\n \"skipToContent\": \"Skip to content\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"Cancel\" },\n \"picker\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"placeholder\": \"Please select\",\n \"selected\": \"{{label}}, selected\",\n \"column\": \"Column {{index}}\"\n },\n \"searchBar\": {\n \"label\": \"Search\",\n \"placeholder\": \"Search\",\n \"cancel\": \"Cancel\",\n \"clear\": \"Clear search\"\n },\n \"navBar\": { \"back\": \"Back\" },\n \"tabBar\": { \"label\": \"Tab bar\" },\n \"pullRefresh\": {\n \"pulling\": \"Pull to refresh\",\n \"loosing\": \"Release to refresh\",\n \"loading\": \"Refreshing...\",\n \"success\": \"Refreshed\"\n },\n \"swipeCell\": { \"actions\": \"More actions\" },\n \"datetimePicker\": {\n \"title\": \"Select date\",\n \"titleTime\": \"Select time\",\n \"year\": \"Year\",\n \"month\": \"Month\",\n \"day\": \"Day\",\n \"hour\": \"Hour\",\n \"minute\": \"Minute\"\n },\n \"calendar\": {\n \"title\": \"Select date\",\n \"confirm\": \"Confirm\",\n \"monthTitle\": \"{{month}}/{{year}}\",\n \"rangeStart\": \"Start\",\n \"rangeEnd\": \"End\"\n },\n \"imagePreview\": {\n \"label\": \"Image preview\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"Close preview\"\n },\n \"collapse\": { \"expand\": \"Expand\", \"collapse\": \"Collapse\" },\n \"rating\": { \"label\": \"Rating\", \"value\": \"{{value}} of {{max}}\" },\n \"progress\": { \"label\": \"Progress\" },\n \"form\": { \"submit\": \"Submit\", \"reset\": \"Reset\", \"required\": \"required\" },\n \"paginationSimple\": { \"pageOf\": \"Page {{page}} of {{total}}\" },\n \"stepStatus\": { \"finish\": \"Completed\", \"process\": \"In progress\", \"wait\": \"Waiting\", \"error\": \"Error\" },\n \"presetToggle\": { \"label\": \"Current preset {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"Editorial\", \"compact\": \"Compact\", \"touch\": \"Touch\" }\n}\n","{\n \"modal\": {\n \"close\": \"Close\"\n },\n \"drawer\": {\n \"close\": \"Close\",\n \"description\": \"Drawer content\"\n },\n \"confirm\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"delete\": \"Delete\"\n },\n \"command\": {\n \"title\": \"Command palette\",\n \"description\": \"Search and jump to modules, settings pages or actions.\",\n \"placeholder\": \"Search commands, paths or keywords\",\n \"empty\": \"No matching results\",\n \"results\": \"Command results\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"Current theme {{theme}}\",\n \"light\": \"Light\",\n \"dark\": \"Dark\",\n \"system\": \"System\"\n },\n \"paletteToggle\": {\n \"label\": \"Current palette {{palette}}\",\n \"default\": \"Default\",\n \"editorial\": \"Editorial\",\n \"tech\": \"Tech\",\n \"graphite\": \"Graphite\",\n \"cool\": \"Cool\"\n }\n}\n","/**\n * A tree of translated strings: nested namespaces whose leaves are message\n * strings (may contain `{{placeholder}}` interpolations).\n */\nexport type Messages = { [key: string]: Messages | string };\n\nconst isObject = (value: unknown): value is Messages =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/** Deep-merge translation objects (later sources win). */\nexport function mergeMessages<T extends object>(\n base: T,\n ...sources: object[]\n): T {\n const out: Messages = { ...(base as Messages) };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source as Messages)) {\n const prev = out[key];\n out[key] =\n isObject(prev) && isObject(value) ? mergeMessages(prev, value) : value;\n }\n }\n return out as T;\n}\n","import enIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n enIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"avatar\",\n \"group\": \"Groupe d'avatars\",\n \"groupWithMore\": \"Groupe d'avatars, {{count}} de plus\"\n },\n \"pagination\": {\n \"jumpPrev\": \"5 pages précédentes\",\n \"jumpNext\": \"5 pages suivantes\",\n \"prev\": \"Page précédente\",\n \"next\": \"Page suivante\",\n \"page\": \"Page {{page}}\",\n \"total\": \"Total : {{total}} éléments\",\n \"jumpTo\": \"Aller à\",\n \"jumpToInput\": \"Aller à la page\",\n \"pageSize\": \"Éléments par page\",\n \"pageSizeOption\": \"{{size}} / page\",\n \"currentPage\": \"Page actuelle\",\n \"nav\": \"Pagination\"\n },\n \"cascader\": {\n \"placeholder\": \"Veuillez choisir\",\n \"clear\": \"Effacer la sélection\",\n \"noResults\": \"Aucun résultat\",\n \"level\": \"{{label}}, niveau {{level}}\",\n \"options\": \"Options\"\n },\n \"timePicker\": {\n \"placeholder\": \"Choisir l'heure\",\n \"label\": \"Heure\",\n \"clear\": \"Effacer l'heure\",\n \"hours\": \"Heures\",\n \"minutes\": \"Minutes\",\n \"seconds\": \"Secondes\",\n \"period\": \"AM/PM\"\n },\n \"common\": {\n \"loading\": \"Chargement\"\n },\n \"alert\": {\n \"close\": \"Fermer\",\n \"expand\": \"Développer\",\n \"collapse\": \"Réduire\",\n \"icon\": {\n \"info\": \"icône d'information\",\n \"success\": \"icône de succès\",\n \"warning\": \"icône d'avertissement\",\n \"danger\": \"icône d'erreur\"\n }\n },\n \"badge\": {\n \"default\": \"Badge\"\n },\n \"empty\": {\n \"description\": \"Aucune donnée\"\n },\n \"tag\": {\n \"close\": \"Fermer\",\n \"closeWithLabel\": \"Supprimer {{label}}\"\n },\n \"input\": {\n \"clear\": \"Effacer\",\n \"showPassword\": \"Afficher le mot de passe\",\n \"hidePassword\": \"Masquer le mot de passe\"\n },\n \"iconButton\": {\n \"default\": \"bouton icône\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"Aucune donnée\",\n \"retry\": \"Réessayer\",\n \"scrollRegion\": \"Tableau défilant\",\n \"selectAll\": \"Sélectionner toutes les lignes\",\n \"selectRow\": \"Sélectionner la ligne {{row}}\"\n },\n \"dashboard\": {\n \"label\": \"Tableau\",\n \"empty\": \"Aucun élément\",\n \"columnLabel_one\": \"{{title}}, {{count}} élément\",\n \"columnLabel_other\": \"{{title}}, {{count}} éléments\",\n \"dragHint\": \"Appuyez sur Espace ou Entrée pour saisir la carte, sur les flèches pour la déplacer, sur Espace ou Entrée pour la déposer et sur Échap pour annuler.\",\n \"lifted\": \"{{card}} saisie : position {{position}} sur {{total}} dans {{column}}.\",\n \"over\": \"{{card}} : position {{position}} sur {{total}} dans {{column}}.\",\n \"dropped\": \"{{card}} déposée en position {{position}} sur {{total}} dans {{column}}.\",\n \"cancelled\": \"Déplacement annulé : {{card}} reste dans {{column}}.\",\n \"moveTo\": \"Déplacer vers {{column}}\",\n \"moveUp\": \"Monter\",\n \"moveDown\": \"Descendre\"\n },\n \"navTree\": {\n \"label\": \"Navigation\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"L'éditeur est indisponible\",\n \"retry\": \"Réessayer\",\n \"retryLabel\": \"Réessayer l'éditeur\",\n \"loading\": \"Chargement de l'éditeur\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"Lecteur multimédia\",\n \"play\": \"Lecture\",\n \"pause\": \"Pause\",\n \"skipBack_one\": \"Reculer de {{count}} seconde\",\n \"skipBack_other\": \"Reculer de {{count}} secondes\",\n \"skipForward_one\": \"Avancer de {{count}} seconde\",\n \"skipForward_other\": \"Avancer de {{count}} secondes\",\n \"seek\": \"Position de lecture\",\n \"timeOf\": \"{{current}} sur {{duration}}\",\n \"mute\": \"Couper le son\",\n \"unmute\": \"Rétablir le son\",\n \"volume\": \"Volume\",\n \"playbackRate\": \"Vitesse de lecture {{rate}}\",\n \"fullscreen\": \"Plein écran\",\n \"exitFullscreen\": \"Quitter le plein écran\",\n \"pictureInPicture\": \"Image dans l’image\",\n \"exitPictureInPicture\": \"Quitter l’image dans l’image\",\n \"captions\": \"Sous-titres\",\n \"captionsOff\": \"Désactivés\",\n \"loading\": \"Chargement\",\n \"error\": \"Ce média ne peut pas être lu\"\n },\n \"flashcard\": {\n \"frontLabel\": \"Question\",\n \"backLabel\": \"Réponse\",\n \"hint\": \"Cliquez ou appuyez sur Espace pour retourner\",\n \"label\": \"Carte mémoire, {{face}} affichée\"\n },\n \"loadingState\": {\n \"label\": \"Chargement...\"\n },\n \"codeBlock\": {\n \"label\": \"Code\",\n \"copy\": \"Copier le code\",\n \"copied\": \"Copié\",\n \"copyFailed\": \"Échec de la copie\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"Notifications\",\n \"close\": \"Fermer\",\n \"regionWithHotkey\": \"Notifications ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"Faire défiler les pages vers la gauche\",\n \"scrollRight\": \"Faire défiler les pages vers la droite\",\n \"close\": \"Fermer {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"Curseur\",\n \"minimum\": \"Minimum\",\n \"maximum\": \"Maximum\"\n },\n \"numberInput\": {\n \"increment\": \"Augmenter\",\n \"decrement\": \"Diminuer\",\n \"notANumber\": \"Saisissez un nombre\",\n \"belowMin\": \"Minimum {{min}}\",\n \"aboveMax\": \"Maximum {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"Formater le JSON\",\n \"valid\": \"JSON valide\",\n \"invalid\": \"JSON invalide\"\n },\n \"keyValueEditor\": {\n \"key\": \"Clé\",\n \"value\": \"Valeur\",\n \"add\": \"Ajouter une entrée\",\n \"remove\": \"Supprimer l’entrée\"\n },\n \"tagInput\": {\n \"add\": \"Ajouter une étiquette\",\n \"clear\": \"Effacer les étiquettes\",\n \"remove\": \"Retirer {{tag}}\",\n \"create\": \"Ajouter « {{tag}} »\",\n \"empty\": \"Aucun résultat\"\n },\n \"validation\": {\n \"valueMissing\": \"Veuillez renseigner ce champ.\",\n \"selectMissing\": \"Veuillez sélectionner un élément de la liste.\",\n \"checkMissing\": \"Veuillez cocher cette case pour continuer.\",\n \"radioMissing\": \"Veuillez sélectionner l’une de ces options.\",\n \"fileMissing\": \"Veuillez sélectionner un fichier.\",\n \"tooShort\": \"Veuillez utiliser au moins {{min}} caractères.\",\n \"tooLong\": \"Veuillez utiliser au plus {{max}} caractères.\",\n \"rangeUnderflow\": \"La valeur doit être supérieure ou égale à {{min}}.\",\n \"rangeOverflow\": \"La valeur doit être inférieure ou égale à {{max}}.\",\n \"badInput\": \"Veuillez saisir une valeur valide.\",\n \"patternMismatch\": \"Veuillez respecter le format requis.\",\n \"emailMismatch\": \"Veuillez saisir une adresse e-mail valide.\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"Questions\",\n \"summary\": \"{{answered}} / {{total}} répondues\",\n \"item\": \"Question {{number}}, {{status}}\",\n \"itemFlagged\": \"Question {{number}}, {{status}}, marquée\",\n \"status\": {\n \"unanswered\": \"sans réponse\",\n \"answered\": \"répondue\",\n \"correct\": \"correcte\",\n \"wrong\": \"incorrecte\",\n \"skipped\": \"passée\"\n },\n \"legend\": {\n \"unanswered\": \"Sans réponse\",\n \"answered\": \"Répondue\",\n \"correct\": \"Correcte\",\n \"wrong\": \"Incorrecte\",\n \"skipped\": \"Passée\",\n \"flagged\": \"Marquée\"\n }\n },\n \"steps\": {\n \"label\": \"Étapes\"\n },\n \"upload\": {\n \"select\": \"Choisir des fichiers\",\n \"uploading\": \"Envoi en cours\",\n \"done\": \"Envoyé\",\n \"failed\": \"Échec de l’envoi\",\n \"tooMany\": \"Vous pouvez choisir au maximum {{count}} fichiers\",\n \"invalidType\": \"{{name}} : type de fichier non pris en charge\",\n \"tooLarge\": \"{{name}} : le fichier dépasse la taille maximale\",\n \"retry\": \"Réessayer {{name}}\",\n \"remove\": \"Retirer {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"Calendrier mensuel\",\n \"previousMonth\": \"Mois précédent\",\n \"nextMonth\": \"Mois suivant\",\n \"today\": \"Aujourd’hui\",\n \"weekdays\": {\n \"mon\": \"lun.\",\n \"tue\": \"mar.\",\n \"wed\": \"mer.\",\n \"thu\": \"jeu.\",\n \"fri\": \"ven.\",\n \"sat\": \"sam.\",\n \"sun\": \"dim.\"\n },\n \"dayWithEvents_one\": \"{{date}}, {{count}} événement\",\n \"dayWithEvents_other\": \"{{date}}, {{count}} événements\",\n \"eventsLabel\": \"Événements du {{date}}\",\n \"noEvents\": \"Aucun événement\"\n },\n \"weekStrip\": {\n \"label\": \"Semaine\",\n \"previousWeek\": \"Semaine précédente\",\n \"nextWeek\": \"Semaine suivante\",\n \"dayWithMarkers_one\": \"{{date}}, {{count}} élément\",\n \"dayWithMarkers_other\": \"{{date}}, {{count}} éléments\",\n \"dayMarked\": \"{{date}}, marqué\"\n },\n \"datePicker\": {\n \"placeholder\": \"Choisir une date\",\n \"label\": \"Date\",\n \"clear\": \"Effacer la date\",\n \"today\": \"Aujourd’hui\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"Navigation\",\n \"expand\": \"Déplier la barre latérale\",\n \"collapse\": \"Replier la barre latérale\",\n \"enableFloating\": \"Activer la barre latérale flottante\",\n \"disableFloating\": \"Désactiver la barre latérale flottante\",\n \"openNavigation\": \"Ouvrir la navigation\",\n \"closeNavigation\": \"Fermer la navigation\",\n \"skipToContent\": \"Aller au contenu\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"Annuler\" },\n \"picker\": {\n \"confirm\": \"Confirmer\",\n \"cancel\": \"Annuler\",\n \"placeholder\": \"Veuillez sélectionner\",\n \"selected\": \"{{label}}, sélectionné\",\n \"column\": \"Colonne {{index}}\"\n },\n \"searchBar\": {\n \"label\": \"Rechercher\",\n \"placeholder\": \"Rechercher\",\n \"cancel\": \"Annuler\",\n \"clear\": \"Effacer la recherche\"\n },\n \"navBar\": { \"back\": \"Retour\" },\n \"tabBar\": { \"label\": \"Barre d'onglets\" },\n \"pullRefresh\": {\n \"pulling\": \"Tirer pour actualiser\",\n \"loosing\": \"Relâcher pour actualiser\",\n \"loading\": \"Actualisation...\",\n \"success\": \"Actualisé\"\n },\n \"swipeCell\": { \"actions\": \"Plus d'actions\" },\n \"datetimePicker\": {\n \"title\": \"Choisir une date\",\n \"titleTime\": \"Choisir une heure\",\n \"year\": \"Année\",\n \"month\": \"Mois\",\n \"day\": \"Jour\",\n \"hour\": \"Heure\",\n \"minute\": \"Minute\"\n },\n \"calendar\": {\n \"title\": \"Choisir une date\",\n \"confirm\": \"Confirmer\",\n \"monthTitle\": \"{{month}}/{{year}}\",\n \"rangeStart\": \"Début\",\n \"rangeEnd\": \"Fin\"\n },\n \"imagePreview\": {\n \"label\": \"Aperçu de l'image\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"Fermer l'aperçu\"\n },\n \"collapse\": { \"expand\": \"Déplier\", \"collapse\": \"Replier\" },\n \"rating\": { \"label\": \"Note\", \"value\": \"{{value}} sur {{max}}\" },\n \"progress\": { \"label\": \"Progression\" },\n \"form\": { \"submit\": \"Envoyer\", \"reset\": \"Réinitialiser\", \"required\": \"obligatoire\" },\n \"paginationSimple\": { \"pageOf\": \"Page {{page}} sur {{total}}\" },\n \"stepStatus\": { \"finish\": \"Terminé\", \"process\": \"En cours\", \"wait\": \"En attente\", \"error\": \"Erreur\" },\n \"presetToggle\": { \"label\": \"Préréglage actuel {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"Éditorial\", \"compact\": \"Compact\", \"touch\": \"Tactile\" }\n}\n","{\n \"modal\": {\n \"close\": \"Fermer\"\n },\n \"drawer\": {\n \"close\": \"Fermer\",\n \"description\": \"Contenu du tiroir\"\n },\n \"confirm\": {\n \"confirm\": \"Confirmer\",\n \"cancel\": \"Annuler\",\n \"delete\": \"Supprimer\"\n },\n \"command\": {\n \"title\": \"Palette de commandes\",\n \"description\": \"Recherchez et accédez aux modules, pages de réglages ou actions.\",\n \"placeholder\": \"Rechercher des commandes, chemins ou mots-clés\",\n \"empty\": \"Aucun résultat correspondant\",\n \"results\": \"Résultats des commandes\",\n \"enter\": \"Entrée\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"Thème actuel {{theme}}\",\n \"light\": \"Clair\",\n \"dark\": \"Sombre\",\n \"system\": \"Système\"\n },\n \"paletteToggle\": {\n \"label\": \"Palette actuelle {{palette}}\",\n \"default\": \"Par défaut\",\n \"editorial\": \"Éditorial\",\n \"tech\": \"Tech\",\n \"graphite\": \"Graphite\",\n \"cool\": \"Froid\"\n }\n}\n","import frIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n frIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"アバター\",\n \"group\": \"アバターグループ\",\n \"groupWithMore\": \"アバターグループ(ほか {{count}} 人)\"\n },\n \"pagination\": {\n \"jumpPrev\": \"前の 5 ページ\",\n \"jumpNext\": \"次の 5 ページ\",\n \"prev\": \"前のページ\",\n \"next\": \"次のページ\",\n \"page\": \"{{page}} ページ\",\n \"total\": \"全 {{total}} 件\",\n \"jumpTo\": \"移動\",\n \"jumpToInput\": \"ページを指定して移動\",\n \"pageSize\": \"1 ページあたりの件数\",\n \"pageSizeOption\": \"{{size}} 件 / ページ\",\n \"currentPage\": \"現在のページ\",\n \"nav\": \"ページネーション\"\n },\n \"cascader\": {\n \"placeholder\": \"選択してください\",\n \"clear\": \"選択をクリア\",\n \"noResults\": \"該当する項目がありません\",\n \"level\": \"{{label}}、レベル {{level}}\",\n \"options\": \"選択肢\"\n },\n \"timePicker\": {\n \"placeholder\": \"時刻を選択\",\n \"label\": \"時刻\",\n \"clear\": \"時刻をクリア\",\n \"hours\": \"時\",\n \"minutes\": \"分\",\n \"seconds\": \"秒\",\n \"period\": \"午前/午後\"\n },\n \"common\": {\n \"loading\": \"読み込み中\"\n },\n \"alert\": {\n \"close\": \"閉じる\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"icon\": {\n \"info\": \"情報アイコン\",\n \"success\": \"成功アイコン\",\n \"warning\": \"警告アイコン\",\n \"danger\": \"エラーアイコン\"\n }\n },\n \"badge\": {\n \"default\": \"バッジ\"\n },\n \"empty\": {\n \"description\": \"データがありません\"\n },\n \"tag\": {\n \"close\": \"閉じる\",\n \"closeWithLabel\": \"{{label}} を削除\"\n },\n \"input\": {\n \"clear\": \"クリア\",\n \"showPassword\": \"パスワードを表示\",\n \"hidePassword\": \"パスワードを隠す\"\n },\n \"iconButton\": {\n \"default\": \"アイコンボタン\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"データがありません\",\n \"retry\": \"再試行\",\n \"scrollRegion\": \"スクロール可能な表\",\n \"selectAll\": \"すべての行を選択\",\n \"selectRow\": \"行 {{row}} を選択\"\n },\n \"dashboard\": {\n \"label\": \"ボード\",\n \"empty\": \"項目はありません\",\n \"columnLabel_one\": \"{{title}}、{{count}} 件\",\n \"columnLabel_other\": \"{{title}}、{{count}} 件\",\n \"dragHint\": \"Space キーまたは Enter キーでカードを持ち上げ、矢印キーで移動し、Space キーまたは Enter キーで置きます。Escape キーで取り消します。\",\n \"lifted\": \"{{card}} を持ち上げました:{{column}} の {{total}} 件中 {{position}} 番目。\",\n \"over\": \"{{card}}:{{column}} の {{total}} 件中 {{position}} 番目。\",\n \"dropped\": \"{{card}} を {{column}} の {{total}} 件中 {{position}} 番目に置きました。\",\n \"cancelled\": \"移動を取り消しました:{{card}} は {{column}} のままです。\",\n \"moveTo\": \"{{column}} に移動\",\n \"moveUp\": \"上へ移動\",\n \"moveDown\": \"下へ移動\"\n },\n \"navTree\": {\n \"label\": \"ナビゲーション\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"エディターを利用できません\",\n \"retry\": \"再試行\",\n \"retryLabel\": \"エディターを再読み込み\",\n \"loading\": \"エディターを読み込み中\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"メディアプレーヤー\",\n \"play\": \"再生\",\n \"pause\": \"一時停止\",\n \"skipBack_one\": \"{{count}} 秒戻る\",\n \"skipBack_other\": \"{{count}} 秒戻る\",\n \"skipForward_one\": \"{{count}} 秒進む\",\n \"skipForward_other\": \"{{count}} 秒進む\",\n \"seek\": \"再生位置\",\n \"timeOf\": \"{{current}} / {{duration}}\",\n \"mute\": \"ミュート\",\n \"unmute\": \"ミュート解除\",\n \"volume\": \"音量\",\n \"playbackRate\": \"再生速度 {{rate}}\",\n \"fullscreen\": \"全画面表示\",\n \"exitFullscreen\": \"全画面表示を終了\",\n \"pictureInPicture\": \"ピクチャーインピクチャー\",\n \"exitPictureInPicture\": \"ピクチャーインピクチャーを終了\",\n \"captions\": \"字幕\",\n \"captionsOff\": \"オフ\",\n \"loading\": \"読み込み中\",\n \"error\": \"このメディアは再生できません\"\n },\n \"flashcard\": {\n \"frontLabel\": \"問題\",\n \"backLabel\": \"解答\",\n \"hint\": \"クリックまたはスペースキーで裏返す\",\n \"label\": \"フラッシュカード、{{face}}を表示中\"\n },\n \"loadingState\": {\n \"label\": \"読み込み中...\"\n },\n \"codeBlock\": {\n \"label\": \"コード\",\n \"copy\": \"コードをコピー\",\n \"copied\": \"コピーしました\",\n \"copyFailed\": \"コピーに失敗しました\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"通知\",\n \"close\": \"閉じる\",\n \"regionWithHotkey\": \"通知 ({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"ページタブを左へスクロール\",\n \"scrollRight\": \"ページタブを右へスクロール\",\n \"close\": \"{{label}} を閉じる\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"スライダー\",\n \"minimum\": \"最小値\",\n \"maximum\": \"最大値\"\n },\n \"numberInput\": {\n \"increment\": \"増やす\",\n \"decrement\": \"減らす\",\n \"notANumber\": \"数値を入力してください\",\n \"belowMin\": \"最小値 {{min}}\",\n \"aboveMax\": \"最大値 {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"JSON を整形\",\n \"valid\": \"有効な JSON\",\n \"invalid\": \"無効な JSON\"\n },\n \"keyValueEditor\": {\n \"key\": \"キー\",\n \"value\": \"値\",\n \"add\": \"項目を追加\",\n \"remove\": \"項目を削除\"\n },\n \"tagInput\": {\n \"add\": \"タグを追加\",\n \"clear\": \"タグをクリア\",\n \"remove\": \"{{tag}} を削除\",\n \"create\": \"「{{tag}}」を追加\",\n \"empty\": \"一致する項目がありません\"\n },\n \"validation\": {\n \"valueMissing\": \"このフィールドを入力してください。\",\n \"selectMissing\": \"リストから項目を選択してください。\",\n \"checkMissing\": \"続行するにはこのボックスをオンにしてください。\",\n \"radioMissing\": \"いずれかのオプションを選択してください。\",\n \"fileMissing\": \"ファイルを選択してください。\",\n \"tooShort\": \"{{min}} 文字以上で入力してください。\",\n \"tooLong\": \"{{max}} 文字以内で入力してください。\",\n \"rangeUnderflow\": \"{{min}} 以上の値を入力してください。\",\n \"rangeOverflow\": \"{{max}} 以下の値を入力してください。\",\n \"badInput\": \"有効な値を入力してください。\",\n \"patternMismatch\": \"指定されている形式で入力してください。\",\n \"emailMismatch\": \"有効なメールアドレスを入力してください。\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"問題\",\n \"summary\": \"{{answered}} / {{total}} 問回答済み\",\n \"item\": \"問題 {{number}}、{{status}}\",\n \"itemFlagged\": \"問題 {{number}}、{{status}}、フラグ付き\",\n \"status\": {\n \"unanswered\": \"未回答\",\n \"answered\": \"回答済み\",\n \"correct\": \"正解\",\n \"wrong\": \"不正解\",\n \"skipped\": \"スキップ\"\n },\n \"legend\": {\n \"unanswered\": \"未回答\",\n \"answered\": \"回答済み\",\n \"correct\": \"正解\",\n \"wrong\": \"不正解\",\n \"skipped\": \"スキップ\",\n \"flagged\": \"フラグ付き\"\n }\n },\n \"steps\": {\n \"label\": \"ステップ\"\n },\n \"upload\": {\n \"select\": \"ファイルを選択\",\n \"uploading\": \"アップロード中\",\n \"done\": \"アップロード完了\",\n \"failed\": \"アップロード失敗\",\n \"tooMany\": \"選択できるファイルは最大 {{count}} 個です\",\n \"invalidType\": \"{{name}}:対応していないファイル形式です\",\n \"tooLarge\": \"{{name}}:ファイルサイズが上限を超えています\",\n \"retry\": \"{{name}} を再試行\",\n \"remove\": \"{{name}} を削除\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"月間カレンダー\",\n \"previousMonth\": \"前の月\",\n \"nextMonth\": \"次の月\",\n \"today\": \"今日\",\n \"weekdays\": {\n \"mon\": \"月\",\n \"tue\": \"火\",\n \"wed\": \"水\",\n \"thu\": \"木\",\n \"fri\": \"金\",\n \"sat\": \"土\",\n \"sun\": \"日\"\n },\n \"dayWithEvents_one\": \"{{date}}、予定 {{count}} 件\",\n \"dayWithEvents_other\": \"{{date}}、予定 {{count}} 件\",\n \"eventsLabel\": \"{{date}} の予定\",\n \"noEvents\": \"予定はありません\"\n },\n \"weekStrip\": {\n \"label\": \"週\",\n \"previousWeek\": \"前の週\",\n \"nextWeek\": \"次の週\",\n \"dayWithMarkers_one\": \"{{date}}、{{count}} 件\",\n \"dayWithMarkers_other\": \"{{date}}、{{count}} 件\",\n \"dayMarked\": \"{{date}}、マークあり\"\n },\n \"datePicker\": {\n \"placeholder\": \"日付を選択\",\n \"label\": \"日付\",\n \"clear\": \"日付をクリア\",\n \"today\": \"今日\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"ナビゲーション\",\n \"expand\": \"サイドバーを展開\",\n \"collapse\": \"サイドバーを折りたたむ\",\n \"enableFloating\": \"フローティングサイドバーを有効にする\",\n \"disableFloating\": \"フローティングサイドバーを無効にする\",\n \"openNavigation\": \"ナビゲーションを開く\",\n \"closeNavigation\": \"ナビゲーションを閉じる\",\n \"skipToContent\": \"コンテンツへスキップ\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"キャンセル\" },\n \"picker\": {\n \"confirm\": \"確定\",\n \"cancel\": \"キャンセル\",\n \"placeholder\": \"選択してください\",\n \"selected\": \"{{label}}、選択済み\",\n \"column\": \"{{index}} 列目\"\n },\n \"searchBar\": {\n \"label\": \"検索\",\n \"placeholder\": \"検索\",\n \"cancel\": \"キャンセル\",\n \"clear\": \"検索をクリア\"\n },\n \"navBar\": { \"back\": \"戻る\" },\n \"tabBar\": { \"label\": \"タブバー\" },\n \"pullRefresh\": {\n \"pulling\": \"引っ張って更新\",\n \"loosing\": \"離して更新\",\n \"loading\": \"更新中...\",\n \"success\": \"更新しました\"\n },\n \"swipeCell\": { \"actions\": \"その他の操作\" },\n \"datetimePicker\": {\n \"title\": \"日付を選択\",\n \"titleTime\": \"時刻を選択\",\n \"year\": \"年\",\n \"month\": \"月\",\n \"day\": \"日\",\n \"hour\": \"時\",\n \"minute\": \"分\"\n },\n \"calendar\": {\n \"title\": \"日付を選択\",\n \"confirm\": \"確定\",\n \"monthTitle\": \"{{year}}年{{month}}月\",\n \"rangeStart\": \"開始\",\n \"rangeEnd\": \"終了\"\n },\n \"imagePreview\": {\n \"label\": \"画像プレビュー\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"プレビューを閉じる\"\n },\n \"collapse\": { \"expand\": \"展開\", \"collapse\": \"折りたたむ\" },\n \"rating\": { \"label\": \"評価\", \"value\": \"{{max}} 中 {{value}}\" },\n \"progress\": { \"label\": \"進捗\" },\n \"form\": { \"submit\": \"送信\", \"reset\": \"リセット\", \"required\": \"必須\" },\n \"paginationSimple\": { \"pageOf\": \"{{total}} ページ中 {{page}} ページ\" },\n \"stepStatus\": { \"finish\": \"完了\", \"process\": \"進行中\", \"wait\": \"待機中\", \"error\": \"エラー\" },\n \"presetToggle\": { \"label\": \"現在のプリセット {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"エディトリアル\", \"compact\": \"コンパクト\", \"touch\": \"タッチ\" }\n}\n","{\n \"modal\": {\n \"close\": \"閉じる\"\n },\n \"drawer\": {\n \"close\": \"閉じる\",\n \"description\": \"ドロワーの内容\"\n },\n \"confirm\": {\n \"confirm\": \"確認\",\n \"cancel\": \"キャンセル\",\n \"delete\": \"削除\"\n },\n \"command\": {\n \"title\": \"コマンドパレット\",\n \"description\": \"モジュール、設定ページ、操作を検索して移動します。\",\n \"placeholder\": \"コマンド、パス、キーワードを検索\",\n \"empty\": \"一致する結果がありません\",\n \"results\": \"コマンドの結果\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"現在のテーマ {{theme}}\",\n \"light\": \"ライト\",\n \"dark\": \"ダーク\",\n \"system\": \"システム\"\n },\n \"paletteToggle\": {\n \"label\": \"現在のパレット {{palette}}\",\n \"default\": \"デフォルト\",\n \"editorial\": \"エディトリアル\",\n \"tech\": \"テック\",\n \"graphite\": \"グラファイト\",\n \"cool\": \"クール\"\n }\n}\n","import jaIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n jaIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","{\n \"avatar\": {\n \"default\": \"头像\",\n \"group\": \"头像组\",\n \"groupWithMore\": \"头像组,另有 {{count}} 位\"\n },\n \"pagination\": {\n \"jumpPrev\": \"向前 5 页\",\n \"jumpNext\": \"向后 5 页\",\n \"prev\": \"上一页\",\n \"next\": \"下一页\",\n \"page\": \"第 {{page}} 页\",\n \"total\": \"共 {{total}} 条\",\n \"jumpTo\": \"跳至\",\n \"jumpToInput\": \"跳转到指定页\",\n \"pageSize\": \"每页条数\",\n \"pageSizeOption\": \"{{size}} 条/页\",\n \"currentPage\": \"当前页\",\n \"nav\": \"分页\"\n },\n \"cascader\": {\n \"placeholder\": \"请选择\",\n \"clear\": \"清除选择\",\n \"noResults\": \"无匹配结果\",\n \"level\": \"{{label}},第 {{level}} 级\",\n \"options\": \"选项\"\n },\n \"timePicker\": {\n \"placeholder\": \"选择时间\",\n \"label\": \"时间\",\n \"clear\": \"清除时间\",\n \"hours\": \"时\",\n \"minutes\": \"分\",\n \"seconds\": \"秒\",\n \"period\": \"上午/下午\"\n },\n \"common\": {\n \"loading\": \"加载中\"\n },\n \"alert\": {\n \"close\": \"关闭\",\n \"expand\": \"展开\",\n \"collapse\": \"收起\",\n \"icon\": {\n \"info\": \"信息图标\",\n \"success\": \"成功图标\",\n \"warning\": \"警告图标\",\n \"danger\": \"错误图标\"\n }\n },\n \"badge\": {\n \"default\": \"徽标\"\n },\n \"empty\": {\n \"description\": \"暂无数据\"\n },\n \"tag\": {\n \"close\": \"关闭\",\n \"closeWithLabel\": \"移除 {{label}}\"\n },\n \"input\": {\n \"clear\": \"清除\",\n \"showPassword\": \"显示密码\",\n \"hidePassword\": \"隐藏密码\"\n },\n \"iconButton\": {\n \"default\": \"图标按钮\"\n }\n}\n","{\n \"table\": {\n \"empty\": \"暂无数据\",\n \"retry\": \"重试\",\n \"scrollRegion\": \"可滚动表格\",\n \"selectAll\": \"选择所有行\",\n \"selectRow\": \"选择行 {{row}}\"\n },\n \"dashboard\": {\n \"label\": \"分栏面板\",\n \"empty\": \"暂无项目\",\n \"columnLabel_one\": \"{{title}},{{count}} 项\",\n \"columnLabel_other\": \"{{title}},{{count}} 项\",\n \"dragHint\": \"按空格键或回车键拿起卡片,用方向键移动,再按空格键或回车键放下,按 Esc 键取消。\",\n \"lifted\": \"已拿起 {{card}}:位于 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"over\": \"{{card}}:位于 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"dropped\": \"已将 {{card}} 放到 {{column}} 第 {{position}} 项,共 {{total}} 项。\",\n \"cancelled\": \"已取消移动:{{card}} 仍在 {{column}}。\",\n \"moveTo\": \"移到 {{column}}\",\n \"moveUp\": \"上移\",\n \"moveDown\": \"下移\"\n },\n \"navTree\": {\n \"label\": \"导航\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"编辑器暂不可用\",\n \"retry\": \"重试\",\n \"retryLabel\": \"重试编辑器\",\n \"loading\": \"加载编辑器\"\n }\n}\n","{\n \"mediaPlayer\": {\n \"label\": \"媒体播放器\",\n \"play\": \"播放\",\n \"pause\": \"暂停\",\n \"skipBack_one\": \"后退 {{count}} 秒\",\n \"skipBack_other\": \"后退 {{count}} 秒\",\n \"skipForward_one\": \"快进 {{count}} 秒\",\n \"skipForward_other\": \"快进 {{count}} 秒\",\n \"seek\": \"播放进度\",\n \"timeOf\": \"{{current}} / {{duration}}\",\n \"mute\": \"静音\",\n \"unmute\": \"取消静音\",\n \"volume\": \"音量\",\n \"playbackRate\": \"播放速度 {{rate}}\",\n \"fullscreen\": \"全屏\",\n \"exitFullscreen\": \"退出全屏\",\n \"pictureInPicture\": \"画中画\",\n \"exitPictureInPicture\": \"退出画中画\",\n \"captions\": \"字幕\",\n \"captionsOff\": \"关闭\",\n \"loading\": \"加载中\",\n \"error\": \"无法播放此媒体\"\n },\n \"flashcard\": {\n \"frontLabel\": \"问题\",\n \"backLabel\": \"答案\",\n \"hint\": \"点击或按空格键翻转\",\n \"label\": \"抽认卡,当前为{{face}}\"\n },\n \"loadingState\": {\n \"label\": \"加载中...\"\n },\n \"codeBlock\": {\n \"label\": \"代码\",\n \"copy\": \"复制代码\",\n \"copied\": \"已复制\",\n \"copyFailed\": \"复制失败\"\n }\n}\n","{\n \"toast\": {\n \"region\": \"通知\",\n \"close\": \"关闭\",\n \"regionWithHotkey\": \"通知({{hotkey}})\"\n },\n \"pageTabs\": {\n \"scrollLeft\": \"向左滚动页面\",\n \"scrollRight\": \"向右滚动页面\",\n \"close\": \"关闭 {{label}}\"\n }\n}\n","{\n \"slider\": {\n \"label\": \"滑块\",\n \"minimum\": \"最小值\",\n \"maximum\": \"最大值\"\n },\n \"numberInput\": {\n \"increment\": \"增加\",\n \"decrement\": \"减少\",\n \"notANumber\": \"请输入数字\",\n \"belowMin\": \"最小值 {{min}}\",\n \"aboveMax\": \"最大值 {{max}}\"\n },\n \"jsonField\": {\n \"format\": \"格式化 JSON\",\n \"valid\": \"JSON 语法正确\",\n \"invalid\": \"JSON 语法错误\"\n },\n \"keyValueEditor\": {\n \"key\": \"键\",\n \"value\": \"值\",\n \"add\": \"添加条目\",\n \"remove\": \"删除条目\"\n },\n \"tagInput\": {\n \"add\": \"添加标签\",\n \"clear\": \"清空标签\",\n \"remove\": \"移除 {{tag}}\",\n \"create\": \"添加“{{tag}}”\",\n \"empty\": \"无匹配项\"\n },\n \"validation\": {\n \"valueMissing\": \"请填写此字段。\",\n \"selectMissing\": \"请在列表中选择一项。\",\n \"checkMissing\": \"如要继续,请勾选此复选框。\",\n \"radioMissing\": \"请选择其中一个选项。\",\n \"fileMissing\": \"请选择文件。\",\n \"tooShort\": \"请至少输入 {{min}} 个字符。\",\n \"tooLong\": \"最多只能输入 {{max}} 个字符。\",\n \"rangeUnderflow\": \"值必须大于或等于 {{min}}。\",\n \"rangeOverflow\": \"值必须小于或等于 {{max}}。\",\n \"badInput\": \"请输入有效的值。\",\n \"patternMismatch\": \"请与所请求的格式保持一致。\",\n \"emailMismatch\": \"请输入有效的电子邮件地址。\"\n }\n}\n","{\n \"answerSheet\": {\n \"label\": \"题目\",\n \"summary\": \"已答 {{answered}} / {{total}}\",\n \"item\": \"第 {{number}} 题,{{status}}\",\n \"itemFlagged\": \"第 {{number}} 题,{{status}},已标记\",\n \"status\": {\n \"unanswered\": \"未作答\",\n \"answered\": \"已作答\",\n \"correct\": \"正确\",\n \"wrong\": \"错误\",\n \"skipped\": \"已跳过\"\n },\n \"legend\": {\n \"unanswered\": \"未作答\",\n \"answered\": \"已作答\",\n \"correct\": \"正确\",\n \"wrong\": \"错误\",\n \"skipped\": \"已跳过\",\n \"flagged\": \"已标记\"\n }\n },\n \"steps\": {\n \"label\": \"步骤\"\n },\n \"upload\": {\n \"select\": \"选择文件\",\n \"uploading\": \"上传中\",\n \"done\": \"已上传\",\n \"failed\": \"上传失败\",\n \"tooMany\": \"最多选择 {{count}} 个文件\",\n \"invalidType\": \"{{name}}:不支持此文件类型\",\n \"tooLarge\": \"{{name}}:文件大小超过限制\",\n \"retry\": \"重试 {{name}}\",\n \"remove\": \"移除 {{name}}\"\n }\n}\n","{\n \"monthCalendar\": {\n \"label\": \"月历\",\n \"previousMonth\": \"上个月\",\n \"nextMonth\": \"下个月\",\n \"today\": \"今天\",\n \"weekdays\": {\n \"mon\": \"一\",\n \"tue\": \"二\",\n \"wed\": \"三\",\n \"thu\": \"四\",\n \"fri\": \"五\",\n \"sat\": \"六\",\n \"sun\": \"日\"\n },\n \"dayWithEvents_one\": \"{{date}},{{count}} 项日程\",\n \"dayWithEvents_other\": \"{{date}},{{count}} 项日程\",\n \"eventsLabel\": \"{{date}} 日程\",\n \"noEvents\": \"暂无日程\"\n },\n \"weekStrip\": {\n \"label\": \"周\",\n \"previousWeek\": \"上一周\",\n \"nextWeek\": \"下一周\",\n \"dayWithMarkers_one\": \"{{date}},{{count}} 项\",\n \"dayWithMarkers_other\": \"{{date}},{{count}} 项\",\n \"dayMarked\": \"{{date}},有标记\"\n },\n \"datePicker\": {\n \"placeholder\": \"选择日期\",\n \"label\": \"日期\",\n \"clear\": \"清除日期\",\n \"today\": \"今天\"\n }\n}\n","{\n \"appShell\": {\n \"navigation\": \"导航\",\n \"expand\": \"展开侧边栏\",\n \"collapse\": \"收起侧边栏\",\n \"enableFloating\": \"启用浮动侧边栏\",\n \"disableFloating\": \"停用浮动侧边栏\",\n \"openNavigation\": \"打开导航\",\n \"closeNavigation\": \"关闭导航\",\n \"skipToContent\": \"跳到主要内容\"\n }\n}\n","{\n \"actionSheet\": { \"cancel\": \"取消\" },\n \"picker\": {\n \"confirm\": \"确认\",\n \"cancel\": \"取消\",\n \"placeholder\": \"请选择\",\n \"selected\": \"{{label}},已选中\",\n \"column\": \"第 {{index}} 列\"\n },\n \"searchBar\": {\n \"label\": \"搜索\",\n \"placeholder\": \"搜索\",\n \"cancel\": \"取消\",\n \"clear\": \"清除搜索\"\n },\n \"navBar\": { \"back\": \"返回\" },\n \"tabBar\": { \"label\": \"标签栏\" },\n \"pullRefresh\": {\n \"pulling\": \"下拉即可刷新\",\n \"loosing\": \"释放即可刷新\",\n \"loading\": \"加载中...\",\n \"success\": \"刷新成功\"\n },\n \"swipeCell\": { \"actions\": \"更多操作\" },\n \"datetimePicker\": {\n \"title\": \"选择日期\",\n \"titleTime\": \"选择时间\",\n \"year\": \"年\",\n \"month\": \"月\",\n \"day\": \"日\",\n \"hour\": \"时\",\n \"minute\": \"分\"\n },\n \"calendar\": {\n \"title\": \"选择日期\",\n \"confirm\": \"确定\",\n \"monthTitle\": \"{{year}}年{{month}}月\",\n \"rangeStart\": \"开始\",\n \"rangeEnd\": \"结束\"\n },\n \"imagePreview\": {\n \"label\": \"图片预览\",\n \"counter\": \"{{index}} / {{total}}\",\n \"close\": \"关闭预览\"\n },\n \"collapse\": { \"expand\": \"展开\", \"collapse\": \"收起\" },\n \"rating\": { \"label\": \"评分\", \"value\": \"{{value}} / {{max}}\" },\n \"progress\": { \"label\": \"进度\" },\n \"form\": { \"submit\": \"提交\", \"reset\": \"重置\", \"required\": \"必填\" },\n \"paginationSimple\": { \"pageOf\": \"第 {{page}} 页,共 {{total}} 页\" },\n \"stepStatus\": { \"finish\": \"已完成\", \"process\": \"进行中\", \"wait\": \"等待中\", \"error\": \"错误\" },\n \"presetToggle\": { \"label\": \"当前预设 {{preset}}\", \"minerva\": \"Minerva\", \"editorial\": \"文学\", \"compact\": \"紧凑\", \"touch\": \"触控\" }\n}\n","{\n \"modal\": {\n \"close\": \"关闭\"\n },\n \"drawer\": {\n \"close\": \"关闭\",\n \"description\": \"抽屉内容\"\n },\n \"confirm\": {\n \"confirm\": \"确定\",\n \"cancel\": \"取消\",\n \"delete\": \"删除\"\n },\n \"command\": {\n \"title\": \"命令面板\",\n \"description\": \"搜索并跳转到后台模块、配置页或操作入口。\",\n \"placeholder\": \"搜索命令、路径或关键字\",\n \"empty\": \"没有匹配结果\",\n \"results\": \"命令结果\",\n \"enter\": \"Enter\"\n }\n}\n","{\n \"themeToggle\": {\n \"label\": \"当前主题 {{theme}}\",\n \"light\": \"亮\",\n \"dark\": \"暗\",\n \"system\": \"跟随\"\n },\n \"paletteToggle\": {\n \"label\": \"当前色身 {{palette}}\",\n \"default\": \"默认\",\n \"editorial\": \"文学\",\n \"tech\": \"科技\",\n \"graphite\": \"石墨灰\",\n \"cool\": \"冷灰蓝\"\n }\n}\n","import zhIndex from \"./index.json\";\nimport data from \"./groups/data.json\";\nimport display from \"./groups/display.json\";\nimport feedback from \"./groups/feedback.json\";\nimport forms from \"./groups/forms.json\";\nimport general from \"./groups/general.json\";\nimport inputs from \"./groups/inputs.json\";\nimport layout from \"./groups/layout.json\";\nimport mobile from \"./groups/mobile.json\";\nimport overlays from \"./groups/overlays.json\";\nimport theme from \"./groups/theme.json\";\nimport { mergeMessages, type Messages } from \"../../merge\";\n\n// Strings of each component group live in groups/<group>.json and are merged\n// (deeply) on top of index.json into a single message tree.\n// Pure: unused bundles are tree-shaken by the consumer's bundler.\nconst messages: Messages = /* @__PURE__ */ mergeMessages<Messages>(\n zhIndex,\n data,\n display,\n feedback,\n forms,\n general,\n inputs,\n layout,\n mobile,\n overlays,\n theme,\n);\n\nexport default messages;\n","// A tiny, framework-agnostic translator for Minerva's message bundles:\n// nested keys (\"a.b.c\"), `{{name}}` interpolation, plurals selected by `count`\n// through `Intl.PluralRules` (`key_one`, `key_other`, ...; built-in rules\n// when the engine has no `Intl.PluralRules`), and fallbacks\n// (base language -> fallback language -> `defaultValue` -> the key itself).\n// Pure functions only: no DOM access and nothing mutated at import time.\nimport type { Messages } from \"./merge\";\n\n/** Options of a single translation */\nexport type TranslateOptions = {\n /** Selects the plural form (`key_one`, `key_other`...) and fills `{{count}}` */\n count?: number;\n /** Returned (interpolated) when the key is missing in every language */\n defaultValue?: string;\n /** Interpolation values (`{{name}}`) */\n [name: string]: unknown;\n};\n\n/** Translates `key` (dot-separated path into the message tree) */\nexport type TranslateFunction = (\n key: string,\n options?: TranslateOptions,\n) => string;\n\nexport interface TranslatorConfig {\n /** Message tree per language */\n messages: Readonly<Partial<Record<string, Messages>>>;\n /** Language to translate to (e.g. \"fr\", \"en-US\") */\n language: string;\n /** Language used for keys missing in `language` (default \"en\") */\n fallbackLanguage?: string;\n}\n\nconst DEFAULT_FALLBACK_LANGUAGE = \"en\";\n\nconst hasOwn = (object: object, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(object, key);\n\n/** Whether the engine implements `Intl.PluralRules` (Hermes without Intl and\n * some mini-program JS engines do not). Read lazily: tests and polyfills may\n * install it after this module loaded. */\nconst hasPluralRules = (): boolean =>\n typeof Intl !== \"undefined\" && typeof Intl.PluralRules === \"function\";\n\n/**\n * CLDR cardinal plural rules of the built-in languages (and English-like\n * \"one / other\" for any other language), used when `Intl.PluralRules` is\n * missing:\n * - zh, ja, ko, vi, th, id, ms: always \"other\"\n * - fr (and pt): \"one\" for 0 <= n < 2, \"many\" for non-zero multiples of\n * 1 000 000, else \"other\"\n * - everything else: \"one\" for exactly 1, else \"other\"\n */\nexport const fallbackPluralCategory = (\n language: string,\n count: number,\n): Intl.LDMLPluralRule => {\n const n = Math.abs(count);\n switch (language.toLowerCase().split(\"-\")[0]) {\n case \"zh\":\n case \"ja\":\n case \"ko\":\n case \"vi\":\n case \"th\":\n case \"id\":\n case \"ms\":\n return \"other\";\n case \"fr\":\n case \"pt\":\n if (n < 2) return \"one\";\n return Number.isInteger(n) && n % 1_000_000 === 0 ? \"many\" : \"other\";\n default:\n return n === 1 ? \"one\" : \"other\";\n }\n};\n\n// Plural rules are costly to build: one instance per language, created lazily.\nconst pluralRulesCache = new Map<string, Intl.PluralRules | null>();\n\nconst getPluralRules = (language: string): Intl.PluralRules | null => {\n let rules = pluralRulesCache.get(language);\n if (rules === undefined) {\n try {\n rules = new Intl.PluralRules(language);\n } catch {\n // Invalid language tag\n rules = null;\n }\n pluralRulesCache.set(language, rules);\n }\n return rules;\n};\n\n/**\n * CLDR plural category of `count` in `language` (\"zero\", \"one\", \"two\", \"few\",\n * \"many\" or \"other\"). Unknown / invalid languages give \"other\". Without\n * `Intl.PluralRules` (Hermes, mini-program engines) the built-in rules of\n * {@link fallbackPluralCategory} apply.\n */\nexport const getPluralCategory = (\n language: string,\n count: number,\n): Intl.LDMLPluralRule =>\n hasPluralRules()\n ? (getPluralRules(language)?.select(count) ?? \"other\")\n : fallbackPluralCategory(language, count);\n\n/** Message string at the dot-separated `key` of `tree`, if any */\nconst lookup = (\n tree: Messages | undefined,\n key: string,\n): string | undefined => {\n let node: Messages | string | undefined = tree;\n for (const part of key.split(\".\")) {\n if (typeof node !== \"object\" || !hasOwn(node, part)) {\n return undefined;\n }\n node = node[part];\n }\n return typeof node === \"string\" ? node : undefined;\n};\n\n/** Value at the (possibly dotted) interpolation `path` of `values` */\nconst readValue = (values: Record<string, unknown>, path: string): unknown => {\n if (hasOwn(values, path)) return values[path];\n let node: unknown = values;\n for (const part of path.split(\".\")) {\n if (typeof node !== \"object\" || node === null || !hasOwn(node, part)) {\n return undefined;\n }\n node = (node as Record<string, unknown>)[part];\n }\n return node;\n};\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g;\n\n/**\n * Replaces `{{name}}` placeholders of `template` with `values`. Placeholders\n * without a value are kept as is. No HTML escaping (renderers escape).\n */\nexport const interpolate = (\n template: string,\n values: Record<string, unknown> = {},\n): string =>\n template.replace(PLACEHOLDER, (match, path: string) => {\n const value = readValue(values, path);\n return value === undefined || value === null ? match : String(value);\n });\n\n/** Languages to look a key up in: \"fr-CA\" -> [\"fr-CA\", \"fr\", fallback] */\nconst languageChain = (language: string, fallbackLanguage: string) => {\n const chain = [language];\n const base = language.split(\"-\")[0];\n if (base) chain.push(base);\n chain.push(fallbackLanguage);\n return [...new Set(chain)];\n};\n\n/** Translates `key` with the given configuration (see `createTranslator`). */\nexport const translate = (\n {\n messages,\n language,\n fallbackLanguage = DEFAULT_FALLBACK_LANGUAGE,\n }: TranslatorConfig,\n key: string,\n options: TranslateOptions = {},\n): string => {\n const { count, defaultValue } = options;\n for (const lng of languageChain(language, fallbackLanguage)) {\n const tree = messages[lng];\n if (!tree) continue;\n const message =\n (typeof count === \"number\"\n ? lookup(tree, `${key}_${getPluralCategory(lng, count)}`)\n : undefined) ?? lookup(tree, key);\n if (message !== undefined) return interpolate(message, options);\n }\n return defaultValue !== undefined ? interpolate(defaultValue, options) : key;\n};\n\n/**\n * Creates a translate function bound to `messages` and `language`.\n *\n * @example\n * const t = createTranslator({ messages, language: \"fr\" });\n * t(\"pagination.page\", { page: 2 }); // \"Page 2\"\n * t(\"monthCalendar.dayWithEvents\", { date, count: 3 }); // uses `_other`\n */\nexport const createTranslator = (\n config: TranslatorConfig,\n): TranslateFunction => {\n const resolved = { ...config };\n return (key, options) => translate(resolved, key, options);\n};\n","// Framework-agnostic i18n: the built-in message bundles of every supported\n// language (plain data) and a tiny translator (`createTranslator` /\n// `translate`) that adapters such as `minerva-design` build on.\nimport en from \"./locales/en\";\nimport fr from \"./locales/fr\";\nimport ja from \"./locales/ja\";\nimport zh from \"./locales/zh\";\nimport type { Messages } from \"./merge\";\nimport type { SupportedLanguage } from \"./types\";\n\nexport type { SupportedLanguage } from \"./types\";\nexport { mergeMessages, type Messages } from \"./merge\";\nexport {\n createTranslator,\n fallbackPluralCategory,\n getPluralCategory,\n interpolate,\n translate,\n type TranslateFunction,\n type TranslateOptions,\n type TranslatorConfig,\n} from \"./translate\";\n\n/** Every language Minerva ships translations for */\nexport const SUPPORTED_LANGUAGES: readonly SupportedLanguage[] = [\n \"en\",\n \"zh\",\n \"ja\",\n \"fr\",\n];\n\n/** Language used when none is set (and as the fallback for missing keys) */\nexport const DEFAULT_LANGUAGE: SupportedLanguage = \"en\";\n\n/** Built-in messages per language (one merged message tree each) */\nexport const messages: Readonly<Record<SupportedLanguage, Messages>> = {\n en,\n zh,\n ja,\n fr,\n};\n\n/** Whether `value` is one of the `SUPPORTED_LANGUAGES` */\nexport const isSupportedLanguage = (\n value: unknown,\n): value is SupportedLanguage =>\n typeof value === \"string\" &&\n (SUPPORTED_LANGUAGES as readonly string[]).includes(value);\n","// Time-of-day formatting and parsing shared by the TimePicker of\n// minerva-design and <minerva-time-picker> of minerva-design/web-components.\n\nconst TOKEN_PATTERN = /(HH|H|hh|h|mm|m|ss|s|a)/g;\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/** Format a time with tokens HH / H / hh / h / mm / m / ss / s / a */\nexport const formatTime = (date: Date, format: string): string => {\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 || 12;\n const values: Record<string, string> = {\n HH: pad(hours24),\n H: String(hours24),\n hh: pad(hours12),\n h: String(hours12),\n mm: pad(date.getMinutes()),\n m: String(date.getMinutes()),\n ss: pad(date.getSeconds()),\n s: String(date.getSeconds()),\n a: hours24 >= 12 ? \"PM\" : \"AM\",\n };\n return format.replace(TOKEN_PATTERN, (token) => values[token]);\n};\n\n/**\n * Parse text typed into the picker.\n * - strict: the text must match the format exactly (used while typing, so a\n * half-typed \"12:3\" is not committed as 12:03)\n * - lenient: numbers may omit leading zeros (\"1:2:3\"), used on blur\n * Returns `undefined` when the text is not a valid time. The date part of the\n * result is `base` (defaults to today).\n */\nexport const parseTimeInput = (\n text: string,\n format: string,\n { strict, base }: { strict: boolean; base?: Date },\n): Date | undefined => {\n const value = text.trim();\n if (!value) return undefined;\n const tokens: string[] = format.match(TOKEN_PATTERN) ?? [];\n if (strict) {\n const source = format\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(TOKEN_PATTERN, (token) =>\n token === \"a\"\n ? \"\\\\s*([AaPp][Mm])\"\n : `(\\\\d{${token.length === 2 ? 2 : \"1,2\"}})`,\n );\n if (!new RegExp(`^${source}$`).test(value)) return undefined;\n }\n const numbers = value.match(/\\d+/g) ?? [];\n const period = value.match(/[AaPp][Mm]/)?.[0]?.toUpperCase();\n const numericTokens = tokens.filter((t) => t !== \"a\");\n if (numbers.length !== numericTokens.length) return undefined;\n const twelveHour = numericTokens.some((t) => t.startsWith(\"h\"));\n if (twelveHour && tokens.includes(\"a\") && !period) return undefined;\n\n let hours = 0;\n let minutes = 0;\n let seconds = 0;\n numericTokens.forEach((token, i) => {\n const n = Number(numbers[i]);\n if (token.startsWith(\"H\") || token.startsWith(\"h\")) hours = n;\n else if (token.startsWith(\"m\")) minutes = n;\n else seconds = n;\n });\n if (twelveHour) {\n if (hours < 1 || hours > 12) return undefined;\n if (period === \"PM\" && hours < 12) hours += 12;\n if (period === \"AM\" && hours === 12) hours = 0;\n }\n if (hours > 23 || minutes > 59 || seconds > 59) return undefined;\n const date = new Date(base ?? new Date());\n date.setHours(hours, minutes, seconds, 0);\n return date;\n};\n\n/** Today at 00:00:00, the base for times picked without a value */\nexport const startOfToday = (): Date => {\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst VALUE_PATTERN = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/;\n\n/**\n * Parses a value / min / max string: 24-hour `HH:mm` or `HH:mm:ss` (the\n * format of `<input type=\"time\">`). `null` for an empty or invalid string.\n */\nexport const parseTimeValue = (\n text: string | null | undefined,\n): Date | null => {\n const match = VALUE_PATTERN.exec((text ?? \"\").trim());\n if (!match) return null;\n const [hours, minutes, seconds] = [match[1], match[2], match[3] ?? \"0\"].map(\n Number,\n );\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n const date = startOfToday();\n date.setHours(hours, minutes, seconds, 0);\n return date;\n};\n\n/** The value string of `date`: `HH:mm:ss`, or `HH:mm` without seconds. */\nexport const toTimeValue = (date: Date, withSeconds: boolean): string =>\n formatTime(date, withSeconds ? \"HH:mm:ss\" : \"HH:mm\");\n\n/** Seconds since midnight (compares times of day). */\nexport const secondsOfDay = (date: Date): number =>\n date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();\n\n/** Whether a display format contains a seconds token (`ss` / `s`) */\nexport const formatHasSeconds = (format: string): boolean =>\n /(^|[^a-zA-Z])s{1,2}([^a-zA-Z]|$)/.test(format);\n\n/**\n * The single source of truth of the seconds column: the format actually\n * used. Hiding seconds (`showSecond={false}` / `hide-second`) removes the\n * seconds token (and its separator) from the format, so the column, the\n * displayed text, parsing and the value always agree:\n * `\"HH:mm:ss\"` -> `\"HH:mm\"`, `\"hh:mm:ss a\"` -> `\"hh:mm a\"`.\n */\nexport const resolveTimeFormat = (format: string, showSecond: boolean) =>\n showSecond ? format : format.replace(/[:.\\s]?s{1,2}(?![a-zA-Z])/, \"\");\n","// Keyboard shortcut helpers shared by the command palettes (shortcut strings\n// such as \"mod+k\") and the toast regions (hotkey key lists such as [\"F8\"]).\n\n/**\n * Key event fields every platform provides (a DOM `KeyboardEvent`, a React\n * Native hardware key event mapped to this shape...).\n */\ninterface KeyFields {\n key: string;\n code: string;\n metaKey: boolean;\n ctrlKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n}\n\n/** Keyboard event fields read by `matchesShortcut`. */\nexport type ShortcutEvent = Pick<\n KeyFields,\n \"key\" | \"metaKey\" | \"ctrlKey\" | \"shiftKey\" | \"altKey\"\n>;\n\n/** Drops empty / non-string shortcut values (runtime safety for untyped callers). */\nexport function normalizeShortcuts(\n shortcut: string | readonly string[] | undefined | null,\n): string[] {\n const values = Array.isArray(shortcut) ? shortcut : [shortcut];\n return values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim() !== \"\",\n );\n}\n\n/**\n * Whether a keyboard event matches a shortcut such as \"mod+k\" or\n * \"ctrl+shift+p\". `mod` accepts Cmd (macOS) or Ctrl. Non-string shortcuts\n * never match.\n */\nexport function matchesShortcut(\n event: ShortcutEvent,\n shortcut: unknown,\n): boolean {\n if (typeof shortcut !== \"string\") return false;\n const parts = shortcut\n .trim()\n .toLowerCase()\n .split(\"+\")\n .map((part) => part.trim())\n .filter(Boolean);\n const key = parts[parts.length - 1];\n if (!key || String(event.key ?? \"\").toLowerCase() !== key) return false;\n const has = (...names: string[]) => names.some((n) => parts.includes(n));\n if (has(\"mod\") && !event.metaKey && !event.ctrlKey) return false;\n if (has(\"ctrl\") && !event.ctrlKey) return false;\n if (has(\"meta\", \"cmd\") && !event.metaKey) return false;\n if (has(\"shift\") && !event.shiftKey) return false;\n if (has(\"alt\", \"option\") && !event.altKey) return false;\n return true;\n}\n\n/** Fields of a command item that the palette search matches. */\nexport interface CommandSearchFields {\n title: string;\n description?: string;\n group?: string;\n keywords?: string;\n}\n\n/** Lower-cases and trims a search query or haystack. */\nexport const normalizeSearchText = (value: string): string =>\n value.trim().toLowerCase();\n\n/** The text a command palette search runs against (group, title, description, keywords). */\nexport const commandSearchText = (item: CommandSearchFields): string =>\n `${item.group ?? \"\"} ${item.title} ${item.description ?? \"\"} ${item.keywords ?? \"\"}`;\n\nconst MODIFIER_KEYS = [\"altKey\", \"ctrlKey\", \"metaKey\", \"shiftKey\"] as const;\ntype ModifierKey = (typeof MODIFIER_KEYS)[number];\n\n/** Keyboard event fields read by `matchesHotkey`. */\nexport type HotkeyEvent = Pick<KeyFields, \"code\" | \"key\" | ModifierKey>;\n\n/**\n * Whether `event` matches every entry of `hotkey`: modifier names\n * (\"altKey\", \"ctrlKey\", \"metaKey\", \"shiftKey\") or a `code` / `key` value.\n * An empty hotkey never matches.\n */\nexport const matchesHotkey = (\n event: HotkeyEvent,\n hotkey: readonly string[],\n): boolean =>\n hotkey.length > 0 &&\n hotkey.every((key) =>\n (MODIFIER_KEYS as readonly string[]).includes(key)\n ? event[key as ModifierKey]\n : event.code === key || event.key === key,\n );\n\n/** Human readable hotkey, e.g. `[\"altKey\", \"KeyT\"]` -> `\"Alt+T\"`. */\nexport const formatHotkey = (hotkey: readonly string[]): string =>\n hotkey\n .map((key) =>\n key\n .replace(/Key$/, \"\")\n .replace(/^Key(?=.)/, \"\")\n .replace(/^Digit/, \"\")\n .replace(/^./, (c) => c.toUpperCase()),\n )\n .join(\"+\");\n","// Pure keyboard navigation over an indexed collection (lists, menus, tabs,\n// radio groups, pickers...): the index math behind the DOM roving focus\n// controller of @minerva/dom, reusable by renderers without a DOM.\n\nexport type Orientation = \"horizontal\" | \"vertical\" | \"both\";\nexport type Direction = \"ltr\" | \"rtl\";\n\nexport interface GetNextIndexOptions {\n /** Index of the current item (`-1` when none). */\n currentIndex: number;\n /** Number of items. */\n count: number;\n /** `KeyboardEvent.key`. */\n key: string;\n /** Which arrow keys move. @default \"vertical\" */\n orientation?: Orientation;\n /** Reading direction; `\"rtl\"` swaps ArrowLeft / ArrowRight. @default \"ltr\" */\n dir?: Direction;\n /** Wrap around at both ends. @default true */\n loop?: boolean;\n /** Disabled items are skipped. */\n isDisabled?: (index: number) => boolean;\n /** Enables PageUp / PageDown, moving by this many items. */\n pageSize?: number;\n}\n\ntype Move = \"next\" | \"prev\" | \"first\" | \"last\" | \"pageNext\" | \"pagePrev\";\n\nfunction keyToMove(\n key: string,\n orientation: Orientation,\n dir: Direction,\n pageSize: number | undefined,\n): Move | null {\n const vertical = orientation !== \"horizontal\";\n const horizontal = orientation !== \"vertical\";\n switch (key) {\n case \"ArrowDown\":\n return vertical ? \"next\" : null;\n case \"ArrowUp\":\n return vertical ? \"prev\" : null;\n case \"ArrowRight\":\n return horizontal ? (dir === \"rtl\" ? \"prev\" : \"next\") : null;\n case \"ArrowLeft\":\n return horizontal ? (dir === \"rtl\" ? \"next\" : \"prev\") : null;\n case \"Home\":\n return \"first\";\n case \"End\":\n return \"last\";\n case \"PageDown\":\n return pageSize ? \"pageNext\" : null;\n case \"PageUp\":\n return pageSize ? \"pagePrev\" : null;\n default:\n return null;\n }\n}\n\n/** First enabled index scanning from `start` by `step`, within bounds. */\nfunction scan(\n start: number,\n step: 1 | -1,\n count: number,\n isDisabled: (index: number) => boolean,\n): number | null {\n for (let i = start; i >= 0 && i < count; i += step) {\n if (!isDisabled(i)) return i;\n }\n return null;\n}\n\n/**\n * Pure keyboard navigation for lists, menus, tabs, radio groups...\n *\n * Returns the index to move to for `key`, or `null` when the key is not a\n * navigation key for this orientation, or there is nowhere to go (edge\n * reached without `loop`, or every other item disabled).\n *\n * - ArrowUp / ArrowDown: vertical and both orientations.\n * - ArrowLeft / ArrowRight: horizontal and both (swapped in RTL).\n * - Home / End: first / last enabled item.\n * - PageUp / PageDown: only with `pageSize` (clamped, never wraps).\n */\nexport function getNextIndex({\n currentIndex,\n count,\n key,\n orientation = \"vertical\",\n dir = \"ltr\",\n loop = true,\n isDisabled = () => false,\n pageSize,\n}: GetNextIndexOptions): number | null {\n if (count <= 0) return null;\n const move = keyToMove(key, orientation, dir, pageSize);\n if (!move) return null;\n\n switch (move) {\n case \"first\":\n return scan(0, 1, count, isDisabled);\n case \"last\":\n return scan(count - 1, -1, count, isDisabled);\n case \"pageNext\":\n case \"pagePrev\": {\n const step = move === \"pageNext\" ? 1 : -1;\n const from = currentIndex < 0 ? (step === 1 ? -1 : count) : currentIndex;\n const target = Math.min(\n count - 1,\n Math.max(0, from + step * (pageSize as number)),\n );\n const found =\n scan(target, step === 1 ? -1 : 1, count, isDisabled) ??\n scan(target, step, count, isDisabled);\n return found === currentIndex ? null : found;\n }\n default: {\n const step = move === \"next\" ? 1 : -1;\n if (currentIndex < 0 || currentIndex >= count) {\n return scan(step === 1 ? 0 : count - 1, step, count, isDisabled);\n }\n for (let n = 1; n < count; n++) {\n let i = currentIndex + step * n;\n if (i < 0 || i >= count) {\n if (!loop) return null;\n i = (i + count) % count;\n }\n if (!isDisabled(i)) return i;\n }\n return null;\n }\n }\n}\n\n/** An option of a combobox list (identified by its `value`). */\nexport interface ActiveOptionItem {\n value: string | number;\n disabled?: boolean;\n}\n\n/**\n * Index of the active (aria-activedescendant) option of a combobox list.\n * The highlight follows the option's identity (`focusedValue`), not its\n * index, so it survives async option updates and is dropped when that option\n * is gone or disabled. Without a valid highlight, `autoHighlight` falls back\n * to the first enabled option; `-1` otherwise. Pass `[]` while the options\n * are hidden (loading) so nothing unseen can be active or selected.\n */\nexport function resolveActiveOptionIndex(\n options: readonly ActiveOptionItem[],\n focusedValue: string | number | null,\n autoHighlight: boolean,\n): number {\n if (focusedValue !== null) {\n const index = options.findIndex(\n (option) => option.value === focusedValue && !option.disabled,\n );\n if (index >= 0) return index;\n }\n return autoHighlight ? options.findIndex((option) => !option.disabled) : -1;\n}\n","// Typeahead (\"type to select\") matching, shared by the DOM roving focus\n// controller and every renderer. Pure: no DOM, timers read through Date.now().\n\nexport interface TypeaheadItem {\n /** Text matched against the typed characters. */\n text: string;\n /** Disabled items are never matched. */\n disabled?: boolean;\n}\n\nexport interface TypeaheadOptions {\n /** Idle time (ms) after which the typed buffer resets. @default 500 */\n timeout?: number;\n}\n\nexport interface Typeahead {\n /**\n * Feeds a key and returns the matching index, or `-1` (non-printable key,\n * or no match).\n */\n search(key: string, items: TypeaheadItem[], currentIndex: number): number;\n /** Clears the typed buffer. */\n reset(): void;\n /** Current typed buffer (lower case). */\n getBuffer(): string;\n}\n\n/**\n * Typeahead (\"type to select\") for menus, listboxes and selects.\n *\n * - Characters typed within `timeout` ms accumulate (\"ap\" -> \"apple\"),\n * matched case-insensitively against the start of each item's text,\n * starting from the current item.\n * - Repeating the same character (\"a\", \"a\", \"a\") cycles through the items\n * starting with it, starting after the current item.\n * - Space only counts while a search is in progress (otherwise it is left\n * for activation).\n */\nexport function createTypeahead(options: TypeaheadOptions = {}): Typeahead {\n const { timeout = 500 } = options;\n let buffer = \"\";\n let lastTime = 0;\n\n return {\n search(key, items, currentIndex) {\n if (key.length !== 1) return -1;\n const now = Date.now();\n if (now - lastTime > timeout) buffer = \"\";\n if (key === \" \" && buffer === \"\") return -1;\n lastTime = now;\n buffer += key.toLowerCase();\n\n const isRepeated =\n buffer.length > 1 && buffer.split(\"\").every((c) => c === buffer[0]);\n const query = isRepeated ? buffer[0] : buffer;\n const count = items.length;\n // single character: start after the current item; otherwise include it\n const startOffset = query.length === 1 ? 1 : 0;\n const start = currentIndex < 0 ? 0 : currentIndex + startOffset;\n for (let n = 0; n < count; n++) {\n const i = (start + n) % count;\n const item = items[i];\n if (item.disabled) continue;\n if (query.length === 1 && i === currentIndex) continue;\n if (item.text.trim().toLowerCase().startsWith(query)) return i;\n }\n return -1;\n },\n reset() {\n buffer = \"\";\n lastTime = 0;\n },\n getBuffer() {\n return buffer;\n },\n };\n}\n","// Sticky offsets of the fixed (left / right) columns of a table, shared by\n// the React library's Table and <minerva-data-table>.\n\n/** The column fields the layout reads */\nexport interface FixedColumnLike {\n key: string;\n width?: string | number;\n fixed?: \"left\" | \"right\";\n}\n\n/** Sticky offsets of the fixed columns */\nexport interface FixedColumnLayout {\n /** Left offset (px) of each left-fixed column */\n leftOffsets: Record<string, number>;\n /** Right offset (px) of each right-fixed column */\n rightOffsets: Record<string, number>;\n /** Key of the last left-fixed column (gets the boundary shadow) */\n lastLeftFixedKey: string | undefined;\n /** Key of the first right-fixed column (gets the boundary shadow) */\n firstRightFixedKey: string | undefined;\n}\n\nconst numericWidth = (width: string | number | undefined): number => {\n if (typeof width === \"number\") return width;\n if (typeof width === \"string\") {\n const n = parseFloat(width);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n};\n\n/**\n * Sticky offsets of the fixed columns of a table (pure function).\n *\n * Left-fixed columns accumulate the widths of the previous left-fixed columns,\n * right-fixed columns the widths of the following right-fixed ones. Fixed\n * columns are expected to be declared contiguously at the start / end of\n * `columns`; the edge keys stop at the first non-fixed column.\n */\nexport function computeFixedColumnLayout(\n columns: readonly FixedColumnLike[],\n): FixedColumnLayout {\n const leftOffsets: Record<string, number> = {};\n const rightOffsets: Record<string, number> = {};\n let leftAcc = 0;\n for (const col of columns) {\n if (col.fixed === \"left\") {\n leftOffsets[col.key] = leftAcc;\n leftAcc += numericWidth(col.width);\n }\n }\n let rightAcc = 0;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.fixed === \"right\") {\n rightOffsets[col.key] = rightAcc;\n rightAcc += numericWidth(col.width);\n }\n }\n let lastLeftFixedKey: string | undefined;\n for (const col of columns) {\n if (col.fixed === \"left\") lastLeftFixedKey = col.key;\n else if (lastLeftFixedKey !== undefined) break;\n }\n let firstRightFixedKey: string | undefined;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.fixed === \"right\") firstRightFixedKey = col.key;\n else if (firstRightFixedKey !== undefined) break;\n }\n return { leftOffsets, rightOffsets, lastLeftFixedKey, firstRightFixedKey };\n}\n","// Default sorting of table columns, shared by the React library's Table and\n// <minerva-data-table>: value comparison, per-column comparator and the\n// ascending -> descending -> unsorted header cycle.\n\n/** Sort direction of a column. */\nexport type TableSortOrder = \"ascend\" | \"descend\";\n\n/** Sorted column and direction; `order: null` means unsorted. */\nexport interface TableSortState {\n /** Key of the sorted column */\n key: string;\n /** Sort direction; `null` means unsorted */\n order: TableSortOrder | null;\n}\n\n/** The column fields read by `getColumnCompare`. */\nexport interface SortableColumnLike<T> {\n key: string;\n sortable?: boolean | ((a: T, b: T) => number);\n}\n\nconst isEmpty = (value: unknown): boolean =>\n value === null || value === undefined || value === \"\";\n\n// Created on first use so importing the module stays free of Intl work.\nlet collator: Intl.Collator | null = null;\n\n/**\n * Default ascending comparison of two cell values: numbers, dates and\n * booleans by value, everything else as text (numeric-aware, case and\n * accent insensitive). Empty values (`null`, `undefined`, `\"\"`) sort last.\n */\nexport function compareTableValues(a: unknown, b: unknown): number {\n if (isEmpty(a) || isEmpty(b)) return isEmpty(a) ? (isEmpty(b) ? 0 : 1) : -1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"boolean\" && typeof b === \"boolean\")\n return Number(a) - Number(b);\n collator ??= new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n return collator.compare(String(a), String(b));\n}\n\n/**\n * Ascending comparator of a column: its own `sortable` function, the\n * default comparison of `row[key]` when `sortable` is `true`, else `null`.\n */\nexport function getColumnCompare<T>(\n col: SortableColumnLike<T>,\n): ((a: T, b: T) => number) | null {\n if (typeof col.sortable === \"function\") return col.sortable;\n if (col.sortable)\n return (a, b) =>\n compareTableValues(\n (a as Record<string, unknown>)[col.key],\n (b as Record<string, unknown>)[col.key],\n );\n return null;\n}\n\n/** Next state of the ascending -> descending -> unsorted cycle of `key`. */\nexport function nextSortState(\n current: TableSortState | null | undefined,\n key: string,\n): TableSortState {\n const order = current?.key === key ? current.order : null;\n return {\n key,\n order: order === null ? \"ascend\" : order === \"ascend\" ? \"descend\" : null,\n };\n}\n","// Page number lists of the paginations of the React library and the web components.\n\n/** Pages skipped by the jump-prev / jump-next items of a pagination. */\nexport const PAGINATION_JUMP_SIZE = 5;\n\nconst rangeOf = (start: number, end: number): number[] => {\n const out: number[] = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n};\n\n/**\n * Window of `windowSize` consecutive page numbers centered on `current`,\n * clamped to `[1, totalPages]`.\n */\nexport function getPageRange(\n current: number,\n totalPages: number,\n windowSize = 5,\n): number[] {\n let start = Math.max(1, current - Math.floor(windowSize / 2));\n const end = Math.min(totalPages, start + windowSize - 1);\n if (end - start + 1 < windowSize) start = Math.max(1, end - windowSize + 1);\n return rangeOf(start, end);\n}\n\n/** An entry of `getCompactPageItems`: a page number or a \"…\" gap. */\nexport type CompactPageItem = number | \"ellipsis-start\" | \"ellipsis-end\";\n\n/**\n * Compact page list: `boundary` pages at each end, `siblings` pages on each\n * side of the current `page` and \"…\" gaps. Every page is listed when they\n * fit; a gap of a single page shows that page instead.\n */\nexport function getCompactPageItems(\n totalPages: number,\n page: number,\n siblings: number,\n boundary: number,\n): CompactPageItem[] {\n // boundaries + current and its siblings + two gap slots\n const totalSlots = boundary * 2 + siblings * 2 + 3;\n if (totalPages <= totalSlots) return rangeOf(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, boundary + 1);\n const rightSibling = Math.min(page + siblings, totalPages - boundary);\n const showStartGap = leftSibling > boundary + 2;\n const showEndGap = rightSibling < totalPages - boundary - 1;\n const clusterSize = boundary + siblings * 2 + 2;\n\n if (!showStartGap) {\n return [\n ...rangeOf(1, clusterSize),\n \"ellipsis-end\",\n ...rangeOf(totalPages - boundary + 1, totalPages),\n ];\n }\n if (!showEndGap) {\n return [\n ...rangeOf(1, boundary),\n \"ellipsis-start\",\n ...rangeOf(totalPages - clusterSize + 1, totalPages),\n ];\n }\n return [\n ...rangeOf(1, boundary),\n \"ellipsis-start\",\n ...rangeOf(leftSibling, rightSibling),\n \"ellipsis-end\",\n ...rangeOf(totalPages - boundary + 1, totalPages),\n ];\n}\n","// Section layout, counts and grid navigation of the AnswerSheet (question\n// navigator) of every renderer.\n\n/** Statuses of an AnswerSheet question, in legend order. */\nexport const ANSWER_SHEET_STATUSES = [\n \"unanswered\",\n \"answered\",\n \"correct\",\n \"wrong\",\n \"skipped\",\n] as const;\n\n/** Status of an AnswerSheet question. */\nexport type AnswerSheetItemStatus = (typeof ANSWER_SHEET_STATUSES)[number];\n\n/** The fields of an AnswerSheet item the helpers read. */\nexport interface AnswerSheetItemLike {\n key: string;\n label?: string;\n status?: string;\n flagged?: boolean;\n disabled?: boolean;\n group?: string;\n}\n\n/** A titled section of an AnswerSheet. */\nexport interface AnswerSheetGroupLike {\n key: string;\n title: string;\n}\n\n/** An item placed in a section, with its display index across the sheet. */\nexport interface AnswerSheetEntry<T extends AnswerSheetItemLike> {\n item: T;\n /** Display index across every section (its default label is index + 1) */\n index: number;\n /** Normalized status */\n status: AnswerSheetItemStatus;\n /** Visible label */\n label: string;\n}\n\n/** A section of an AnswerSheet: untitled (no group) or a group. */\nexport interface AnswerSheetSection<T extends AnswerSheetItemLike> {\n /** \"\" for the untitled section, else the group key */\n key: string;\n title?: string;\n entries: AnswerSheetEntry<T>[];\n}\n\n/** A known status, else \"unanswered\". */\nexport const answerSheetStatus = (status?: string): AnswerSheetItemStatus =>\n (ANSWER_SHEET_STATUSES as readonly string[]).includes(status ?? \"\")\n ? (status as AnswerSheetItemStatus)\n : \"unanswered\";\n\n/**\n * The sections of an AnswerSheet: the items without a known group first (an\n * untitled section), then each group in `groups` order; items keep their\n * order. Empty sections are dropped. Display indexes run across sections.\n */\nexport function answerSheetSections<T extends AnswerSheetItemLike>(\n items: readonly T[] | null | undefined,\n groups?: readonly AnswerSheetGroupLike[] | null,\n): AnswerSheetSection<T>[] {\n const list = Array.isArray(items) ? items : [];\n const known = new Set((groups ?? []).map((group) => group.key));\n const buckets: { key: string; title?: string; items: T[] }[] = [\n {\n key: \"\",\n items: list.filter((item) => !item.group || !known.has(item.group)),\n },\n ...(groups ?? []).map((group) => ({\n key: group.key,\n title: group.title,\n items: list.filter((item) => item.group === group.key),\n })),\n ];\n let index = 0;\n const sections: AnswerSheetSection<T>[] = [];\n for (const bucket of buckets) {\n if (!bucket.items.length) continue;\n sections.push({\n key: bucket.key,\n title: bucket.title,\n entries: bucket.items.map((item) => {\n const entry = {\n item,\n index,\n status: answerSheetStatus(item.status),\n label: item.label ?? String(index + 1),\n };\n index += 1;\n return entry;\n }),\n });\n }\n return sections;\n}\n\n/** Answered questions (answered, correct or wrong) and the total. */\nexport function answerSheetSummary(\n items: readonly AnswerSheetItemLike[] | null | undefined,\n): { answered: number; total: number } {\n const list = Array.isArray(items) ? items : [];\n const answered = list.filter((item) =>\n [\"answered\", \"correct\", \"wrong\"].includes(answerSheetStatus(item.status)),\n ).length;\n return { answered, total: list.length };\n}\n\n/**\n * The legend entries of an AnswerSheet: the statuses present (in\n * ANSWER_SHEET_STATUSES order), then \"flagged\" when an item is flagged.\n */\nexport function answerSheetLegend(\n items: readonly AnswerSheetItemLike[] | null | undefined,\n): (AnswerSheetItemStatus | \"flagged\")[] {\n const list = Array.isArray(items) ? items : [];\n const present = new Set(list.map((item) => answerSheetStatus(item.status)));\n const out: (AnswerSheetItemStatus | \"flagged\")[] =\n ANSWER_SHEET_STATUSES.filter((status) => present.has(status));\n if (list.some((item) => item.flagged)) out.push(\"flagged\");\n return out;\n}\n\n/** A keyboard move of an AnswerSheet. */\nexport type AnswerSheetMove =\n \"previous\" | \"next\" | \"first\" | \"last\" | \"up\" | \"down\";\n\n/**\n * The display index reached from `index` by a keyboard move: previous / next\n * in display order, first / last, and up / down by a row when the sheet has\n * fixed `columns` (rows restart in each section; moving past a section goes\n * to the nearest row of the next / previous one, same column, clamped).\n * Returns null when there is nowhere to go (up / down without columns).\n */\nexport function answerSheetMoveIndex(\n sections: readonly { entries: readonly unknown[] }[],\n index: number,\n move: AnswerSheetMove,\n columns?: number,\n): number | null {\n const sizes = sections.map((section) => section.entries.length);\n const total = sizes.reduce((sum, size) => sum + size, 0);\n if (!total) return null;\n const clamp = (next: number) => Math.min(total - 1, Math.max(0, next));\n switch (move) {\n case \"previous\":\n return clamp(index - 1);\n case \"next\":\n return clamp(index + 1);\n case \"first\":\n return 0;\n case \"last\":\n return total - 1;\n }\n const cols = columns && columns > 0 ? Math.floor(columns) : 0;\n if (!cols) return null;\n // locate the section of the index\n let start = 0;\n let section = 0;\n while (section < sizes.length && index >= start + sizes[section]) {\n start += sizes[section];\n section += 1;\n }\n if (section >= sizes.length) return clamp(index);\n const offset = index - start;\n const column = offset % cols;\n if (move === \"down\") {\n if (offset + cols < sizes[section]) return index + cols;\n // a shorter last row below: its last item\n const lastRow = Math.floor((sizes[section] - 1) / cols);\n if (Math.floor(offset / cols) < lastRow) return start + sizes[section] - 1;\n if (section + 1 >= sizes.length) return index;\n return start + sizes[section] + Math.min(column, sizes[section + 1] - 1);\n }\n if (offset - cols >= 0) return index - cols;\n if (section === 0) return index;\n const size = sizes[section - 1];\n const prevStart = start - size;\n const rowStart = Math.floor((size - 1) / cols) * cols;\n return prevStart + Math.min(rowStart + column, size - 1);\n}\n","// Local calendar-day math of the month calendars (no time of day, no\n// timezone): every date returned is local midnight.\n\n/**\n * Local midnight of `year` / `month` (0-based) / `day`. Out-of-range months\n * and days roll over like `Date`; years below 100 are kept as is (the `Date`\n * constructor would map them to 19xx).\n */\nexport function localDate(year: number, month: number, day: number): Date {\n const date = new Date(0);\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\n/** The local day of `date` as `\"YYYY-MM-DD\"`. */\nexport function dayKey(date: Date): string {\n return `${String(date.getFullYear()).padStart(4, \"0\")}-${String(\n date.getMonth() + 1,\n ).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\n/** Local midnight `days` days after (or before, when negative) `date`. */\nexport function addDays(date: Date, days: number): Date {\n return localDate(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** First day of the month of `date`, shifted by `offset` months. */\nexport function monthStart(date: Date, offset = 0): Date {\n return localDate(date.getFullYear(), date.getMonth() + offset, 1);\n}\n\n/** Whether `a` and `b` fall in the same month of the same year. */\nexport function sameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\n/**\n * First day (local midnight) of the week containing `date`, for weeks that\n * start on `firstDayOfWeek` (0 = Sunday ... 6 = Saturday; anything else\n * falls back to Monday).\n */\nexport function weekStart(date: Date, firstDayOfWeek = 1): Date {\n const first =\n Number.isInteger(firstDayOfWeek) &&\n firstDayOfWeek >= 0 &&\n firstDayOfWeek <= 6\n ? firstDayOfWeek\n : 1;\n return addDays(date, -((date.getDay() - first + 7) % 7));\n}\n\nconst STRICT_DAY_KEY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst LOOSE_DAY_KEY = /^\\s*(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s*$/;\n\n/**\n * Parses a `\"YYYY-MM-DD\"` string (or `\"YYYY-M-D\"` when `strict` is `false`)\n * into local midnight, rejecting out-of-range months and days (e.g. Feb 30).\n */\nexport function parseDayKey(text: string, strict = true): Date | null {\n const match = (strict ? STRICT_DAY_KEY : LOOSE_DAY_KEY).exec(text);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const date = localDate(year, month - 1, day);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return null;\n }\n return date;\n}\n","// Internal: decimal places of a number, shared by the number input and the\n// slider precision helpers (not part of the public core API).\n\n/**\n * Decimal places needed to write `n` exactly as a fixed-point number:\n * `1.25` -> 2, `1e-7` -> 7, `1.5e-7` -> 8 (coefficient decimals plus the\n * negative exponent), `1e21` -> 0. Capped at 100 (`toFixed` limit).\n */\nexport function decimalPlaces(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const m = /^\\d+(?:\\.(\\d+))?(?:e([+-]\\d+))?$/i.exec(String(Math.abs(n)));\n if (!m) return 0;\n const fraction = m[1]?.length ?? 0;\n const exponent = m[2] ? Number(m[2]) : 0;\n return Math.min(100, Math.max(0, fraction - exponent));\n}\n","// Value helpers of the number inputs (React NumberInput and\n// <minerva-number-input>).\n\nimport { decimalPlaces } from \"./decimal-places\";\n\n/**\n * Decimal places of `step` (`0.05` -> 2, `1.25` -> 2, `1e-7` -> 7);\n * `0` for whole or missing steps.\n */\nexport function inferStepPrecision(step?: number): number {\n if (!step) return 0;\n return decimalPlaces(step);\n}\n\n/** `n` limited to `[min, max]`; a missing bound does not limit. */\nexport function clampNumber(n: number, min?: number, max?: number): number {\n let v = n;\n if (min !== undefined) v = Math.max(min, v);\n if (max !== undefined) v = Math.min(max, v);\n return v;\n}\n\n/** Display text of a value with `precision` decimals; `\"\"` for empty / NaN. */\nexport function formatNumberValue(\n v: number | null | undefined,\n precision: number,\n): string {\n if (v === null || v === undefined || Number.isNaN(v)) return \"\";\n return v.toFixed(precision);\n}\n\n/**\n * Parses the text typed into a number input: digits with an optional\n * leading \"-\" and one \".\" (no exponent, a typing trap). `null` otherwise.\n */\nexport function parseNumberDraft(input: string): number | null {\n const trimmed = input.trim();\n if (!trimmed || !/^-?\\d*(\\.\\d*)?$/.test(trimmed)) return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n}\n","// Spacing and size values of the layout components (Box, Stack, grids...).\n\n/**\n * Resolves a spacing value to CSS. Numbers and numeric strings select the\n * spacing scale (`2` -> `var(--space-2)`, `\"0.5\"` -> `var(--space-0-5)`);\n * any other string is a CSS value used as is (`\"12px\"`, `\"auto\"`,\n * `\"var(--x)\"`). Strings are trimmed.\n */\nexport function resolveSpace(value: string | number): string {\n const text = String(value).trim();\n if (typeof value !== \"number\" && !/^\\d+(\\.\\d+)?$/.test(text)) return text;\n return `var(--space-${text.replace(\".\", \"-\")})`;\n}\n\n/**\n * Resolves a size value to CSS: numbers and numeric strings are pixels\n * (`100` / `\"100\"` -> `\"100px\"`), other strings CSS lengths used as is.\n * Strings are trimmed.\n */\nexport function resolveSize(value: string | number): string {\n const text = String(value).trim();\n return typeof value === \"number\" || /^-?\\d+(\\.\\d+)?$/.test(text)\n ? `${text}px`\n : text;\n}\n","// Shared logic of DashboardColumns / DashboardColumn (every renderer).\nimport { resolveSize } from \"./spacing\";\nimport type { ColorScheme } from \"./theme/types\";\n\n/** Theme colors a DashboardColumn accent can name (`data-color` / classes) */\nexport const DASHBOARD_COLORS: readonly ColorScheme[] = [\n \"primary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"neutral\",\n];\n\n/** Default width of a dashboard column */\nexport const DASHBOARD_COLUMN_WIDTH = \"18rem\";\n\n/** Default space between dashboard columns */\nexport const DASHBOARD_GAP = \"0.75rem\";\n\n/**\n * The accent of a column: `scheme` for a theme color, `custom` for any other\n * CSS color (set as `--dashboard-column-color`), neither when unset / blank.\n */\nexport function dashboardAccent(color: string | null | undefined): {\n scheme?: ColorScheme;\n custom?: string;\n} {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return {};\n if ((DASHBOARD_COLORS as readonly string[]).includes(value))\n return { scheme: value as ColorScheme };\n return { custom: value };\n}\n\n/** CSS value of the theme color of an accent (`var(--success-color)`) */\nexport function dashboardAccentValue(color: string | null | undefined): string {\n const { scheme, custom } = dashboardAccent(color);\n if (custom) return custom;\n if (scheme === \"neutral\") return \"var(--text-muted-color)\";\n return scheme ? `var(--${scheme}-color)` : \"\";\n}\n\n/**\n * The count badge of a column: a non-negative integer, `undefined` (hidden)\n * for a missing, negative or non-finite count.\n */\nexport function dashboardCount(count: unknown): number | undefined {\n const value = typeof count === \"string\" && count.trim() ? +count : count;\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : undefined;\n}\n\n/** A board length (number: pixels) as CSS, `undefined` when unset / blank */\nexport function dashboardLength(\n value: string | number | null | undefined,\n): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"number\" && !Number.isFinite(value)) return undefined;\n const text = resolveSize(value);\n return text ? text : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Drag and drop of cards (every renderer). The board is controlled: it never\n// reorders anything, it reports a `DashboardCardMove` and the app updates its\n// data (`moveDashboardCard` applies a move to plain lists).\n\n/**\n * A card move reported by a draggable DashboardColumns (`onCardMove`,\n * `card-move`, `minerva-card-move`, `cardMove`).\n */\nexport interface DashboardCardMove {\n /** `value` of the moved DashboardCard */\n cardKey: string;\n /** `value` of the column the card comes from */\n fromColumn: string;\n /** Index of the card in its column before the move */\n fromIndex: number;\n /** `value` of the column the card goes to (may be `fromColumn`) */\n toColumn: string;\n /**\n * Index of the card in `toColumn` after the move, i.e. counted without\n * the card itself (remove it from `fromColumn`, then insert it at\n * `toIndex`)\n */\n toIndex: number;\n}\n\n/** A column of a board as the drag logic sees it: its key and its cards */\nexport interface DashboardLayoutColumn {\n /** `value` of the column */\n key: string;\n /** `value` of its cards, in order */\n cards: readonly string[];\n}\n\n/** Where a card is, or would land: a column key and an index in it */\nexport interface DashboardPosition {\n column: string;\n /** Index in the column, the dragged card excluded */\n index: number;\n}\n\n/** A keyboard (or accessibility action) move of a picked-up card */\nexport type DashboardDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\n/** Where `cardKey` is in `layout` (`undefined` when it is not there) */\nexport function dashboardFind(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n): DashboardPosition | undefined {\n for (const column of layout) {\n const index = column.cards.indexOf(cardKey);\n if (index >= 0) return { column: column.key, index };\n }\n return undefined;\n}\n\n/**\n * Number of positions a dragged card can take in `columnKey`: its cards\n * without the dragged one, plus one (0 for an unknown column)\n */\nexport function dashboardSlots(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n columnKey: string,\n): number {\n const column = layout.find((entry) => entry.key === columnKey);\n if (!column) return 0;\n return column.cards.filter((key) => key !== cardKey).length + 1;\n}\n\n/**\n * The move of `cardKey` to `to` (the index is clamped to the column), or\n * `undefined` when the card or the column is unknown\n */\nexport function dashboardCardMove(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n to: DashboardPosition,\n): DashboardCardMove | undefined {\n const from = dashboardFind(layout, cardKey);\n const slots = dashboardSlots(layout, cardKey, to.column);\n if (!from || slots === 0) return undefined;\n return {\n cardKey,\n fromColumn: from.column,\n fromIndex: from.index,\n toColumn: to.column,\n toIndex: Math.min(Math.max(0, Math.floor(to.index)), slots - 1),\n };\n}\n\n/** Whether a move leaves the card where it was */\nexport function isDashboardNoop(move: DashboardCardMove): boolean {\n return move.fromColumn === move.toColumn && move.fromIndex === move.toIndex;\n}\n\n/**\n * Insertion index of a dragged card from the pointer position along the\n * column (`position`) and the midpoints of the other cards of the column\n * (same axis, in order, the dragged card excluded): the number of cards\n * whose midpoint is before the pointer.\n */\nexport function dashboardInsertIndex(\n midpoints: readonly number[],\n position: number,\n): number {\n let index = 0;\n while (index < midpoints.length && midpoints[index]! < position) index++;\n return index;\n}\n\n/**\n * The next position of a picked-up card for a keyboard arrow (or an\n * accessibility action): `up` / `down` within the column, `left` / `right`\n * to the adjacent column at the same index (clamped). Positions `accept`\n * rejects are skipped (the original position is always accepted); returns\n * `undefined` at the edges.\n */\nexport function dashboardKeyboardTarget(\n layout: readonly DashboardLayoutColumn[],\n cardKey: string,\n current: DashboardPosition,\n direction: DashboardDirection,\n accept?: (move: DashboardCardMove) => boolean,\n): DashboardPosition | undefined {\n const ok = (position: DashboardPosition) => {\n const move = dashboardCardMove(layout, cardKey, position);\n if (!move) return false;\n return isDashboardNoop(move) || !accept || accept(move);\n };\n if (direction === \"up\" || direction === \"down\") {\n const step = direction === \"up\" ? -1 : 1;\n const slots = dashboardSlots(layout, cardKey, current.column);\n for (\n let index = current.index + step;\n index >= 0 && index < slots;\n index += step\n ) {\n const position = { column: current.column, index };\n if (ok(position)) return position;\n }\n return undefined;\n }\n const step = direction === \"left\" ? -1 : 1;\n const start = layout.findIndex((column) => column.key === current.column);\n if (start < 0) return undefined;\n for (\n let index = start + step;\n index >= 0 && index < layout.length;\n index += step\n ) {\n const column = layout[index]!.key;\n const slots = dashboardSlots(layout, cardKey, column);\n const position = { column, index: Math.min(current.index, slots - 1) };\n if (ok(position)) return position;\n }\n return undefined;\n}\n\n/**\n * Keyboard action of a key on a card of a draggable board: `toggle` picks\n * up / drops (Space, Enter), `cancel` (Escape), or an arrow direction\n * (Left / Right swapped in right-to-left boards)\n */\nexport function dashboardKeyAction(\n key: string,\n rtl = false,\n): DashboardDirection | \"toggle\" | \"cancel\" | undefined {\n switch (key) {\n case \" \":\n case \"Spacebar\":\n case \"Enter\":\n return \"toggle\";\n case \"Escape\":\n case \"Esc\":\n return \"cancel\";\n case \"ArrowUp\":\n return \"up\";\n case \"ArrowDown\":\n return \"down\";\n case \"ArrowLeft\":\n return rtl ? \"right\" : \"left\";\n case \"ArrowRight\":\n return rtl ? \"left\" : \"right\";\n default:\n return undefined;\n }\n}\n\n/**\n * Applies a move to the lists of a board (column key -> items): returns new\n * lists (the input is not mutated); `keyOf` reads the card key of an item.\n * Lists without the card are returned unchanged.\n */\nexport function moveDashboardCard<T>(\n lists: Readonly<Record<string, readonly T[]>>,\n move: DashboardCardMove,\n keyOf: (item: T) => string | number,\n): Record<string, T[]> {\n const next: Record<string, T[]> = {};\n for (const [key, items] of Object.entries(lists)) next[key] = [...items];\n const source = next[move.fromColumn];\n const target = next[move.toColumn];\n if (!source || !target) return next;\n const index = source.findIndex(\n (item) => String(keyOf(item)) === move.cardKey,\n );\n if (index < 0) return next;\n const [card] = source.splice(index, 1);\n target.splice(Math.min(Math.max(0, move.toIndex), target.length), 0, card!);\n return next;\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated aliases (the component was called KanbanBoard): kept for one\n// minor release cycle, not documented.\n\n/** @deprecated Use `DASHBOARD_COLORS` */\nexport const KANBAN_COLORS = DASHBOARD_COLORS;\n/** @deprecated Use `DASHBOARD_COLUMN_WIDTH` */\nexport const KANBAN_COLUMN_WIDTH = DASHBOARD_COLUMN_WIDTH;\n/** @deprecated Use `DASHBOARD_GAP` */\nexport const KANBAN_GAP = DASHBOARD_GAP;\n/** @deprecated Use `dashboardAccent` */\nexport const kanbanAccent = dashboardAccent;\n/** @deprecated Use `dashboardAccentValue` */\nexport const kanbanAccentValue = dashboardAccentValue;\n/** @deprecated Use `dashboardCount` */\nexport const kanbanCount = dashboardCount;\n/** @deprecated Use `dashboardLength` */\nexport const kanbanLength = dashboardLength;\n/** @deprecated Use `DashboardCardMove` */\nexport type KanbanCardMove = DashboardCardMove;\n/** @deprecated Use `DashboardLayoutColumn` */\nexport type KanbanLayoutColumn = DashboardLayoutColumn;\n/** @deprecated Use `DashboardPosition` */\nexport type KanbanPosition = DashboardPosition;\n/** @deprecated Use `DashboardDirection` */\nexport type KanbanDirection = DashboardDirection;\n/** @deprecated Use `dashboardFind` */\nexport const kanbanFind = dashboardFind;\n/** @deprecated Use `dashboardSlots` */\nexport const kanbanSlots = dashboardSlots;\n/** @deprecated Use `dashboardCardMove` */\nexport const kanbanCardMove = dashboardCardMove;\n/** @deprecated Use `isDashboardNoop` */\nexport const isKanbanNoop = isDashboardNoop;\n/** @deprecated Use `dashboardInsertIndex` */\nexport const kanbanInsertIndex = dashboardInsertIndex;\n/** @deprecated Use `dashboardKeyboardTarget` */\nexport const kanbanKeyboardTarget = dashboardKeyboardTarget;\n/** @deprecated Use `dashboardKeyAction` */\nexport const kanbanKeyAction = dashboardKeyAction;\n/** @deprecated Use `moveDashboardCard` */\nexport const moveKanbanCard = moveDashboardCard;\n","// Visible window of a fixed-row-height virtual list.\n\n/** Inputs of `getVirtualRange`. */\nexport interface VirtualRangeInput {\n /** Scroll offset of the viewport (px) */\n scrollTop: number;\n /** Height of the viewport (px) */\n viewportHeight: number;\n /** Height of one row (px); `0` or less renders nothing */\n itemHeight: number;\n /** Number of rows */\n itemCount: number;\n /** Rows rendered above and below the viewport; negative or NaN means 0 */\n overscan?: number;\n}\n\n/** Rows to render: indexes `[start, end)`. */\nexport interface VirtualRange {\n start: number;\n end: number;\n /** Rows the window holds (viewport rows plus both overscans) */\n visibleCount: number;\n}\n\n/** The rows of a virtual list to render for the current scroll position. */\nexport function getVirtualRange({\n scrollTop,\n viewportHeight,\n itemHeight,\n itemCount,\n overscan = 0,\n}: VirtualRangeInput): VirtualRange {\n if (!(itemHeight > 0)) return { start: 0, end: 0, visibleCount: 0 };\n const extra = Math.max(0, overscan || 0);\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - extra);\n const visibleCount = Math.ceil(viewportHeight / itemHeight) + 2 * extra;\n const end = Math.min(itemCount, start + visibleCount);\n return { start, end, visibleCount };\n}\n","/** The file fields read by `matchesAccept`. */\nexport interface AcceptFileLike {\n name: string;\n type: string;\n}\n\n/**\n * Whether a file matches an `<input accept>` list: comma-separated\n * extensions (`.png`), MIME types (`image/png`) and wildcards (`image/*`,\n * `*`), case-insensitive. An empty list (or entry) accepts everything.\n */\nexport function matchesAccept(file: AcceptFileLike, accept: string): boolean {\n return accept.split(\",\").some((part) => {\n const rule = part.trim().toLowerCase();\n if (!rule || rule === \"*\" || rule === \"*/*\") return true;\n if (rule.startsWith(\".\")) return file.name.toLowerCase().endsWith(rule);\n const type = file.type.toLowerCase();\n return rule.endsWith(\"/*\")\n ? type.startsWith(rule.slice(0, -1))\n : type === rule;\n });\n}\n","// Separators of the tag inputs: typed or pasted text is split into tags.\n\n/** Default separators of a tag input: a comma and the Enter key. */\nexport const DEFAULT_TAG_SEPARATORS: readonly string[] = [\",\", \"Enter\"];\n\n/**\n * Splits `text` on any of the literal `separators` (longest first, so\n * `\"::\"` wins over `\":\"`). No separators returns `[text]`.\n */\nexport function splitBySeparators(\n text: string,\n separators: readonly string[],\n): string[] {\n if (separators.length === 0) return [text];\n const pattern = [...separators]\n .sort((a, b) => b.length - a.length)\n .map((sep) => sep.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\"|\");\n return text.split(new RegExp(pattern));\n}\n","// Option tree helpers of the cascaders (React Cascader and\n// <minerva-cascader>).\n\n/** The option fields read by the cascader helpers. */\nexport interface CascaderOptionLike<T> {\n value: string | number;\n disabled?: boolean;\n children?: readonly T[];\n}\n\n/** An option of the tree together with the chain of options leading to it. */\nexport interface CascaderSearchEntry<T> {\n option: T;\n /** Options from the root level down to (and including) `option` */\n path: T[];\n}\n\n/**\n * Resolves the option chain of a value path (one value per level). Stops\n * at the first value not found, so the result may be shorter than `values`.\n */\nexport function findCascaderPath<T extends CascaderOptionLike<T>>(\n options: readonly T[],\n values: readonly (string | number)[],\n): T[] {\n const result: T[] = [];\n let level: readonly T[] | undefined = options;\n for (const value of values) {\n const found: T | undefined = level?.find((o) => o.value === value);\n if (!found) break;\n result.push(found);\n level = found.children;\n }\n return result;\n}\n\n/**\n * Every enabled option of the tree (depth first) with its path. Disabled\n * options are skipped together with their descendants.\n */\nexport function flattenCascaderOptions<T extends CascaderOptionLike<T>>(\n options: readonly T[],\n path: T[] = [],\n): CascaderSearchEntry<T>[] {\n return options.flatMap((option) => {\n if (option.disabled) return [];\n const current = [...path, option];\n return [\n { option, path: current },\n ...(option.children\n ? flattenCascaderOptions(option.children, current)\n : []),\n ];\n });\n}\n","// Star math of the ratings (React Rating and <minerva-rating>): scores\n// on a 0..max scale shown as five stars with half stars.\n\n/** Fill of one star. */\nexport type RatingStarFill = \"full\" | \"half\" | \"empty\";\n\n/** Rounds a score to one decimal (`3.14` -> `3.1`). */\nexport const roundRating = (n: number): number => Math.round(n * 10) / 10;\n\n/**\n * Stars shown for `value` on a `0..max` scale, normalized to five stars in\n * half-star steps: fractions in 0.25..0.75 give a half star, larger ones\n * round up, smaller ones down. A `max` of 0 or less (or NaN) shows 0 stars.\n */\nexport function ratingDisplayStars(value: number, max: number): number {\n const stars5 = max > 0 ? (value / max) * 5 : 0;\n const fullCount = Math.floor(stars5);\n const fraction = stars5 - fullCount;\n const half = fraction >= 0.25 && fraction < 0.75;\n const roundedFull = fraction >= 0.75 ? fullCount + 1 : fullCount;\n return roundedFull + (half ? 0.5 : 0);\n}\n\n/** Fill of the star at `index` (0-based) when `displayed` stars are shown. */\nexport const ratingStarFill = (\n index: number,\n displayed: number,\n): RatingStarFill =>\n index < Math.floor(displayed) ? \"full\" : index < displayed ? \"half\" : \"empty\";\n","// Platform-neutral helpers of the media players (React / Vue / Angular\n// MediaPlayer, <minerva-media-player>, the mini-program players and the\n// React Native MediaControls): time formatting, media type inference,\n// playback rates and the keyboard map.\n\n/** Kind of media a player renders. */\nexport type MediaKind = \"audio\" | \"video\";\n\n/** Default playback rates of the speed button. */\nexport const DEFAULT_PLAYBACK_RATES: readonly number[] = [\n 0.5, 0.75, 1, 1.25, 1.5, 2,\n];\n\n/** Default skip step of the back / forward buttons (seconds). */\nexport const DEFAULT_SKIP_SECONDS = 10;\n\n/** Seek step of the arrow keys (seconds). */\nexport const MEDIA_KEY_SEEK_STEP = 5;\n\n/** Volume step of the arrow keys (0..1). */\nexport const MEDIA_KEY_VOLUME_STEP = 0.1;\n\nconst AUDIO_EXTENSIONS = new Set([\n \"mp3\",\n \"m4a\",\n \"aac\",\n \"wav\",\n \"oga\",\n \"ogg\",\n \"opus\",\n \"flac\",\n \"weba\",\n]);\n\n/**\n * Kind of media from an explicit `type`, a MIME type (`audio/mpeg`) or the\n * file extension of `src` (query and hash ignored). Defaults to video.\n */\nexport function inferMediaType(\n src?: string | null,\n mimeType?: string | null,\n type?: MediaKind | null,\n): MediaKind {\n if (type === \"audio\" || type === \"video\") return type;\n const mime = mimeType?.trim().toLowerCase();\n if (mime?.startsWith(\"audio/\")) return \"audio\";\n if (mime?.startsWith(\"video/\")) return \"video\";\n const path = (src ?? \"\").split(/[?#]/)[0] ?? \"\";\n const dot = path.lastIndexOf(\".\");\n const ext = dot >= 0 ? path.slice(dot + 1).toLowerCase() : \"\";\n return AUDIO_EXTENSIONS.has(ext) ? \"audio\" : \"video\";\n}\n\nconst finite = (n: number | null | undefined): number =>\n typeof n === \"number\" && Number.isFinite(n) && n > 0 ? n : 0;\n\n/**\n * `m:ss`, or `h:mm:ss` when the time (or the `duration` it is shown next\n * to) reaches an hour. Negative, NaN and infinite values show `0:00`.\n */\nexport function formatMediaTime(seconds: number, duration?: number): string {\n const total = Math.floor(finite(seconds));\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n const ss = String(secs).padStart(2, \"0\");\n if (hours > 0 || finite(duration) >= 3600) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${ss}`;\n }\n return `${minutes}:${ss}`;\n}\n\n/** Clamps a seek target to `0..duration` (no upper bound while unknown). */\nexport function clampMediaTime(seconds: number, duration?: number): number {\n const value = Number.isFinite(seconds) ? Math.max(0, seconds) : 0;\n const max = finite(duration);\n return max > 0 ? Math.min(value, max) : value;\n}\n\n/** Played fraction (0..1) of the media. */\nexport const mediaProgress = (currentTime: number, duration: number): number =>\n finite(duration) > 0\n ? Math.min(1, Math.max(0, finite(currentTime) / duration))\n : 0;\n\n/** Clamps a volume to 0..1 (rounded to two decimals). */\nexport const clampVolume = (volume: number): number =>\n Number.isFinite(volume)\n ? Math.round(Math.min(1, Math.max(0, volume)) * 100) / 100\n : 1;\n\n/** The rate after `current` in `rates` (wraps around; first when unknown). */\nexport function nextPlaybackRate(\n current: number,\n rates: readonly number[] = DEFAULT_PLAYBACK_RATES,\n): number {\n if (rates.length === 0) return current;\n const index = rates.indexOf(current);\n return rates[(index + 1) % rates.length] ?? current;\n}\n\n/** `1.25` -> `1.25×`, `1` -> `1×`. */\nexport const formatPlaybackRate = (rate: number): string =>\n `${Number(rate.toFixed(2))}×`;\n\n/** Minimal `TimeRanges` shape (DOM media `buffered`). */\nexport interface MediaTimeRanges {\n readonly length: number;\n start(index: number): number;\n end(index: number): number;\n}\n\n/**\n * End of the buffered range that contains `currentTime` (or of the last range\n * before it): what the seek bar shows as loaded.\n */\nexport function bufferedEnd(\n ranges: MediaTimeRanges | null | undefined,\n currentTime: number,\n): number {\n if (!ranges || ranges.length === 0) return 0;\n let end = 0;\n for (let i = 0; i < ranges.length; i++) {\n const start = ranges.start(i);\n const stop = ranges.end(i);\n if (currentTime >= start && currentTime <= stop) return stop;\n if (stop <= currentTime) end = stop;\n }\n return end;\n}\n\n/**\n * Icons of the control bar: SVG path data on a 24×24 box, filled with\n * `currentColor` (Material Symbols shapes, Apache-2.0).\n */\nexport const MEDIA_ICON_PATHS = {\n play: \"M8 5.14v13.72a1 1 0 0 0 1.52.85l10.6-6.86a1 1 0 0 0 0-1.7L9.52 4.3A1 1 0 0 0 8 5.14z\",\n pause: \"M7 5h3.5v14H7zm6.5 0H17v14h-3.5z\",\n skipBack:\n \"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\",\n skipForward:\n \"M12 5V1l5 5-5 5V7c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6h2c0 4.42-3.58 8-8 8s-8-3.58-8-8 3.58-8 8-8z\",\n volume:\n \"M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05A4.47 4.47 0 0 0 16.5 12zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\",\n muted:\n \"M16.5 12A4.5 4.5 0 0 0 14 7.97v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.8 8.8 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4 9.91 6.09 12 8.18V4z\",\n fullscreen:\n \"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\",\n exitFullscreen:\n \"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\",\n pictureInPicture:\n \"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z\",\n captions:\n \"M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\",\n} as const;\n\n/** Name of a control bar icon. */\nexport type MediaIconName = keyof typeof MEDIA_ICON_PATHS;\n\n/** What a key does when the player has the focus. */\nexport type MediaKeyAction =\n | { type: \"toggle\" }\n | { type: \"seek\"; delta: number }\n | { type: \"volume\"; delta: number }\n | { type: \"mute\" }\n | { type: \"fullscreen\" }\n | { type: \"captions\" };\n\n/**\n * Space / K play-pause, ← / → seek by 5 s, ↑ / ↓ volume, M mute,\n * F fullscreen, C captions on / off. `null` for other keys (and modified\n * keys).\n */\nexport function mediaKeyAction(\n key: string,\n modifiers: { ctrlKey?: boolean; metaKey?: boolean; altKey?: boolean } = {},\n): MediaKeyAction | null {\n if (modifiers.ctrlKey || modifiers.metaKey || modifiers.altKey) return null;\n switch (key) {\n case \" \":\n case \"Spacebar\":\n case \"k\":\n case \"K\":\n return { type: \"toggle\" };\n case \"ArrowLeft\":\n return { type: \"seek\", delta: -MEDIA_KEY_SEEK_STEP };\n case \"ArrowRight\":\n return { type: \"seek\", delta: MEDIA_KEY_SEEK_STEP };\n case \"ArrowUp\":\n return { type: \"volume\", delta: MEDIA_KEY_VOLUME_STEP };\n case \"ArrowDown\":\n return { type: \"volume\", delta: -MEDIA_KEY_VOLUME_STEP };\n case \"m\":\n case \"M\":\n return { type: \"mute\" };\n case \"f\":\n case \"F\":\n return { type: \"fullscreen\" };\n case \"c\":\n case \"C\":\n return { type: \"captions\" };\n default:\n return null;\n }\n}\n","// Captions / subtitles of the media players: a small WebVTT + SRT parser, the\n// active cue at a playback time, data: URL decoding and the remembered track\n// choice. Platform-neutral: no DOM, no `fetch`, no storage globals (callers\n// inject them).\n\n/** A captions / subtitles file of a media player. */\nexport interface MediaTrack {\n /** URL of the WebVTT (`.vtt`) or SubRip (`.srt`) file (data: URLs work). */\n src: string;\n /** BCP 47 language of the track (`en`, `fr-CA`). */\n srclang?: string;\n /** Name shown in the captions menu. */\n label: string;\n /** `subtitles` (translation, default) or `captions` (transcription + sounds). */\n kind?: \"subtitles\" | \"captions\";\n /** Selected when the user has not chosen a track yet. */\n default?: boolean;\n}\n\n/** A parsed cue: shown from `start` (inclusive) to `end` (exclusive), seconds. */\nexport interface MediaCue {\n start: number;\n end: number;\n text: string;\n}\n\n/** What the players emit when the captions choice changes (`-1` = off). */\nexport interface MediaTrackChange {\n index: number;\n track: MediaTrack | null;\n}\n\nconst TIMING =\n /^\\s*((?:\\d+:)?\\d{1,2}:\\d{1,2}(?:[.,]\\d{1,3})?)\\s*-->\\s*((?:\\d+:)?\\d{1,2}:\\d{1,2}(?:[.,]\\d{1,3})?)/;\n\n/** `01:02:03.500`, `02:03,5` -> seconds (NaN when malformed). */\nexport function parseCueTime(value: string): number {\n const parts = value.trim().replace(\",\", \".\").split(\":\");\n if (parts.length < 2 || parts.length > 3) return Number.NaN;\n let seconds = 0;\n for (const part of parts) {\n if (!/^\\d+(?:\\.\\d+)?$/.test(part)) return Number.NaN;\n seconds = seconds * 60 + Number(part);\n }\n return seconds;\n}\n\nconst ENTITIES: Record<string, string> = {\n amp: \"&\",\n lt: \"<\",\n gt: \">\",\n quot: '\"',\n apos: \"'\",\n nbsp: \"\\u00a0\",\n lrm: \"\\u200e\",\n rlm: \"\\u200f\",\n};\n\n/**\n * Plain text of a cue payload: strips WebVTT / SRT markup (`<v Name>`, `<b>`,\n * `<i>`, `<c.class>`, `<00:01.000>` timestamps, `<font>`, `{\\an8}`) and\n * decodes the character references.\n */\nexport function cueText(raw: string): string {\n return raw\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/\\{\\\\[^}]*\\}/g, \"\")\n .replace(/<[^>\\n]*>/g, \"\")\n .replace(/&(#x[0-9a-f]+|#\\d+|[a-z]+);/gi, (match, name: string) => {\n if (name[0] === \"#\") {\n const code =\n name[1] === \"x\" || name[1] === \"X\"\n ? Number.parseInt(name.slice(2), 16)\n : Number.parseInt(name.slice(1), 10);\n return Number.isFinite(code) && code > 0 && code <= 0x10ffff\n ? String.fromCodePoint(code)\n : match;\n }\n return ENTITIES[name.toLowerCase()] ?? match;\n })\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction parseBlocks(text: string): MediaCue[] {\n const cues: MediaCue[] = [];\n const blocks = text\n .replace(/^\\uFEFF/, \"\")\n .replace(/\\r\\n?/g, \"\\n\")\n .split(/\\n[ \\t]*\\n/);\n for (const block of blocks) {\n const lines = block.split(\"\\n\");\n const at = lines.findIndex((line) => line.includes(\"-->\"));\n if (at < 0) continue;\n const head = lines[0]?.trim() ?? \"\";\n // WebVTT NOTE / STYLE / REGION blocks never carry cues.\n if (/^(NOTE|STYLE|REGION)(\\s|$)/.test(head) && at !== 0) continue;\n const timing = TIMING.exec(lines[at] ?? \"\");\n if (!timing) continue;\n const start = parseCueTime(timing[1] ?? \"\");\n const end = parseCueTime(timing[2] ?? \"\");\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n continue;\n }\n const content = cueText(lines.slice(at + 1).join(\"\\n\"));\n if (content) cues.push({ start, end, text: content });\n }\n return cues.sort((a, b) => a.start - b.start || a.end - b.end);\n}\n\n/** Cues of a WebVTT file (header, NOTE / STYLE / REGION blocks skipped). */\nexport function parseVtt(text: string): MediaCue[] {\n return parseBlocks(text.replace(/^\\uFEFF?WEBVTT[^\\n]*(\\n|$)/, \"\\n\"));\n}\n\n/** Cues of a SubRip (SRT) file. */\nexport const parseSrt = (text: string): MediaCue[] => parseBlocks(text);\n\n/** Cues of a WebVTT or SRT file (detected from the `WEBVTT` header). */\nexport function parseCaptions(text: string): MediaCue[] {\n return /^\\uFEFF?WEBVTT/.test(text) ? parseVtt(text) : parseSrt(text);\n}\n\n/** Text of the cues shown at `time` (overlapping cues on separate lines). */\nexport function activeCueText(cues: readonly MediaCue[], time: number): string {\n if (!Number.isFinite(time)) return \"\";\n const lines: string[] = [];\n for (const cue of cues) {\n if (cue.start > time) break;\n if (time < cue.end) lines.push(cue.text);\n }\n return lines.join(\"\\n\");\n}\n\n/** Whether `src` names a SubRip file (`.srt`, or an `application/x-subrip` data: URL). */\nexport function isSrtSource(src: string): boolean {\n if (/^data:/i.test(src)) return /^data:[^,;]*(subrip|srt)/i.test(src);\n const path = src.split(/[?#]/)[0] ?? \"\";\n return /\\.srt$/i.test(path);\n}\n\nconst BASE64 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nfunction decodeBase64(value: string): string {\n const clean = value.replace(/[^A-Za-z0-9+/]/g, \"\");\n let hex = \"\";\n let buffer = 0;\n let bits = 0;\n for (const char of clean) {\n buffer = (buffer << 6) | BASE64.indexOf(char);\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n hex += `%${((buffer >> bits) & 0xff).toString(16).padStart(2, \"0\")}`;\n }\n }\n try {\n return decodeURIComponent(hex);\n } catch {\n // Not UTF-8: read the bytes as Latin-1.\n return hex.replace(/%([0-9a-f]{2})/g, (_, byte: string) =>\n String.fromCharCode(Number.parseInt(byte, 16)),\n );\n }\n}\n\n/** Text of a `data:` URL (percent-encoded or base64), `null` for other URLs. */\nexport function decodeDataUrl(src: string): string | null {\n const match = /^data:([^,]*),([\\s\\S]*)$/i.exec(src.trim());\n if (!match) return null;\n const meta = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n if (/;base64$/i.test(meta)) return decodeBase64(body);\n try {\n return decodeURIComponent(body);\n } catch {\n return body;\n }\n}\n\n/**\n * Cues of a captions file: decodes data: URLs in place, otherwise reads the\n * text with `fetchText` (`fetch`, `Taro.request`, `uni.request`…).\n */\nexport async function loadCaptions(\n src: string,\n fetchText: (url: string) => Promise<string>,\n): Promise<MediaCue[]> {\n const inline = decodeDataUrl(src);\n const text = inline ?? (await fetchText(src));\n return isSrtSource(src) ? parseSrt(text) : parseCaptions(text);\n}\n\n/** Storage key of the remembered captions choice. */\nexport const MEDIA_CAPTIONS_STORAGE_KEY = \"minerva-media-player-captions\";\n\n/** Remembered form of a choice: `\"off\"`, or the track language (label when none). */\nexport const captionsPreference = (track: MediaTrack | null): string =>\n track ? track.srclang || track.label : \"off\";\n\nconst primary = (lang: string) => lang.toLowerCase().split(/[-_]/)[0] ?? \"\";\n\n/**\n * Index of the track to show (`-1` = off): the remembered choice (`\"off\"`,\n * a language — exact, then primary subtag — or a label), else the first\n * `default` track, else off.\n */\nexport function pickCaptionsTrack(\n tracks: readonly MediaTrack[],\n preference?: string | null,\n): number {\n if (tracks.length === 0) return -1;\n if (preference === \"off\") return -1;\n if (preference) {\n const wanted = preference.toLowerCase();\n let index = tracks.findIndex((t) => t.srclang?.toLowerCase() === wanted);\n if (index < 0) {\n index = tracks.findIndex(\n (t) => !!t.srclang && primary(t.srclang) === primary(wanted),\n );\n }\n if (index < 0) {\n index = tracks.findIndex((t) => t.label.toLowerCase() === wanted);\n }\n if (index >= 0) return index;\n }\n return tracks.findIndex((t) => t.default);\n}\n\n/** Minimal synchronous key-value storage (`localStorage`, mini-program storage). */\nexport interface CaptionsStorage {\n getItem(key: string): string | null | undefined;\n setItem(key: string, value: string): void;\n}\n\n/** The remembered captions choice (`null` when none or storage fails). */\nexport function readCaptionsPreference(\n storage?: CaptionsStorage | null,\n): string | null {\n try {\n const value = storage?.getItem(MEDIA_CAPTIONS_STORAGE_KEY);\n return typeof value === \"string\" && value ? value : null;\n } catch {\n return null;\n }\n}\n\n/** Remembers a captions choice (storage failures ignored). */\nexport function writeCaptionsPreference(\n storage: CaptionsStorage | null | undefined,\n track: MediaTrack | null,\n): void {\n try {\n storage?.setItem(MEDIA_CAPTIONS_STORAGE_KEY, captionsPreference(track));\n } catch {\n // Private mode, quota, sandboxed frame: the choice is not remembered.\n }\n}\n\n/**\n * Track the captions key (C) switches to: off when one is shown, else the\n * last used one (`previous`), else the first track. `null` without tracks.\n */\nexport function toggledCaptionsTrack(\n tracks: readonly MediaTrack[],\n current: number,\n previous: number,\n): number | null {\n if (tracks.length === 0) return null;\n if (current >= 0) return -1;\n return previous >= 0 && previous < tracks.length ? previous : 0;\n}\n","// Value helpers of the sliders (every renderer): clamping, snapping to the\n// step or to the marks, keyboard stepping, two-thumb ranges.\n\nimport { decimalPlaces } from \"./decimal-places\";\n\n/** A slider value: one number, or `[start, end]` for a range slider */\nexport type SliderValue = number | [number, number];\n\n/** A mark of the slider scale */\nexport interface SliderMark {\n /** Position of the mark (between min and max) */\n value: number;\n /** Text shown under the mark */\n label?: string;\n}\n\n/** Scale of a slider */\nexport interface SliderScale {\n min: number;\n max: number;\n /** Step between two values; `null` snaps to the marks only */\n step: number | null;\n /** Marks of the scale (already resolved, see `getSliderMarks`) */\n marks?: readonly SliderMark[];\n /** Snap to the closest mark (instead of the step) */\n snapToMarks?: boolean;\n}\n\n/** Most step ticks drawn by `marks: true` (denser scales draw none). */\nexport const SLIDER_MAX_STEP_MARKS = 101;\n\n/** Decimal places of a step (`0.05` -> 2, `1.5e-7` -> 8). */\nexport function sliderPrecision(step?: number | null): number {\n if (!step) return 0;\n return decimalPlaces(step);\n}\n\n/** `v` limited to `[min, max]`. */\nexport function clampSliderValue(v: number, min: number, max: number): number {\n if (Number.isNaN(v)) return min;\n return Math.min(max, Math.max(min, v));\n}\n\n/**\n * Marks of a slider: `true` draws one tick per step (none when there would\n * be more than `SLIDER_MAX_STEP_MARKS`), an array keeps the marks within\n * `[min, max]`, sorted.\n */\nexport function getSliderMarks(\n marks: readonly SliderMark[] | boolean | undefined | null,\n min: number,\n max: number,\n step: number | null = 1,\n): SliderMark[] {\n if (!marks || max <= min) return [];\n if (marks === true) {\n if (!step || step <= 0) return [];\n const count = Math.floor((max - min) / step + 1e-9) + 1;\n if (count > SLIDER_MAX_STEP_MARKS) return [];\n const precision = sliderPrecision(step);\n return Array.from({ length: count }, (_, i) => ({\n value: Number((min + i * step).toFixed(precision)),\n }));\n }\n return marks\n .filter((m) => Number.isFinite(m.value) && m.value >= min && m.value <= max)\n .slice()\n .sort((a, b) => a.value - b.value);\n}\n\n/** The mark closest to `v` (`undefined` without marks). */\nfunction closestMark(\n v: number,\n marks: readonly SliderMark[] | undefined,\n): number | undefined {\n if (!marks?.length) return undefined;\n let best = marks[0].value;\n for (const m of marks) {\n if (Math.abs(m.value - v) < Math.abs(best - v)) best = m.value;\n }\n return best;\n}\n\n/**\n * `v` snapped to the scale: to the closest mark with `snapToMarks` (or a\n * `null` step), otherwise to the closest step from `min`; always clamped.\n */\nexport function snapSliderValue(v: number, scale: SliderScale): number {\n const { min, max, step, marks, snapToMarks } = scale;\n const clamped = clampSliderValue(v, min, max);\n if (snapToMarks || step === null) {\n return closestMark(clamped, marks) ?? clamped;\n }\n if (!step || step <= 0) return clamped;\n const snapped = min + Math.round((clamped - min) / step) * step;\n const precision = Math.max(sliderPrecision(step), sliderPrecision(min));\n // A last step shorter than `step` can overshoot `max`: clamp again.\n return clampSliderValue(Number(snapped.toFixed(precision)), min, max);\n}\n\n/** Position of `v` on the scale, in percent (0..100). */\nexport function sliderPercent(v: number, min: number, max: number): number {\n if (max <= min) return 0;\n return ((clampSliderValue(v, min, max) - min) / (max - min)) * 100;\n}\n\n/**\n * Ratio (0..1 from the min end, unclamped) of a pointer `position` on a\n * track whose measured axis starts at `start` and is `length` long.\n * `reversed` tracks have their min at the far end of the axis: vertical\n * sliders (min at the bottom, the y axis grows downwards) and horizontal RTL\n * sliders. `0` while the track is not measured.\n */\nexport function sliderRatioAt(\n position: number,\n start: number,\n length: number,\n reversed = false,\n): number {\n if (!length) return 0;\n const ratio = (position - start) / length;\n return reversed ? 1 - ratio : ratio;\n}\n\n/**\n * The snapped value at `ratio` (0..1, from the start of the track) of the\n * track. Renderers flip the ratio for RTL / vertical sliders (see\n * `sliderRatioAt`).\n */\nexport function sliderValueFromRatio(\n ratio: number,\n scale: SliderScale,\n): number {\n const r = Math.min(1, Math.max(0, Number.isFinite(ratio) ? ratio : 0));\n return snapSliderValue(scale.min + r * (scale.max - scale.min), scale);\n}\n\n/**\n * The value after a key press: ArrowRight / ArrowUp add one step, ArrowLeft\n * / ArrowDown remove one, PageUp / PageDown move by 10% of the scale (at\n * least one step), Home / End jump to the bounds. Marks-only sliders move\n * to the next / previous mark. `null` for other keys. Keys are logical:\n * renderers swap the horizontal arrows in RTL.\n */\nexport function getSliderKeyValue(\n key: string,\n value: number,\n scale: SliderScale,\n): number | null {\n const { min, max, step, marks, snapToMarks } = scale;\n if (key === \"Home\") return snapSliderValue(min, scale);\n if (key === \"End\") return snapSliderValue(max, scale);\n const up = key === \"ArrowRight\" || key === \"ArrowUp\";\n const down = key === \"ArrowLeft\" || key === \"ArrowDown\";\n const pageUp = key === \"PageUp\";\n const pageDown = key === \"PageDown\";\n if (!up && !down && !pageUp && !pageDown) return null;\n const direction = up || pageUp ? 1 : -1;\n if ((snapToMarks || step === null) && marks?.length) {\n const values = marks.map((m) => m.value);\n if (pageUp || pageDown) {\n const jump = Math.max(1, Math.round(values.length / 10));\n const index = values.indexOf(closestMark(value, marks) as number);\n const next = Math.min(\n values.length - 1,\n Math.max(0, index + direction * jump),\n );\n return values[next];\n }\n const next =\n direction > 0\n ? values.find((v) => v > value)\n : [...values].reverse().find((v) => v < value);\n return next ?? value;\n }\n const unit = step && step > 0 ? step : (max - min) / 100;\n const delta = pageUp || pageDown ? Math.max(unit, (max - min) / 10) : unit;\n return snapSliderValue(value + direction * delta, scale);\n}\n\n/**\n * A value made valid for the slider: a clamped (and snapped) number, or for\n * a range two clamped values in order. Missing values fall back to the\n * bounds.\n */\nexport function normalizeSliderValue(\n value: SliderValue | null | undefined,\n range: boolean,\n scale: SliderScale,\n): SliderValue {\n const fix = (v: unknown, fallback: number) =>\n typeof v === \"number\" && Number.isFinite(v)\n ? snapSliderValue(v, scale)\n : fallback;\n if (range) {\n const pair = Array.isArray(value)\n ? value\n : typeof value === \"number\"\n ? [scale.min, value]\n : [scale.min, scale.max];\n const a = fix(pair[0], scale.min);\n const b = fix(pair[1], scale.max);\n return a <= b ? [a, b] : [b, a];\n }\n return fix(Array.isArray(value) ? value[0] : value, scale.min);\n}\n\n/** The values of a slider value as a list (one or two thumbs). */\nexport function sliderValues(value: SliderValue): number[] {\n return Array.isArray(value) ? [value[0], value[1]] : [value];\n}\n\n/**\n * The value with thumb `index` moved to `next`. Range thumbs cannot cross:\n * the start stops at the end and the end at the start.\n */\nexport function setSliderThumb(\n value: SliderValue,\n index: number,\n next: number,\n): SliderValue {\n if (!Array.isArray(value)) return next;\n if (index === 0) return [Math.min(next, value[1]), value[1]];\n return [value[0], Math.max(next, value[0])];\n}\n\n/** Index of the thumb closest to `v` (ties go to the end thumb when past it). */\nexport function closestSliderThumb(value: SliderValue, v: number): number {\n if (!Array.isArray(value)) return 0;\n const [a, b] = value;\n if (a === b) return v > b ? 1 : 0;\n return Math.abs(v - a) <= Math.abs(v - b) ? 0 : 1;\n}\n\n/** Whether two slider values are equal. */\nexport function sliderValuesEqual(a: SliderValue, b: SliderValue): boolean {\n if (Array.isArray(a) && Array.isArray(b))\n return a[0] === b[0] && a[1] === b[1];\n return a === b;\n}\n\n/** Whether a mark lies inside the filled part of the track. */\nexport function isSliderMarkActive(mark: number, value: SliderValue): boolean {\n if (Array.isArray(value)) return mark >= value[0] && mark <= value[1];\n return mark <= value;\n}\n","/**\n * A value accepted by {@link cn}: strings / numbers are kept, falsy values are\n * skipped, arrays are flattened and objects contribute their truthy keys.\n */\nexport type ClassValue =\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | ClassDictionary\n | ClassValue[];\n\n/** `{ \"is-active\": isActive }` — keys whose value is truthy are kept. */\nexport type ClassDictionary = Record<string, unknown>;\n\nconst append = (out: string[], value: ClassValue): void => {\n if (!value || value === true) return;\n if (typeof value === \"string\" || typeof value === \"number\") {\n out.push(String(value));\n } else if (typeof value === \"bigint\") {\n out.push(value.toString());\n } else if (Array.isArray(value)) {\n for (const item of value) append(out, item);\n } else {\n for (const key of Object.keys(value)) {\n if (key && value[key]) out.push(key);\n }\n }\n};\n\n/**\n * Join class names, skipping falsy values (a dependency-free `classnames`).\n *\n * cn(\"btn\", isActive && \"btn-active\", { \"btn-disabled\": disabled }, className)\n */\nexport function cn(...inputs: ClassValue[]): string {\n const out: string[] = [];\n for (const input of inputs) append(out, input);\n return out.join(\" \");\n}\n","// Vocabulary of the code highlighter, kept apart from the tokenizer so the\n// theme tokens (../tokens/code.ts) can list the token types without loading\n// the grammars.\n\n/**\n * Token types produced by `highlightCode`. Each one has a color token,\n * `--code-token-<type>-color` (light and dark values in `tokens.css`,\n * resolved by `resolveTokens` for React Native and the mini-programs).\n */\nexport const highlightTokenTypes = [\n \"comment\",\n \"keyword\",\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"property\",\n \"function\",\n \"tag\",\n \"attr-name\",\n \"attr-value\",\n \"punctuation\",\n \"operator\",\n \"regex\",\n \"variable\",\n \"builtin\",\n \"inserted\",\n \"deleted\",\n \"heading\",\n] as const;\n\n/** Type of a highlighted token (see `highlightTokenTypes`). */\nexport type HighlightTokenType = (typeof highlightTokenTypes)[number];\n\n/**\n * A run of source text. `type` is `null` for plain text. The texts of the\n * tokens returned by `highlightCode` concatenate to the input exactly.\n */\nexport interface HighlightToken {\n type: HighlightTokenType | null;\n text: string;\n}\n\n/** Canonical names of the languages `highlightCode` understands. */\nexport const supportedCodeLanguages = [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"css\",\n \"html\",\n \"bash\",\n \"python\",\n \"yaml\",\n \"sql\",\n \"diff\",\n \"markdown\",\n \"plain\",\n] as const;\n\n/** A canonical language name (see `normalizeCodeLanguage` for the aliases). */\nexport type CodeLanguage = (typeof supportedCodeLanguages)[number];\n","// Language detection of unlabelled code (EPUB `<pre>` without a class,\n// Markdown fences without an info string, HTML extracts…).\n//\n// `detectCodeLanguage(code)` scores the first ~4 KB / 200 lines against\n// hand-picked features of each supported language (a line rule adds its\n// points for each matching line, up to a few lines, so no single feature\n// dominates) and returns the best one, or \"plain\" when no score reaches the\n// threshold. Unambiguous markers (a shebang, a doctype, valid JSON) decide\n// directly. Pure, deterministic (ties follow a fixed order) and roughly\n// linear: every regular expression is tried on one line of at most 400\n// characters, without nested quantifiers.\nimport type { CodeLanguage } from \"./types\";\n\nconst SAMPLE_CHARS = 4096;\nconst SAMPLE_LINES = 200;\nconst LINE_CHARS = 400;\n/** Lowest winning score: below it the code stays plain */\nconst THRESHOLD = 3;\n\ntype Bucket =\n | \"js\"\n | \"ts\"\n | \"jsx\"\n | \"json\"\n | \"css\"\n | \"html\"\n | \"bash\"\n | \"python\"\n | \"yaml\"\n | \"sql\"\n | \"diff\"\n | \"markdown\";\n\n/** Points added for each matching line, for at most `cap` lines (default 4) */\ntype LineRule = readonly [\n bucket: Bucket,\n pattern: RegExp,\n points: number,\n cap?: number,\n];\n\nconst CSS_TAGS =\n \"html|body|main|header|footer|nav|section|article|aside|div|span|a|p|h[1-6]|ul|ol|li|dl|dt|dd|img|button|input|select|textarea|label|form|fieldset|table|thead|tbody|tr|td|th|pre|code|blockquote|figure|figcaption|strong|em|small|svg|canvas|video|audio|iframe|hr\";\nconst CSS_PROPS =\n \"color|background(-color|-image|-size|-position|-repeat)?|margin(-top|-right|-bottom|-left|-inline|-block)?|padding(-top|-right|-bottom|-left|-inline|-block)?|display|position|top|right|bottom|left|inset|width|height|min-width|min-height|max-width|max-height|border(-top|-right|-bottom|-left|-radius|-color|-width|-style)?|outline|font(-family|-size|-weight|-style)?|line-height|letter-spacing|text-(align|decoration|transform|overflow|shadow)|white-space|word-break|overflow(-x|-y|-wrap)?|z-index|opacity|transform|transition|animation|box-shadow|box-sizing|cursor|flex(-direction|-wrap|-grow|-shrink|-basis)?|justify-content|align-(items|self|content)|gap|grid(-template-columns|-template-rows|-area|-column|-row)?|content|visibility|vertical-align|list-style|filter|fill|stroke\";\nconst SHELL_COMMANDS =\n \"apt|apt-get|brew|npm|npx|pnpm|yarn|bun|pip|pip3|git|cd|ls|mkdir|rm|cp|mv|curl|wget|chmod|chown|echo|source|docker|kubectl|cat|grep|sed|awk|tar|make|ssh|scp|touch|unzip|systemctl|cargo|rustup|python|python3|node|deno|sudo\";\n\nconst LINE_RULES: readonly LineRule[] = [\n // JavaScript (shared by TypeScript / JSX / TSX)\n [\"js\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$[{][^=]*=[^=>]/, 3],\n [\"js\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$[{][^=]*$/, 2],\n [\"js\", /=>/, 1.5],\n [\"js\", /\\bfunction\\b\\s*\\*?\\s*[\\w$]*\\s*\\(/, 2.5],\n [\"js\", /\\brequire\\(\\s*['\"]/, 3],\n [\"js\", /^\\s*import\\s+[\\w$*{][^'\"]*\\s+from\\s+['\"][^'\"]+['\"]/, 3],\n [\"js\", /^\\s*import\\s+['\"][^'\"]+['\"]\\s*;/, 2],\n [\"js\", /\\b(module\\.exports|exports\\.[\\w$]+)\\s*=/, 3],\n [\"js\", /^\\s*export\\s+(default\\b|async\\b|function\\b|class\\b|\\{|\\*)/, 2.5],\n [\"js\", /\\bconsole\\.(log|error|warn|info|debug)\\(/, 3],\n [\"js\", /[!=]==/, 1.5],\n [\"js\", /\\b(document|window|globalThis)\\.\\w/, 2],\n [\"js\", /\\bawait\\s+[\\w$.]+\\(|\\basync\\s*(\\(|function\\b|[\\w$]+\\s*=>)/, 1.5],\n [\"js\", /\\bnew\\s+[A-Z][\\w$]*\\(/, 1],\n [\"js\", /\\bthis\\.[\\w$]/, 1.5],\n [\"js\", /`[^`]*\\$\\{/, 1.5],\n [\"js\", /^\\s*(if|for|while|switch)\\s*\\(.*\\)\\s*\\{\\s*$/, 1],\n [\"js\", /^\\s*\\}\\s*(else|catch|finally)\\b/, 1.5],\n [\"js\", /;\\s*$/, 0.25, 8],\n [\"js\", /(^|\\s)\\/\\/\\s/, 0.5],\n // TypeScript (on top of JavaScript)\n [\n \"ts\",\n /^\\s*(export\\s+)?(declare\\s+)?(interface|type)\\s+[A-Z][\\w$]*\\s*(<[^>]*>)?\\s*(=|\\{|extends\\b)/,\n 5,\n 3,\n ],\n [\"ts\", /^\\s*(export\\s+)?(declare\\s+)?(const\\s+)?enum\\s+[A-Z][\\w$]*\\s*\\{/, 5],\n [\"ts\", /\\bas\\s+const\\b/, 4],\n [\"ts\", /^\\s*import\\s+type\\b/, 4],\n // not at the line end: `type: string` is YAML too\n [\n \"ts\",\n /[\\w$?)\\]]\\s*:\\s*(string|number|boolean|void|any|unknown|never|bigint)(\\[\\])?\\s*[;,)=|>{}\\]]/,\n 2.5,\n ],\n [\n \"ts\",\n /\\)\\s*:\\s*(Promise\\b|[A-Z][\\w$]*|string|number|boolean|void)[^{=;]*(\\{|=>)\\s*$/,\n 3,\n ],\n [\"ts\", /^\\s*(export\\s+)?(const|let|var)\\s+[\\w$]+\\s*:\\s*[\\w$<[{(]/, 3],\n [\"ts\", /\\b(private|public|protected|readonly)\\s+[\\w$]+\\s*[:;=(?]/, 2],\n [\n \"ts\",\n /\\b(implements\\s+[A-Z]|keyof\\s|satisfies\\s|abstract\\s+class\\b|declare\\s+(module|global|const|function))/,\n 2,\n ],\n [\"ts\", /[\\w$]<\\s*[A-Z][\\w$]*(\\[\\])?(\\s*,\\s*[A-Z][\\w$]*(\\[\\])?)*\\s*>\\s*\\(/, 2],\n // JSX (markup inside JavaScript)\n [\"jsx\", /(\\breturn|=>|[=(?:,&|])\\s*\\(?\\s*<([A-Za-z][\\w.]*|>)[\\s/>]/, 3],\n // not after an identifier: `Promise<Book>` is a generic\n [\"jsx\", /(^|[^\\w$.])<\\/?[A-Z][\\w.]*[\\s/>]/, 1.5],\n [\"jsx\", /\\s(className|htmlFor|on[A-Z]\\w*)=/, 2],\n [\"jsx\", /\\s[\\w-]+=\\{/, 2],\n [\"jsx\", /<>|<\\/>/, 3],\n // HTML / XML\n [\"html\", /<\\/[a-zA-Z][\\w:-]*\\s*>/, 1.5, 6],\n [\n \"html\",\n /(^|[^\\w$.])<[a-zA-Z][\\w:-]*(\\s+[\\w:@.-]+(\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/,\n 1,\n 6,\n ],\n [\"html\", /<!--/, 2, 2],\n [\"html\", /<\\/?(script|style|head|body|meta|link)\\b/i, 2, 2],\n [\"html\", /&([a-z]+|#\\d+);/, 1, 2],\n // CSS\n [\n \"css\",\n /^\\s*@(media|supports|font-face|keyframes|import|layer|container|page|charset)\\b/,\n 3,\n 3,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*([.#][\\\\w-]+|[*&]|::?[\\\\w-]+|\\\\[[\\\\w-]+|(${CSS_TAGS})\\\\b)[^{};=]*\\\\{\\\\s*$`,\n ),\n 2,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*([.#][\\\\w-]+|::?[\\\\w-]+|(${CSS_TAGS})\\\\b)[^{};=]*\\\\{[^{}]*:[^{}]*\\\\}\\\\s*$`,\n ),\n 3,\n ],\n [\n \"css\",\n new RegExp(\n `^\\\\s*(--[\\\\w-]+|-(webkit|moz|ms)-[\\\\w-]+|${CSS_PROPS})\\\\s*:\\\\s*[^;{}]+;\\\\s*$`,\n ),\n 1.5,\n 8,\n ],\n [\n \"css\",\n /^\\s*[a-z-]+\\s*:[^;{}]*(\\d(px|rem|em|vh|vw|ms|deg|fr)\\b|#[0-9a-fA-F]{3,8}\\b|\\b(rgba?|hsla?|var|calc)\\()[^;{}]*;\\s*$/,\n 1.5,\n ],\n [\"css\", /!important\\s*;/, 1, 2],\n // Python\n [\"python\", /^\\s*(async\\s+)?def\\s+\\w+\\s*\\(.*\\)\\s*(->[^:]+)?:\\s*(#.*)?$/, 4, 3],\n [\"python\", /^>>> /, 3],\n [\"python\", /^\\s*class\\s+\\w+(\\s*\\(.*\\))?\\s*:\\s*$/, 4, 2],\n [\n \"python\",\n /^\\s*(import\\s+[\\w.]+(\\s+as\\s+\\w+)?(\\s*,\\s*[\\w.]+)*|from\\s+[.\\w]+\\s+import\\s+(\\(|\\*|[\\w, ]+))\\s*$/,\n 3,\n 3,\n ],\n [\"python\", /\\bself\\.\\w/, 1.5, 3],\n [\"python\", /^\\s*elif\\b.*:\\s*$/, 3, 1],\n [\n \"python\",\n /^\\s*(if|for|while|with|try|except|else|finally)\\b[^{};]*:\\s*(#.*)?$/,\n 1.5,\n ],\n [\"python\", /^\\s*print\\(/, 1, 2],\n [\"python\", /\\b(None|True|False)\\b/, 1, 2],\n [\"python\", /__\\w+__/, 2, 2],\n [\n \"python\",\n /\\b(lambda\\s|nonlocal\\s|yield\\s+from\\b|not\\s+in\\b|is\\s+not\\b|is\\s+None\\b)/,\n 1.5,\n ],\n [\"python\", /^\\s*(pass|raise\\b.*)\\s*$/, 1.5, 2],\n [\"python\", /\\bf\"[^\"]*\\{|\\bf'[^']*\\{/, 1, 2],\n [\"python\", /^\\s*@[\\w.]+(\\(.*\\))?\\s*$/, 0.5, 2],\n // Bash / shell sessions\n [\"bash\", /^\\s*\\$\\s+\\S/, 3],\n [\n \"bash\",\n new RegExp(\n `^\\\\s*(\\\\$\\\\s+)?(sudo\\\\s+)?(${SHELL_COMMANDS})(\\\\s+[^\\\\s=:(.]|\\\\s*$)`,\n ),\n 3,\n 5,\n ],\n [\n \"bash\",\n /^\\s*(\\$\\s+)?(sudo\\s+)?(npm|pnpm|yarn|npx|pip3?|brew|apt(-get)?|git|docker|cargo|gem|composer|kubectl)\\s+(install|i|add|run|exec|init|clone|commit|push|pull|checkout|build|test|start|get|update|upgrade|remove|uninstall|status|log|diff|compose|apply|create|ci|dlx)\\b/,\n 2,\n 3,\n ],\n [\"bash\", /\\s--?[a-zA-Z][\\w-]*(=\\S+)?(\\s|$)/, 0.5],\n [\"bash\", /^\\s*export\\s+[A-Za-z_]\\w*=/, 3],\n [\"bash\", /^\\s*[A-Za-z_]\\w*=(\"|'|\\$|[^\\s=])/, 1, 3],\n [\"bash\", /&&|\\|\\||\\s\\|\\s/, 0.5, 2],\n [\"bash\", /\\$\\{?[A-Za-z_]\\w*\\}?|\\$\\(|\\$[0-9@#?]/, 0.5, 3],\n [\n \"bash\",\n /^\\s*(if\\s+\\[|then\\s*$|fi\\s*$|do\\s*$|done\\b|esac\\b|case\\s+.+\\s+in\\s*$|while\\s+\\[|elif\\s+\\[|for\\s+\\w+\\s+in\\s+[^:]*$)/,\n 3,\n ],\n [\n \"bash\",\n /2>&1|>\\s*\\/dev\\/null|\\|\\s*(grep|xargs|sort|head|tail|wc|tee|less)\\b/,\n 2,\n 2,\n ],\n // SQL (statements at a line start, any case; clauses in capitals)\n [\"sql\", /^\\s*SELECT\\s*$/, 2, 1],\n [\n \"sql\",\n /^\\s*(select\\s+(\\*|distinct\\b|top\\s+\\d|count\\(|[\\w.]+\\s*,|[\\w.]+\\s+as\\s|[\\w.]+\\s+from\\s)|insert\\s+into\\s+[\\w.\"`[]|update\\s+[\\w.\"`]+\\s+set\\s|delete\\s+from\\s+[\\w.\"`[]|create\\s+(or\\s+replace\\s+)?(temp(orary)?\\s+)?(table|index|unique\\s+index|view|database|schema|function|trigger|sequence)\\b|alter\\s+table\\s|drop\\s+(table|index|view|database|schema)\\b|with\\s+(recursive\\s+)?\\w+\\s+as\\s*\\()/i,\n 4,\n 3,\n ],\n [\n \"sql\",\n /^\\s*(FROM|WHERE|JOIN|LEFT JOIN|INNER JOIN|RIGHT JOIN|GROUP BY|ORDER BY|HAVING|LIMIT|VALUES|SET|UNION|ON|AND|OR)\\b/,\n 1,\n ],\n [\n \"sql\",\n /\\b(VARCHAR|INTEGER|PRIMARY KEY|NOT NULL|FOREIGN KEY|REFERENCES|AUTO_INCREMENT|BIGINT|TIMESTAMP|primary key|not null|varchar|foreign key)\\b/,\n 1,\n 3,\n ],\n [\"sql\", /^\\s*--\\s/, 0.5, 2],\n // diff\n [\"diff\", /^@@ -\\d+(,\\d+)? \\+\\d+(,\\d+)? @@/, 5, 3],\n [\"diff\", /^diff --git /, 5, 1],\n [\"diff\", /^index [0-9a-f]+\\.\\.[0-9a-f]+/, 3, 1],\n // Markdown\n [\"markdown\", /^#\\s+\\S/, 1.5, 3],\n [\"markdown\", /^#{2,6}\\s+\\S/, 2.5, 3],\n [\"markdown\", /^\\s*[-*+]\\s+\\S/, 0.75],\n [\"markdown\", /^\\s*\\d+[.)]\\s+\\S/, 1, 3],\n [\n \"markdown\",\n /\\[[^\\]\\n]+\\]\\((https?:\\/\\/|mailto:|\\.{0,2}\\/|#)[^)\\s]*\\)|\\[[^\\]\\n]+\\]\\([\\w./-]+\\.(md|html?|png|jpe?g|gif|svg)\\)/,\n 2,\n 3,\n ],\n [\"markdown\", /!\\[[^\\]]*\\]\\([^)\\s]+\\)/, 2, 2],\n [\"markdown\", /^\\s{0,3}(```|~~~)/, 4],\n [\"markdown\", /^>\\s?\\S/, 1, 2],\n [\"markdown\", /\\*\\*[^*\\n]+\\*\\*/, 1, 2],\n [\"markdown\", /(^|[^`])`[^`\\n]+`/, 0.5, 2],\n [\"markdown\", /^\\s*\\|.+\\|\\s*$/, 0.5],\n [\"markdown\", /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)+\\|?\\s*$/, 3, 1],\n [\"markdown\", /^=+\\s*$/, 2, 1],\n];\n\n/** A prose sentence (Markdown paragraphs): words, no code punctuation */\nconst isProse = (line: string) =>\n /^[A-Z]/.test(line) &&\n /[.!?:]$/.test(line) &&\n !/[{};=<>()]/.test(line) &&\n line.split(/\\s+/).length >= 6;\n\n/** A line of a JSON document (keys and values, brackets, commas) */\nconst JSON_LINE =\n /^\\s*(\"([^\"\\\\]|\\\\.)*\"\\s*:\\s*)?([[{]|\"([^\"\\\\]|\\\\.)*\"|-?\\d[\\d.eE+-]*|true|false|null)?\\s*[\\]},]*\\s*,?\\s*$/;\nconst YAML_KEY_VALUE = /^\\s*(-\\s+)?[A-Za-z_\"'][\\w\"' ./-]*:\\s+\\S/;\nconst YAML_KEY = /^\\s*(-\\s+)?[A-Za-z_\"'][\\w\"'./-]*:\\s*$/;\nconst YAML_ITEM = /^\\s*-\\s+\\S/;\nconst YAML_DOCUMENT = /^(---|\\.\\.\\.)\\s*$/;\n\n/** Preference among equal scores: the more specific languages first */\nconst ORDER: readonly CodeLanguage[] = [\n \"diff\",\n \"json\",\n \"html\",\n \"tsx\",\n \"jsx\",\n \"typescript\",\n \"javascript\",\n \"python\",\n \"sql\",\n \"css\",\n \"yaml\",\n \"bash\",\n \"markdown\",\n];\n\n/** The analysed head of the code: ~4 KB, cut at a line break, ≤ 200 lines */\nfunction sample(code: string): { text: string; whole: boolean } {\n let text = code.slice(0, SAMPLE_CHARS);\n const whole = text.length === code.length;\n if (!whole) {\n const cut = text.lastIndexOf(\"\\n\");\n if (cut > 0) text = text.slice(0, cut);\n }\n const lines = text.split(\"\\n\");\n if (lines.length > SAMPLE_LINES) {\n return { text: lines.slice(0, SAMPLE_LINES).join(\"\\n\"), whole: false };\n }\n return { text, whole };\n}\n\n/** Language decided by an unambiguous marker, else undefined */\nfunction marker(text: string, whole: boolean): CodeLanguage | undefined {\n const end = text.indexOf(\"\\n\");\n const first = (end < 0 ? text : text.slice(0, end)).trim();\n if (first.startsWith(\"#!\")) {\n if (/\\b(ba|z|k|da)?sh\\b/.test(first)) return \"bash\";\n if (/\\bpython[\\d.]*\\b/.test(first)) return \"python\";\n if (/\\b(node|deno|bun)\\b/.test(first)) return \"javascript\";\n }\n if (/^(<!doctype\\s+html|<\\?xml\\s|<html[\\s>])/i.test(first)) return \"html\";\n if (whole && /^[[{]/.test(text) && /[\"\\d]/.test(text)) {\n try {\n const value: unknown = JSON.parse(text);\n if (value !== null && typeof value === \"object\") return \"json\";\n } catch {\n // not strict JSON: scored below\n }\n }\n return undefined;\n}\n\n/**\n * Guesses the language of unlabelled code: one of the canonical names of\n * `supportedCodeLanguages`, `\"plain\"` when nothing is convincing (empty,\n * very short or ambiguous text, prose). Fast heuristic scoring of the\n * first ~4 KB / 200 lines: shebangs, doctypes and valid JSON decide\n * directly; otherwise keywords, declarations and the shape of the lines\n * (`key: value`, `prop: value;`, `+` / `-` hunks, tags inside JavaScript…)\n * are weighed and the best score above a threshold wins. Deterministic and\n * dependency-free; a guess, so pass the language when it is known.\n */\nexport function detectCodeLanguage(code: string): CodeLanguage {\n if (typeof code !== \"string\") return \"plain\";\n const { text: head, whole } = sample(code.replace(/\\r\\n?/g, \"\\n\"));\n const text = head.trim();\n if (text.length < 4) return \"plain\";\n\n const decided = marker(text, whole);\n if (decided) return decided;\n\n const score: Record<Bucket, number> = {\n js: 0,\n ts: 0,\n jsx: 0,\n json: 0,\n css: 0,\n html: 0,\n bash: 0,\n python: 0,\n yaml: 0,\n sql: 0,\n diff: 0,\n markdown: 0,\n };\n const hits = new Array<number>(LINE_RULES.length).fill(0);\n const lines = text\n .split(\"\\n\")\n .map((line) => line.slice(0, LINE_CHARS).replace(/\\s+$/, \"\"));\n let nonBlank = 0;\n let jsonLines = 0;\n let yamlLines = 0;\n let yamlKeys = 0;\n let yamlItems = 0;\n let yamlDocuments = 0;\n let yamlNested = false;\n let yamlParent = false;\n let plus = 0;\n let minus = 0;\n let hunkLike = 0;\n let prose = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n nonBlank++;\n LINE_RULES.forEach(([bucket, pattern, points, cap = 4], r) => {\n if (hits[r] < cap && pattern.test(line)) {\n hits[r]++;\n score[bucket] += points;\n }\n });\n if (JSON_LINE.test(line) || /^\\s*\\/\\/ /.test(line)) jsonLines++;\n if (prose < 4 && isProse(line)) {\n prose++;\n score.markdown += 0.25;\n }\n // a `--- a/file` line followed by `+++ b/file`\n if (/^--- \\S/.test(line) && /^\\+\\+\\+ \\S/.test(lines[i + 1] ?? \"\")) {\n score.diff += 5;\n }\n if (/^[+-]/.test(line)) {\n if (line[0] === \"+\") plus++;\n else minus++;\n hunkLike++;\n } else if (/^( |@@|\\\\ No newline|diff |index |--- |\\+\\+\\+ )/.test(line)) {\n hunkLike++;\n }\n if (/^\\s*#/.test(line)) {\n yamlLines++; // a comment does not break the YAML shape\n } else if (YAML_DOCUMENT.test(line)) {\n yamlLines++;\n yamlDocuments++;\n } else if (\n (YAML_KEY_VALUE.test(line) || YAML_KEY.test(line)) &&\n !/[;,{(]$/.test(line)\n ) {\n yamlLines++;\n yamlKeys++;\n if (yamlParent && /^\\s+/.test(line)) yamlNested = true;\n yamlParent = YAML_KEY.test(line);\n } else if (YAML_ITEM.test(line) && !/[;{]$/.test(line)) {\n yamlLines++;\n yamlItems++;\n } else if (/^\\s+\\S/.test(line) && yamlKeys) {\n yamlLines += 0.5; // continuation of a block scalar or a flow value\n }\n }\n\n // JSON that is not strictly valid (truncated, trailing commas): its shape\n if (/^[[{]/.test(text)) {\n if (nonBlank >= 2 && jsonLines >= nonBlank * 0.9) score.json += 6;\n if (/^(\\[\\s*)?\\{\\s*\"[^\"\\n]*\"\\s*:/.test(text)) score.json += 4;\n }\n // headerless diff: only +, - and context lines, both + and -\n if (plus && minus && hunkLike === nonBlank) {\n score.diff += 3 + Math.min(nonBlank, 6) * 0.5;\n }\n if (text.startsWith(\"<\")) score.html += 2;\n // YAML: mostly `key: value` / `- item` lines\n if (yamlKeys >= 2 && yamlLines >= nonBlank * 0.75) {\n score.yaml +=\n yamlKeys +\n Math.min(yamlItems, 6) * 0.5 +\n yamlDocuments +\n (yamlNested ? 1 : 0);\n }\n\n const candidates: Partial<Record<CodeLanguage, number>> = {\n json: score.json,\n css: score.css,\n html: score.html,\n bash: score.bash,\n python: score.python,\n yaml: score.yaml,\n sql: score.sql,\n diff: score.diff,\n markdown: score.markdown,\n };\n const typed = score.ts >= THRESHOLD;\n if (score.jsx >= THRESHOLD && score.js + score.ts + score.jsx >= 5) {\n candidates[typed ? \"tsx\" : \"jsx\"] = score.js + score.ts + score.jsx;\n } else if (typed) {\n candidates.typescript = score.js + score.ts;\n } else {\n candidates.javascript = score.js;\n }\n\n let best: CodeLanguage = \"plain\";\n let bestScore = 0;\n for (const language of ORDER) {\n const value = candidates[language] ?? 0;\n if (value >= THRESHOLD && value > bestScore) {\n best = language;\n bestScore = value;\n }\n }\n return best;\n}\n","// A tiny, dependency-free syntax highlighter for read-only code blocks.\n//\n// `highlightCode(code, language)` splits the source into typed tokens whose\n// texts concatenate to the input exactly; renderers turn them into colored\n// spans / text nodes (never HTML strings: the code is user content).\n//\n// Each grammar is a list of rules tried in order at the current position: a\n// sticky regular expression with a token type (or a classifier, or one type\n// per capture group), or a scanner function for nested constructs (template\n// literals, tags, fenced code). Characters no rule matches are plain text.\n//\n// Cost: rules either succeed or fail within a bounded look-ahead (strings\n// and comments run to the end of the line / input instead of failing, so an\n// unterminated one is consumed once), keeping the work roughly linear. Input\n// longer than 200,000 characters is returned as plain text. Grammars are\n// built lazily, on first use of each language.\nimport { detectCodeLanguage } from \"./detect\";\nimport {\n supportedCodeLanguages,\n type CodeLanguage,\n type HighlightToken,\n type HighlightTokenType,\n} from \"./types\";\n\ntype T = HighlightTokenType | null;\n\n/** State of one lexing pass, read by the rules. */\ninterface Ctx {\n code: string;\n /** Start of the current rule attempt */\n start: number;\n /** End of the current regex match (classifiers) */\n end: number;\n /** Last token that is not blank */\n prev?: HighlightToken;\n /** Only blanks since the last line break (or the start) */\n line: boolean;\n /** Innermost open bracket (`{`, `(`, `[`), \"\" at the top level */\n opener: string;\n /** Highlights embedded code (one level deeper) */\n sub: (code: string, language: CodeLanguage) => void;\n}\n\ntype Emit = (type: T, text: string) => void;\n/** Type of a match (`false`: the rule does not apply). */\ntype Classify = (text: string, c: Ctx) => T | false;\n/** Emits tokens from `c.start`; returns the end (-1: no match). */\ntype Scanner = (c: Ctx, emit: Emit) => number;\ntype Rule =\n | Scanner\n | readonly [\n kind: T | readonly T[] | Classify,\n pattern: RegExp,\n when?: (c: Ctx) => boolean,\n ];\n\nconst MAX_LENGTH = 200_000;\nconst MAX_DEPTH = 4;\n\n// Token types used repeatedly (shorter once minified).\nconst PUNCT = \"punctuation\";\nconst FN = \"function\";\nconst PROP = \"property\";\nconst STR = \"string\";\nconst KW = \"keyword\";\nconst VAR = \"variable\";\nconst NUM = \"number\";\nconst CMT = \"comment\";\nconst OP = \"operator\";\nconst BUILTIN = \"builtin\";\n\n/** Language aliases, by canonical name (the first of each group). */\nconst ALIASES =\n \"javascript js mjs cjs|typescript ts mts cts|json jsonc json5|css scss less|html htm xml svg vue|bash sh shell zsh console|python py|yaml yml|markdown md|diff patch|plain text txt plaintext\";\n\n/**\n * Canonical name of a language or alias (`\"ts\"` -> `\"typescript\"`,\n * `\"yml\"` -> `\"yaml\"`, `\"language-js\"` -> `\"javascript\"`); `\"plain\"` for\n * unknown or missing languages.\n *\n * `\"auto\"` stands for the language detected from `code`\n * (`detectCodeLanguage`); without `code` it is `\"plain\"`. `code` is ignored\n * for any other language.\n */\nexport function normalizeCodeLanguage(\n language?: string | null,\n code?: string,\n): CodeLanguage {\n const name =\n typeof language === \"string\"\n ? language\n .trim()\n .toLowerCase()\n .replace(/^language-/, \"\")\n : \"\";\n if (name === \"auto\") {\n return typeof code === \"string\" ? detectCodeLanguage(code) : \"plain\";\n }\n for (const group of ALIASES.split(\"|\")) {\n const names = group.split(\" \");\n if (names.includes(name)) return names[0] as CodeLanguage;\n }\n return (supportedCodeLanguages as readonly string[]).includes(name)\n ? (name as CodeLanguage)\n : \"plain\";\n}\n\n/** Label of a language shown by the code blocks (`\"json\"` -> `\"JSON\"`). */\nexport const codeLanguageLabel = (language: string): string =>\n language.trim().toUpperCase();\n\n/**\n * Splits highlighted code into lines (tokens without the line breaks). A\n * final line break does not start an extra empty line.\n */\nexport function splitHighlightLines(\n tokens: readonly HighlightToken[],\n): HighlightToken[][] {\n const lines: HighlightToken[][] = [[]];\n for (const { type, text } of tokens) {\n text.split(\"\\n\").forEach((part, i) => {\n if (i) lines.push([]);\n if (part) lines[lines.length - 1].push({ type, text: part });\n });\n }\n if (lines.length > 1 && !lines[lines.length - 1].length) lines.pop();\n return lines;\n}\n\n/**\n * Splits `code` into highlighted tokens for `language` (any name accepted by\n * `normalizeCodeLanguage`; `\"auto\"` detects it from the code). The token\n * texts concatenate to `code` exactly.\n * Never throws: unknown languages, very large input (> 200,000 characters)\n * and unexpected failures give a single plain token.\n */\nexport function highlightCode(\n code: string,\n language?: string | null,\n): HighlightToken[] {\n let text = \"\";\n try {\n text = typeof code === \"string\" ? code : String(code ?? \"\");\n if (!text) return [];\n const lang = normalizeCodeLanguage(language, text);\n if (lang !== \"plain\" && text.length <= MAX_LENGTH) {\n const out: HighlightToken[] = [];\n lex(text, lang, out, 0);\n let length = 0;\n for (const token of out) length += token.text.length;\n if (length === text.length) return out;\n }\n } catch {\n // fall through: plain text\n }\n return text ? [{ type: null, text }] : [];\n}\n\nconst grammars: Partial<Record<CodeLanguage, readonly Rule[]>> = {};\n\nfunction lex(\n code: string,\n lang: CodeLanguage,\n out: HighlightToken[],\n depth: number,\n): void {\n const stack: string[] = [];\n const c: Ctx = {\n code,\n start: 0,\n end: 0,\n line: true,\n opener: \"\",\n sub: (inner, language) => lex(inner, language, out, depth + 1),\n };\n const emit: Emit = (type, text) => {\n if (!text) return;\n const last = out[out.length - 1];\n if (last && last.type === type) last.text += text;\n else out.push({ type, text });\n const solid = /\\S/.test(text);\n if (solid) {\n c.prev = { type, text };\n if (type === PUNCT && text.length === 1) {\n if (\"{([\".includes(text)) {\n if (stack.length < 256) stack.push(text);\n } else if (\"})]\".includes(text)) stack.pop();\n c.opener = stack[stack.length - 1] ?? \"\";\n }\n }\n const nl = text.lastIndexOf(\"\\n\");\n c.line = nl < 0 ? c.line && !solid : !/\\S/.test(text.slice(nl + 1));\n };\n const rules =\n depth > MAX_DEPTH || lang === \"plain\"\n ? undefined\n : (grammars[lang] ??= grammar(lang));\n if (!rules) return emit(null, code);\n let pos = 0;\n scan: while (pos < code.length) {\n c.start = pos;\n for (const rule of rules) {\n let end: number;\n if (typeof rule === \"function\") {\n end = rule(c, emit);\n if (end <= pos) continue;\n } else {\n const [kind, pattern, when] = rule;\n if (when && !when(c)) continue;\n pattern.lastIndex = pos;\n const m = pattern.exec(code);\n if (!m || !m[0]) continue;\n end = c.end = pos + m[0].length;\n if (Array.isArray(kind)) {\n (kind as readonly T[]).forEach((type, i) =>\n emit(type, m[i + 1] ?? \"\"),\n );\n } else {\n const type =\n typeof kind === \"function\" ? (kind as Classify)(m[0], c) : kind;\n if (type === false) continue;\n emit(type as T, m[0]);\n }\n }\n pos = end;\n continue scan;\n }\n emit(null, code[pos]);\n pos++;\n }\n}\n\n// ---------------------------------------------------------------- helpers\n\nconst words = (list: string) => new Set(list.split(\" \"));\n\n/** The two characters after the match, past spaces and tabs. */\nfunction after(c: Ctx): string {\n let i = c.end;\n while (c.code[i] === \" \" || c.code[i] === \"\\t\") i++;\n return c.code.slice(i, i + 2);\n}\n\nconst atLine = (c: Ctx) => c.line;\nconst afterBlank = (c: Ctx) => !c.start || /\\s/.test(c.code[c.start - 1]);\nconst isPascal = (word: string) => /^[A-Z]/.test(word) && /[a-z]/.test(word);\n\n/** Index of the `}` closing a `{` opened before `i` (skips strings). */\nfunction closeBrace(s: string, i: number): number {\n for (let depth = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === \"{\") depth++;\n else if (ch === \"}\") {\n if (!depth--) return i;\n } else if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n for (i++; i < s.length && s[i] !== ch; i++) {\n if (s[i] === \"\\\\\") i++;\n else if (s[i] === \"\\n\" && ch !== \"`\") break;\n }\n }\n }\n return s.length;\n}\n\n/** Emits `{ <code> }` (`i` is after the `{`); returns the end. */\nfunction embed(c: Ctx, emit: Emit, i: number, lang: CodeLanguage): number {\n const close = closeBrace(c.code, i);\n c.sub(c.code.slice(i, close), lang);\n emit(PUNCT, c.code.slice(close, close + 1));\n return Math.min(close + 1, c.code.length);\n}\n\n/** Whether an expression may start after `p` (regex / JSX vs division / `<`). */\nconst exprStart = (p?: HighlightToken) =>\n !p ||\n p.type === KW ||\n p.type === OP ||\n (p.type === PUNCT && !/[)\\]}]/.test(p.text));\n\n/** Numbers of JavaScript (`1n`), Python (`2j`), SQL: hex / binary / octal, `_` separators. */\nconst number =\n /(?:0[xob][\\da-f_]+|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:e[-+]?\\d[\\d_]*)?)[nj]?/iy;\n\nconst quoted = /([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\[\\s\\S])*\\1?/y;\n\n// ---------------------------------------------------------------- markup\n\n/**\n * Tag at `at` (`<name attrs>`, `</name>`, `<name/>`); emits it and returns\n * `[end, nesting change, lower-case name]`, or undefined (nothing emitted).\n * `lang`: JSX, attribute values in `{}` are expressions.\n */\nfunction head(\n c: Ctx,\n emit: Emit,\n at: number,\n lang?: CodeLanguage,\n): [number, number, string] | undefined {\n const s = c.code;\n const open = /(<\\/?)([A-Za-z][\\w:.-]*|(?=>))/y;\n open.lastIndex = at;\n const m = open.exec(s);\n if (!m) return;\n emit(PUNCT, m[1]);\n emit(\"tag\", m[2]);\n const attr = /\\s+|\\/?>|\"[^\"]*\"?|'[^']*'?|[={/]|[^\\s\"'>/={]+/y;\n const name = m[2].toLowerCase();\n let i = at + m[0].length;\n let eq = false;\n while (i < s.length) {\n attr.lastIndex = i;\n const t = attr.exec(s)![0];\n i += t.length;\n if (t[t.length - 1] === \">\") {\n emit(PUNCT, t);\n return [i, m[1] !== \"<\" ? -1 : t === \">\" ? 1 : 0, name];\n }\n if (t === \"{\" && lang) {\n emit(PUNCT, t);\n i = embed(c, emit, i, lang);\n eq = false;\n continue;\n }\n const blank = !/\\S/.test(t);\n emit(\n blank\n ? null\n : t === \"=\" || t === \"/\"\n ? PUNCT\n : eq || t[0] === '\"' || t[0] === \"'\"\n ? \"attr-value\"\n : \"attr-name\",\n t,\n );\n if (!blank) eq = t === \"=\";\n }\n return [i, 0, name];\n}\n\n/**\n * An element at `c.start`. `lang`: JSX, the whole element with its children\n * (text, `{expressions}`, nested elements); else an HTML tag (`<script>` /\n * `<style>` contents are highlighted as JavaScript / CSS).\n */\nfunction tag(c: Ctx, emit: Emit, lang?: CodeLanguage): number {\n const s = c.code;\n const h = head(c, emit, c.start, lang);\n if (!h) return -1;\n let [i, depth] = h;\n const name = h[2];\n if (depth < 1) return i;\n if (lang) {\n const text = /[^<{]+/y;\n while (depth > 0 && i < s.length) {\n text.lastIndex = i;\n const t = text.exec(s);\n if (t) {\n emit(null, t[0]);\n i += t[0].length;\n } else if (s[i] === \"{\") {\n emit(PUNCT, \"{\");\n i = embed(c, emit, i + 1, lang);\n } else {\n const n = head(c, emit, i, lang);\n if (n) [i, depth] = [n[0], depth + n[1]];\n else emit(null, s[i++]);\n }\n }\n return i;\n }\n if (name !== \"script\" && name !== \"style\") return i;\n const close = new RegExp(`</${name}`, \"gi\");\n close.lastIndex = i;\n const end = close.exec(s)?.index ?? s.length;\n const attrs = s.slice(c.start, i);\n c.sub(\n s.slice(i, end),\n name === \"style\"\n ? \"css\"\n : /\\blang=[\"']?ts/.test(attrs)\n ? \"typescript\"\n : /\\btype=[\"']?(?:application\\/(?:ld\\+)?json|importmap)/i.test(attrs)\n ? \"json\"\n : \"javascript\",\n );\n return end;\n}\n\n// ---------------------------------------------------------------- grammars\n\nfunction grammar(lang: CodeLanguage): readonly Rule[] {\n switch (lang) {\n case \"javascript\":\n case \"typescript\":\n case \"jsx\":\n case \"tsx\":\n return js(lang);\n case \"json\":\n return json();\n case \"css\":\n return css();\n case \"html\":\n return html();\n case \"bash\":\n return bash();\n case \"python\":\n return python();\n case \"yaml\":\n return yaml();\n case \"sql\":\n return sql();\n case \"diff\":\n return diff();\n default:\n return markdown();\n }\n}\n\nfunction js(lang: CodeLanguage): Rule[] {\n const ts = lang === \"typescript\" || lang === \"tsx\";\n const keywords = words(\n \"as async await break case catch class const continue debugger default delete do else export extends finally for from function if import in instanceof let new of return static super switch this throw try typeof var void while with yield\" +\n (ts\n ? \" abstract declare enum implements infer interface is keyof namespace override private protected public readonly satisfies type\"\n : \"\"),\n );\n const globals = words(\n \"console document window\" +\n (ts ? \" any boolean never number object string unknown\" : \"\"),\n );\n const template: Scanner = (c, emit) => {\n const s = c.code;\n let i = c.start;\n if (s[i] !== \"`\") return -1;\n let from = i++;\n while (i < s.length) {\n if (s[i] === \"\\\\\") i += 2;\n else if (s[i] === \"`\") {\n i++;\n break;\n } else if (s[i] === \"$\" && s[i + 1] === \"{\") {\n emit(STR, s.slice(from, i));\n emit(PUNCT, \"$\");\n emit(PUNCT, \"{\");\n i = from = embed(c, emit, i + 2, lang);\n } else i++;\n }\n i = Math.min(i, s.length);\n emit(STR, s.slice(from, i));\n return i;\n };\n const rules: Rule[] = [\n [null, /\\s+/y],\n [CMT, /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n template,\n [STR, quoted],\n [\n \"regex\",\n /\\/(?![*/])(?:[^/\\\\\\n[]|\\\\.|\\[(?:[^\\]\\\\\\n]|\\\\.){0,200}\\]){1,500}\\/[dgimsuvy]*/y,\n (c) => exprStart(c.prev),\n ],\n ];\n if (lang === \"jsx\" || lang === \"tsx\") {\n rules.push((c, emit) =>\n c.code[c.start] === \"<\" &&\n /[A-Za-z>]/.test(c.code[c.start + 1] ?? \"\") &&\n exprStart(c.prev)\n ? tag(c, emit, lang)\n : -1,\n );\n }\n rules.push(\n [FN, /@[A-Za-z_$][\\w$.]*/y],\n [NUM, number],\n [\n (w, c) => {\n const p = c.prev;\n const n = after(c);\n if (p?.text === \".\") return n[0] === \"(\" ? FN : null;\n if (\n w !== \"default\" &&\n c.opener === \"{\" &&\n ((n[0] === \":\" && n[1] !== \":\") || n === \"?:\") &&\n (!p || p.type === CMT || /^[{,;]$/.test(p.text))\n )\n return PROP;\n if (keywords.has(w)) return KW;\n if (w === \"true\" || w === \"false\") return \"boolean\";\n if (w === \"null\" || w === \"undefined\") return \"null\";\n if (n[0] === \"(\" || p?.text === FN) return FN;\n return globals.has(w) || isPascal(w) ? BUILTIN : null;\n },\n /[A-Za-z_$\\u00a0-\\uffff][\\w$\\u00a0-\\uffff]*/y,\n ],\n [OP, /=>|[-+*%=&|^~!<>?]+|\\//y],\n [PUNCT, /[{}[\\]();,.:#]/y],\n );\n return rules;\n}\n\nfunction json(): Rule[] {\n return [\n [null, /\\s+/y],\n [CMT, /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n [PROP, /([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\.)*\\1(?=\\s*:)/y],\n [STR, quoted],\n [NUM, /[-+]?(?:0x[\\da-f]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)/iy],\n [\n (w, c) =>\n after(c)[0] === \":\"\n ? PROP\n : w === \"true\" || w === \"false\"\n ? \"boolean\"\n : w === \"null\"\n ? \"null\"\n : w === \"Infinity\" || w === \"NaN\"\n ? NUM\n : null,\n /[A-Za-z_$][\\w$]*/y,\n ],\n [PUNCT, /[{}[\\],:]/y],\n ];\n}\n\nfunction css(): Rule[] {\n const inBlock = (c: Ctx) => c.opener === \"{\";\n return [\n [null, /\\s+/y],\n [CMT, /\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\/\\/[^\\n]*/y],\n [[FN, PUNCT, STR, PUNCT], /(url)(\\()([^)\\n]*)(\\)?)/iy],\n [STR, quoted],\n [KW, /@[\\w-]+|!\\s*important/iy],\n [VAR, /--[\\w-]+|\\$[\\w-]+/y],\n [NUM, /#[\\da-fA-F]{3,8}(?![\\w-])/y, inBlock],\n [NUM, /[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?(?:%|[a-zA-Z]+)?/y],\n [\"attr-name\", /[.#][\\w-]+/y],\n [\"attr-name\", /::?[\\w-]+/y, (c) => !inBlock(c) || c.prev?.text === \"&\"],\n [\n (_, c) => {\n const n = after(c);\n const p = c.prev;\n if (\n n[0] === \":\" &&\n (c.opener === \"(\" ||\n (inBlock(c) && (!p || p.type === CMT || /^[{;}]$/.test(p.text))))\n )\n return PROP;\n if (n[0] === \"(\") return FN;\n return inBlock(c) && n[0] !== \"{\" ? null : \"tag\";\n },\n /-?[A-Za-z_][\\w-]*/y,\n ],\n [PUNCT, /[{}()[\\];,:]/y],\n [OP, /[>+~*=|^$&]/y],\n ];\n}\n\nfunction html(): Rule[] {\n return [\n [CMT, /<!--[\\s\\S]*?(?:-->|$)/y],\n [KW, /<[!?][^>]*>?/y],\n (c, emit) => tag(c, emit),\n [BUILTIN, /&(?:#\\d+|#x[\\da-f]+|[a-z][\\da-z]*);/iy],\n [null, /[^<&]+/y],\n ];\n}\n\nfunction bash(): Rule[] {\n const keywords = words(\n \"if then else elif fi for while until do done case esac in function return local export break continue declare readonly\",\n );\n const variable = /\\$(?:\\{[^}\\n]*\\}?|[A-Za-z_]\\w*|[\\d@#?$!*-])/y;\n /** Command position: start of a line or after `|`, `&&`, `;`, `(`, `then`... */\n const command = (c: Ctx) => {\n const p = c.prev;\n if (p?.text === \"\\\\\") return false;\n return (\n c.line ||\n !p ||\n p.type === OP ||\n /^(?:[({`$]|then|do|else|elif|if|while|until|time|!)$/.test(p.text)\n );\n };\n const double: Scanner = (c, emit) => {\n const s = c.code;\n let i = c.start;\n if (s[i] !== '\"') return -1;\n let from = i++;\n for (; i < s.length && s[i] !== '\"'; i++) {\n if (s[i] === \"\\\\\") i++;\n else if (s[i] === \"$\") {\n variable.lastIndex = i;\n const m = variable.exec(s);\n if (m) {\n emit(STR, s.slice(from, i));\n emit(VAR, m[0]);\n from = i + m[0].length;\n i = from - 1;\n }\n }\n }\n i = Math.min(i + 1, s.length);\n emit(STR, s.slice(from, i));\n return i;\n };\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y, (c) => !c.start || /[\\s;|&(]/.test(c.code[c.start - 1])],\n double,\n [STR, /'[^']*'?/y],\n [VAR, variable],\n [\n VAR,\n /[A-Za-z_]\\w*(?=\\+?=)/y,\n (c) =>\n command(c) ||\n /^(?:export|local|declare|readonly)$/.test(c.prev?.text ?? \"\"),\n ],\n [NUM, /\\d+(?![\\w./~@%+:,=-])/y],\n [\n (w, c) => (command(c) ? (keywords.has(w) ? KW : FN) : null),\n /[\\w./~@%+:,-][\\w./~@%+:,=-]*/y,\n ],\n [OP, /&&|\\|\\||;;|[|&;<>!]+/y],\n [PUNCT, /[()[\\]{}=$`\\\\]/y],\n ];\n}\n\nfunction python(): Rule[] {\n const keywords = words(\n \"and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield\",\n );\n const builtins = words(\n \"bool dict float int len list print range set str super tuple type self cls\",\n );\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y],\n [STR, /[rRbBuUfF]{0,2}(\"\"\"|''')[\\s\\S]*?(?:\\1|$)/y],\n [STR, /[rRbBuUfF]{0,2}([\"'])(?:(?!\\1)[^\\\\\\n]|\\\\[\\s\\S])*\\1?/y],\n [FN, /@[\\w.]+/y, atLine],\n [NUM, number],\n [\n (w, c) => {\n const p = c.prev?.text;\n const n = after(c);\n if (p === \".\") return n[0] === \"(\" ? FN : null;\n if (keywords.has(w)) return KW;\n if (w === \"True\" || w === \"False\") return \"boolean\";\n if (w === \"None\") return \"null\";\n if (p === \"def\") return FN;\n if (p === \"class\" || builtins.has(w) || isPascal(w)) return BUILTIN;\n return n[0] === \"(\" ? FN : null;\n },\n /[A-Za-z_\\u00a0-\\uffff][\\w\\u00a0-\\uffff]*/y,\n ],\n [OP, /:=|->|[-+*/%=<>!&|^~@]+/y],\n [PUNCT, /[()[\\]{},;.:]/y],\n ];\n}\n\nfunction yaml(): Rule[] {\n return [\n [null, /\\s+/y],\n [CMT, /#[^\\n]*/y, afterBlank],\n [PUNCT, /(?:---|\\.\\.\\.)(?=\\s|$)/y, atLine],\n [\n PROP,\n /(?:\"(?:[^\"\\\\\\n]|\\\\.)*\"|'[^'\\n]*'|[^\\s#:,[\\]{}'\"!&*|>%@`-][^\\n#:]{0,255})(?=:(?:\\s|$))/y,\n (c) => c.line || /^[-?{,]$/.test(c.prev?.text ?? \"\"),\n ],\n [PUNCT, /[-?](?=\\s|$)/y],\n [VAR, /[&*][\\w-]+/y],\n [KW, /!!?[\\w/.-]*/y],\n [OP, /[|>][-+\\d]*(?=[ \\t]*(?:#|\\n|$))/y],\n [STR, /\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"?|'(?:[^']|'')*'?/y],\n [PUNCT, /[:,[\\]{}]/y],\n [\n (text) => {\n const v = text.trim();\n return /^(?:true|false|yes|no|on|off)$/i.test(v)\n ? \"boolean\"\n : /^(?:null|~)$/i.test(v)\n ? \"null\"\n : /^[-+]?(?:\\.inf|\\.nan|0x[\\da-f]+|0o[0-7]+|(?:\\d[\\d_]*\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)$/i.test(\n v,\n )\n ? NUM\n : STR;\n },\n /[^\\s#,[\\]{}][^\\n#,[\\]{}]*/y,\n ],\n ];\n}\n\nfunction sql(): Rule[] {\n const keywords = words(\n \"select from where insert into values update set delete create alter drop table index and or not in is like between exists join left right inner outer on as order by group having limit offset union all distinct case when then else end with primary key references default asc desc\",\n );\n const types = words(\n \"int integer bigint decimal numeric float varchar char text boolean date timestamp json jsonb uuid\",\n );\n return [\n [null, /\\s+/y],\n [CMT, /--[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y],\n [STR, /'(?:[^'\\\\]|''|\\\\[\\s\\S])*'?/y],\n [PROP, /\"(?:[^\"]|\"\")*\"?|`[^`]*`?/y],\n [VAR, /[@$][\\w.]+|\\?/y],\n [NUM, number],\n [\n (w, c) => {\n const lower = w.toLowerCase();\n if (lower === \"true\" || lower === \"false\") return \"boolean\";\n if (lower === \"null\") return \"null\";\n if (keywords.has(lower)) return KW;\n if (types.has(lower)) return BUILTIN;\n return after(c)[0] === \"(\" ? FN : null;\n },\n /[A-Za-z_][\\w$]*/y,\n ],\n [OP, /[-+*/%=<>!|&^~]+/y],\n [PUNCT, /[(),;.[\\]]/y],\n ];\n}\n\nfunction diff(): Rule[] {\n // Every rule starts at a line start: the last two consume a line / breaks.\n return [\n [KW, /(?:diff|index|---|\\+\\+\\+)(?=[ \\t\\n]|$)[^\\n]*/y],\n [\"heading\", /@@[^\\n]*/y],\n [\"inserted\", /[+>][^\\n]*/y],\n [\"deleted\", /[-<][^\\n]*/y],\n [null, /[^\\n]+|\\n+/y],\n ];\n}\n\nfunction markdown(): Rule[] {\n const fence: Scanner = (c, emit) => {\n if (!c.line) return -1;\n const s = c.code;\n const open = /(`{3,}|~{3,})([^\\n]*)/y;\n open.lastIndex = c.start;\n const m = open.exec(s);\n if (!m) return -1;\n emit(PUNCT, m[0]);\n const start = c.start + m[0].length;\n const close = new RegExp(\n `\\\\n[ \\\\t]{0,3}${m[1][0]}{${m[1].length},}[ \\\\t]*(?=\\\\n|$)`,\n \"g\",\n );\n close.lastIndex = start;\n const e = close.exec(s);\n const end = e ? e.index : s.length;\n c.sub(\n s.slice(start, end),\n normalizeCodeLanguage(m[2].trim().split(/\\s/)[0]),\n );\n if (!e) return end;\n const indent = /^\\n[ \\t]*/.exec(e[0])![0];\n emit(null, indent);\n emit(PUNCT, e[0].slice(indent.length));\n return end + e[0].length;\n };\n return [\n [null, /\\s+/y],\n fence,\n [\"heading\", /#{1,6}(?=\\s|$)[^\\n]*/y, atLine],\n [\n PUNCT,\n /(?:[-*_][ \\t]*){3,}(?=\\n|$)|(?:[*+-]|\\d{1,9}[.)])(?=[ \\t])|>/y,\n atLine,\n ],\n [null, /\\\\[\\s\\S]/y],\n [STR, /`[^`\\n]*`?/y],\n [\n KW,\n /\\*\\*[^*\\n]+\\*\\*|__[^_\\n]+__|\\*[^*\\n]+\\*|_[^_\\n]+_/y,\n (c) => !/\\w/.test(c.code[c.start - 1] ?? \"\"),\n ],\n [[PROP, \"attr-value\"], /(!?\\[[^[\\]\\n]{0,500}\\])(\\([^)\\n]*\\)?)/y],\n [\"attr-value\", /<(?:https?|mailto):[^>\\s]*>?/y],\n [null, /[^\\n`*_[!<\\\\]+/y],\n ];\n}\n","// Character-range marks of the code blocks (saved highlights, annotations,\n// search hits) laid over the syntax-highlighted tokens.\n//\n// `applyCodeMarks(tokens, marks)` cuts the highlighted tokens at the mark\n// boundaries and groups them into runs covered by the same mark, so every\n// renderer can wrap each run in a <mark> (a styled text on React Native and\n// the mini-programs) while keeping the token colors inside it.\n// `splitCodeMarkLines` then splits the runs into lines for the numbered\n// lines layout. Pure and platform neutral.\nimport type { ColorScheme } from \"../theme/types\";\nimport { colorMix } from \"../tokens/color\";\nimport type { HighlightToken } from \"./types\";\n\n/**\n * Color of a code mark: a theme color name (`\"primary\"`, `\"success\"`,\n * `\"warning\"`, `\"danger\"`, `\"info\"`, `\"neutral\"`: a translucent tint of it)\n * or any CSS color, used as the background as is (prefer a translucent one,\n * e.g. `\"rgb(250 204 21 / 0.35)\"`, so the token colors stay readable).\n */\nexport type CodeMarkColor = ColorScheme | (string & {});\n\n/** A highlighted character range of a code block. */\nexport interface CodeMark {\n /**\n * Start offset (inclusive), in UTF-16 code units of the code string (the\n * index of `String.prototype.slice`)\n */\n start: number;\n /** End offset (exclusive), in UTF-16 code units of the code string */\n end: number;\n /**\n * Background of the mark (default: a translucent yellow readable in light\n * and dark themes, `--code-block-mark-bg`)\n */\n color?: CodeMarkColor;\n /** Extra class of the rendered mark element(s) (web renderers) */\n className?: string;\n /** Identifier, rendered as `data-mark-id` */\n id?: string;\n /** Tooltip (`title`) of the rendered mark element(s) */\n title?: string;\n}\n\n/**\n * A run of highlighted tokens covered by the same mark (or by none). The\n * token texts of the runs returned by `applyCodeMarks` concatenate to the\n * code exactly.\n */\nexport interface CodeMarkRun<M extends CodeMark = CodeMark> {\n /** The mark shown on the run, `null` for unmarked text */\n mark: M | null;\n /** Index of `mark` in the marks array, -1 for unmarked text */\n index: number;\n /** Offset of the run in the code */\n start: number;\n /** End offset (exclusive) of the run in the code */\n end: number;\n /** Highlighted tokens of the run (cut at the mark boundaries) */\n tokens: HighlightToken[];\n}\n\n/** Theme colors a mark can name (a tint of `--<name>-color`) */\nexport const CODE_MARK_COLORS: readonly ColorScheme[] = [\n \"primary\",\n \"success\",\n \"warning\",\n \"danger\",\n \"info\",\n \"neutral\",\n];\n\n/**\n * Default background of the marks: a translucent yellow, readable on the\n * light and dark code backgrounds (no theme token is translucent in every\n * palette).\n */\nexport const CODE_MARK_DEFAULT_BACKGROUND = \"rgba(250, 204, 21, 0.35)\";\n\n/** Share of a theme color in the tint of a mark (percent). */\nexport const CODE_MARK_TINT = 30;\n\nconst isHigh = (code: number) => code >= 0xd800 && code <= 0xdbff;\nconst isLow = (code: number) => code >= 0xdc00 && code <= 0xdfff;\n\n/**\n * Clamps a mark range to `code`: offsets are truncated to integers, clamped\n * to `0..code.length` and swapped when reversed; a boundary falling inside a\n * surrogate pair (an emoji...) is moved outward so the pair stays whole.\n * Returns `null` for an empty range or non-numeric offsets.\n */\nexport function clampCodeRange(\n code: string,\n start: unknown,\n end: unknown,\n): [start: number, end: number] | null {\n if (typeof start !== \"number\" || typeof end !== \"number\") return null;\n if (Number.isNaN(start) || Number.isNaN(end)) return null;\n const length = code.length;\n const clamp = (n: number) =>\n Math.min(length, Math.max(0, Number.isFinite(n) ? Math.trunc(n) : n));\n let a = clamp(Math.min(start, end));\n let b = clamp(Math.max(start, end));\n if (a > 0 && isLow(code.charCodeAt(a)) && isHigh(code.charCodeAt(a - 1))) a--;\n if (b < length && isLow(code.charCodeAt(b)) && isHigh(code.charCodeAt(b - 1)))\n b++;\n return a < b ? [a, b] : null;\n}\n\n/**\n * Cuts highlighted tokens (`highlightCode`, or one plain token) at the\n * boundaries of `marks` and groups them into runs covered by the same mark.\n *\n * - Offsets are UTF-16 offsets into the code (the concatenated token texts),\n * clamped by `clampCodeRange`; empty, reversed-to-empty and non-numeric\n * ranges are ignored.\n * - Overlaps: where marks overlap, the one later in the array wins (its\n * color, class, title, id and click); the earlier one is cut around it,\n * so it may render as several elements sharing its `data-mark-id`. Order\n * the array by priority (e.g. put the active / nested mark last).\n * - Marks may cross token boundaries and line breaks: the tokens are cut,\n * their types are kept.\n */\nexport function applyCodeMarks<M extends CodeMark>(\n tokens: readonly HighlightToken[],\n marks?: readonly M[] | null,\n): CodeMarkRun<M>[] {\n const code = tokens.map((token) => token.text).join(\"\");\n if (!code) return [];\n // elementary intervals between the sorted boundaries, with their top mark\n const ranges: { index: number; start: number; end: number }[] = [];\n const points = new Set<number>([0, code.length]);\n (Array.isArray(marks) ? marks : []).forEach((mark, index) => {\n const range =\n mark && typeof mark === \"object\"\n ? clampCodeRange(code, mark.start, mark.end)\n : null;\n if (!range) return;\n ranges.push({ index, start: range[0], end: range[1] });\n points.add(range[0]).add(range[1]);\n });\n const bounds = [...points].sort((a, b) => a - b);\n const top = new Array<number>(bounds.length - 1).fill(-1);\n const find = (offset: number) => {\n let lo = 0;\n let hi = bounds.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (bounds[mid] < offset) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n for (const range of ranges) {\n for (let i = find(range.start); bounds[i] < range.end; i++) {\n top[i] = range.index;\n }\n }\n\n const runs: CodeMarkRun<M>[] = [];\n let interval = 0;\n let offset = 0;\n for (const { type, text } of tokens) {\n let from = 0;\n while (from < text.length) {\n while (bounds[interval + 1] <= offset + from) interval++;\n const to = Math.min(text.length, bounds[interval + 1] - offset);\n const index = top[interval];\n const piece = { type, text: text.slice(from, to) };\n const last = runs[runs.length - 1];\n if (last && last.index === index && last.end === offset + from) {\n last.tokens.push(piece);\n last.end = offset + to;\n } else {\n runs.push({\n mark: index < 0 ? null : (marks as readonly M[])[index],\n index,\n start: offset + from,\n end: offset + to,\n tokens: [piece],\n });\n }\n from = to;\n }\n offset += text.length;\n }\n return runs;\n}\n\n/**\n * Splits marked runs (`applyCodeMarks`) into lines, without the line breaks\n * (like `splitHighlightLines`: a final line break does not start an extra\n * empty line; an empty line has no runs). A mark crossing a line break is\n * cut into one run per line.\n */\nexport function splitCodeMarkLines<M extends CodeMark>(\n runs: readonly CodeMarkRun<M>[],\n): CodeMarkRun<M>[][] {\n const lines: CodeMarkRun<M>[][] = [[]];\n for (const run of runs) {\n let current: CodeMarkRun<M> | null = null;\n let offset = run.start;\n for (const { type, text } of run.tokens) {\n text.split(\"\\n\").forEach((part, i) => {\n if (i) {\n lines.push([]);\n current = null;\n offset++;\n }\n if (!part) return;\n if (!current) {\n current = {\n mark: run.mark,\n index: run.index,\n start: offset,\n end: offset,\n tokens: [],\n };\n lines[lines.length - 1].push(current);\n }\n current.tokens.push({ type, text: part });\n offset += part.length;\n current.end = offset;\n });\n }\n }\n if (lines.length > 1 && !lines[lines.length - 1].length) lines.pop();\n return lines;\n}\n\n/**\n * CSS background of a mark color (web and mini-program renderers): a tint\n * of a theme color (`color-mix` of `--<name>-color`, `--text-muted-color`\n * for `neutral`), any other value as is, `\"\"` when unset (the stylesheet\n * default, `--code-block-mark-bg`).\n */\nexport function codeMarkBackground(color: string | null | undefined): string {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return \"\";\n if (!(CODE_MARK_COLORS as readonly string[]).includes(value)) return value;\n const base =\n value === \"neutral\" ? \"var(--text-muted-color)\" : `var(--${value}-color)`;\n return `color-mix(in srgb, ${base} ${CODE_MARK_TINT}%, transparent)`;\n}\n\n/**\n * Concrete background of a mark color from resolved theme colors (React\n * Native and the mini-programs, without CSS variables / `color-mix`): the\n * tint of a theme color as an `rgba()` (`<name>-color`, `text-muted-color`\n * for `neutral`), any other value as is, the default translucent yellow when\n * unset (or when the theme color cannot be parsed).\n */\nexport function resolveCodeMarkBackground(\n color: string | null | undefined,\n colors: Readonly<Record<string, string | undefined>>,\n): string {\n const value = typeof color === \"string\" ? color.trim() : \"\";\n if (!value) return CODE_MARK_DEFAULT_BACKGROUND;\n if (!(CODE_MARK_COLORS as readonly string[]).includes(value)) return value;\n const base =\n colors[value === \"neutral\" ? \"text-muted-color\" : `${value}-color`];\n return (\n (base && colorMix(base, \"transparent\", CODE_MARK_TINT)) ||\n CODE_MARK_DEFAULT_BACKGROUND\n );\n}\n","// Base of the headless state machines: a tiny immutable store and a\n// props-aware machine (controlled / uncontrolled values, `SYNC` events) that\n// every renderer drives the same way (React `useSyncExternalStore`, Lit\n// reactive controllers, Vue refs, Angular signals, mini-program `setData`).\n// Platform-neutral: no DOM, timers go through an injectable `Scheduler`.\n\n/** Called after every state change with the new and the previous state. */\nexport type StoreListener<S> = (state: S, prev: S) => void;\n\n/** Read / subscribe half shared by every store and machine. */\nexport interface ReadableStore<S> {\n /** Current state (a new object after every change, never mutated). */\n getState(): S;\n /** Listens to changes; returns the unsubscribe function. */\n subscribe(listener: StoreListener<S>): () => void;\n}\n\n/** The common shape of a machine: state, events and change listeners. */\nexport interface Store<S, E> extends ReadableStore<S> {\n /** Sends an event; listeners run only when the state actually changed. */\n send(event: E): void;\n}\n\n/** A writable store (the building block of the machines). */\nexport interface WritableStore<S> extends ReadableStore<S> {\n /** Replaces the state (or derives it); no-op when equal to the current one. */\n setState(next: S | ((prev: S) => S)): void;\n}\n\nexport interface CreateStoreOptions<S> {\n /**\n * Equality deciding whether a new state is a change.\n * @default shallowEqual (same keys, `Object.is` values)\n */\n equals?: (a: S, b: S) => boolean;\n}\n\n/** Same own keys with `Object.is` values (or the same value). */\nexport function shallowEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n typeof b !== \"object\" ||\n a === null ||\n b === null ||\n Array.isArray(a) !== Array.isArray(b)\n ) {\n return false;\n }\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Minimal immutable store: `setState` with an equal state (see `equals`) is a\n * no-op, listeners receive `(state, prev)` and may unsubscribe while being\n * notified. `getState` / `subscribe` are bound (safe to pass around, e.g. to\n * `useSyncExternalStore`).\n */\nexport function createStore<S>(\n initial: S,\n options: CreateStoreOptions<S> = {},\n): WritableStore<S> {\n const equals = options.equals ?? shallowEqual;\n let state = initial;\n const listeners = new Set<StoreListener<S>>();\n return {\n getState: () => state,\n setState(next) {\n const value =\n typeof next === \"function\" ? (next as (prev: S) => S)(state) : next;\n if (equals(value, state)) return;\n const prev = state;\n state = value;\n for (const listener of [...listeners]) listener(state, prev);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Scheduler\n\n/** Opaque timer handle of a `Scheduler`. */\nexport type SchedulerHandle = unknown;\n\n/**\n * Time source of the machines with timers (toast auto-dismiss...). Inject one\n * to drive time yourself (tests, React Native / mini-program timers, a\n * paused game loop...).\n */\nexport interface Scheduler {\n setTimeout(callback: () => void, ms: number): SchedulerHandle;\n clearTimeout(handle: SchedulerHandle): void;\n /** Current time in milliseconds. */\n now(): number;\n}\n\n/**\n * The engine's timers, read at call time (fake timers and polyfills installed\n * after this module loaded are honored).\n */\nexport const defaultScheduler: Scheduler = {\n setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),\n clearTimeout: (handle) =>\n globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>),\n now: () => Date.now(),\n};\n\n// ---------------------------------------------------------------------------\n// Props-aware machine\n\n/**\n * Updates the props of a machine (sent by framework adapters on every render\n * / property change). A controlled key set to `undefined` switches it back to\n * uncontrolled (its last value is kept).\n */\nexport interface SyncEvent<P> {\n type: \"SYNC\";\n props: Partial<P>;\n}\n\n/** A machine: a store driven by events and by its props. */\nexport interface Machine<S, E, P> extends Store<S, E | SyncEvent<P>> {\n /** Current props. */\n getProps(): Readonly<P>;\n /** Same as `send({ type: \"SYNC\", props })`. */\n setProps(props: Partial<P>): void;\n /**\n * The state `state` would be with `props` applied (controlled values and\n * normalization), without committing anything: lets adapters render\n * controlled values right away (before their props are synced).\n */\n project(state: S, props?: Partial<P>): S;\n}\n\n/** Definition of a machine (pure functions only). */\nexport interface MachineDefinition<S, E, P> {\n /** First state, from the initial props. */\n initial(props: P): S;\n /** Next state for `event` (return `state` itself when nothing changes). */\n reduce(state: S, event: E, props: P): S;\n /**\n * Keys of the state mirrored by props of the same name when those are not\n * `undefined` (controlled values).\n */\n controlled?: readonly (keyof S & keyof P)[];\n /**\n * Derived / clamped fields recomputed after every event and props change\n * (`prev`: the committed state the change starts from).\n */\n normalize?(state: S, props: P, prev: S): S;\n /**\n * Change callbacks: `requested` is the state an event asked for (before\n * controlled values are re-applied), `prev` the committed state before it.\n * Runs after the new state is committed and listeners notified.\n */\n changed?(requested: S, prev: S, props: P): void;\n}\n\nconst applyControlled = <S, P>(\n state: S,\n props: P,\n keys: readonly (keyof S & keyof P)[],\n): S => {\n let next = state;\n for (const key of keys) {\n const value = props[key] as unknown;\n if (value !== undefined && !Object.is(next[key], value)) {\n next = { ...next, [key]: value };\n }\n }\n return next;\n};\n\n/**\n * Builds a machine from a pure definition.\n *\n * - `send(event)`: `reduce`, then `normalize`; controlled keys keep their\n * prop value (the change is only reported through `changed`, the owner\n * decides by syncing the prop); the result is committed (no-op when\n * shallowly equal) and `changed` runs.\n * - `send({ type: \"SYNC\", props })` / `setProps(props)`: merges the props,\n * re-applies controlled values and `normalize`; never calls `changed`.\n */\nexport function createMachine<S extends object, E, P extends object>(\n definition: MachineDefinition<S, E, P>,\n initialProps: P,\n): Machine<S, E, P> {\n const keys = definition.controlled ?? [];\n let props: P = { ...initialProps };\n const normalize = (state: S, p: P, prev: S) =>\n definition.normalize ? definition.normalize(state, p, prev) : state;\n\n const first = definition.initial(props);\n const store = createStore<S>(\n normalize(applyControlled(first, props, keys), props, first),\n );\n\n const project = (state: S, partial?: Partial<P>): S => {\n const p = partial ? { ...props, ...partial } : props;\n return normalize(applyControlled(state, p, keys), p, state);\n };\n\n const send = (event: E | SyncEvent<P>) => {\n const prev = store.getState();\n if ((event as SyncEvent<P>)?.type === \"SYNC\") {\n props = { ...props, ...(event as SyncEvent<P>).props };\n store.setState(project(prev));\n return;\n }\n const reduced = definition.reduce(prev, event as E, props);\n if (reduced === prev) return;\n // Controlled values are re-applied before normalizing, so derived fields\n // follow the value actually kept (a rejected change leaves no trace).\n store.setState(\n normalize(applyControlled(reduced, props, keys), props, prev),\n );\n definition.changed?.(normalize(reduced, props, prev), prev, props);\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n send,\n getProps: () => props,\n setProps: (partial) => send({ type: \"SYNC\", props: partial }),\n project,\n };\n}\n\n/** Whether the value of `key` differs between two states. */\nexport const changedKey = <S>(a: S, b: S, key: keyof S): boolean =>\n !Object.is(a[key], b[key]);\n","// Disclosure (collapsible, accordion item, popover, dialog...) with presence\n// phases: closed -> opening -> open -> closing -> closed. The renderer keeps\n// the content mounted while the phase is not \"closed\" and reports the end of\n// its enter / exit animation with ANIMATION_END (or SKIP_ANIMATION when it\n// has none, e.g. reduced motion).\nimport { createMachine, type Machine } from \"./store\";\n\n/** Presence phase of the disclosed content. */\nexport type DisclosurePhase = \"closed\" | \"opening\" | \"open\" | \"closing\";\n\nexport interface DisclosureProps {\n /** Controlled open state (`undefined`: uncontrolled). */\n open?: boolean;\n /** Initial open state while uncontrolled. @default false */\n defaultOpen?: boolean;\n /** Ignores OPEN / CLOSE / TOGGLE (props still apply). @default false */\n disabled?: boolean;\n /**\n * Whether opening / closing go through the \"opening\" / \"closing\" phases\n * (ended by ANIMATION_END); `false` jumps straight to \"open\" / \"closed\".\n * @default true\n */\n animated?: boolean;\n /** Called with the requested open state (controlled or not). */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface DisclosureState {\n open: boolean;\n phase: DisclosurePhase;\n}\n\nexport type DisclosureEvent =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"TOGGLE\" }\n /** The enter / exit animation finished: settles the phase. */\n | { type: \"ANIMATION_END\" }\n /** Settles the phase at once (no animation to wait for). */\n | { type: \"SKIP_ANIMATION\" };\n\nexport type DisclosureMachine = Machine<\n DisclosureState,\n DisclosureEvent,\n DisclosureProps\n>;\n\nconst settle = (state: DisclosureState): DisclosureState => {\n if (state.phase === \"opening\") return { ...state, phase: \"open\" };\n if (state.phase === \"closing\") return { ...state, phase: \"closed\" };\n return state;\n};\n\n/** Whether the content should be rendered (any phase but \"closed\"). */\nexport const isDisclosurePresent = (state: DisclosureState): boolean =>\n state.phase !== \"closed\";\n\n/** Creates a disclosure machine. */\nexport function createDisclosureMachine(\n props: DisclosureProps = {},\n): DisclosureMachine {\n return createMachine<DisclosureState, DisclosureEvent, DisclosureProps>(\n {\n controlled: [\"open\"],\n initial: (p) => {\n const open = p.open ?? p.defaultOpen ?? false;\n return { open, phase: open ? \"open\" : \"closed\" };\n },\n reduce(state, event, p) {\n switch (event.type) {\n case \"OPEN\":\n case \"CLOSE\":\n case \"TOGGLE\": {\n if (p.disabled) return state;\n const open =\n event.type === \"TOGGLE\" ? !state.open : event.type === \"OPEN\";\n return open === state.open ? state : { ...state, open };\n }\n case \"ANIMATION_END\":\n case \"SKIP_ANIMATION\":\n return settle(state);\n default:\n return state;\n }\n },\n // The phase follows `open`: entering / leaving starts the transition.\n normalize(state, p) {\n const animated = p.animated ?? true;\n let { phase } = state;\n if (state.open && (phase === \"closed\" || phase === \"closing\")) {\n phase = animated ? \"opening\" : \"open\";\n } else if (!state.open && (phase === \"open\" || phase === \"opening\")) {\n phase = animated ? \"closing\" : \"closed\";\n } else if (!animated) {\n phase = state.open ? \"open\" : \"closed\";\n }\n return phase === state.phase ? state : { ...state, phase };\n },\n changed(requested, prev, p) {\n if (requested.open !== prev.open) p.onOpenChange?.(requested.open);\n },\n },\n props,\n );\n}\n","// Toast queue: the framework-neutral store behind the React `toast()` /\n// `<ToastProvider>` and the web components' `toast()` /\n// `<minerva-toast-region>`. Semantics: insertion order (a re-used id replaces\n// the toast in place and restarts its timer), auto-dismiss timers with\n// pause / resume (hover / focus), an \"open\" -> \"closing\" -> removed lifecycle\n// (`exitDuration` for the exit animation) and `getToastOverflow` for the\n// renderers' `max`. Generic over the content type (React nodes, Lit\n// templates, strings...) and over extra per-toast data (render scope...).\nimport { createStore, type Scheduler } from \"./store\";\n\n/**\n * The engine's timers read at call time, like `defaultScheduler`, but called\n * from this module so that leak reports name the toast queue.\n */\nconst engineScheduler: Scheduler = {\n setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),\n clearTimeout: (handle) =>\n globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>),\n now: () => Date.now(),\n};\n\n/** Default auto-close delay, in milliseconds. */\nexport const TOAST_DEFAULT_DURATION = 4000;\n/** Default length of the closing animation before a toast is removed. */\nexport const TOAST_DEFAULT_EXIT_DURATION = 200;\n\nexport type ToastQueueId = string | number;\n\n/** Semantic color of a toast. */\nexport type ToastQueueColor = \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/** Why a toast closed. */\nexport type ToastQueueCloseReason =\n \"timeout\" | \"close-button\" | \"action\" | \"escape\" | \"dismiss\" | \"overflow\";\n\n/** Button rendered in a toast. */\nexport interface ToastQueueAction<C> {\n label: C;\n onClick: () => void;\n}\n\n/** Options of a shown toast (`C`: content type). */\nexport interface ToastQueueOptions<C> {\n /** Re-using the id of a toast replaces it; generated when omitted. */\n id?: ToastQueueId;\n /** @default \"info\" */\n color?: ToastQueueColor;\n /** Spinner, no auto-close by default. @default false */\n loading?: boolean;\n title?: C;\n description?: C;\n /** Auto-close delay; 0 keeps the toast open. @default 4000 (0 when loading) */\n duration?: number;\n /** Custom icon; `null` hides it. */\n icon?: C | null;\n /** @default true */\n closable?: boolean;\n action?: ToastQueueAction<C>;\n /** Called once with the id when the toast starts closing. */\n onClose?: (id: ToastQueueId) => void;\n}\n\n/** A toast of the queue. */\nexport interface ToastQueueBaseItem<C> {\n id: ToastQueueId;\n color: ToastQueueColor;\n loading: boolean;\n title?: C;\n description?: C;\n duration: number;\n icon?: C | null;\n closable: boolean;\n action?: ToastQueueAction<C>;\n onClose?: (id: ToastQueueId) => void;\n state: \"open\" | \"closing\";\n}\n\n/** A toast with the renderer's extra data `X`. */\nexport type ToastQueueItem<\n C,\n X extends object = object,\n> = ToastQueueBaseItem<C> & X;\n\nexport interface ToastQueueState<C, X extends object = object> {\n /** Toasts in display order (a new array after every change). */\n toasts: ToastQueueItem<C, X>[];\n}\n\n/** Close / remove notifications (e.g. turned into DOM events). */\nexport type ToastQueueLifecycleEvent<C, X extends object = object> =\n | {\n type: \"close\";\n item: ToastQueueItem<C, X>;\n reason: ToastQueueCloseReason;\n }\n | { type: \"remove\"; item: ToastQueueItem<C, X> };\n\nexport type ToastQueueEvent<C, X extends object = object> =\n | { type: \"ADD\"; options: ToastQueueOptions<C>; extra?: X }\n | {\n type: \"UPDATE\";\n id: ToastQueueId;\n options: Omit<ToastQueueOptions<C>, \"id\">;\n }\n | { type: \"DISMISS\"; id: ToastQueueId; reason?: ToastQueueCloseReason }\n | { type: \"DISMISS_ALL\" }\n | { type: \"PAUSE\"; id: ToastQueueId }\n | { type: \"RESUME\"; id: ToastQueueId }\n | { type: \"RESET\" };\n\nexport interface ToastQueueConfig {\n /**\n * Whether toasts are kept. `false` (e.g. during SSR, where a module level\n * list would leak between requests) only hands out ids.\n * @default () => true\n */\n isClient?: () => boolean;\n /** Timers and clock. @default the engine's timers (`defaultScheduler`) */\n scheduler?: Scheduler;\n /** @default TOAST_DEFAULT_DURATION */\n defaultDuration?: number;\n /** @default TOAST_DEFAULT_EXIT_DURATION */\n exitDuration?: number;\n}\n\nexport interface ToastQueue<C, X extends object = object> {\n getState(): ToastQueueState<C, X>;\n subscribe(\n listener: (\n state: ToastQueueState<C, X>,\n prev: ToastQueueState<C, X>,\n ) => void,\n ): () => void;\n send(event: ToastQueueEvent<C, X>): void;\n /** Shows (or replaces) a toast; returns its id. */\n add(options: ToastQueueOptions<C>, extra?: X): ToastQueueId;\n /**\n * Merges options into an open toast (its extra data is kept) and restarts\n * its timer. Unknown or closing ids are ignored.\n */\n update(id: ToastQueueId, options: Omit<ToastQueueOptions<C>, \"id\">): void;\n /** Starts closing a toast (`onClose`, \"close\" notification), then removes it. */\n dismiss(id: ToastQueueId, reason?: ToastQueueCloseReason): void;\n /** Closes every toast. */\n dismissAll(): void;\n /** Stops the auto-close countdown (hover / focus). */\n pause(id: ToastQueueId): void;\n /** Continues a paused countdown where it stopped. */\n resume(id: ToastQueueId): void;\n /** Whether the countdown of a toast is paused. */\n isPaused(id: ToastQueueId): boolean;\n /** Clears every toast and timer (no callbacks). */\n reset(): void;\n /** Listens to close / remove notifications. */\n subscribeLifecycle(\n listener: (event: ToastQueueLifecycleEvent<C, X>) => void,\n ): () => void;\n}\n\ninterface Timer {\n handle?: unknown;\n /** Time at which the toast closes (while running). */\n deadline: number;\n /** Time left while paused. */\n remaining: number;\n paused: boolean;\n}\n\n/**\n * The oldest open toasts beyond `max` visible ones (closing toasts do not\n * count): the renderers dismiss them (reason \"overflow\").\n */\nexport function getToastOverflow<T extends { state: \"open\" | \"closing\" }>(\n toasts: readonly T[],\n max: number,\n): T[] {\n const open = toasts.filter((t) => t.state === \"open\");\n return open.slice(0, Math.max(0, open.length - max));\n}\n\n/** Creates a toast queue. */\nexport function createToastQueue<C, X extends object = object>(\n config: ToastQueueConfig = {},\n): ToastQueue<C, X> {\n const isClient = config.isClient ?? (() => true);\n const scheduler = config.scheduler ?? engineScheduler;\n const defaultDuration = config.defaultDuration ?? TOAST_DEFAULT_DURATION;\n const exitDuration = config.exitDuration ?? TOAST_DEFAULT_EXIT_DURATION;\n\n type Item = ToastQueueItem<C, X>;\n // Every change produces a new state (and array), so equality is identity.\n const store = createStore<ToastQueueState<C, X>>(\n { toasts: [] },\n { equals: Object.is },\n );\n const lifecycle = new Set<(event: ToastQueueLifecycleEvent<C, X>) => void>();\n const timers = new Map<ToastQueueId, Timer>();\n let idCounter = 0;\n\n const toasts = () => store.getState().toasts;\n const setToasts = (next: Item[]) => store.setState({ toasts: next });\n const notify = (event: ToastQueueLifecycleEvent<C, X>) => {\n for (const fn of [...lifecycle]) fn(event);\n };\n\n const clearTimer = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (timer) scheduler.clearTimeout(timer.handle);\n timers.delete(id);\n };\n\n const schedule = (id: ToastQueueId, duration: number) => {\n clearTimer(id);\n if (duration <= 0) return;\n timers.set(id, {\n handle: scheduler.setTimeout(() => dismiss(id, \"timeout\"), duration),\n deadline: scheduler.now() + duration,\n remaining: duration,\n paused: false,\n });\n };\n\n const add = (options: ToastQueueOptions<C>, extra?: X): ToastQueueId => {\n const id = options.id ?? ++idCounter;\n if (!isClient()) return id;\n const loading = options.loading ?? false;\n const next = {\n ...extra,\n id,\n color: options.color ?? \"info\",\n loading,\n title: options.title,\n description: options.description,\n duration: options.duration ?? (loading ? 0 : defaultDuration),\n icon: options.icon,\n closable: options.closable ?? true,\n action: options.action,\n onClose: options.onClose,\n state: \"open\",\n } as Item;\n const list = toasts();\n const index = list.findIndex((t) => t.id === id);\n if (index >= 0) {\n const updated = list.slice();\n updated[index] = next;\n setToasts(updated);\n } else {\n setToasts([...list, next]);\n }\n schedule(id, next.duration);\n return id;\n };\n\n const update = (\n id: ToastQueueId,\n options: Omit<ToastQueueOptions<C>, \"id\">,\n ) => {\n const current = toasts().find((t) => t.id === id && t.state === \"open\");\n if (!current) return;\n // Entering / leaving the loading state with the default duration of the\n // previous state switches to the default of the new one unless a\n // duration is given\n const loadingChanged =\n options.loading !== undefined && options.loading !== current.loading;\n const previousDefault = current.loading ? 0 : defaultDuration;\n const duration =\n options.duration ??\n (loadingChanged && current.duration === previousDefault\n ? undefined\n : current.duration);\n // The current toast doubles as the extra data: its own fields are all\n // overwritten by the merged options.\n add({ ...current, ...options, id, duration }, current);\n };\n\n function dismiss(\n id: ToastQueueId,\n reason: ToastQueueCloseReason = \"dismiss\",\n ): void {\n clearTimer(id);\n const closing = toasts().find((t) => t.id === id && t.state === \"open\");\n if (!closing) return;\n setToasts(\n toasts().map((t) => (t.id === id ? { ...t, state: \"closing\" } : t)),\n );\n closing.onClose?.(id);\n notify({ type: \"close\", item: closing, reason });\n scheduler.setTimeout(() => {\n // A toast shown again with the same id while closing stays\n const current = toasts().find((t) => t.id === id);\n if (current?.state !== \"closing\") return;\n setToasts(toasts().filter((t) => t.id !== id));\n notify({ type: \"remove\", item: current });\n }, exitDuration);\n }\n\n const dismissAll = () => {\n for (const t of toasts()) dismiss(t.id);\n };\n\n const pause = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (!timer || timer.paused) return;\n scheduler.clearTimeout(timer.handle);\n timer.remaining = Math.max(0, timer.deadline - scheduler.now());\n timer.paused = true;\n };\n\n const resume = (id: ToastQueueId) => {\n const timer = timers.get(id);\n if (!timer?.paused) return;\n timer.paused = false;\n timer.deadline = scheduler.now() + timer.remaining;\n timer.handle = scheduler.setTimeout(\n () => dismiss(id, \"timeout\"),\n timer.remaining,\n );\n };\n\n const reset = () => {\n for (const id of [...timers.keys()]) clearTimer(id);\n setToasts([]);\n };\n\n const send = (event: ToastQueueEvent<C, X>) => {\n switch (event.type) {\n case \"ADD\":\n add(event.options, event.extra);\n break;\n case \"UPDATE\":\n update(event.id, event.options);\n break;\n case \"DISMISS\":\n dismiss(event.id, event.reason);\n break;\n case \"DISMISS_ALL\":\n dismissAll();\n break;\n case \"PAUSE\":\n pause(event.id);\n break;\n case \"RESUME\":\n resume(event.id);\n break;\n case \"RESET\":\n reset();\n break;\n }\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n send,\n add,\n update,\n dismiss,\n dismissAll,\n pause,\n resume,\n isPaused: (id) => timers.get(id)?.paused ?? false,\n reset,\n subscribeLifecycle(listener) {\n lifecycle.add(listener);\n return () => {\n lifecycle.delete(listener);\n };\n },\n };\n}\n","// Selection of items of a collection (listbox, select, table rows, tree,\n// tag group...): single or multiple, disabled items, a maximum count.\nimport { createMachine, type Machine } from \"./store\";\n\nexport type SelectionMode = \"single\" | \"multiple\";\n\nexport interface SelectionProps<V = string> {\n /** \"single\": at most one value; \"multiple\": any number. @default \"single\" */\n mode?: SelectionMode;\n /** Controlled selected values, in selection order (`undefined`: uncontrolled). */\n value?: readonly V[];\n /** Initial selected values while uncontrolled. @default [] */\n defaultValue?: readonly V[];\n /** Every selectable value, in order (used by SELECT_ALL). @default [] */\n items?: readonly V[];\n /**\n * Disabled values can't be selected; in multiple mode a selected disabled\n * value can't be deselected either.\n */\n isDisabled?: (value: V) => boolean;\n /** Most values selected at once in multiple mode. @default Infinity */\n max?: number;\n /**\n * Single mode: whether TOGGLE / DESELECT may empty the selection.\n * @default true\n */\n allowEmpty?: boolean;\n /** Called with the requested selection (controlled or not). */\n onValueChange?: (value: V[]) => void;\n}\n\nexport interface SelectionState<V = string> {\n value: readonly V[];\n}\n\nexport type SelectionEvent<V = string> =\n | { type: \"SELECT\"; value: V }\n | { type: \"DESELECT\"; value: V }\n | { type: \"TOGGLE\"; value: V }\n /** Replaces the selection (disabled values are left as they are). */\n | { type: \"SET\"; value: readonly V[] }\n /** Selects every enabled item (up to `max`; multiple mode only). */\n | { type: \"SELECT_ALL\" }\n /** Deselects every enabled value. */\n | { type: \"CLEAR\" };\n\nexport type SelectionMachine<V = string> = Machine<\n SelectionState<V>,\n SelectionEvent<V>,\n SelectionProps<V>\n>;\n\n/** Whether `value` is selected. */\nexport const isSelected = <V>(state: SelectionState<V>, value: V): boolean =>\n state.value.includes(value);\n\nconst sameValues = <V>(a: readonly V[], b: readonly V[]) =>\n a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n\n/** Creates a selection machine. */\nexport function createSelectionMachine<V = string>(\n props: SelectionProps<V> = {},\n): SelectionMachine<V> {\n const reduceValue = (\n current: readonly V[],\n event: SelectionEvent<V>,\n p: SelectionProps<V>,\n ): readonly V[] => {\n const multiple = p.mode === \"multiple\";\n const disabled = p.isDisabled ?? (() => false);\n const max = multiple ? (p.max ?? Infinity) : 1;\n const allowEmpty = multiple || (p.allowEmpty ?? true);\n // Disabled values stay selected in multiple mode; a single selection\n // can always be replaced by an enabled value.\n const locked = multiple ? current.filter(disabled) : [];\n\n const select = (value: V): readonly V[] => {\n if (disabled(value) || current.includes(value)) return current;\n if (!multiple) return [value];\n return current.length >= max ? current : [...current, value];\n };\n const deselect = (value: V): readonly V[] => {\n if (!current.includes(value) || (multiple && disabled(value))) {\n return current;\n }\n const next = current.filter((v) => !Object.is(v, value));\n return next.length === 0 && !allowEmpty ? current : next;\n };\n\n switch (event.type) {\n case \"SELECT\":\n return select(event.value);\n case \"DESELECT\":\n return deselect(event.value);\n case \"TOGGLE\":\n return current.includes(event.value)\n ? deselect(event.value)\n : select(event.value);\n case \"SET\": {\n const wanted = event.value.filter((v, i, all) => {\n return !disabled(v) && all.indexOf(v) === i;\n });\n const next = [...locked, ...wanted].slice(0, multiple ? max : 1);\n return next.length === 0 && !allowEmpty ? current : next;\n }\n case \"SELECT_ALL\": {\n if (!multiple) return current;\n const next = [...current];\n for (const v of p.items ?? []) {\n if (next.length >= max) break;\n if (!disabled(v) && !next.includes(v)) next.push(v);\n }\n return next;\n }\n case \"CLEAR\": {\n const next = multiple ? current.filter(disabled) : [];\n return next.length === 0 && !allowEmpty ? current : next;\n }\n default:\n return current;\n }\n };\n\n return createMachine<SelectionState<V>, SelectionEvent<V>, SelectionProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({ value: p.value ?? p.defaultValue ?? [] }),\n reduce(state, event, p) {\n const value = reduceValue(state.value, event, p);\n return sameValues(value, state.value) ? state : { value };\n },\n changed(requested, prev, p) {\n if (!sameValues(requested.value, prev.value)) {\n p.onValueChange?.([...requested.value]);\n }\n },\n },\n props,\n );\n}\n","// Tabs (WAI-ARIA tabs pattern): selected value, focused tab, keyboard\n// navigation (arrows per orientation / direction, Home / End, optional\n// wrapping) and automatic or manual activation. Renderers that discover\n// their tabs at runtime (DOM children) pass them with the events.\nimport { getNextIndex, type Direction } from \"../keyboard-navigation\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport type TabsMachineOrientation = \"horizontal\" | \"vertical\";\nexport type TabsActivation = \"automatic\" | \"manual\";\n\n/** A tab of the list. */\nexport interface TabsItem {\n value: string;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n /** Controlled selected value (`undefined`: uncontrolled). */\n value?: string;\n /** Initial selected value while uncontrolled. */\n defaultValue?: string;\n /** Tabs in order (events may pass their own list). @default [] */\n tabs?: readonly TabsItem[];\n /** @default \"horizontal\" */\n orientation?: TabsMachineOrientation;\n /** Reading direction (ArrowLeft / ArrowRight swap in RTL). @default \"ltr\" */\n dir?: Direction;\n /** Arrow keys wrap around at both ends. @default true */\n loop?: boolean;\n /**\n * \"automatic\": a tab is selected when it receives focus; \"manual\": with\n * Enter / Space / click only. @default \"automatic\"\n */\n activationMode?: TabsActivation;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: string) => void;\n}\n\nexport interface TabsState {\n value: string | undefined;\n /** Tab holding the focus (`undefined`: focus outside the tabs). */\n focusedValue: string | undefined;\n}\n\nexport type TabsEvent =\n /** Click / Enter / Space on a tab. */\n | { type: \"SELECT\"; value: string; disabled?: boolean }\n /** A tab received focus (selects it in automatic mode). */\n | { type: \"FOCUS\"; value: string; disabled?: boolean }\n | { type: \"BLUR\" }\n /**\n * A key pressed on the tab list: moves `focusedValue` (the renderer then\n * focuses that tab, which sends FOCUS). `from` defaults to the focused\n * (else selected) tab.\n */\n | {\n type: \"NAVIGATE\";\n key: string;\n from?: string;\n tabs?: readonly TabsItem[];\n };\n\nexport type TabsMachine = Machine<TabsState, TabsEvent, TabsProps>;\n\nexport interface TabsNavigationOptions {\n key: string;\n currentIndex: number;\n tabs: readonly Pick<TabsItem, \"disabled\">[];\n orientation?: TabsMachineOrientation;\n dir?: Direction;\n loop?: boolean;\n}\n\n/**\n * Index of the tab a key moves the focus to (enabled tabs only), or `null`\n * when the key is not a navigation key for this orientation.\n */\nexport const getTabsNavigationIndex = ({\n key,\n currentIndex,\n tabs,\n orientation = \"horizontal\",\n dir = \"ltr\",\n loop = true,\n}: TabsNavigationOptions): number | null =>\n getNextIndex({\n currentIndex,\n count: tabs.length,\n key,\n orientation,\n dir,\n loop,\n isDisabled: (index) => !!tabs[index].disabled,\n });\n\n/**\n * The tab holding the roving tab stop: the selected tab when it is enabled,\n * else the first enabled one (`undefined` when every tab is disabled).\n */\nexport const getTabsTabStop = <T extends TabsItem>(\n tabs: readonly T[],\n value: string | undefined,\n): T | undefined =>\n tabs.find((tab) => tab.value === value && !tab.disabled) ??\n tabs.find((tab) => !tab.disabled);\n\nconst isTabDisabled = (\n tabs: readonly TabsItem[] | undefined,\n value: string,\n explicit: boolean | undefined,\n) => explicit ?? tabs?.find((tab) => tab.value === value)?.disabled ?? false;\n\n/** Creates a tabs machine. */\nexport function createTabsMachine(props: TabsProps = {}): TabsMachine {\n return createMachine<TabsState, TabsEvent, TabsProps>(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value ?? p.defaultValue,\n focusedValue: undefined,\n }),\n reduce(state, event, p) {\n switch (event.type) {\n case \"SELECT\":\n if (isTabDisabled(p.tabs, event.value, event.disabled)) {\n return state;\n }\n return event.value === state.value\n ? state\n : { ...state, value: event.value };\n case \"FOCUS\": {\n const disabled = isTabDisabled(p.tabs, event.value, event.disabled);\n const select =\n !disabled &&\n (p.activationMode ?? \"automatic\") === \"automatic\" &&\n event.value !== state.value;\n return {\n focusedValue: event.value,\n value: select ? event.value : state.value,\n };\n }\n case \"BLUR\":\n return state.focusedValue === undefined\n ? state\n : { ...state, focusedValue: undefined };\n case \"NAVIGATE\": {\n const tabs = event.tabs ?? p.tabs ?? [];\n const from = event.from ?? state.focusedValue ?? state.value;\n const next = getTabsNavigationIndex({\n key: event.key,\n currentIndex: tabs.findIndex((tab) => tab.value === from),\n tabs,\n orientation: p.orientation,\n dir: p.dir,\n loop: p.loop,\n });\n if (next === null) return state;\n return { ...state, focusedValue: tabs[next].value };\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (requested.value !== prev.value && requested.value !== undefined) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n","// Cascading picker columns (mobile wheel picker, cascader, region / date\n// pickers): an options tree shown as one column per level. Choosing an\n// option in column N keeps columns < N and recomputes every column > N\n// (first enabled option of each level, or the previous choice when it still\n// exists there).\nimport { createMachine, type Machine } from \"./store\";\n\n/** A node of the options tree. */\nexport interface PickerOption<V = string> {\n value: V;\n label?: string;\n disabled?: boolean;\n /** Options of the next column when this one is chosen. */\n children?: readonly PickerOption<V>[];\n}\n\n/** A column derived from the tree and the value path. */\nexport interface PickerColumn<V = string> {\n options: readonly PickerOption<V>[];\n /** Index of the chosen option (`-1`: none, every option disabled). */\n selectedIndex: number;\n}\n\nexport interface PickerProps<V = string> {\n /** Options of the first column (their `children` feed the next ones). */\n options: readonly PickerOption<V>[];\n /** Controlled value path, one value per column (`undefined`: uncontrolled). */\n value?: readonly V[];\n /** Initial value path while uncontrolled (missing levels pick the first enabled option). */\n defaultValue?: readonly V[];\n /** Called with the requested value path (controlled or not). */\n onValueChange?: (value: V[], selectedOptions: PickerOption<V>[]) => void;\n}\n\nexport interface PickerState<V = string> {\n /** Value path, one value per column (always a valid path of the tree). */\n value: readonly V[];\n}\n\nexport type PickerEvent<V = string> =\n /** Chooses the option at `index` of `column`. */\n | { type: \"SELECT\"; column: number; index: number }\n /** Moves the choice of `column` by `delta` enabled options (wheel, arrows), clamped. */\n | { type: \"STEP\"; column: number; delta: number }\n /** Replaces the value path. */\n | { type: \"SET\"; value: readonly V[] };\n\nexport type PickerMachine<V = string> = Machine<\n PickerState<V>,\n PickerEvent<V>,\n PickerProps<V>\n>;\n\nconst firstEnabled = <V>(options: readonly PickerOption<V>[]) =>\n options.findIndex((o) => !o.disabled);\n\n/**\n * Columns shown for a value path: every level down the chosen options\n * (a level whose value is missing or disabled falls back to its first\n * enabled option).\n */\nexport function getPickerColumns<V>(\n options: readonly PickerOption<V>[],\n value: readonly V[],\n): PickerColumn<V>[] {\n const columns: PickerColumn<V>[] = [];\n let level: readonly PickerOption<V>[] | undefined = options;\n for (let depth = 0; level && level.length > 0; depth++) {\n let index: number = level.findIndex(\n (o) => !o.disabled && Object.is(o.value, value[depth]),\n );\n if (index < 0) index = firstEnabled(level);\n columns.push({ options: level, selectedIndex: index });\n level = index < 0 ? undefined : level[index].children;\n }\n return columns;\n}\n\n/** The options chosen in each column (the resolved value path). */\nexport const getPickerSelectedOptions = <V>(\n columns: readonly PickerColumn<V>[],\n): PickerOption<V>[] =>\n columns\n .filter((c) => c.selectedIndex >= 0)\n .map((c) => c.options[c.selectedIndex]);\n\nconst resolve = <V>(options: readonly PickerOption<V>[], value: readonly V[]) =>\n getPickerSelectedOptions(getPickerColumns(options, value)).map(\n (o) => o.value,\n );\n\nconst samePath = <V>(a: readonly V[], b: readonly V[]) =>\n a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n\n/** Creates a picker columns machine. */\nexport function createPickerMachine<V = string>(\n props: PickerProps<V>,\n): PickerMachine<V> {\n return createMachine<PickerState<V>, PickerEvent<V>, PickerProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({ value: p.value ?? p.defaultValue ?? [] }),\n reduce(state, event, p) {\n const columns = getPickerColumns(p.options, state.value);\n const path = getPickerSelectedOptions(columns).map((o) => o.value);\n const choose = (column: number, index: number) => {\n const option = columns[column]?.options[index];\n if (!option || option.disabled) return state;\n // Levels after `column` are recomputed (previous values are kept\n // when they still exist below the new choice).\n const value = resolve(p.options, [\n ...path.slice(0, column),\n option.value,\n ...path.slice(column + 1),\n ]);\n return samePath(value, state.value) ? state : { value };\n };\n switch (event.type) {\n case \"SELECT\":\n return choose(event.column, event.index);\n case \"STEP\": {\n const column = columns[event.column];\n if (!column || event.delta === 0) return state;\n const step = event.delta > 0 ? 1 : -1;\n let index = column.selectedIndex;\n let target = index;\n for (let moved = 0; moved < Math.abs(event.delta);) {\n index += step;\n if (index < 0 || index >= column.options.length) break;\n if (!column.options[index].disabled) {\n target = index;\n moved++;\n }\n }\n return choose(event.column, target);\n }\n case \"SET\": {\n const value = resolve(p.options, event.value);\n return samePath(value, state.value) ? state : { value };\n }\n default:\n return state;\n }\n },\n normalize(state, p) {\n const value = resolve(p.options, state.value);\n return samePath(value, state.value) ? state : { value };\n },\n changed(requested, prev, p) {\n if (samePath(requested.value, prev.value)) return;\n const selected = getPickerSelectedOptions(\n getPickerColumns(p.options, requested.value),\n );\n p.onValueChange?.([...requested.value], selected);\n },\n },\n props,\n );\n}\n","// Form field state and validation: value, touched / dirty, sync validators\n// (required, min / max, minLength / maxLength, pattern, email, custom) and\n// optional async ones, with error messages translated from the\n// `validation.*` keys of the message bundles (en / zh / ja / fr).\nimport { createTranslator, type TranslateFunction } from \"../i18n/translate\";\nimport { messages } from \"../i18n\";\nimport { createMachine, type Machine } from \"./store\";\n\n/** A validation failure: an i18n key, its interpolation values and the message. */\nexport interface FieldError {\n /** Message key, e.g. \"validation.valueMissing\". */\n key: string;\n /** Interpolation values of the message (`{{min}}`...). */\n params?: Record<string, unknown>;\n /** Translated message (filled by the machine). */\n message: string;\n}\n\n/** What a validator reports: `null` / `undefined` when the value is valid. */\nexport type FieldValidationResult = Omit<FieldError, \"message\"> & {\n message?: string;\n};\n\n/** A synchronous validator. */\nexport type FieldValidator<V> = (\n value: V,\n) => FieldValidationResult | null | undefined;\n\n/** An asynchronous validator (runs once every sync validator passed). */\nexport type FieldAsyncValidator<V> = (\n value: V,\n) => Promise<FieldValidationResult | null | undefined>;\n\n/** \"Empty\" for the validators: `undefined`, `null`, `\"\"`, `[]` or `false`. */\nexport const isEmptyFieldValue = (value: unknown): boolean =>\n value === undefined ||\n value === null ||\n value === \"\" ||\n value === false ||\n (Array.isArray(value) && value.length === 0);\n\nconst lengthOf = (value: unknown): number | undefined =>\n typeof value === \"string\" || Array.isArray(value) ? value.length : undefined;\n\n// Same rule as the HTML input type=\"email\" (WHATWG)\nconst EMAIL_RE =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n/**\n * Built-in validators. Every one but `required` accepts empty values (combine\n * with `required`). `key` overrides the message key.\n */\nexport const fieldValidators = {\n /** Fails on empty values (\"validation.valueMissing\"). */\n required:\n (key = \"validation.valueMissing\"): FieldValidator<unknown> =>\n (value) =>\n isEmptyFieldValue(value) ? { key } : null,\n /** Number below `min` (\"validation.rangeUnderflow\"). */\n min:\n (min: number, key = \"validation.rangeUnderflow\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"number\" && value < min\n ? { key, params: { min } }\n : null,\n /** Number above `max` (\"validation.rangeOverflow\"). */\n max:\n (max: number, key = \"validation.rangeOverflow\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"number\" && value > max\n ? { key, params: { max } }\n : null,\n /** Text / list shorter than `min` (\"validation.tooShort\"). */\n minLength:\n (min: number, key = \"validation.tooShort\"): FieldValidator<unknown> =>\n (value) => {\n const length = lengthOf(value);\n return length !== undefined && length > 0 && length < min\n ? { key, params: { min } }\n : null;\n },\n /** Text / list longer than `max` (\"validation.tooLong\"). */\n maxLength:\n (max: number, key = \"validation.tooLong\"): FieldValidator<unknown> =>\n (value) => {\n const length = lengthOf(value);\n return length !== undefined && length > max\n ? { key, params: { max } }\n : null;\n },\n /** Text not fully matching `pattern` (\"validation.patternMismatch\"). */\n pattern: (\n pattern: RegExp | string,\n key = \"validation.patternMismatch\",\n ): FieldValidator<unknown> => {\n const source = typeof pattern === \"string\" ? pattern : pattern.source;\n const flags = typeof pattern === \"string\" ? \"\" : pattern.flags;\n // Whole-value match, like the HTML `pattern` attribute (no `g` state)\n const re = new RegExp(`^(?:${source})$`, flags.replace(/[gy]/g, \"\"));\n return (value) =>\n typeof value === \"string\" && value !== \"\" && !re.test(value)\n ? { key }\n : null;\n },\n /** Text that is not an email address (\"validation.emailMismatch\"). */\n email:\n (key = \"validation.emailMismatch\"): FieldValidator<unknown> =>\n (value) =>\n typeof value === \"string\" && value !== \"\" && !EMAIL_RE.test(value)\n ? { key }\n : null,\n /**\n * Custom rule: `test` returns whether the value is valid\n * (\"validation.badInput\" unless `key` / `message` is given).\n */\n custom:\n <V>(\n test: (value: V) => boolean,\n options: { key?: string; message?: string } = {},\n ): FieldValidator<V> =>\n (value) =>\n test(value)\n ? null\n : {\n key: options.key ?? \"validation.badInput\",\n message: options.message,\n },\n};\n\n/** When validation runs. */\nexport type FieldValidateOn = \"change\" | \"blur\" | \"submit\";\n\n/** Validation status. */\nexport type FieldStatus = \"idle\" | \"validating\" | \"valid\" | \"invalid\";\n\nexport interface FieldProps<V> {\n /** Controlled value (`undefined`: uncontrolled). */\n value?: V;\n /** Initial value (and the RESET target). */\n defaultValue: V;\n /** Sync validators, run in order (every failure is reported). */\n validators?: readonly FieldValidator<V>[];\n /** Async validators, run once the sync ones pass (stale results are dropped). */\n asyncValidators?: readonly FieldAsyncValidator<V>[];\n /**\n * First validation: on every CHANGE, on BLUR, or only on VALIDATE (submit).\n * Once validated, every change re-validates. @default \"blur\"\n */\n validateOn?: FieldValidateOn;\n /** Translates the error keys. @default English messages */\n translate?: TranslateFunction;\n /** Value equality (dirty check). @default Object.is */\n equals?: (a: V, b: V) => boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: V) => void;\n}\n\nexport interface FieldState<V> {\n value: V;\n /** The field lost focus at least once (or was submitted). */\n touched: boolean;\n /** The value differs from `defaultValue`. */\n dirty: boolean;\n /** Validation ran at least once since the last reset. */\n validated: boolean;\n status: FieldStatus;\n errors: readonly FieldError[];\n /** Id of the latest validation run (async results of older runs are dropped). */\n run: number;\n}\n\nexport type FieldEvent<V> =\n | { type: \"CHANGE\"; value: V }\n | { type: \"BLUR\" }\n /** Validates now (e.g. on submit) and marks the field touched. */\n | { type: \"VALIDATE\" }\n /** Back to `value` (default: `defaultValue`), untouched, no errors. */\n | { type: \"RESET\"; value?: V }\n /** Result of the async validators of run `run` (sent by the machine). */\n | { type: \"ASYNC_RESULT\"; run: number; errors: readonly FieldError[] };\n\nexport interface FieldMachine<V> extends Machine<\n FieldState<V>,\n FieldEvent<V>,\n FieldProps<V>\n> {\n /** Resolves once the validation in flight (if any) settled. */\n whenSettled(): Promise<FieldState<V>>;\n}\n\nconst englishTranslator = /* @__PURE__ */ createTranslator({\n messages,\n language: \"en\",\n});\n\n/** Translates a validator result into a `FieldError`. */\nexport const toFieldError = (\n result: FieldValidationResult,\n translate: TranslateFunction = englishTranslator,\n): FieldError => ({\n ...result,\n message:\n result.message ??\n translate(result.key, { ...result.params, defaultValue: result.key }),\n});\n\n/** Whether the field currently has validation errors. */\nexport const isFieldInvalid = <V>(state: FieldState<V>): boolean =>\n state.errors.length > 0;\n\n/** Creates a field machine. */\nexport function createFieldMachine<V>(props: FieldProps<V>): FieldMachine<V> {\n const runSync = (value: V, p: FieldProps<V>): FieldError[] => {\n const errors: FieldError[] = [];\n for (const validate of p.validators ?? []) {\n const result = validate(value);\n if (result) errors.push(toFieldError(result, p.translate));\n }\n return errors;\n };\n\n const validate = (state: FieldState<V>, p: FieldProps<V>): FieldState<V> => {\n const errors = runSync(state.value, p);\n const pending = errors.length === 0 && (p.asyncValidators?.length ?? 0) > 0;\n return {\n ...state,\n validated: true,\n errors,\n status: pending ? \"validating\" : errors.length ? \"invalid\" : \"valid\",\n run: state.run + 1,\n };\n };\n\n const machine = createMachine<FieldState<V>, FieldEvent<V>, FieldProps<V>>(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : p.defaultValue,\n touched: false,\n dirty: false,\n validated: false,\n status: \"idle\",\n errors: [],\n run: 0,\n }),\n reduce(state, event, p) {\n const validateOn = p.validateOn ?? \"blur\";\n switch (event.type) {\n case \"CHANGE\": {\n if (Object.is(event.value, state.value)) return state;\n const next = { ...state, value: event.value };\n return validateOn === \"change\" || state.validated\n ? validate(next, p)\n : next;\n }\n case \"BLUR\": {\n const next = state.touched ? state : { ...state, touched: true };\n return validateOn === \"submit\" && !state.validated\n ? next\n : validate(next, p);\n }\n case \"VALIDATE\":\n return validate({ ...state, touched: true }, p);\n case \"RESET\":\n return {\n ...state,\n value: event.value !== undefined ? event.value : p.defaultValue,\n touched: false,\n validated: false,\n status: \"idle\",\n errors: [],\n run: state.run + 1,\n };\n case \"ASYNC_RESULT\":\n if (event.run !== state.run || state.status !== \"validating\") {\n return state;\n }\n return {\n ...state,\n errors: event.errors,\n status: event.errors.length ? \"invalid\" : \"valid\",\n };\n default:\n return state;\n }\n },\n normalize(state, p) {\n const equals = p.equals ?? Object.is;\n const dirty = !equals(state.value, p.defaultValue);\n return dirty === state.dirty ? state : { ...state, dirty };\n },\n changed(requested, prev, p) {\n if (!Object.is(requested.value, prev.value)) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n\n let inFlight: Promise<void> | null = null;\n\n const startAsync = (state: FieldState<V>) => {\n const p = machine.getProps();\n const { run, value } = state;\n const current = Promise.all(\n (p.asyncValidators ?? []).map((validate) => validate(value)),\n ).then(\n (results) => {\n const errors = results\n .filter((r): r is FieldValidationResult => !!r)\n .map((r) => toFieldError(r, machine.getProps().translate));\n machine.send({ type: \"ASYNC_RESULT\", run, errors });\n },\n () => {\n // A failing async validator counts as an invalid value\n machine.send({\n type: \"ASYNC_RESULT\",\n run,\n errors: [\n toFieldError(\n { key: \"validation.badInput\" },\n machine.getProps().translate,\n ),\n ],\n });\n },\n );\n inFlight = current;\n current.then(() => {\n if (inFlight === current) inFlight = null;\n });\n };\n\n machine.subscribe((state, prev) => {\n if (state.status === \"validating\" && state.run !== prev.run) {\n startAsync(state);\n }\n });\n\n return {\n ...machine,\n async whenSettled() {\n while (inFlight) await inFlight;\n return machine.getState();\n },\n };\n}\n","// Pagination: current page and page size (each controlled or not), the page\n// count and the page items (numbers, jump / ellipsis items) of the React\n// Pagination and <minerva-pagination>.\nimport {\n getCompactPageItems,\n getPageRange,\n PAGINATION_JUMP_SIZE,\n} from \"../pagination\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport interface PaginationMachineProps {\n /** Controlled current page, 1-based (`undefined`: uncontrolled). */\n page?: number;\n /** @default 1 */\n defaultPage?: number;\n /** Controlled page size (`undefined`: uncontrolled). */\n pageSize?: number;\n /** @default 10 */\n defaultPageSize?: number;\n /** Total number of items. @default 0 */\n total?: number;\n /** Ignores every event. @default false */\n disabled?: boolean;\n /** Called with the requested page and page size (controlled or not). */\n onChange?: (page: number, pageSize: number) => void;\n}\n\nexport interface PaginationMachineState {\n page: number;\n pageSize: number;\n}\n\nexport type PaginationMachineEvent =\n | { type: \"GOTO\"; page: number }\n | { type: \"NEXT\" }\n | { type: \"PREV\" }\n | { type: \"FIRST\" }\n | { type: \"LAST\" }\n /**\n * A key pressed on a page item: ArrowLeft / ArrowRight (logical, i.e.\n * already swapped in RTL) move by one page, Home / End to the first /\n * last page.\n */\n | { type: \"KEY\"; key: string }\n /** Changes the page size and goes back to the first page. */\n | { type: \"SET_PAGE_SIZE\"; pageSize: number };\n\nexport type PaginationMachine = Machine<\n PaginationMachineState,\n PaginationMachineEvent,\n PaginationMachineProps\n>;\n\n/** Number of pages, at least 1 (there is always a possibly empty page). */\nexport const getTotalPages = (total: number, pageSize: number): number =>\n Math.max(1, pageSize > 0 ? Math.ceil(total / pageSize) : 0);\n\n/**\n * `[first, last]` item numbers shown on `page` (1-based, the page clamped to\n * the valid range); `[0, 0]` without items.\n */\nexport function getPaginationVisibleRange(\n page: number,\n pageSize: number,\n total: number,\n): [number, number] {\n if (total <= 0) return [0, 0];\n const shown = Math.min(Math.max(1, page), getTotalPages(total, pageSize));\n return [(shown - 1) * pageSize + 1, Math.min(shown * pageSize, total)];\n}\n\n/** Whether moving to `target` is a change within range. */\nexport const canGoToPage = (\n page: number,\n target: number,\n totalPages: number,\n disabled = false,\n): boolean =>\n !disabled && target !== page && target >= 1 && target <= totalPages;\n\n/**\n * Page a navigation key leads to (ArrowLeft / ArrowRight: previous / next,\n * Home / End: first / last), or `null` for other keys. Not clamped.\n */\nexport function getPaginationKeyTarget(\n key: string,\n page: number,\n totalPages: number,\n): number | null {\n switch (key) {\n case \"ArrowLeft\":\n return page - 1;\n case \"ArrowRight\":\n return page + 1;\n case \"Home\":\n return 1;\n case \"End\":\n return totalPages;\n default:\n return null;\n }\n}\n\nexport type PaginationItemKind =\n \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\" | \"ellipsis\";\n\n/** An entry of the page list. */\nexport interface PaginationItem {\n /** Stable key (a focused button survives page changes). */\n key: string;\n kind: PaginationItemKind;\n /** Page the item leads to (0 for ellipses). */\n page: number;\n}\n\nexport interface PaginationItemsOptions {\n page: number;\n totalPages: number;\n /**\n * Pages on each side of the current one: switches to the compact list\n * (boundary pages + \"…\" gaps). Compact when this or `boundaryCount` is set.\n */\n siblingCount?: number;\n /** Pages kept at both ends of the compact list. */\n boundaryCount?: number;\n /** Leaves out the prev / next items. @default false */\n hideEdges?: boolean;\n}\n\n/**\n * Items of the page list: prev, the pages (a window of 5 around the current\n * page with first / last pages and jump items, or the compact list with\n * ellipses), next.\n */\nexport function getPaginationItems({\n page,\n totalPages,\n siblingCount,\n boundaryCount,\n hideEdges = false,\n}: PaginationItemsOptions): PaginationItem[] {\n const edge = (kind: \"prev\" | \"next\"): PaginationItem[] =>\n hideEdges\n ? []\n : [{ key: kind, kind, page: kind === \"prev\" ? page - 1 : page + 1 }];\n const pageItem = (p: number): PaginationItem => ({\n key: `page-${p}`,\n kind: \"page\",\n page: p,\n });\n\n if (siblingCount !== undefined || boundaryCount !== undefined) {\n const compact = getCompactPageItems(\n totalPages,\n page,\n Math.max(0, siblingCount ?? 1),\n Math.max(1, boundaryCount ?? 1),\n );\n return [\n ...edge(\"prev\"),\n ...compact.map((item) =>\n typeof item === \"number\"\n ? pageItem(item)\n : { key: item, kind: \"ellipsis\" as const, page: 0 },\n ),\n ...edge(\"next\"),\n ];\n }\n\n const range = getPageRange(page, totalPages);\n const items: PaginationItem[] = [...edge(\"prev\")];\n if (range.length > 0 && range[0] > 1) {\n items.push(pageItem(1));\n if (range[0] > 2) {\n items.push({\n key: \"jump-prev\",\n kind: \"jump-prev\",\n page: Math.max(1, page - PAGINATION_JUMP_SIZE),\n });\n }\n }\n for (const p of range) items.push(pageItem(p));\n const last = range[range.length - 1];\n if (range.length > 0 && last < totalPages) {\n if (last < totalPages - 1) {\n items.push({\n key: \"jump-next\",\n kind: \"jump-next\",\n page: Math.min(totalPages, page + PAGINATION_JUMP_SIZE),\n });\n }\n items.push(pageItem(totalPages));\n }\n items.push(...edge(\"next\"));\n return items;\n}\n\n/** Creates a pagination machine. */\nexport function createPaginationMachine(\n props: PaginationMachineProps = {},\n): PaginationMachine {\n return createMachine<\n PaginationMachineState,\n PaginationMachineEvent,\n PaginationMachineProps\n >(\n {\n controlled: [\"page\", \"pageSize\"],\n initial: (p) => ({\n page: p.page ?? p.defaultPage ?? 1,\n pageSize: p.pageSize ?? p.defaultPageSize ?? 10,\n }),\n reduce(state, event, p) {\n if (p.disabled) return state;\n const totalPages = getTotalPages(p.total ?? 0, state.pageSize);\n const goTo = (target: number | null) =>\n target !== null && canGoToPage(state.page, target, totalPages)\n ? { ...state, page: target }\n : state;\n switch (event.type) {\n case \"GOTO\":\n return goTo(event.page);\n case \"NEXT\":\n return goTo(state.page + 1);\n case \"PREV\":\n return goTo(state.page - 1);\n case \"FIRST\":\n return goTo(1);\n case \"LAST\":\n return goTo(totalPages);\n case \"KEY\":\n return goTo(\n getPaginationKeyTarget(event.key, state.page, totalPages),\n );\n case \"SET_PAGE_SIZE\":\n return { page: 1, pageSize: event.pageSize };\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (\n requested.page !== prev.page ||\n requested.pageSize !== prev.pageSize\n ) {\n p.onChange?.(requested.page, requested.pageSize);\n }\n },\n },\n props,\n );\n}\n","// Star rating: a score on a 0..max scale drawn as five stars, with hover\n// preview, half-star picks, keyboard steps (slider pattern), read-only and\n// clearable modes. The React Rating and <minerva-rating> run on it.\nimport {\n ratingDisplayStars,\n ratingStarFill,\n roundRating,\n type RatingStarFill,\n} from \"../rating\";\nimport { createMachine, type Machine } from \"./store\";\n\n/** Number of stars a rating is drawn with. */\nexport const RATING_STAR_COUNT = 5;\n\nexport interface RatingMachineProps {\n /** Controlled score (`undefined`: uncontrolled). */\n value?: number;\n /** @default 0 */\n defaultValue?: number;\n /** Highest score. @default 10 */\n max?: number;\n /** Display only: events are ignored, no hover preview. @default false */\n readOnly?: boolean;\n /** Picks and arrow keys use half stars. @default true */\n allowHalf?: boolean;\n /** Picking the current score again clears it to 0. @default false */\n clearable?: boolean;\n /** Called with the requested score (controlled or not). */\n onValueChange?: (value: number) => void;\n}\n\nexport interface RatingMachineState {\n value: number;\n /** Stars previewed under the pointer (`null`: not hovering). */\n hoverStars: number | null;\n}\n\nexport type RatingMachineEvent =\n /** The pointer is over star `index` (0-based); `half`: its first half. */\n | { type: \"HOVER\"; index: number; half?: boolean }\n | { type: \"HOVER_END\" }\n /** Star `index` (0-based) was clicked; `half`: on its first half. */\n | { type: \"PICK\"; index: number; half?: boolean }\n /**\n * A key on the slider. Arrow keys are logical (swap ArrowLeft / ArrowRight\n * in RTL before sending): Right / Up add a step (half a star, `max / 10`),\n * Left / Down remove one, PageUp / PageDown one whole star, Home / End go\n * to 0 / `max`; clamped to 0..max.\n */\n | { type: \"KEY\"; key: string }\n | { type: \"SET\"; value: number }\n | { type: \"CLEAR\" };\n\nexport type RatingMachine = Machine<\n RatingMachineState,\n RatingMachineEvent,\n RatingMachineProps\n>;\n\n/** PageUp / PageDown step, in stars. */\nconst PAGE_STARS = Math.max(1, Math.round(RATING_STAR_COUNT / 5));\n\n/**\n * Score a key leads to from `value` (`null`: not a rating key). Arrow keys\n * are logical (already swapped in RTL).\n */\nexport function getRatingKeyValue(\n key: string,\n value: number,\n max: number,\n allowHalf = true,\n): number | null {\n const step = max / (RATING_STAR_COUNT * (allowHalf ? 2 : 1));\n const pageStep = (max / RATING_STAR_COUNT) * PAGE_STARS;\n switch (key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n return Math.min(max, roundRating(value + step));\n case \"ArrowLeft\":\n case \"ArrowDown\":\n return Math.max(0, roundRating(value - step));\n case \"PageUp\":\n return Math.min(max, roundRating(value + pageStep));\n case \"PageDown\":\n return Math.max(0, roundRating(value - pageStep));\n case \"Home\":\n return 0;\n case \"End\":\n return max;\n default:\n return null;\n }\n}\n\n/** Score of a click on star `index` (its first half: a half star). */\nexport const getRatingPickValue = (\n index: number,\n half: boolean,\n max: number,\n allowHalf = true,\n): number =>\n roundRating(\n ((index + (half && allowHalf ? 0.5 : 1)) / RATING_STAR_COUNT) * max,\n );\n\n/** Stars drawn: the hover preview, else the score on five stars. */\nexport const getRatingDisplayStars = (\n state: RatingMachineState,\n max: number,\n): number => state.hoverStars ?? ratingDisplayStars(state.value, max);\n\n/** Fill of each of the five stars. */\nexport const getRatingStarFills = (\n state: RatingMachineState,\n max: number,\n): RatingStarFill[] => {\n const displayed = getRatingDisplayStars(state, max);\n return Array.from({ length: RATING_STAR_COUNT }, (_, i) =>\n ratingStarFill(i, displayed),\n );\n};\n\n/** Creates a rating machine. */\nexport function createRatingMachine(\n props: RatingMachineProps = {},\n): RatingMachine {\n return createMachine<\n RatingMachineState,\n RatingMachineEvent,\n RatingMachineProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value ?? p.defaultValue ?? 0,\n hoverStars: null,\n }),\n reduce(state, event, p) {\n if (p.readOnly) return state;\n const max = p.max ?? 10;\n const allowHalf = p.allowHalf ?? true;\n const setValue = (value: number) =>\n value === state.value ? state : { ...state, value };\n switch (event.type) {\n case \"HOVER\": {\n const stars = event.index + (event.half && allowHalf ? 0.5 : 1);\n return stars === state.hoverStars\n ? state\n : { ...state, hoverStars: stars };\n }\n case \"HOVER_END\":\n return state.hoverStars === null\n ? state\n : { ...state, hoverStars: null };\n case \"PICK\": {\n const value = getRatingPickValue(\n event.index,\n !!event.half,\n max,\n allowHalf,\n );\n return setValue(p.clearable && value === state.value ? 0 : value);\n }\n case \"KEY\": {\n const value = getRatingKeyValue(\n event.key,\n state.value,\n max,\n allowHalf,\n );\n return value === null ? state : setValue(value);\n }\n case \"SET\":\n return setValue(Math.min(max, Math.max(0, event.value)));\n case \"CLEAR\":\n return setValue(0);\n default:\n return state;\n }\n },\n // No preview while read-only\n normalize: (state, p) =>\n p.readOnly && state.hoverStars !== null\n ? { ...state, hoverStars: null }\n : state,\n changed(requested, prev, p) {\n if (requested.value !== prev.value) p.onValueChange?.(requested.value);\n },\n },\n props,\n );\n}\n","// Number stepper (number input / spin button): a value within min..max moved\n// by `step` (rounded to `precision`), a draft text while typing, committed\n// (parsed, clamped, rounded) on blur / Enter.\nimport {\n clampNumber,\n formatNumberValue,\n inferStepPrecision,\n parseNumberDraft,\n} from \"../number-input\";\nimport { createMachine, type Machine } from \"./store\";\n\nexport interface NumberStepperProps {\n /** Controlled value; `null` is empty (`undefined`: uncontrolled). */\n value?: number | null;\n /** @default null */\n defaultValue?: number | null;\n min?: number;\n max?: number;\n /** @default 1 */\n step?: number;\n /** Decimals kept. @default the decimals of `step` */\n precision?: number;\n /** PageUp / PageDown move by `step * pageMultiplier`. @default 10 */\n pageMultiplier?: number;\n /** Committed text out of range is clamped (else kept as is). @default true */\n clampOnBlur?: boolean;\n /** Ignores every event. */\n disabled?: boolean;\n /** Ignores every event. */\n readOnly?: boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: number | null) => void;\n}\n\nexport interface NumberStepperState {\n value: number | null;\n /** Text being typed (`null`: not editing, the formatted value is shown). */\n draft: string | null;\n}\n\nexport type NumberStepperEvent =\n /** Adds `step * (multiplier ?? 1)`. */\n | { type: \"INCREMENT\"; multiplier?: number }\n | { type: \"DECREMENT\"; multiplier?: number }\n /** Sets a value (clamped and rounded); `null` empties the field. */\n | { type: \"SET\"; value: number | null }\n /** Text typed into the field. */\n | { type: \"INPUT\"; text: string }\n /** Commits the draft (blur, Enter). */\n | { type: \"COMMIT\" }\n /** ArrowUp / ArrowDown: one step; PageUp / PageDown: a page; Home / End: min / max. */\n | { type: \"KEY\"; key: string };\n\nexport type NumberStepperMachine = Machine<\n NumberStepperState,\n NumberStepperEvent,\n NumberStepperProps\n>;\n\nconst precisionOf = (p: NumberStepperProps) =>\n p.precision ?? inferStepPrecision(p.step ?? 1);\n\n/** `n` rounded to the stepper's precision and clamped to min..max. */\nexport const normalizeStepperValue = (\n n: number,\n p: NumberStepperProps,\n): number => {\n const rounded = Number(n.toFixed(precisionOf(p)));\n return clampNumber(rounded, p.min, p.max);\n};\n\n/** Text shown by the field: the draft, else the formatted value. */\nexport const getNumberStepperText = (\n state: NumberStepperState,\n props: NumberStepperProps,\n): string => state.draft ?? formatNumberValue(state.value, precisionOf(props));\n\n/** Whether INCREMENT would change the value. */\nexport const canIncrementStepper = (\n state: NumberStepperState,\n p: NumberStepperProps,\n): boolean =>\n !p.disabled &&\n !p.readOnly &&\n (state.value === null || p.max === undefined || state.value < p.max);\n\n/** Whether DECREMENT would change the value. */\nexport const canDecrementStepper = (\n state: NumberStepperState,\n p: NumberStepperProps,\n): boolean =>\n !p.disabled &&\n !p.readOnly &&\n (state.value === null || p.min === undefined || state.value > p.min);\n\n/** Creates a number stepper machine. */\nexport function createNumberStepperMachine(\n props: NumberStepperProps = {},\n): NumberStepperMachine {\n return createMachine<\n NumberStepperState,\n NumberStepperEvent,\n NumberStepperProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : (p.defaultValue ?? null),\n draft: null,\n }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const step = p.step ?? 1;\n const set = (value: number | null): NumberStepperState =>\n Object.is(value, state.value) && state.draft === null\n ? state\n : { value, draft: null };\n const move = (delta: number) => {\n // From empty: start at 0 (or the nearest bound)\n const base = state.value ?? clampNumber(0, p.min, p.max);\n const target = state.value === null ? base : base + delta;\n return set(normalizeStepperValue(target, p));\n };\n switch (event.type) {\n case \"INCREMENT\":\n return move(step * (event.multiplier ?? 1));\n case \"DECREMENT\":\n return move(-step * (event.multiplier ?? 1));\n case \"SET\":\n return set(\n event.value === null || Number.isNaN(event.value)\n ? null\n : normalizeStepperValue(event.value, p),\n );\n case \"INPUT\":\n return event.text === state.draft\n ? state\n : { ...state, draft: event.text };\n case \"COMMIT\": {\n if (state.draft === null) return state;\n if (state.draft.trim() === \"\") return set(null);\n const parsed = parseNumberDraft(state.draft);\n // Invalid text: back to the current value\n if (parsed === null) return { ...state, draft: null };\n const rounded = Number(parsed.toFixed(precisionOf(p)));\n return set(\n (p.clampOnBlur ?? true)\n ? clampNumber(rounded, p.min, p.max)\n : rounded,\n );\n }\n case \"KEY\": {\n const page = p.pageMultiplier ?? 10;\n switch (event.key) {\n case \"ArrowUp\":\n return move(step);\n case \"ArrowDown\":\n return move(-step);\n case \"PageUp\":\n return move(step * page);\n case \"PageDown\":\n return move(-step * page);\n case \"Home\":\n return p.min === undefined ? state : set(p.min);\n case \"End\":\n return p.max === undefined ? state : set(p.max);\n default:\n return state;\n }\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (!Object.is(requested.value, prev.value)) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n","// Toggles: checkbox (with the indeterminate / mixed state), switch and radio\n// group (single selection, roving focus: arrows move and check).\nimport {\n getNextIndex,\n type Direction,\n type Orientation,\n} from \"../keyboard-navigation\";\nimport { createMachine, type Machine } from \"./store\";\n\n// ---------------------------------------------------------------------------\n// Checkbox\n\nexport interface CheckboxMachineProps {\n /** Controlled checked state (`undefined`: uncontrolled). */\n checked?: boolean;\n /** @default false */\n defaultChecked?: boolean;\n /** Controlled indeterminate (mixed) state (`undefined`: uncontrolled). */\n indeterminate?: boolean;\n /** @default false */\n defaultIndeterminate?: boolean;\n /** Ignores TOGGLE / SET. */\n disabled?: boolean;\n /** Ignores TOGGLE / SET. */\n readOnly?: boolean;\n /** Called when the user checks / unchecks (an indeterminate box becomes checked). */\n onCheckedChange?: (checked: boolean) => void;\n /** Called when the indeterminate state is requested to change. */\n onIndeterminateChange?: (indeterminate: boolean) => void;\n}\n\nexport interface CheckboxMachineState {\n checked: boolean;\n indeterminate: boolean;\n}\n\nexport type CheckboxMachineEvent =\n /** An indeterminate box becomes checked; otherwise `checked` flips. */\n { type: \"TOGGLE\" } | { type: \"SET\"; checked: boolean };\n\nexport type CheckboxMachine = Machine<\n CheckboxMachineState,\n CheckboxMachineEvent,\n CheckboxMachineProps\n>;\n\n/** `aria-checked` of a checkbox: \"mixed\" while indeterminate. */\nexport const getCheckboxAriaChecked = (\n state: CheckboxMachineState,\n): \"true\" | \"false\" | \"mixed\" =>\n state.indeterminate ? \"mixed\" : state.checked ? \"true\" : \"false\";\n\n/** Creates a checkbox machine. */\nexport function createCheckboxMachine(\n props: CheckboxMachineProps = {},\n): CheckboxMachine {\n return createMachine<\n CheckboxMachineState,\n CheckboxMachineEvent,\n CheckboxMachineProps\n >(\n {\n controlled: [\"checked\", \"indeterminate\"],\n initial: (p) => ({\n checked: p.checked ?? p.defaultChecked ?? false,\n indeterminate: p.indeterminate ?? p.defaultIndeterminate ?? false,\n }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const checked =\n event.type === \"TOGGLE\"\n ? state.indeterminate || !state.checked\n : event.checked;\n return checked === state.checked && !state.indeterminate\n ? state\n : { checked, indeterminate: false };\n },\n changed(requested, prev, p) {\n if (requested.checked !== prev.checked || prev.indeterminate) {\n p.onCheckedChange?.(requested.checked);\n }\n if (requested.indeterminate !== prev.indeterminate) {\n p.onIndeterminateChange?.(requested.indeterminate);\n }\n },\n },\n props,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Switch\n\nexport interface SwitchMachineProps {\n /** Controlled state (`undefined`: uncontrolled). */\n checked?: boolean;\n /** @default false */\n defaultChecked?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n /** Called with the requested state (controlled or not). */\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport interface SwitchMachineState {\n checked: boolean;\n}\n\nexport type SwitchMachineEvent =\n { type: \"TOGGLE\" } | { type: \"SET\"; checked: boolean };\n\nexport type SwitchMachine = Machine<\n SwitchMachineState,\n SwitchMachineEvent,\n SwitchMachineProps\n>;\n\n/** Creates a switch machine. */\nexport function createSwitchMachine(\n props: SwitchMachineProps = {},\n): SwitchMachine {\n return createMachine<\n SwitchMachineState,\n SwitchMachineEvent,\n SwitchMachineProps\n >(\n {\n controlled: [\"checked\"],\n initial: (p) => ({ checked: p.checked ?? p.defaultChecked ?? false }),\n reduce(state, event, p) {\n if (p.disabled || p.readOnly) return state;\n const checked =\n event.type === \"TOGGLE\" ? !state.checked : event.checked;\n return checked === state.checked ? state : { checked };\n },\n changed(requested, prev, p) {\n if (requested.checked !== prev.checked) {\n p.onCheckedChange?.(requested.checked);\n }\n },\n },\n props,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radio group\n\n/** An option of a radio group. */\nexport interface RadioGroupItem {\n value: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupMachineProps {\n /** Controlled checked value (`undefined`: uncontrolled; `null`: none). */\n value?: string | null;\n /** @default null */\n defaultValue?: string | null;\n /** Options in order (events may pass their own list). @default [] */\n items?: readonly RadioGroupItem[];\n /** Disables the whole group. */\n disabled?: boolean;\n readOnly?: boolean;\n /** Which arrow keys move. @default \"both\" */\n orientation?: Orientation;\n /** @default \"ltr\" */\n dir?: Direction;\n /** @default true */\n loop?: boolean;\n /** Called with the requested value (controlled or not). */\n onValueChange?: (value: string) => void;\n}\n\nexport interface RadioGroupMachineState {\n value: string | null;\n /** Option holding the focus (`null`: focus outside the group). */\n focusedValue: string | null;\n}\n\nexport type RadioGroupMachineEvent =\n /** Click / Space on an option. */\n | { type: \"SELECT\"; value: string }\n | { type: \"FOCUS\"; value: string }\n | { type: \"BLUR\" }\n /**\n * An arrow key: moves the focus to the next enabled option and checks it\n * (the renderer focuses `focusedValue`). Home / End are not part of the\n * radio pattern and are ignored.\n */\n | { type: \"NAVIGATE\"; key: string; items?: readonly RadioGroupItem[] };\n\nexport type RadioGroupMachine = Machine<\n RadioGroupMachineState,\n RadioGroupMachineEvent,\n RadioGroupMachineProps\n>;\n\n/**\n * The option holding the roving tab stop: the checked one when enabled, else\n * the first enabled option.\n */\nexport const getRadioGroupTabStop = (\n items: readonly RadioGroupItem[],\n value: string | null,\n): RadioGroupItem | undefined =>\n items.find((item) => item.value === value && !item.disabled) ??\n items.find((item) => !item.disabled);\n\n/** Creates a radio group machine. */\nexport function createRadioGroupMachine(\n props: RadioGroupMachineProps = {},\n): RadioGroupMachine {\n const isItemDisabled = (p: RadioGroupMachineProps, value: string) =>\n !!p.items?.find((item) => item.value === value)?.disabled;\n\n return createMachine<\n RadioGroupMachineState,\n RadioGroupMachineEvent,\n RadioGroupMachineProps\n >(\n {\n controlled: [\"value\"],\n initial: (p) => ({\n value: p.value !== undefined ? p.value : (p.defaultValue ?? null),\n focusedValue: null,\n }),\n reduce(state, event, p) {\n switch (event.type) {\n case \"SELECT\":\n if (p.disabled || p.readOnly || isItemDisabled(p, event.value)) {\n return state;\n }\n return event.value === state.value\n ? state\n : { ...state, value: event.value };\n case \"FOCUS\":\n return event.value === state.focusedValue\n ? state\n : { ...state, focusedValue: event.value };\n case \"BLUR\":\n return state.focusedValue === null\n ? state\n : { ...state, focusedValue: null };\n case \"NAVIGATE\": {\n if (p.disabled || event.key === \"Home\" || event.key === \"End\") {\n return state;\n }\n const items = event.items ?? p.items ?? [];\n const from = state.focusedValue ?? state.value;\n const next = getNextIndex({\n currentIndex: items.findIndex((item) => item.value === from),\n count: items.length,\n key: event.key,\n orientation: p.orientation ?? \"both\",\n dir: p.dir,\n loop: p.loop,\n isDisabled: (index) => !!items[index].disabled,\n });\n if (next === null) return state;\n const value = items[next].value;\n return {\n focusedValue: value,\n value: p.readOnly ? state.value : value,\n };\n }\n default:\n return state;\n }\n },\n changed(requested, prev, p) {\n if (requested.value !== prev.value && requested.value !== null) {\n p.onValueChange?.(requested.value);\n }\n },\n },\n props,\n );\n}\n"],"mappings":"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"}