minerva-design 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/custom-elements.json +663 -0
- package/dist/angular/fesm2022/minerva-angular.mjs +1163 -34
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +237 -1
- package/dist/core/calendar-date.d.cts +5 -0
- package/dist/core/calendar-date.d.ts +5 -0
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/core/index.cjs +6 -6
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.js +671 -630
- package/dist/core/index.js.map +1 -1
- package/dist/core/styling-hooks/components/date-picker.d.cts +45 -0
- package/dist/core/styling-hooks/components/date-picker.d.ts +45 -0
- package/dist/core/styling-hooks/manifest.d.cts +44 -0
- package/dist/core/styling-hooks/manifest.d.ts +44 -0
- package/dist/core/styling-hooks.cjs +1 -1
- package/dist/core/styling-hooks.cjs.map +1 -1
- package/dist/core/styling-hooks.js +62 -0
- package/dist/core/styling-hooks.js.map +1 -1
- package/dist/native/components/Calendar/Calendar.cjs +1 -1
- package/dist/native/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/native/components/Calendar/Calendar.d.cts +2 -0
- package/dist/native/components/Calendar/Calendar.d.ts +2 -0
- package/dist/native/components/Calendar/Calendar.js +115 -112
- package/dist/native/components/Calendar/Calendar.js.map +1 -1
- package/dist/native/components/Checkbox/Checkbox.cjs +1 -1
- package/dist/native/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/native/components/Checkbox/Checkbox.js +8 -8
- package/dist/native/components/Checkbox/CheckboxGroup.cjs +1 -1
- package/dist/native/components/Checkbox/CheckboxGroup.cjs.map +1 -1
- package/dist/native/components/Checkbox/CheckboxGroup.js +6 -6
- package/dist/native/components/DatePicker/DatePicker.cjs +2 -0
- package/dist/native/components/DatePicker/DatePicker.cjs.map +1 -0
- package/dist/native/components/DatePicker/DatePicker.d.cts +40 -0
- package/dist/native/components/DatePicker/DatePicker.d.ts +40 -0
- package/dist/native/components/DatePicker/DatePicker.js +110 -0
- package/dist/native/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/native/components/DatePicker/index.cjs +1 -0
- package/dist/native/components/DatePicker/index.d.cts +2 -0
- package/dist/native/components/DatePicker/index.d.ts +2 -0
- package/dist/native/components/DatePicker/index.js +2 -0
- package/dist/native/components/Radio/RadioGroup.cjs +1 -1
- package/dist/native/components/Radio/RadioGroup.cjs.map +1 -1
- package/dist/native/components/Radio/RadioGroup.js +9 -9
- package/dist/native/components/Switch/Switch.cjs +1 -1
- package/dist/native/components/Switch/Switch.cjs.map +1 -1
- package/dist/native/components/Switch/Switch.js +23 -23
- package/dist/native/components/Switch/Switch.js.map +1 -1
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.d.cts +1 -0
- package/dist/native/index.d.ts +1 -0
- package/dist/native/index.js +70 -68
- package/dist/native/source/components/Calendar/Calendar.tsx +14 -6
- package/dist/native/source/components/DatePicker/DatePicker.tsx +201 -0
- package/dist/native/source/components/DatePicker/index.ts +2 -0
- package/dist/native/source/index.ts +1 -0
- package/dist/native/source/manifest.ts +6 -0
- package/dist/react/components/DatePicker/DatePicker.cjs +2 -0
- package/dist/react/components/DatePicker/DatePicker.cjs.map +1 -0
- package/dist/react/components/DatePicker/DatePicker.d.cts +13 -0
- package/dist/react/components/DatePicker/DatePicker.d.ts +13 -0
- package/dist/react/components/DatePicker/DatePicker.js +315 -0
- package/dist/react/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/react/components/DatePicker/datePicker.module.scss.cjs +2 -0
- package/dist/react/components/DatePicker/datePicker.module.scss.cjs.map +1 -0
- package/dist/react/components/DatePicker/datePicker.module.scss.js +23 -0
- package/dist/react/components/DatePicker/datePicker.module.scss.js.map +1 -0
- package/dist/react/components/DatePicker/index.cjs +1 -0
- package/dist/react/components/DatePicker/index.d.cts +5 -0
- package/dist/react/components/DatePicker/index.d.ts +5 -0
- package/dist/react/components/DatePicker/index.js +3 -0
- package/dist/react/components/DatePicker/types.d.cts +97 -0
- package/dist/react/components/DatePicker/types.d.ts +97 -0
- package/dist/react/components/Tooltip/Tooltip.cjs +1 -1
- package/dist/react/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/react/components/Tooltip/Tooltip.js +5 -5
- package/dist/react/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/react/components/index.cjs +1 -1
- package/dist/react/components/index.d.cts +1 -0
- package/dist/react/components/index.d.ts +1 -0
- package/dist/react/components/index.js +3 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.js +7 -6
- package/dist/react/style.css +1 -0
- package/dist/react/styles/date-picker.css +7 -0
- package/dist/taro/date-picker.d.ts +20 -0
- package/dist/taro/index.d.ts +1 -0
- package/dist/taro/index.js +1155 -990
- package/dist/uni/DatePicker.vue +225 -0
- package/dist/uni/DatePicker.vue.d.ts +36 -0
- package/dist/uni/MonthCalendar.vue +2 -0
- package/dist/uni/MonthCalendar.vue.d.ts +2 -0
- package/dist/uni/index.d.ts +1 -0
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +8 -0
- package/dist/vue/components/DatePicker/DatePicker.vue.d.ts +36 -0
- package/dist/vue/components/DatePicker/DatePicker.vue.js +7 -0
- package/dist/vue/components/DatePicker/DatePicker.vue.js.map +1 -0
- package/dist/vue/components/DatePicker/DatePicker.vue_vue_type_script_setup_true_lang.js +380 -0
- package/dist/vue/components/DatePicker/DatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/DatePicker/index.d.ts +2 -0
- package/dist/vue/components/DatePicker/index.js +2 -0
- package/dist/vue/components/DatePicker/types.d.ts +26 -0
- package/dist/vue/components/MonthCalendar/MonthCalendar.vue.d.ts +1 -1
- package/dist/vue/global.d.ts +108 -0
- package/dist/vue/groups/forms-pickers.d.ts +1 -0
- package/dist/vue/groups/forms-pickers.js +5 -2
- package/dist/vue/groups/forms-pickers.js.map +1 -1
- package/dist/vue/index.js +95 -94
- package/dist/weapp/controls.js +259 -76
- package/dist/weapp/date-picker/index.js +1 -0
- package/dist/weapp/date-picker/index.json +1 -0
- package/dist/weapp/date-picker/index.wxml +1 -0
- package/dist/weapp/date-picker/index.wxss +1 -0
- package/dist/weapp/types.d.ts +19 -0
- package/dist/web-components/cdn/minerva.js +461 -335
- package/dist/web-components/cdn/minerva.js.map +1 -1
- package/dist/web-components/components/date-picker/date-picker.d.ts +110 -0
- package/dist/web-components/components/date-picker/date-picker.js +378 -0
- package/dist/web-components/components/date-picker/date-picker.js.map +1 -0
- package/dist/web-components/elements/date-picker.d.ts +1 -0
- package/dist/web-components/elements/date-picker.js +8 -0
- package/dist/web-components/elements/date-picker.js.map +1 -0
- package/dist/web-components/html-custom-data.json +85 -0
- package/dist/web-components/index.d.ts +1 -0
- package/dist/web-components/index.js +8 -6
- package/dist/web-components/styles/DatePicker/datePicker.css.js +6 -0
- package/dist/web-components/styles/DatePicker/datePicker.css.js.map +1 -0
- package/dist/web-components/types/react.d.ts +12 -0
- package/dist/web-components/types/solid.d.ts +9 -0
- package/dist/web-components/types/svelte.d.ts +9 -0
- package/dist/web-components/types/vue.d.ts +10 -0
- package/package.json +9 -1
package/dist/core/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["STANDARD","clamp","pxCss","paletteRules","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","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","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","spaceTokens","fontFamilyTokens","scaleTokens","reducedMotionTokens","forcedColorsTokens","NAMED","clamp","max","min","parseHex","hex","digits","d","channel","i","component","match","text","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","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","x","y","blur","spread","css","l","evaluateTransition","duration","EASINGS","evaluateEasing","points","FAMILIES","COLOR_FAMILY","family","test","tokenKind","tokenCascade","designOptions","chosen","palette","apply","mode","reducedMotion","overrides","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","variant","HEADER","stylesheet","shadowRef","baseRules","defaults","root","tokens","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\"","\"unavailable\"","\"retryLabel\"","display_default$3","\"copy\"","\"copied\"","\"copyFailed\"","feedback_default$3","\"region\"","\"regionWithHotkey\"","\"scrollLeft\"","\"scrollRight\"","forms_default$3","\"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","\"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\"","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\"","\"error\"","\"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","t","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","found","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","localDate","year","month","day","dayKey","addDays","days","monthStart","offset","sameMonth","inferStepPrecision","s","dot","clampNumber","formatNumberValue","precision","parseNumberDraft","trimmed","input","resolveSpace","resolveSize","getVirtualRange","itemHeight","extra","overscan","scrollTop","visibleCount","itemCount","matchesAccept","accept","rule","file","type","DEFAULT_TAG_SEPARATORS","splitBySeparators","separators","pattern","sep","findCascaderPath","level","o","flattenCascaderOptions","option","roundRating","ratingDisplayStars","stars5","fullCount","fraction","half","ratingStarFill","displayed","append","cn","inputs","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","list","updated","update","loadingChanged","previousDefault","closing","dismissAll","pause","resume","reset","isSelected","sameValues","createSelectionMachine","reduceValue","multiple","disabled","allowEmpty","locked","select","deselect","wanted","getTabsNavigationIndex","tabs","getTabsTabStop","tab","isTabDisabled","explicit","createTabsMachine","firstEnabled","getPickerColumns","getPickerSelectedOptions","resolve","samePath","createPickerMachine","choose","column","moved","selected","isEmptyFieldValue","lengthOf","EMAIL_RE","fieldValidators","flags","re","englishTranslator","toFieldError","isFieldInvalid","createFieldMachine","runSync","errors","validate","pending","machine","validateOn","dirty","inFlight","startAsync","results","getTotalPages","total","getPaginationVisibleRange","shown","canGoToPage","getPaginationKeyTarget","getPaginationItems","edge","hideEdges","pageItem","siblingCount","boundaryCount","compact","range","last","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/design.ts","../../../core/src/tokens/default-theme.ts","../../../core/src/theme/themes.ts","../../../core/src/theme/palettes.ts","../../../core/src/tokens/scales.ts","../../../core/src/tokens/accessibility.ts","../../../core/src/tokens/color.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/calendar-date.ts","../../../core/src/number-input.ts","../../../core/src/spacing.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/cn.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","// 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 { 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);\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","// 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","// 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 { formatColor, parseColor } from \"./color\";\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 /** 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 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 if (chosen) apply(palettes[chosen][mode]);\n else if (mode === \"dark\") apply(dark);\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 { 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 ...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 \"monacoCodeEditor\": {\n \"unavailable\": \"The editor is unavailable\",\n \"retry\": \"Retry\",\n \"retryLabel\": \"Retry editor\",\n \"loading\": \"Loading editor\"\n }\n}\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 \"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 \"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}\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 \"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 \"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 \"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 \"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}\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 \"navTree\": {\n \"label\": \"ナビゲーション\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"エディターを利用できません\",\n \"retry\": \"再試行\",\n \"retryLabel\": \"エディターを再読み込み\",\n \"loading\": \"エディターを読み込み中\"\n }\n}\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 \"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 \"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}\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 \"navTree\": {\n \"label\": \"导航\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"编辑器暂不可用\",\n \"retry\": \"重试\",\n \"retryLabel\": \"重试编辑器\",\n \"loading\": \"加载编辑器\"\n }\n}\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 \"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 \"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}\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","// 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","// 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","// 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","/**\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","// 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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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["STANDARD","clamp","pxCss","paletteRules","avatar","pagination","cascader","timePicker","common","alert","badge","empty","tag","input","iconButton","table","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","navTree","monacoCodeEditor","loadingState","codeBlock","toast","pageTabs","numberInput","jsonField","keyValueEditor","tagInput","validation","steps","upload","monthCalendar","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","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","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","spaceTokens","fontFamilyTokens","scaleTokens","reducedMotionTokens","forcedColorsTokens","NAMED","clamp","max","min","parseHex","hex","digits","d","channel","i","component","match","text","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","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","x","y","blur","spread","css","l","evaluateTransition","duration","EASINGS","evaluateEasing","points","FAMILIES","COLOR_FAMILY","family","test","tokenKind","tokenCascade","designOptions","chosen","palette","apply","mode","reducedMotion","overrides","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","variant","HEADER","stylesheet","shadowRef","baseRules","defaults","root","tokens","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\"","\"unavailable\"","\"retryLabel\"","display_default$3","\"copy\"","\"copied\"","\"copyFailed\"","feedback_default$3","\"region\"","\"regionWithHotkey\"","\"scrollLeft\"","\"scrollRight\"","forms_default$3","\"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","\"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\"","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\"","\"error\"","\"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","t","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","found","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","localDate","year","month","day","dayKey","addDays","days","monthStart","offset","sameMonth","STRICT_DAY_KEY","LOOSE_DAY_KEY","parseDayKey","inferStepPrecision","s","dot","clampNumber","formatNumberValue","precision","parseNumberDraft","trimmed","input","resolveSpace","resolveSize","getVirtualRange","itemHeight","extra","overscan","scrollTop","visibleCount","itemCount","matchesAccept","accept","rule","file","type","DEFAULT_TAG_SEPARATORS","splitBySeparators","separators","pattern","sep","findCascaderPath","level","o","flattenCascaderOptions","option","roundRating","ratingDisplayStars","stars5","fullCount","fraction","half","ratingStarFill","displayed","append","cn","inputs","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","list","updated","update","loadingChanged","previousDefault","closing","dismissAll","pause","resume","reset","isSelected","sameValues","createSelectionMachine","reduceValue","multiple","disabled","allowEmpty","locked","select","deselect","wanted","getTabsNavigationIndex","tabs","getTabsTabStop","tab","isTabDisabled","explicit","createTabsMachine","firstEnabled","getPickerColumns","getPickerSelectedOptions","resolve","samePath","createPickerMachine","choose","column","moved","selected","isEmptyFieldValue","lengthOf","EMAIL_RE","fieldValidators","flags","re","englishTranslator","toFieldError","isFieldInvalid","createFieldMachine","runSync","errors","validate","pending","machine","validateOn","dirty","inFlight","startAsync","results","getTotalPages","total","getPaginationVisibleRange","shown","canGoToPage","getPaginationKeyTarget","getPaginationItems","edge","hideEdges","pageItem","siblingCount","boundaryCount","compact","range","last","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/design.ts","../../../core/src/tokens/default-theme.ts","../../../core/src/theme/themes.ts","../../../core/src/theme/palettes.ts","../../../core/src/tokens/scales.ts","../../../core/src/tokens/accessibility.ts","../../../core/src/tokens/color.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/calendar-date.ts","../../../core/src/number-input.ts","../../../core/src/spacing.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/cn.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","// 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 { 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);\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","// 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","// 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 { formatColor, parseColor } from \"./color\";\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 /** 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 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 if (chosen) apply(palettes[chosen][mode]);\n else if (mode === \"dark\") apply(dark);\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 { 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 ...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 \"monacoCodeEditor\": {\n \"unavailable\": \"The editor is unavailable\",\n \"retry\": \"Retry\",\n \"retryLabel\": \"Retry editor\",\n \"loading\": \"Loading editor\"\n }\n}\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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"navTree\": {\n \"label\": \"ナビゲーション\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"エディターを利用できません\",\n \"retry\": \"再試行\",\n \"retryLabel\": \"エディターを再読み込み\",\n \"loading\": \"エディターを読み込み中\"\n }\n}\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 \"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 \"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 \"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 \"navTree\": {\n \"label\": \"导航\"\n },\n \"monacoCodeEditor\": {\n \"unavailable\": \"编辑器暂不可用\",\n \"retry\": \"重试\",\n \"retryLabel\": \"重试编辑器\",\n \"loading\": \"加载编辑器\"\n }\n}\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 \"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 \"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 \"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","// 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\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","// 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","/**\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","// 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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"}
|