dsh-niuma 0.2.2 → 0.2.3

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/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.js", "../src/holidays.mjs", "../src/core.mjs"],
4
- "sourcesContent": ["import React from 'react';\nimport {\n DEFAULTS,\n computeRates,\n earnedToday,\n formatDuration,\n formatMoney,\n monthSummary,\n normalizeConfig,\n yearSummary,\n} from '../core.mjs';\nimport {\n HOLIDAY_BLOCKS,\n HOLIDAY_BLOCKS_2027_ESTIMATED,\n HOLIDAY_ESTIMATE_2027,\n HOLIDAY_SOURCE,\n} from '../holidays.mjs';\n\n/**\n * dsh-niuma \u6D4F\u89C8\u5668\u534A\u4FA7\uFF1ADSH \u4FA7\u680F\u300C\u725B\u9A6C\u300D\u5165\u53E3 + \u4E2D\u680F\u5DE5\u8D44\u5B9E\u65F6\u8BA1\u6570\u5668\u9762\u677F\u3002\n *\n * \u6570\u636E\u6765\u6E90\uFF1A\n * GET /niuma/config \u2014\u2014 \u5BBF\u4E3B\u4FA7\u914D\u7F6E\uFF08\u62FF\u4E0D\u5230\u5C31\u7528\u5185\u7F6E DEFAULTS\uFF0C\u4ECD\u7136\u8BA1\u65F6\uFF09\n * POST /niuma/settings \u2014\u2014 \u9762\u677F\u5185\u6539\u914D\u7F6E\n *\n * \u8BA1\u7B97\u4E00\u5F8B\u8C03\u7528 ../core.mjs \u7684\u7EAF\u51FD\u6570\uFF08\u5BBF\u4E3B\u534A\u4FA7\u540C\u6E90\uFF09\uFF0C\u8FD9\u91CC\u53EA\u505A\u6E32\u67D3\u4E0E\u4EA4\u4E92\u3002\n * \u6837\u5F0F\u53EA\u7528 DSH \u4E3B\u9898\u53D8\u91CF --dsw-alias-*\uFF0C\u6DF1\u6D45\u8272\u4E3B\u9898\u4E0B\u90FD\u8DDF\u968F\u754C\u9762\uFF0C\u65E0\u9700\u4E3B\u9898\u68C0\u6D4B\u3002\n */\n\n/** \u5305\u540D\u5728\u6784\u5EFA\u671F\u7531 tools/build-client.mjs \u6CE8\u5165\uFF08define: __DSH_PLUGIN_NAME__\uFF09\u3002 */\nconst PKG_NAME = typeof __DSH_PLUGIN_NAME__ === 'string' ? __DSH_PLUGIN_NAME__ : 'dsh-niuma';\nconst SHORT_NAME = PKG_NAME.replace(/^dsh-/, '');\n/** \u4FA7\u680F id \u4E0E main \u9762\u677F key \u5FC5\u987B\u540C\u540D\uFF1BSPEC \u51BB\u7ED3\u4E3A 'niuma'\u3002 */\nconst SLOT_ID = SHORT_NAME === 'niuma' ? 'niuma' : SHORT_NAME;\nconst LOCALE_NS = SLOT_ID;\nconst ROUTE_BASE = `/${SHORT_NAME}`;\n\n/* ------------------------------------------------------------------ *\n * \u4E3B\u9898\u8272\uFF08\u5168\u90E8\u57FA\u4E8E DSH \u7684 --dsw-alias-* \u53D8\u91CF\uFF0C\u62EC\u53F7\u91CC\u662F\u53D8\u91CF\u7684\u515C\u5E95\u503C\uFF09\n * ------------------------------------------------------------------ */\nconst C = {\n label: 'var(--dsw-alias-label-primary, #1f2329)',\n label2: 'var(--dsw-alias-label-secondary, #5a6472)',\n label3: 'var(--dsw-alias-label-tertiary, #8a94a6)',\n border: 'var(--dsw-alias-border-l2, rgba(128,128,128,.28))',\n border1: 'var(--dsw-alias-border-l1, rgba(128,128,128,.16))',\n layer1: 'var(--dsw-alias-bg-layer-1, rgba(128,128,128,.06))',\n layer2: 'var(--dsw-alias-bg-layer-2, rgba(128,128,128,.10))',\n brand: 'var(--dsw-alias-brand-primary, #2f7dff)',\n ok: 'var(--dsw-alias-state-success-primary, #3fb950)',\n warn: 'var(--dsw-alias-state-warn-primary, #e3b341)',\n error: 'var(--dsw-alias-state-error-primary, #f85149)',\n};\n\n/** \u540C\u6392\u5361\u7247\u7EDF\u4E00\uFF1A\u5706\u89D2 / \u9634\u5F71 / \u5E95\u8272 / \u8FB9\u6846\u5B8C\u5168\u4E00\u81F4\u3002 */\nconst CARD = {\n border: `1px solid ${C.border1}`,\n borderRadius: 12,\n background: C.layer1,\n boxShadow: '0 1px 2px rgba(0,0,0,.07)',\n padding: '10px 12px',\n boxSizing: 'border-box',\n};\n\n/** \u6570\u5B57\uFF1A\u7B49\u5BBD\u6570\u4F4D + \u4E0D\u6362\u884C\uFF08\u6BCF\u79D2\u8DF3\u52A8\u65F6\u5BBD\u5EA6\u4E0D\u6296\uFF09\u3002 */\nconst NUM = { fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap' };\n\n/** \u91D1\u8272\u91D1\u989D\uFF1A\u6E10\u53D8\u91D1\u5C5E\u8D28\u611F + \u5355\u8272\u56DE\u9000\uFF08\u4E0D\u652F\u6301 background-clip:text \u65F6\u663E\u793A\u91D1\u8272\uFF09\u3002 */\nconst GOLD = {\n color: '#D9A441',\n backgroundImage: 'linear-gradient(180deg, #FFE9A8 0%, #F2C14E 40%, #D79A2B 72%, #B87A16 100%)',\n WebkitBackgroundClip: 'text',\n backgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n textShadow: '0 1px 0 rgba(0,0,0,.05)',\n};\nconst GOLD_TINT = '#E7B84D';\n\n/** \u72B6\u6001\u5FBD\u6807\u914D\u8272\uFF1A\u989C\u8272\u4E0E\u8BED\u4E49\u4E00\u81F4\uFF0C\u6DF1\u6D45\u8272\u90FD\u9760\u4E3B\u9898\u53D8\u91CF\u3002 */\nconst STATUS_META = {\n rest: { key: 'statusRest', color: C.label3 },\n before: { key: 'statusBefore', color: C.warn },\n working: { key: 'statusWorking', color: C.ok },\n lunch: { key: 'statusLunch', color: C.brand },\n off: { key: 'statusOff', color: C.label2 },\n};\n\n/* ------------------------------------------------------------------ *\n * \u6587\u6848\uFF08zh / en \u8986\u76D6\u9762\u677F\u6240\u6709\u53EF\u89C1\u6587\u6848\uFF09\n * ------------------------------------------------------------------ */\nconst zh = {\n 'nav': '\u725B\u9A6C',\n 'title': '\u725B\u9A6C\u52A0\u901F\u5668',\n 'subtitle': '\u4ECA\u65E5\u5DE5\u8D44\u5B9E\u65F6\u8BA1\u6570\u5668',\n 'earnedToday': '\u4ECA\u65E5\u5DF2\u8D5A',\n 'todayOn': '\u4ECA\u5929',\n 'perSecond': '\u6BCF\u79D2\u8FDB\u8D26',\n 'statusRest': '\u4F11\u606F\u65E5',\n 'statusBefore': '\u672A\u4E0A\u73ED',\n 'statusWorking': '\u642C\u7816\u4E2D',\n 'statusLunch': '\u5348\u4F11\u4E2D',\n 'statusOff': '\u5DF2\u4E0B\u73ED',\n 'todayProgress': '\u4ECA\u65E5\u8FDB\u5EA6',\n 'progressOfTarget': '\u5DF2\u8D5A / \u76EE\u6807',\n 'toStart': '\u8DDD\u4E0A\u73ED',\n 'toEnd': '\u8DDD\u4E0B\u73ED',\n 'secondWage': '\u79D2\u5DE5\u8D44',\n 'minuteWage': '\u5206\u5DE5\u8D44',\n 'hourlyWage': '\u65F6\u5DE5\u8D44',\n 'dailyWage': '\u65E5\u5DE5\u8D44',\n 'weeklyWage': '\u5468\u5DE5\u8D44',\n 'monthlyWage': '\u6708\u5DE5\u8D44',\n 'details': '\u660E\u7EC6',\n 'monthlySalaryLabel': '\u5B9E\u6536\u6708\u85AA',\n 'workdaysThisMonth': '\u5F53\u6708\u5DE5\u4F5C\u65E5',\n 'paidHoursPerDay': '\u65E5\u6709\u6548\u5DE5\u65F6',\n 'todayTarget': '\u4ECA\u65E5\u76EE\u6807',\n 'monthEarned': '\u672C\u6708\u5DF2\u8D5A',\n 'monthWorkedDays': '\u672C\u6708\u5DF2\u5DE5\u4F5C',\n 'monthRemainingDays': '\u5269\u4F59\u5DE5\u4F5C\u65E5',\n 'holidaySourceLink': '\u56FD\u52A1\u9662\u529E\u516C\u5385 2026 \u5E74\u8282\u5047\u65E5\u5B89\u6392',\n 'configLoading': '\u6B63\u5728\u8BFB\u53D6\u8BBE\u7F6E\u2026',\n 'configFailed': '\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C',\n 'retry': '\u91CD\u8BD5',\n 'settings': '\u8BBE\u7F6E',\n 'decimalsLabel': '\u5C0F\u6570',\n 'decimalsUnit': '\u4F4D',\n 'turboLabel': '\u52A0\u901F',\n 'refreshRate': '\u5237\u65B0\u9891\u7387',\n 'rateSecond': '\u6309\u79D2\uFF081s\uFF09',\n 'rateFrame': '\u5237\u65B0\u7387\uFF08\u224816ms\uFF09',\n 'settingsHint': '\u6539\u5B8C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF1B\u683C\u5F0F\u4E0D\u5BF9\u4F1A\u5728\u4E0B\u65B9\u7EA2\u5B57\u63D0\u793A\uFF0C\u4E0D\u5F71\u54CD\u8BA1\u65F6\u3002',\n 'salaryField': '\u5B9E\u6536\u6708\u85AA',\n 'groupSalary': '\u5DE5\u8D44',\n 'groupWorkTime': '\u5DE5\u4F5C\u65F6\u95F4',\n 'groupLunch': '\u5348\u4F11',\n 'salaryUnit': '\u5143 / \u6708',\n 'workStartField': '\u4E0A\u73ED\u65F6\u95F4',\n 'workEndField': '\u4E0B\u73ED\u65F6\u95F4',\n 'lunchEnabledField': '\u542F\u7528\u5348\u4F11',\n 'lunchEnabledShort': '\u542F\u7528',\n 'lunchStartField': '\u5348\u4F11\u5F00\u59CB',\n 'lunchEndField': '\u5348\u4F11\u7ED3\u675F',\n 'lunchPaidField': '\u5348\u4F11\u7B97\u5DE5\u65F6',\n 'lunchPaidShort': '\u7B97\u5DE5\u65F6',\n 'holidaysCardTitle': '\u8282\u5047\u65E5\u5B89\u6392',\n 'holidays2026Label': '2026 \u5E74\uFF08\u5B98\u65B9\uFF09',\n 'holidays2027Label': '2027 \u5E74\uFF08\u9884\u4F30\uFF09',\n 'holidayEstimateTag': '\u9884\u4F30',\n 'holidayEstimateNote': '\u5B98\u65B9\u5C1A\u672A\u516C\u5E03\uFF0C\u4EE5\u4E0A\u4E3A\u6309\u89C4\u5219\u4E0E\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4EE5\u56FD\u52A1\u9662\u901A\u77E5\u4E3A\u51C6\u3002',\n 'holidayEstimateShort': '2027 \u4E3A\u9884\u4F30\u503C',\n 'settingsDataNote': '\u8282\u5047\u65E5\u4E0E\u8C03\u4F11\u6570\u636E\u89C1\u4E0A\u65B9\u300C\u8282\u5047\u65E5\u5B89\u6392\u300D\u5361\u7247\uFF082027 \u5E74\u4E3A\u9884\u4F30\u503C\uFF0C\u4E0D\u53EF\u5728\u672C\u9875\u7F16\u8F91\uFF09\u3002',\n\n 'holidaysCardSub': '\u6CD5\u5B9A\u5047\u65E5 {days} \u5929 \u00B7 \u8C03\u4F11\u4E0A\u73ED {extra} \u5929',\n 'holidaysDaysShort': '{days} \u5929',\n 'holidaysExtraNote': '\u8C03\u4F11\u4E0A\u73ED\u65E5 {extra} \u5929\uFF08\u5468\u672B\u8865\u73ED\uFF0C\u6309\u5DE5\u4F5C\u65E5\u8BA1\uFF09',\n 'holidayNewYear': '\u5143\u65E6',\n 'holidaySpring': '\u6625\u8282',\n 'holidayQingming': '\u6E05\u660E',\n 'holidayLabour': '\u52B3\u52A8\u8282',\n 'holidayDragon': '\u7AEF\u5348',\n 'holidayMidAutumn': '\u4E2D\u79CB',\n 'holidayNational': '\u56FD\u5E86',\n 'save': '\u4FDD\u5B58',\n 'saving': '\u4FDD\u5B58\u4E2D\u2026',\n 'saved': '\u5DF2\u4FDD\u5B58',\n 'saveFailed': '\u4FDD\u5B58\u5931\u8D25\uFF1A',\n 'dayUnit': '\u5929',\n 'hourUnit': '\u5C0F\u65F6',\n 'minuteUnit': '\u5206\u949F',\n 'viewLabel': '\u67E5\u770B',\n 'viewCurrent': '\u672C\u6708',\n 'viewYear': '\u5168\u5E74\u5E73\u5747',\n 'monthUnit': '\u6708',\n 'holidayShort': '\u5047',\n 'currentHint': '\u6309\u6BCF\u6708 {days} \u4E2A\u5DE5\u4F5C\u65E5\u3001\u6BCF\u5929 {hours} \u5C0F\u65F6\u8BA1',\n 'monthHint': '{year} \u5E74 {month} \u6708 \u00B7 \u5DE5\u4F5C\u65E5 {workdays} \u5929 \u00B7 \u6CD5\u5B9A\u5047\u65E5 {holidays} \u5929',\n 'yearHint': '{year} \u5168\u5E74 \u00B7 {workdays} \u4E2A\u5DE5\u4F5C\u65E5 \u00B7 \u6309\u5E74\u6536\u5165\u6298\u7B97',\n 'viewOnlyHint': '\u4EC5\u6362\u7B97\uFF0C\u4E0D\u5F71\u54CD\u4ECA\u65E5\u8BA1\u6570\u5668',\n 'yearWorkdays': '\u5168\u5E74\u5DE5\u4F5C\u65E5',\n 'yearIncome': '\u5168\u5E74\u6536\u5165',\n 'averageDaily': '\u5E73\u5747\u65E5\u85AA',\n 'averageHourly': '\u5E73\u5747\u65F6\u85AA',\n 'averageMinute': '\u5E73\u5747\u5206\u85AA',\n 'averageSecond': '\u5E73\u5747\u79D2\u85AA',\n 'monthWorkdaysCard': '\u5DE5\u4F5C\u65E5',\n 'maxHolidayBadge': '\u5168\u5E74\u5047\u65E5\u6700\u591A',\n 'maxHolidayNote': '\u5168\u5E74\u5047\u65E5\u6700\u591A\uFF1A{month} \u6708\uFF08\u6CD5\u5B9A\u5047\u65E5 {days} \u5929\uFF09',\n 'maxHolidayThis': '\u5168\u5E74\u5047\u65E5\u6700\u591A\u7684\u6708\u4EFD\uFF08\u6CD5\u5B9A\u5047\u65E5 {days} \u5929\uFF09',\n 'sectionRates': '\u5DE5\u8D44\u6362\u7B97',\n 'sectionRatesHint': '\u6309\u6BCF\u6708 {days} \u4E2A\u5DE5\u4F5C\u65E5\u3001\u6BCF\u5929 {hours} \u5C0F\u65F6\u8BA1',\n 'sectionDetail': '\u4ECA\u65E5\u53E3\u5F84\u660E\u7EC6',\n 'restHint': '\u4ECA\u5929\u4F11\u606F\uFF0C\u597D\u597D\u8EBA\u5E73',\n 'liveNow': '\u5B9E\u65F6',\n};\n\nconst en = {\n 'nav': 'Niuma',\n 'title': 'Niuma Booster',\n 'subtitle': 'Real-time salary ticker',\n 'earnedToday': 'Earned today',\n 'todayOn': 'Today',\n 'perSecond': 'Per second',\n 'statusRest': 'Day off',\n 'statusBefore': 'Not started',\n 'statusWorking': 'Working',\n 'statusLunch': 'Lunch break',\n 'statusOff': 'Off work',\n 'todayProgress': 'Today progress',\n 'progressOfTarget': 'Earned / target',\n 'toStart': 'Until start',\n 'toEnd': 'Until off',\n 'secondWage': 'Per second',\n 'minuteWage': 'Per minute',\n 'hourlyWage': 'Per hour',\n 'dailyWage': 'Per day',\n 'weeklyWage': 'Per week',\n 'monthlyWage': 'Per month',\n 'details': 'Details',\n 'monthlySalaryLabel': 'Net monthly salary',\n 'workdaysThisMonth': 'Workdays this month',\n 'paidHoursPerDay': 'Paid hours / day',\n 'todayTarget': \"Today's target\",\n 'monthEarned': 'Earned this month',\n 'monthWorkedDays': 'Worked this month',\n 'monthRemainingDays': 'Workdays left',\n 'holidaySourceLink': 'State Council 2026 holiday schedule',\n 'configLoading': 'Loading settings\u2026',\n 'configFailed': 'Failed to load settings, using defaults',\n 'retry': 'Retry',\n 'settings': 'Settings',\n 'decimalsLabel': 'Decimals',\n 'decimalsUnit': 'dp',\n 'turboLabel': 'Turbo',\n 'refreshRate': 'Refresh rate',\n 'rateSecond': 'Per second (1s)',\n 'rateFrame': 'Display rate (~16ms)',\n 'settingsHint': 'Click Save to apply. Invalid input is shown in red below; the ticker keeps running.',\n 'salaryField': 'Net monthly salary',\n 'groupSalary': 'Salary',\n 'groupWorkTime': 'Working hours',\n 'groupLunch': 'Lunch break',\n 'salaryUnit': 'CNY / month',\n 'workStartField': 'Work start',\n 'workEndField': 'Work end',\n 'lunchEnabledField': 'Enable lunch break',\n 'lunchEnabledShort': 'On',\n 'lunchStartField': 'Lunch start',\n 'lunchEndField': 'Lunch end',\n 'lunchPaidField': 'Lunch is paid',\n 'lunchPaidShort': 'Paid',\n 'holidaysCardTitle': 'Holiday calendar',\n 'holidays2026Label': '2026 (official)',\n 'holidays2027Label': '2027 (estimated)',\n 'holidayEstimateTag': 'estimate',\n 'holidayEstimateNote': 'Not announced officially yet \u2014 estimated from the rules and past practice, for reference only.',\n 'holidayEstimateShort': '2027 is estimated',\n 'settingsDataNote': 'Holiday data lives in the calendar card above (2027 values are estimates and not editable here).',\n\n 'holidaysCardSub': '{days} statutory days \u00B7 {extra} make-up workdays',\n 'holidaysDaysShort': '{days} d',\n 'holidaysExtraNote': '{extra} make-up workdays (weekend shifts, counted as workdays)',\n 'holidayNewYear': \"New Year's Day\",\n 'holidaySpring': 'Spring Festival',\n 'holidayQingming': 'Qingming',\n 'holidayLabour': 'Labour Day',\n 'holidayDragon': 'Dragon Boat',\n 'holidayMidAutumn': 'Mid-Autumn',\n 'holidayNational': 'National Day',\n 'save': 'Save',\n 'saving': 'Saving\u2026',\n 'saved': 'Saved',\n 'saveFailed': 'Save failed: ',\n 'dayUnit': 'd',\n 'hourUnit': 'h',\n 'minuteUnit': 'min',\n 'viewLabel': 'View',\n 'viewCurrent': 'This month',\n 'viewYear': 'Year average',\n 'monthUnit': 'M',\n 'holidayShort': 'hol.',\n 'currentHint': '{days} workdays / month \u00B7 {hours} h / day',\n 'monthHint': '{year}-{month} \u00B7 {workdays} workdays \u00B7 {holidays} statutory holidays',\n 'yearHint': '{year} \u00B7 {workdays} workdays \u00B7 averaged over the year',\n 'viewOnlyHint': 'Conversion only \u2014 today\\'s ticker is unaffected',\n 'yearWorkdays': 'Workdays / year',\n 'yearIncome': 'Annual income',\n 'averageDaily': 'Avg per day',\n 'averageHourly': 'Avg per hour',\n 'averageMinute': 'Avg per minute',\n 'averageSecond': 'Avg per second',\n 'monthWorkdaysCard': 'Workdays',\n 'maxHolidayBadge': 'Most holidays',\n 'maxHolidayNote': 'Most holidays: month {month} ({days} statutory days)',\n 'maxHolidayThis': 'The month with the most holidays ({days} statutory days)',\n 'sectionRates': 'Pay rates',\n 'sectionRatesHint': '{days} workdays / month \u00B7 {hours} h / day',\n 'sectionDetail': \"Today's basis\",\n 'restHint': 'Day off \u2014 enjoy it',\n 'liveNow': 'LIVE',\n};\n\n/** \u7EC4\u4EF6\u5728\u6CA1\u6709 locale \u6CE8\u5165 t \u65F6\uFF08\u6D4B\u8BD5 / \u515C\u5E95\uFF09\u76F4\u63A5\u8BFB\u4E2D\u6587\u8868\uFF0C\u7EDD\u4E0D\u767D\u5C4F\u3002 */\nconst fallbackTranslate = (key) => (zh[key] != null ? zh[key] : key);\n\n/* ------------------------------------------------------------------ *\n * \u683C\u5F0F\u5316\u5C0F\u5DE5\u5177\n * ------------------------------------------------------------------ */\nconst money = (value, digits = 2) => `${formatMoney(value, digits)} \u5143`;\n\n/** 8.00 -> '8'\uFF0C8.50 -> '8.5'\uFF08\u5DE5\u65F6\u5C55\u793A\u7528\uFF09 */\nfunction trimNumber(value, digits = 2) {\n const fixed = Number(value || 0).toFixed(digits);\n return fixed.replace(/\\.?0+$/, '') || '0';\n}\n\n/** \u914D\u7F6E -> \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F\uFF08\u6240\u6709\u8F93\u5165\u6846\u90FD\u662F\u5B57\u7B26\u4E32 / \u5E03\u5C14\uFF0C\u7F16\u8F91\u4E2D\u4E0D\u6253\u65AD\u8BA1\u65F6\uFF09\u3002 */\nfunction formFromConfig(config) {\n return {\n monthlySalary: String(config.monthlySalary == null ? '' : config.monthlySalary),\n workStart: String(config.workStart == null ? '' : config.workStart),\n workEnd: String(config.workEnd == null ? '' : config.workEnd),\n lunchEnabled: config.lunchEnabled !== false,\n lunchStart: String(config.lunchStart == null ? '' : config.lunchStart),\n lunchEnd: String(config.lunchEnd == null ? '' : config.lunchEnd),\n lunchPaid: config.lunchPaid === true,\n updateMs: String(config.updateMs == null ? 1000 : config.updateMs),\n };\n}\n\n/** \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F -> \u63D0\u4EA4\u7ED9\u5BBF\u4E3B\u7684\u914D\u7F6E patch\u3002 */\nfunction patchFromForm(form) {\n const salaryText = String(form.monthlySalary == null ? '' : form.monthlySalary).trim();\n return {\n monthlySalary: salaryText === '' ? Number.NaN : Number(salaryText),\n workStart: String(form.workStart || '').trim(),\n workEnd: String(form.workEnd || '').trim(),\n lunchEnabled: Boolean(form.lunchEnabled),\n lunchStart: String(form.lunchStart || '').trim(),\n lunchEnd: String(form.lunchEnd || '').trim(),\n lunchPaid: Boolean(form.lunchPaid),\n updateMs: Number(form.updateMs),\n };\n}\n\n/* ------------------------------------------------------------------ *\n * \u6570\u636E\u83B7\u53D6\n * ------------------------------------------------------------------ */\n/**\n * \u8BFB\u53D6\u5BBF\u4E3B\u914D\u7F6E\u3002\u5931\u8D25\u65F6 state.status='failed'\uFF0C\u9762\u677F\u7528 DEFAULTS \u7EE7\u7EED\u8BA1\u65F6\u5E76\u7ED9\u51FA\u53EF\u8BFB\u63D0\u793A\u3002\n * \u8F6E\u8BE2\uFF1A\u53EA\u6709\u300C\u91CD\u8BD5\u300D\u6309\u94AE\u4F1A refresh\u3002\n */\nfunction useRemoteConfig() {\n const [state, setState] = React.useState({ status: 'loading', data: null, error: null });\n const [tick, setTick] = React.useState(0);\n React.useEffect(() => {\n let alive = true;\n if (typeof fetch !== 'function') {\n setState({ status: 'failed', data: null, error: 'fetch unavailable' });\n return undefined;\n }\n setState((prev) => ({ status: prev.data ? 'ready' : 'loading', data: prev.data, error: null }));\n fetch(`${ROUTE_BASE}/config`, { cache: 'no-store', credentials: 'same-origin' })\n .then(async (response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const body = await response.json();\n if (!body || body.ok !== true) throw new Error((body && body.error) || 'bad payload');\n return body.data || null;\n })\n .then((data) => {\n if (alive) setState({ status: 'ready', data, error: null });\n })\n .catch((error) => {\n if (alive) {\n setState((prev) => ({\n status: 'failed',\n data: prev.data,\n error: String((error && error.message) || error),\n }));\n }\n });\n return () => { alive = false; };\n }, [tick]);\n const refresh = React.useCallback(() => setTick((n) => n + 1), []);\n return { ...state, refresh };\n}\n\n/**\n * \u5F53\u524D\u65F6\u95F4\uFF1A\u6309\u914D\u7F6E\u7684\u5237\u65B0\u95F4\u9694\u66F4\u65B0\u3002\n * - updateMs >= 50\uFF1AsetInterval\uFF08\u6309\u79D2 / 200ms / 100ms\uFF09\n * - updateMs <= 16\uFF1ArequestAnimationFrame\uFF08\u8DDF\u968F\u5C4F\u5E55\u5237\u65B0\u7387\u8FDE\u7EED\u6EDA\u52A8\uFF09\n */\nfunction useClock(updateMs) {\n const [now, setNow] = React.useState(() => new Date());\n React.useEffect(() => {\n if (updateMs <= 16) {\n let raf = 0;\n const loop = () => {\n setNow(new Date());\n raf = requestAnimationFrame(loop);\n };\n raf = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(raf);\n }\n const timer = setInterval(() => setNow(new Date()), updateMs);\n return () => clearInterval(timer);\n }, [updateMs]);\n return now;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C0F\u7EC4\u4EF6\n * ------------------------------------------------------------------ */\n/** \u4FA7\u680F\u5165\u53E3\u56FE\u6807\uFF1A\u949E\u7968 + \u786C\u5E01\uFF08\u81EA\u7ED8 SVG\uFF0C\u4E0D\u4F9D\u8D56 primitives\uFF09\u3002 */\nfunction NiumaIcon(props) {\n const size = (props && props.size) || 16;\n const active = props && props.active;\n return React.createElement('svg', {\n width: size,\n height: size,\n viewBox: '0 0 16 16',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.3,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n style: { opacity: active ? 1 : 0.82 },\n 'aria-hidden': 'true',\n }, [\n React.createElement('rect', { key: 'a', x: '1.4', y: '3.6', width: '13.2', height: '8.8', rx: '1.8' }),\n React.createElement('circle', { key: 'b', cx: '8', cy: '8', r: '2.1' }),\n React.createElement('path', { key: 'c', d: 'M4 8h.01M12 8h.01' }),\n ]);\n}\n\n/** \u5168\u5C40\u5C0F\u6837\u5F0F\uFF1A\u53EA\u653E\u52A8\u6548 keyframes\uFF08\u5185\u8054 style \u5199\u4E0D\u4E86 keyframes\uFF09\u3002\u7EC4\u4EF6\u5185\u8054\u6837\u5F0F\u4ECD\u662F\u4E3B\u4F53\u3002 */\nconst PANEL_CSS = `\n@keyframes niumaPulse { 0%,100% { opacity: .95; transform: scale(1); } 50% { opacity: .3; transform: scale(.68); } }\n@media (prefers-reduced-motion: reduce) { .niuma-live-dot { animation: none !important; } }\n`;\n\nfunction StyleTag() {\n return React.createElement('style', null, PANEL_CSS);\n}\n\n/** \u72B6\u6001\u5FBD\u6807\uFF1A\u4F11\u606F\u65E5 / \u672A\u4E0A\u73ED / \u642C\u7816\u4E2D / \u5348\u4F11\u4E2D / \u5DF2\u4E0B\u73ED\u3002 */\nfunction StatusBadge(props) {\n const t = props.t;\n const meta = STATUS_META[props.status] || STATUS_META.rest;\n const live = props.status === 'working';\n return React.createElement('span', {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 11px 4px 9px',\n borderRadius: 999,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.5,\n color: meta.color,\n border: `1px solid color-mix(in srgb, ${meta.color} 42%, transparent)`,\n background: `color-mix(in srgb, ${meta.color} 12%, transparent)`,\n whiteSpace: 'nowrap',\n },\n }, [\n React.createElement('i', {\n key: 'dot',\n className: live ? 'niuma-live-dot' : undefined,\n style: { width: 6, height: 6, borderRadius: '50%', background: meta.color, display: 'inline-block' },\n }),\n t(meta.key),\n ]);\n}\n\n/** \u5C0F\u8282\u6807\u9898\uFF1A\u5DE6\u6807\u9898 + \u53F3\u53E3\u5F84\u63D0\u793A\uFF08\u540C\u4E00\u884C\uFF0C\u7A84\u5C4F\u81EA\u52A8\u6362\u884C\uFF09\u3002 */\nfunction SectionTitle(props) {\n return React.createElement('div', {\n style: {\n display: 'flex', alignItems: 'baseline', justifyContent: 'space-between',\n gap: 8, flexWrap: 'wrap', margin: '2px 1px -1px',\n },\n }, [\n React.createElement('span', {\n key: 't',\n style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' },\n }, props.title),\n props.hint\n ? React.createElement('span', { key: 'h', style: { fontSize: 10.5, color: C.label3, ...NUM } }, props.hint)\n : null,\n ]);\n}\n\n/** \u4ECA\u65E5\u5DF2\u8D5A\u4E3B\u5361\uFF1A\u6E10\u53D8\u5E95 + \u8D85\u5927\u91D1\u989D + \u8FDB\u5EA6\u6761\uFF08\u89C6\u89C9\u7126\u70B9\u53EA\u6709\u8FD9\u4E00\u5904\uFF09\u3002 */\n/* ------------------------------------------------------------------ *\n * \u6EDA\u52A8\u91D1\u989D\uFF1A\u8FDE\u7EED\u7684\u300C\u673A\u68B0\u91CC\u7A0B\u8868\u300D\n * \u6BCF\u4E00\u4F4D\u4E0D\u662F\u7B49\u91D1\u989D\u53D8\u4E86\u624D\u8DF3\u4E00\u683C\uFF0C\u800C\u662F\u6309\u4F4D\u6743\u8FDE\u7EED\u8F6C\u52A8\uFF1A\n * \u6700\u540E\u4E00\u4F4D\u5C0F\u6570\u8F6C\u5F97\u98DE\u5FEB\uFF080-9 \u5FAA\u73AF\uFF09\uFF0C\u524D\u4E00\u4F4D\u6162 10 \u500D\uFF0C\u6574\u6570\u4F4D\u51E0\u4E4E\u4E0D\u52A8\u3002\n * \u52A0\u901F\u6A21\u5F0F\u4E0B\u6BCF\u5E27\uFF08rAF\uFF09\u66F4\u65B0 wheel \u4F4D\u7F6E\uFF0C\u770B\u8D77\u6765\u5C31\u662F\u6570\u5B57\u5728\u6301\u7EED\u5F80\u4E0A\u6EDA\u3002\n * ------------------------------------------------------------------ */\nconst ROLL_BLOCKS = Array.from({ length: 11 }, (_, i) => String(i % 10));\n\n/** \u5355\u4E2A\u6570\u5B57\u8F6E\uFF1A`position` \u662F\u8FDE\u7EED\u4F4D\u7F6E\uFF08\u5355\u4F4D=1 \u4E2A\u6570\u5B57\u683C\uFF0C\u5C0F\u6570\u90E8\u5206=\u6EDA\u5230\u4E00\u534A\uFF09\u3002 */\nfunction RollingDigit(props) {\n const heightEm = 1.22;\n const widthEm = 0.62;\n const pos = Number.isFinite(props.position) ? props.position : 0;\n const wheel = ((pos % 10) + 10) % 10;\n return React.createElement('span', {\n 'aria-hidden': 'true',\n style: {\n display: 'inline-block', position: 'relative', overflow: 'hidden',\n width: `${widthEm}em`, height: `${heightEm}em`, verticalAlign: 'baseline',\n },\n }, [\n React.createElement('span', {\n key: 'ghost',\n style: { visibility: 'hidden', display: 'block', height: `${heightEm}em`, lineHeight: `${heightEm}em` },\n }, '0'),\n React.createElement('span', {\n key: 'strip',\n style: {\n position: 'absolute', left: 0, top: 0, display: 'flex', flexDirection: 'column',\n transform: `translateY(${-(wheel * heightEm)}em)`,\n willChange: 'transform',\n },\n }, ROLL_BLOCKS.map((value, i) => React.createElement('span', {\n key: i,\n style: { display: 'block', height: `${heightEm}em`, lineHeight: `${heightEm}em` },\n }, value))),\n ]);\n}\n\n/**\n * \u91D1\u989D \u2192 \u8FDE\u7EED\u6EDA\u8F6E\u3002`value` \u662F\u539F\u59CB\u91D1\u989D\uFF0C`decimals` \u51B3\u5B9A\u5C0F\u6570\u4F4D\u3002\n * \u6BCF\u4E00\u4F4D\u7684\u8F6E\u4F4D = value * 10^decimals / 10^(\u8BE5\u4F4D\u53F3\u4FA7\u6570\u5B57\u4E2A\u6570)\uFF0C\u56E0\u6B64\u4F4E\u4F4D\u5FEB\u3001\u9AD8\u4F4D\u6162\u3002\n */\nfunction RollingMoney(props) {\n const decimals = Math.max(0, Math.min(6, Number.isInteger(props.decimals) ? props.decimals : 4));\n const text = formatMoney(props.value, decimals);\n const scale = 10 ** decimals;\n // \u4ECE\u53F3\u5F80\u5DE6\u6570\u300C\u8BE5\u4F4D\u53F3\u4FA7\u8FD8\u6709\u51E0\u4E2A\u6570\u5B57\u300D\uFF0C\u5F97\u5230\u6BCF\u4F4D\u4F4D\u6743\n const chars = text.split('');\n const significances = new Array(chars.length).fill(-1);\n let seen = 0;\n for (let i = chars.length - 1; i >= 0; i -= 1) {\n if (/[0-9]/.test(chars[i])) {\n significances[i] = seen;\n seen += 1;\n }\n }\n return React.createElement('span', {\n style: {\n display: 'inline-flex', alignItems: 'baseline', letterSpacing: 0, position: 'relative',\n // \u7B49\u5BBD\u5B57\u4F53\u4FDD\u8BC1\u6BCF\u4E2A\u6570\u5B57\u8F6E\u5BBD\u5EA6\u7A33\u5B9A\uFF08\u4E0D\u88C1\u5B57\u3001\u4E0D\u6296\u52A8\uFF09\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n ...(props.style || {}),\n },\n }, [\n React.createElement('span', {\n key: 'sr',\n style: {\n position: 'absolute', width: 1, height: 1, padding: 0, margin: -1,\n overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: 0,\n },\n }, text),\n React.createElement('span', {\n key: 'visual',\n 'aria-hidden': 'true',\n style: { display: 'inline-flex', alignItems: 'baseline' },\n }, chars.map((char, i) => {\n if (!/[0-9]/.test(char)) {\n return React.createElement('span', {\n key: `s${i}`,\n style: { display: 'inline-block', lineHeight: '1.22em' },\n }, char);\n }\n const position = (Number(props.value) || 0) * scale / 10 ** significances[i];\n return React.createElement(RollingDigit, { key: `d${i}`, position });\n })),\n ]);\n}\n\nfunction HeroCard(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\n const decimals = Number.isInteger(props.decimals) ? props.decimals : 4;\n const onDecimalsChange = props.onDecimalsChange;\n const turbo = props.turbo === true;\n const onTurboChange = props.onTurboChange;\n const progress = Math.max(0, Math.min(1, Number(snap.todayProgress) || 0));\n const percentText = `${(progress * 100).toFixed(1)}%`;\n const live = snap.status === 'working';\n const rest = snap.status === 'rest';\n const heroBackground = 'linear-gradient(135deg, '\n + 'color-mix(in srgb, ' + C.brand + ' 17%, ' + C.layer1 + ') 0%, '\n + C.layer1 + ' 58%, ' + C.layer1 + ' 100%)';\n return React.createElement('div', {\n style: {\n position: 'relative',\n overflow: 'hidden',\n borderRadius: 18,\n padding: '16px 18px 14px',\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 34%, ${C.border1})`,\n background: heroBackground,\n boxShadow: '0 12px 30px rgba(0,0,0,.10)',\n boxSizing: 'border-box',\n minWidth: 0,\n },\n }, [\n React.createElement('div', {\n key: 'glow',\n 'aria-hidden': 'true',\n style: {\n position: 'absolute', right: -52, top: -72, width: 188, height: 188, borderRadius: '50%',\n background: `radial-gradient(circle, color-mix(in srgb, ${GOLD_TINT} 30%, transparent) 0%, transparent 68%)`,\n pointerEvents: 'none',\n },\n }),\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'a',\n style: { display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 12.5, fontWeight: 600, color: C.label2 },\n }, [\n live\n ? React.createElement('i', {\n key: 'dot',\n className: 'niuma-live-dot',\n style: { width: 7, height: 7, borderRadius: '50%', background: C.ok, display: 'inline-block' },\n })\n : null,\n t('earnedToday'),\n ]),\n React.createElement('span', { key: 'b', style: { fontSize: 11, color: C.label3, ...NUM } },\n `${t('todayOn')} ${snap.dateKey}`),\n ]),\n React.createElement('div', {\n key: 'amt',\n style: { display: 'flex', alignItems: 'baseline', gap: 7, marginTop: 4, flexWrap: 'wrap' },\n }, [\n React.createElement(RollingMoney, {\n key: 'val',\n value: snap.todayEarned,\n decimals,\n style: {\n fontSize: 46, lineHeight: 1.12, fontWeight: 800,\n ...GOLD,\n ...NUM,\n ...(rest ? { opacity: 0.62 } : {}),\n },\n }),\n React.createElement('span', {\n key: 'unit',\n style: { fontSize: 18, fontWeight: 700, color: C.label2, ...NUM },\n }, '\u5143'),\n React.createElement('label', {\n key: 'dec',\n title: t('decimalsLabel'),\n style: {\n marginLeft: 'auto', display: 'inline-flex', alignItems: 'center', gap: 3,\n fontSize: 10, color: C.label3, ...NUM,\n },\n }, [\n React.createElement('span', { key: 'l' }, t('decimalsLabel')),\n React.createElement('select', {\n key: 's',\n value: String(decimals),\n 'aria-label': t('decimalsLabel'),\n onChange: (event) => onDecimalsChange && onDecimalsChange(Number(event.target.value)),\n style: {\n height: 22, padding: '0 2px', borderRadius: 6,\n border: `1px solid ${C.border1}`, background: C.layer2, color: C.label2,\n fontSize: 10.5, fontVariantNumeric: 'tabular-nums', outline: 'none', cursor: 'pointer',\n },\n }, [0, 1, 2, 3, 4, 5, 6].map((n) => React.createElement('option', { key: n, value: String(n) }, String(n)))),\n React.createElement('span', { key: 'u' }, t('decimalsUnit')),\n ]),\n React.createElement('label', {\n key: 'turbo',\n title: t('turboLabel'),\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 3,\n fontSize: 10, padding: '1px 6px', borderRadius: 999,\n border: `1px solid ${turbo ? `color-mix(in srgb, ${GOLD_TINT} 60%, ${C.border1})` : C.border1}`,\n background: turbo ? `color-mix(in srgb, ${GOLD_TINT} 16%, transparent)` : 'transparent',\n color: turbo ? C.label2 : C.label3, cursor: 'pointer', ...NUM,\n },\n }, [\n React.createElement('input', {\n key: 'i', type: 'checkbox', checked: turbo,\n onChange: (event) => onTurboChange && onTurboChange(event.target.checked),\n style: { accentColor: GOLD_TINT, width: 12, height: 12, margin: 0, cursor: 'inherit' },\n }),\n React.createElement('span', { key: 'l' }, t('turboLabel')),\n ]),\n ]),\n React.createElement('div', {\n key: 'chips',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, marginTop: 5, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'per',\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4,\n fontSize: 11.5, fontWeight: 600, color: C.label2,\n background: `color-mix(in srgb, ${C.brand} 11%, transparent)`,\n border: `1px solid color-mix(in srgb, ${C.brand} 22%, transparent)`,\n borderRadius: 999, padding: '2px 9px', ...NUM,\n },\n }, `${t('perSecond')} +${money(rates.secondWage, 4)}`),\n React.createElement('span', { key: 'target', style: { fontSize: 11, color: C.label3, ...NUM } },\n rest ? t('restHint') : `${t('todayTarget')} ${money(snap.todayTarget, 2)}`),\n ]),\n React.createElement('div', {\n key: 'progTop',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, marginTop: 13, flexWrap: 'wrap' },\n }, [\n React.createElement('span', { key: 'l', style: { fontSize: 11.5, color: C.label3 } }, t('todayProgress')),\n React.createElement('span', { key: 'p', style: { fontSize: 12.5, fontWeight: 700, color: C.brand, ...NUM } }, percentText),\n ]),\n React.createElement('div', {\n key: 'bar',\n style: { marginTop: 5, height: 9, borderRadius: 999, background: `color-mix(in srgb, ${C.label} 9%, transparent)`, overflow: 'hidden' },\n }, [\n React.createElement('div', {\n key: 'fill',\n style: {\n width: `${(progress * 100).toFixed(2)}%`, height: '100%', borderRadius: 999,\n background: `linear-gradient(90deg, ${C.brand} 0%, color-mix(in srgb, ${C.brand} 55%, ${C.ok}) 100%)`,\n transition: 'width .35s linear',\n },\n }),\n ]),\n React.createElement('div', {\n key: 'progNum',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, marginTop: 5, flexWrap: 'wrap', fontSize: 10.5, color: C.label3 },\n }, [\n React.createElement('span', { key: 'a' }, t('progressOfTarget')),\n React.createElement('span', { key: 'b', style: { color: C.label2, fontWeight: 600, ...NUM } },\n `${money(snap.todayEarned, 2)} / ${money(snap.todayTarget, 2)}`),\n ]),\n ]);\n}\n\n/** \u5012\u8BA1\u65F6\u4E24\u5F20\u5C0F\u5361\uFF1A\u8DDD\u4E0A\u73ED / \u8DDD\u4E0B\u73ED\u3002 */\nfunction CountdownRow(props) {\n const t = props.t;\n const snap = props.snap;\n const chip = (key, label, value, accent) => React.createElement('div', {\n key,\n style: {\n flex: '1 1 120px', minWidth: 116,\n display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8,\n padding: '9px 12px', borderRadius: 12,\n background: accent ? `color-mix(in srgb, ${GOLD_TINT} 9%, ${C.layer1})` : C.layer1,\n border: `1px solid ${accent ? `color-mix(in srgb, ${GOLD_TINT} 38%, ${C.border1})` : C.border1}`,\n boxSizing: 'border-box',\n },\n }, [\n React.createElement('span', {\n key: 'l',\n style: { fontSize: 11, color: accent ? C.label2 : C.label3, whiteSpace: 'nowrap' },\n }, label),\n React.createElement('span', {\n key: 'v',\n style: { fontSize: 13.5, fontWeight: 700, color: C.label, ...NUM },\n }, value),\n ]);\n return React.createElement('div', {\n style: { display: 'flex', flexWrap: 'wrap', gap: 9 },\n }, [\n chip('start', t('toStart'), Number(snap.secondsToStart) > 0 ? formatDuration(snap.secondsToStart) : '\u2014'),\n chip('end', t('toEnd'), Number(snap.secondsToEnd) > 0 ? formatDuration(snap.secondsToEnd) : '\u2014'),\n chip('month', t('monthEarned'), money(snap.monthEarned, 2), true),\n ]);\n}\n\n/** \u516D\u5BAB\u683C\uFF1A\u79D2 / \u5206 / \u65F6 / \u65E5 / \u5468 / \u6708\u5DE5\u8D44\uFF1B\u7B2C\u4E00\u5F20\u300C\u79D2\u5DE5\u8D44\u300D\u7528\u54C1\u724C\u8272\u5F3A\u8C03\u3002 */\nconst RATE_CARDS = [\n { key: 'secondWage', label: 'secondWage', digits: 4 },\n { key: 'minuteWage', label: 'minuteWage', digits: 4 },\n { key: 'hourlyWage', label: 'hourlyWage', digits: 2 },\n { key: 'dailyWage', label: 'dailyWage', digits: 2 },\n { key: 'weeklyWage', label: 'weeklyWage', digits: 2 },\n { key: 'monthlyWage', label: 'monthlyWage', digits: 2 },\n];\n\n/** \u5DE5\u8D44\u6362\u7B97\u7F51\u683C\uFF1A\u7531\u8C03\u7528\u65B9\u7ED9\u51FA {key,label,value,accent} \u5361\u7247\uFF08\u672C\u6708 / \u6307\u5B9A\u6708 / \u5168\u5E74\u5E73\u5747\u4E09\u79CD\u89C6\u89D2\uFF09\u3002 */\nfunction RatesGrid(props) {\n const cards = Array.isArray(props.cards) ? props.cards : [];\n return React.createElement('div', {\n style: { display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 8 },\n }, cards.map((card, index) => {\n const accent = card.accent === true;\n return React.createElement('div', {\n key: card.key,\n 'data-stat': `stat-${index}`,\n style: {\n ...CARD,\n padding: '10px 11px',\n borderRadius: 12,\n ...(accent ? {\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 46%, ${C.border1})`,\n background: `color-mix(in srgb, ${GOLD_TINT} 9%, ${C.layer1})`,\n } : {}),\n },\n }, [\n React.createElement('div', {\n key: 'l',\n style: { fontSize: 11, color: accent ? C.label2 : C.label3, fontWeight: accent ? 600 : 400 },\n }, card.label),\n React.createElement('div', {\n key: 'v',\n style: {\n fontSize: 15.5, fontWeight: 700, letterSpacing: '-.2px',\n color: accent ? C.label : C.label, marginTop: 2, ...NUM,\n },\n }, card.value),\n ]);\n }));\n}\n\n/** \u6708\u4EFD / \u5168\u5E74\u89C6\u89D2\u9009\u62E9\u5668\uFF08\u539F\u751F select\uFF0C\u6DF1\u6D45\u8272\u90FD\u7528\u4E3B\u9898\u53D8\u91CF\uFF09\u3002 */\nfunction PeriodSelect(props) {\n const t = props.t;\n const year = props.year;\n const months = props.months;\n const style = {\n appearance: 'none',\n WebkitAppearance: 'none',\n border: `1px solid ${C.border}`,\n background: C.layer2,\n color: C.label,\n borderRadius: 8,\n padding: '4px 9px',\n fontSize: 12,\n fontWeight: 600,\n cursor: 'pointer',\n outline: 'none',\n maxWidth: 220,\n };\n return React.createElement('select', {\n value: props.value,\n 'aria-label': t('viewLabel'),\n onChange: (event) => props.onChange(event.target.value),\n style,\n }, [\n React.createElement('option', { key: 'current', value: 'current' }, t('viewCurrent')),\n ...months.map((month) => React.createElement('option', {\n key: `m${month.month}`,\n value: `m${month.month}`,\n }, `${month.month}${t('monthUnit')} \u00B7 ${month.workdays}${t('dayUnit')} \u00B7 ${t('holidayShort')}${month.holidayDays}`)),\n React.createElement('option', { key: 'year', value: 'year' }, `${year} ${t('viewYear')}`),\n ]);\n}\n\n/** \u53E3\u5F84\u660E\u7EC6\uFF1A\u6708\u85AA / \u5DE5\u4F5C\u65E5 / \u65E5\u5DE5\u65F6 / \u4ECA\u65E5\u76EE\u6807 / \u672C\u6708\u5DF2\u8D5A\uFF08\u8282\u5047\u65E5\u6765\u6E90\u7EDF\u4E00\u653E\u5728\u8282\u5047\u65E5\u5361\u7247\uFF09\u3002 */\nfunction DetailsFooter(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\n const items = [\n { key: 'salary', label: t('monthlySalaryLabel'), value: money(rates.monthlySalary, 2) },\n { key: 'workdays', label: t('workdaysThisMonth'), value: `${rates.monthlyWorkdays}${t('dayUnit')}` },\n { key: 'hours', label: t('paidHoursPerDay'), value: `${trimNumber(rates.paidHours, 2)}${t('hourUnit')}` },\n { key: 'target', label: t('todayTarget'), value: money(snap.todayTarget, 2) },\n { key: 'month', label: t('monthEarned'), value: money(snap.monthEarned, 2) },\n { key: 'worked', label: t('monthWorkedDays'), value: `${snap.monthWorkdaysDone}${t('dayUnit')}` },\n { key: 'left', label: t('monthRemainingDays'), value: `${snap.monthWorkdaysLeft}${t('dayUnit')}` },\n ];\n return React.createElement('div', {\n style: {\n background: C.layer1, border: `1px solid ${C.border1}`, borderRadius: 12,\n padding: '10px 12px', fontSize: 11, color: C.label3, lineHeight: 1.6,\n },\n }, [\n React.createElement('div', {\n key: 'items',\n style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(118px, 1fr))', gap: '7px 12px' },\n }, items.map((item) => React.createElement('div', {\n key: item.key,\n style: { minWidth: 0 },\n }, [\n React.createElement('div', { key: 'l', style: { fontSize: 10.5, color: C.label3 } }, item.label),\n React.createElement('div', {\n key: 'v',\n style: { fontSize: 13, fontWeight: 650, color: C.label2, ...NUM },\n }, item.value),\n ]))),\n ]);\n}\n\n/** \u8282\u5047\u65E5\u5361\u7247\uFF1A2026 \u5B98\u65B9 / 2027 \u9884\u4F30\u4E24\u6BB5\uFF0C\u4E03\u6BB5\u5047\u65E5\u533A\u6BB5 + \u8C03\u4F11\u4E0A\u73ED\u65E5\u7EDF\u8BA1\u3002 */\nconst HOLIDAY_LABEL_KEYS = {\n newYear: 'holidayNewYear',\n spring: 'holidaySpring',\n qingming: 'holidayQingming',\n labour: 'holidayLabour',\n dragon: 'holidayDragon',\n midAutumn: 'holidayMidAutumn',\n national: 'holidayNational',\n};\n\nfunction HolidaysCard(props) {\n const t = props.t;\n const source = props.holidaySource || HOLIDAY_SOURCE;\n const extra = Array.isArray(props.extraWorkdays) ? props.extraWorkdays : [];\n const countYear = (year) => extra.filter((key) => String(key).startsWith(`${year}-`)).length;\n const shortDate = (key) => key.slice(5).replace('-', '/');\n const sections = [\n {\n key: 'official',\n label: t('holidays2026Label'),\n blocks: HOLIDAY_BLOCKS,\n estimated: false,\n extraCount: countYear(2026),\n tag: null,\n },\n {\n key: 'estimate',\n label: t('holidays2027Label'),\n blocks: HOLIDAY_BLOCKS_2027_ESTIMATED,\n estimated: true,\n extraCount: countYear(2027),\n tag: t('holidayEstimateTag'),\n },\n ];\n const sumDays = (blocks) => blocks.reduce((sum, block) => sum + block.days, 0);\n const renderSection = (section) => React.createElement('div', { key: section.key, style: { marginTop: section.key === 'official' ? 8 : 12 } }, [\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'baseline', flexWrap: 'wrap', gap: 8 },\n }, [\n React.createElement('span', { key: 'l', style: { fontSize: 11.5, fontWeight: 700, color: C.label2 } }, section.label),\n section.tag\n ? React.createElement('span', {\n key: 'tag',\n style: {\n fontSize: 9.5, fontWeight: 700, color: C.label2,\n border: `1px dashed color-mix(in srgb, ${GOLD_TINT} 60%, transparent)`,\n borderRadius: 999, padding: '0 6px', lineHeight: 1.6,\n },\n }, section.tag)\n : null,\n React.createElement('span', { key: 's', style: { marginLeft: 'auto', fontSize: 10, color: C.label3, ...NUM } },\n t('holidaysCardSub').replace('{days}', String(sumDays(section.blocks))).replace('{extra}', String(section.extraCount))),\n ]),\n React.createElement('div', {\n key: 'grid',\n style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(118px, 1fr))', gap: 7, marginTop: 6 },\n }, section.blocks.map((block) => React.createElement('div', {\n key: block.id,\n style: {\n border: section.estimated\n ? `1px dashed color-mix(in srgb, ${GOLD_TINT} 40%, ${C.border1})`\n : `1px solid ${C.border1}`,\n borderRadius: 9,\n padding: '6px 8px',\n background: `color-mix(in srgb, ${GOLD_TINT} ${section.estimated ? 3 : 6}%, transparent)`,\n },\n }, [\n React.createElement('div', {\n key: 'row',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 6 },\n }, [\n React.createElement('span', { key: 'n', style: { fontSize: 11.5, fontWeight: 650, color: C.label } },\n t(HOLIDAY_LABEL_KEYS[block.id])),\n React.createElement('span', {\n key: 'd',\n style: {\n fontSize: 10, fontWeight: 700, color: C.label2,\n background: `color-mix(in srgb, ${GOLD_TINT} 16%, transparent)`,\n borderRadius: 999, padding: '0 6px', ...NUM,\n },\n }, t('holidaysDaysShort').replace('{days}', String(block.days))),\n ]),\n React.createElement('div', { key: 'r', style: { fontSize: 10, color: C.label3, marginTop: 2, ...NUM } },\n `${shortDate(block.from)} \u2013 ${shortDate(block.to)}`),\n ]))),\n section.estimated\n ? React.createElement('div', {\n key: 'est-note',\n style: { marginTop: 6, fontSize: 10.5, color: C.label3, lineHeight: 1.5 },\n }, `\u26A0 ${t('holidayEstimateNote')}`)\n : null,\n ]);\n return React.createElement('div', {\n style: {\n background: C.layer1,\n border: `1px solid ${C.border1}`,\n borderRadius: 12,\n padding: '10px 12px',\n },\n }, [\n React.createElement('div', {\n key: 'title',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('span', { key: 't', style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' } },\n t('holidaysCardTitle')),\n React.createElement('a', {\n key: 'a',\n href: source.url,\n target: '_blank',\n rel: 'noreferrer',\n title: source.title,\n style: { fontSize: 10.5, color: C.brand, textDecoration: 'none', fontWeight: 600 },\n }, `${source.year} ${t('holidaySourceLink')} \u2197`),\n ]),\n sections.map(renderSection),\n React.createElement('div', {\n key: 'foot',\n style: { marginTop: 8, fontSize: 10.5, color: C.label3 },\n }, t('holidaysExtraNote').replace('{extra}', String(extra.length))),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u8BBE\u7F6E\u533A\uFF08<details> \u539F\u751F\u6298\u53E0\uFF0C\u4E0D\u989D\u5916\u5360\u4E00\u4E2A hook\uFF09\n * ------------------------------------------------------------------ */\nfunction SettingsSection(props) {\n const t = props.t;\n const form = props.form;\n const setField = props.setField;\n const setCheck = props.setCheck;\n const save = props.save;\n const onSave = props.onSave;\n\n // E \u65B9\u6848\uFF1A\u884C\u5F0F\u77ED\u63A7\u4EF6 \u2014\u2014 \u6807\u7B7E\u56FA\u5B9A\u5DE6\u5217\uFF0C\u63A7\u4EF6\u90FD\u6309\u5185\u5BB9\u5B9A\u5BBD\uFF08\u4E0D\u62C9\u6EE1\uFF09\n const rowStyle = {\n display: 'flex', alignItems: 'center', gap: 10,\n minHeight: 33, padding: '2px 0', borderTop: `1px solid ${C.border1}`,\n };\n const rowKeyStyle = { width: 62, flex: '0 0 62px', fontSize: 11.5, color: C.label3 };\n const rowValStyle = { display: 'flex', alignItems: 'center', gap: 4, flexWrap: 'wrap', minWidth: 0 };\n const inputStyle = {\n boxSizing: 'border-box', width: 88, minHeight: 28, padding: '4px 8px',\n borderRadius: 7, border: `1px solid ${C.border}`, background: C.layer2,\n color: C.label, fontSize: 12.5, fontVariantNumeric: 'tabular-nums', outline: 'none',\n };\n const selectStyle = {\n boxSizing: 'border-box', width: 48, minHeight: 28, padding: '4px 2px 4px 6px',\n borderRadius: 7, border: `1px solid ${C.border}`, background: C.layer2,\n color: C.label, fontSize: 12.5, fontVariantNumeric: 'tabular-nums', outline: 'none', cursor: 'pointer',\n };\n const unitStyle = { fontSize: 10.5, color: C.label3, whiteSpace: 'nowrap' };\n const dashStyle = { fontSize: 11, color: C.label3, margin: '0 1px' };\n const HOUR_OPTIONS = Array.from({ length: 24 }, (_, i) => String(i).padStart(2, '0'));\n const MINUTE_OPTIONS = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, '0'));\n\n const row = (key, label, values) => React.createElement('div', { key, style: rowStyle }, [\n React.createElement('span', { key: 'k', style: rowKeyStyle }, label),\n React.createElement('div', { key: 'v', style: rowValStyle }, values),\n ]);\n\n /** 24 \u5C0F\u65F6\u5236\u65F6\u95F4\uFF1A\u5C0F\u65F6/\u5206\u949F\u4E24\u4E2A\u4E0B\u62C9\uFF0C\u5404 46px\uFF08\u4E0D\u53D7\u6D4F\u89C8\u5668 locale \u5F71\u54CD\uFF09\u3002 */\n const timeSelects = (field, label, disabled = false) => {\n const [rawHour = '00', rawMinute = '00'] = String(form[field] || '00:00').split(':');\n const hour = HOUR_OPTIONS.includes(rawHour) ? rawHour : '00';\n const minute = MINUTE_OPTIONS.includes(rawMinute) ? rawMinute : '00';\n const commit = (nextHour, nextMinute) => setField(field, `${nextHour}:${nextMinute}`);\n const style = { ...selectStyle, opacity: disabled ? 0.45 : 1, cursor: disabled ? 'default' : 'pointer' };\n return React.createElement('span', { key: field, style: { display: 'inline-flex', alignItems: 'center', gap: 2 } }, [\n React.createElement('select', {\n key: 'h', value: hour, disabled, 'aria-label': `${label} ${t('hourUnit')}`,\n onChange: (event) => commit(event.target.value, minute), style,\n }, HOUR_OPTIONS.map((value) => React.createElement('option', { key: value, value }, value))),\n React.createElement('span', { key: 'c', style: { color: C.label3, fontWeight: 700, fontSize: 12 } }, ':'),\n React.createElement('select', {\n key: 'm', value: minute, disabled, 'aria-label': `${label} ${t('minuteUnit')}`,\n onChange: (event) => commit(hour, event.target.value), style,\n }, MINUTE_OPTIONS.map((value) => React.createElement('option', { key: value, value }, value))),\n ]);\n };\n\n const timeRange = (startField, endField, label, disabled) => React.createElement('span', {\n key: `${startField}-${endField}`,\n style: { display: 'inline-flex', alignItems: 'center', gap: 2 },\n }, [\n timeSelects(startField, label, disabled),\n React.createElement('span', { key: 'dash', style: dashStyle }, '\u2013'),\n timeSelects(endField, label, disabled),\n ]);\n\n const toggle = (field, labelKey, disabled) => React.createElement('label', {\n key: field,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 5,\n padding: '2px 6px', borderRadius: 8,\n border: `1px solid ${C.border1}`, background: C.layer2,\n fontSize: 10.5, color: disabled ? C.label3 : C.label2, whiteSpace: 'nowrap',\n cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.55 : 1,\n },\n }, [\n React.createElement('input', {\n key: 'i', type: 'checkbox', checked: Boolean(form[field]), disabled,\n onChange: (event) => setCheck(field, event.target.checked),\n style: { accentColor: GOLD_TINT, width: 13, height: 13, margin: 0, cursor: 'inherit' },\n }),\n React.createElement('span', { key: 'l' }, t(labelKey)),\n ]);\n\n const lunchDisabled = !form.lunchEnabled;\n const RATE_OPTIONS = [\n ['1000', t('rateSecond')],\n ['250', '250 ms'],\n ['100', '100 ms'],\n ['50', '50 ms'],\n ['16', t('rateFrame')],\n ];\n\n return React.createElement('details', {\n open: true,\n style: { background: C.layer1, border: `1px solid ${C.border1}`, borderRadius: 12, padding: '10px 12px' },\n }, [\n React.createElement('summary', {\n key: 'sum',\n style: { cursor: 'pointer', fontSize: 12.5, fontWeight: 650, color: C.label, userSelect: 'none' },\n }, t('settings')),\n React.createElement('div', { key: 'body', style: { marginTop: 7 } }, [\n row('salary', t('salaryField'), [\n React.createElement('input', {\n key: 'i', type: 'text', inputMode: 'decimal', value: form.monthlySalary, placeholder: '10000',\n onChange: (event) => setField('monthlySalary', event.target.value), style: inputStyle,\n }),\n React.createElement('span', { key: 'u', style: unitStyle }, t('salaryUnit')),\n ]),\n row('worktime', t('groupWorkTime'), [\n timeRange('workStart', 'workEnd', t('groupWorkTime'), false),\n ]),\n row('lunch', t('groupLunch'), [\n // \u65F6\u95F4\u5728\u524D\u3001\u4E24\u4E2A\u5F00\u5173\u5728\u540E\uFF08\u653E\u5230\u884C\u5C3E\uFF09\n timeRange('lunchStart', 'lunchEnd', t('groupLunch'), lunchDisabled),\n toggle('lunchEnabled', 'lunchEnabledShort', false),\n toggle('lunchPaid', 'lunchPaidShort', lunchDisabled),\n ]),\n row('refresh', t('refreshRate'), [\n React.createElement('select', {\n key: 'r',\n value: String(form.updateMs),\n onChange: (event) => setField('updateMs', event.target.value),\n style: { ...selectStyle, width: 128, padding: '4px 6px' },\n }, RATE_OPTIONS.map(([value, label]) => React.createElement('option', { key: value, value }, label))),\n ]),\n ]),\n React.createElement('div', {\n key: 'actions',\n style: { display: 'flex', alignItems: 'center', gap: 10, marginTop: 7, paddingTop: 7, borderTop: `1px solid ${C.border1}` },\n }, [\n React.createElement('button', {\n key: 'save',\n type: 'button',\n onClick: onSave,\n disabled: save.status === 'saving',\n style: {\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 72%, rgba(0,0,0,.18))`,\n color: '#3A2A05',\n background: save.status === 'saving'\n ? `color-mix(in srgb, ${GOLD_TINT} 52%, #fff)`\n : 'linear-gradient(180deg, #F8DC86 0%, #EFC258 52%, #D99D2C 100%)',\n borderRadius: 8,\n padding: '5px 16px',\n fontSize: 12.5,\n fontWeight: 700,\n letterSpacing: '.3px',\n cursor: save.status === 'saving' ? 'default' : 'pointer',\n opacity: save.status === 'saving' ? 0.72 : 1,\n boxShadow: `0 2px 9px color-mix(in srgb, ${GOLD_TINT} 34%, transparent), inset 0 1px 0 rgba(255,255,255,.45)`,\n textShadow: '0 1px 0 rgba(255,255,255,.28)',\n },\n }, save.status === 'saving' ? t('saving') : t('save')),\n save.status === 'ok'\n ? React.createElement('span', { key: 'ok', style: { fontSize: 11.5, color: C.ok } }, save.message || t('saved'))\n : null,\n save.status === 'error'\n ? React.createElement('span', {\n key: 'err',\n style: { fontSize: 11.5, color: C.error, flex: '1 1 200px', whiteSpace: 'pre-wrap' },\n }, `${t('saveFailed')}${save.errors.join('\uFF1B')}`)\n : null,\n ]),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u9762\u677F\u4E3B\u4F53\n * ------------------------------------------------------------------ */\nfunction NiumaPanel(props) {\n const t = props && typeof props.t === 'function' ? props.t : fallbackTranslate;\n\n const remote = useRemoteConfig();\n\n // \u670D\u52A1\u7AEF\u914D\u7F6E -> \u89C4\u8303\u5316\u914D\u7F6E\uFF1B\u574F\u6570\u636E/\u7F3A\u5B57\u6BB5\u4E00\u5F8B\u9000\u56DE DEFAULTS\uFF08\u8BA1\u7B97\u4E0D\u4F1A\u629B\uFF09\u3002\n const cfg = React.useMemo(() => {\n const raw = remote.data && remote.data.config ? remote.data.config : null;\n if (!raw) return DEFAULTS;\n try {\n const result = normalizeConfig(raw);\n return result.config || DEFAULTS;\n } catch (error) {\n return DEFAULTS;\n }\n }, [remote.data]);\n\n // \u5237\u65B0\u9891\u7387\uFF1A1000=\u6309\u79D2\uFF1B16\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF08\u8FDE\u7EED\u6EDA\u52A8\uFF09\uFF1B\u4E2D\u95F4\u503C\u4E3A\u6BEB\u79D2\u7EA7\n const updateMs = cfg.turbo === true ? 16 : (Number.isInteger(cfg.updateMs) ? cfg.updateMs : 1000);\n const now = useClock(updateMs);\n\n // \u6BCF\u6B21\u5237\u65B0\u91CD\u7B97\uFF08core \u662F\u7EAF\u51FD\u6570\uFF0C\u91CD\u7B97\u4EE3\u4EF7\u6781\u5C0F\uFF1B\u5DF2\u4E0B\u73ED/\u4F11\u606F\u65E5\u4F1A\u7A33\u5B9A\u5728\u65E5\u5DE5\u8D44\u6216 0\uFF09\u3002\n const snap = React.useMemo(() => earnedToday(cfg, now), [cfg, now]);\n const rates = snap && snap.rates ? snap.rates : computeRates(cfg, snap && snap.dateKey);\n const baseForm = React.useMemo(() => formFromConfig(cfg), [cfg]);\n\n /**\n * \u300C\u5DE5\u8D44\u6362\u7B97\u300D\u89C6\u89D2\uFF1A\u672C\u6708\uFF08\u8DDF\u968F\u4ECA\u65E5\u53E3\u5F84\uFF09/ \u6307\u5B9A\u6708\u4EFD / \u5168\u5E74\u5E73\u5747\u3002\n * \u53EA\u5F71\u54CD\u6362\u7B97\u5C55\u793A\uFF0C\u4E0D\u5F71\u54CD\u9876\u90E8\u300C\u4ECA\u65E5\u5DF2\u8D5A\u300D\u8BA1\u6570\u5668\uFF08\u8BA1\u6570\u5668\u6C38\u8FDC\u6309\u4ECA\u5929\u7B97\uFF09\u3002\n */\n const viewYear = Number(String(snap && snap.dateKey ? snap.dateKey : '').slice(0, 4)) || new Date().getFullYear();\n const yearEstimated = viewYear === HOLIDAY_ESTIMATE_2027.year;\n const yearData = React.useMemo(() => yearSummary(cfg, viewYear), [cfg, viewYear]);\n const [view, setView] = React.useState('current');\n const selectedMonth = view.startsWith('m') ? yearData.months[Number(view.slice(1)) - 1] : null;\n const maxHolidayMonth = yearData.maxHolidayMonth;\n const maxHolidayText = t('maxHolidayNote')\n .replace('{month}', String(maxHolidayMonth.month))\n .replace('{days}', String(maxHolidayMonth.holidayDays));\n let viewCards;\n let viewHint;\n let viewNote;\n if (view === 'year') {\n // \u4E0E\u300C\u672C\u6708\u300D\u4FDD\u6301\u540C\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5\uFF0C\u518D\u653E\u8BE5\u89C6\u89D2\u7684\u6C47\u603B\u9879\n viewCards = [\n { key: 'avgSecond', label: t('averageSecond'), value: money(yearData.averageSecondWage, 4), accent: true },\n { key: 'avgMinute', label: t('averageMinute'), value: money(yearData.averageMinuteWage, 4) },\n { key: 'avgHourly', label: t('averageHourly'), value: money(yearData.averageHourlyWage, 2) },\n { key: 'avgDaily', label: t('averageDaily'), value: money(yearData.averageDailyWage, 2) },\n { key: 'yearWorkdays', label: t('yearWorkdays'), value: `${yearData.totalWorkdays}${t('dayUnit')}` },\n { key: 'yearIncome', label: t('yearIncome'), value: money(yearData.annualIncome, 2) },\n ];\n viewHint = `${t('yearHint').replace('{year}', String(viewYear)).replace('{workdays}', String(yearData.totalWorkdays))} \u00B7 ${t('viewOnlyHint')}`\n + (yearEstimated ? ` \u00B7 ${t('holidayEstimateShort')}` : '');\n viewNote = yearEstimated ? t('holidayEstimateNote') : maxHolidayText;\n } else if (selectedMonth) {\n // \u4E0E\u300C\u672C\u6708\u300D\u4FDD\u6301\u540C\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5 \u2192 \u6708 \u2192 \u5DE5\u4F5C\u65E5\n viewCards = [\n { key: 'secondWage', label: t('secondWage'), value: money(selectedMonth.secondWage, 4), accent: true },\n { key: 'minuteWage', label: t('minuteWage'), value: money(selectedMonth.minuteWage, 4) },\n { key: 'hourlyWage', label: t('hourlyWage'), value: money(selectedMonth.hourlyWage, 2) },\n { key: 'dailyWage', label: t('dailyWage'), value: money(selectedMonth.dailyWage, 2) },\n { key: 'monthlyWage', label: t('monthlyWage'), value: money(selectedMonth.monthlySalary, 2) },\n { key: 'monthWorkdays', label: t('monthWorkdaysCard'), value: `${selectedMonth.workdays}${t('dayUnit')}` },\n ];\n viewHint = `${t('monthHint')\n .replace('{year}', String(viewYear))\n .replace('{month}', String(selectedMonth.month))\n .replace('{workdays}', String(selectedMonth.workdays))\n .replace('{holidays}', String(selectedMonth.holidayDays))} \u00B7 ${t('viewOnlyHint')}`\n + (yearEstimated ? ` \u00B7 ${t('holidayEstimateShort')}` : '');\n viewNote = yearEstimated\n ? t('holidayEstimateNote')\n : (selectedMonth.month === maxHolidayMonth.month\n ? `\u2605 ${t('maxHolidayThis').replace('{days}', String(maxHolidayMonth.holidayDays))}`\n : maxHolidayText);\n } else {\n // \u7EDF\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5 \u2192 \u5468 \u2192 \u6708\uFF08\u6240\u6709\u89C6\u89D2\u90FD\u4ECE\u300C\u79D2\u300D\u5F00\u59CB\u3001\u4ECE\u5C0F\u5230\u5927\uFF09\n viewCards = RATE_CARDS.map((spec) => ({\n key: spec.key,\n label: t(spec.label),\n value: money(rates[spec.key], spec.digits),\n accent: spec.key === 'secondWage',\n }));\n viewHint = t('currentHint')\n .replace('{days}', String(rates.monthlyWorkdays))\n .replace('{hours}', trimNumber(rates.paidHours, 2));\n viewNote = maxHolidayText;\n }\n\n // \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F\uFF1Anull = \u8FD8\u6CA1\u6539\u8FC7\uFF0C\u76F4\u63A5\u663E\u793A\u5F53\u524D\u914D\u7F6E\u3002\n const [draft, setDraft] = React.useState(null);\n const [save, setSave] = React.useState({ status: 'idle', errors: [], message: '' });\n const form = draft || baseForm;\n\n const setField = (field, value) => {\n setDraft((prev) => ({ ...(prev || baseForm), [field]: value }));\n if (save.status !== 'idle') setSave({ status: 'idle', errors: [], message: '' });\n };\n const setCheck = (field, checked) => setField(field, checked);\n\n const onSave = () => {\n const patch = patchFromForm(form);\n // \u5148\u5728\u672C\u5730\u8DD1\u540C\u4E00\u5957\u6821\u9A8C\uFF1A\u975E\u6CD5\u8F93\u5165\u5C31\u5730\u7EA2\u5B57\uFF0C\u4E0D\u53D1\u8BF7\u6C42\u4E5F\u4E0D\u4F1A\u767D\u5C4F\u3002\n const checked = normalizeConfig(patch);\n if (checked.errors && checked.errors.length > 0) {\n setSave({ status: 'error', errors: checked.errors, message: '' });\n return;\n }\n if (typeof fetch !== 'function') {\n setSave({ status: 'error', errors: ['fetch unavailable'], message: '' });\n return;\n }\n setSave({ status: 'saving', errors: [], message: '' });\n fetch(`${ROUTE_BASE}/settings`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(patch),\n })\n .then(async (response) => {\n let body = null;\n try {\n body = await response.json();\n } catch (error) {\n body = null;\n }\n if (!response.ok || !body || body.ok !== true) {\n throw new Error((body && body.error) || `HTTP ${response.status}`);\n }\n return body;\n })\n .then(() => {\n setDraft(null);\n setSave({ status: 'ok', errors: [], message: t('saved') });\n remote.refresh();\n })\n .catch((error) => {\n setSave({ status: 'error', errors: [String((error && error.message) || error)], message: '' });\n });\n };\n\n // \u5FEB\u901F\u4FDD\u5B58\uFF1A\u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D\u8FD9\u79CD\u5373\u65F6\u504F\u597D\uFF0C\u4E0D\u8D70\u8BBE\u7F6E\u8868\u5355\u7684\u300C\u4FDD\u5B58\u300D\u6D41\u7A0B\n const [quickError, setQuickError] = React.useState('');\n const postConfig = React.useCallback((patch) => {\n if (typeof fetch !== 'function') return;\n fetch(`${ROUTE_BASE}/settings`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(patch),\n })\n .then(async (response) => {\n let body = null;\n try { body = await response.json(); } catch (error) { body = null; }\n if (!response.ok || !body || body.ok !== true) throw new Error((body && body.error) || `HTTP ${response.status}`);\n setQuickError('');\n remote.refresh();\n })\n .catch((error) => setQuickError(String((error && error.message) || error)));\n }, [remote.refresh]);\n const onDecimalsChange = (value) => postConfig({ decimals: value });\n const onTurboChange = (checked) => postConfig({ turbo: Boolean(checked) });\n\n const holidaySource = (remote.data && remote.data.holidaySource) || HOLIDAY_SOURCE;\n const banner = remote.status === 'failed'\n ? {\n color: C.warn,\n text: `${t('configFailed')}${remote.error ? `\uFF08${remote.error}\uFF09` : ''}`,\n retry: true,\n }\n : remote.status === 'loading'\n ? { color: C.label3, text: t('configLoading'), retry: false }\n : null;\n\n return React.createElement('div', {\n style: {\n // DSH \u7684 main slot \u7ED9\u7684\u662F\u5B9A\u9AD8\u5BB9\u5668\uFF1A\u63D2\u4EF6\u5FC5\u987B\u81EA\u5DF1\u5F53\u6EDA\u52A8\u5BB9\u5668\uFF0C\u5426\u5219\u5C55\u5F00\u8BBE\u7F6E\u540E\u5E95\u90E8\u4F1A\u88AB\u88C1\u6389\u3002\n // \u6CE8\u610F\uFF1A\u8FD9\u91CC\u7528 block + \u5185\u5C42 flex \u7684\u5199\u6CD5 \u2014\u2014 \u5982\u679C\u6839\u76F4\u63A5 display:flex\uFF0C\u5B50\u9879\u4F1A\u5728\u5B9A\u9AD8\u5BB9\u5668\u91CC\n // \u88AB flex-shrink \u538B\u6241\uFF08\u5C55\u5F00\u8BBE\u7F6E\u65F6\u6574\u5F20\u4E3B\u5361\u9AD8\u5EA6\u88AB\u538B\u7F29\u3001\u5185\u5BB9\u88AB overflow \u88C1\u6389\uFF09\u3002\n height: '100%',\n width: '100%',\n overflowY: 'auto',\n overflowX: 'hidden',\n overscrollBehavior: 'contain',\n scrollbarGutter: 'stable',\n boxSizing: 'border-box',\n fontSize: 13,\n lineHeight: 1.45,\n color: C.label,\n fontFamily: 'inherit',\n },\n }, [\n React.createElement(StyleTag, { key: 'css' }),\n React.createElement('div', {\n key: 'inner',\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: 11,\n width: '100%',\n maxWidth: 820,\n margin: '0 auto',\n padding: '16px 18px 40px',\n boxSizing: 'border-box',\n minWidth: 0,\n },\n }, [\n // \u54C1\u724C\u5934\uFF1A\u56FE\u6807\u5757 + \u6807\u9898/\u526F\u6807\u9898 + \u72B6\u6001\u5FBD\u6807\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', gap: 11, flexWrap: 'wrap' },\n }, [\n React.createElement('div', {\n key: 'icon',\n style: {\n width: 38, height: 38, borderRadius: 12, flex: '0 0 auto',\n display: 'grid', placeItems: 'center',\n color: C.brand,\n background: `color-mix(in srgb, ${C.brand} 13%, transparent)`,\n border: `1px solid color-mix(in srgb, ${C.brand} 26%, transparent)`,\n },\n }, React.createElement(NiumaIcon, { size: 21 })),\n React.createElement('div', { key: 'tt', style: { marginRight: 'auto', minWidth: 0 } }, [\n React.createElement('div', {\n key: 't',\n style: { fontSize: 17.5, fontWeight: 800, letterSpacing: '-.3px', color: C.label },\n }, t('title')),\n React.createElement('div', {\n key: 's',\n style: { fontSize: 11, color: C.label3, marginTop: 1 },\n }, t('subtitle')),\n ]),\n React.createElement(StatusBadge, { key: 'badge', t, status: snap.status }),\n ]),\n\n // \u914D\u7F6E\u8BFB\u53D6\u72B6\u6001\n banner\n ? React.createElement('div', {\n key: 'banner',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap',\n fontSize: 12, color: banner.color, padding: '6px 10px',\n borderRadius: 9, border: `1px solid color-mix(in srgb, ${banner.color} 45%, transparent)`,\n background: `color-mix(in srgb, ${banner.color} 10%, transparent)`,\n },\n }, [\n React.createElement('span', { key: 'txt', style: { flex: '1 1 160px' } }, banner.text),\n banner.retry\n ? React.createElement('button', {\n key: 'retry',\n type: 'button',\n onClick: remote.refresh,\n style: {\n border: `1px solid ${banner.color}`, color: banner.color, background: 'transparent',\n borderRadius: 6, padding: '2px 10px', fontSize: 12, cursor: 'pointer',\n },\n }, t('retry'))\n : null,\n ])\n : null,\n\n React.createElement(HeroCard, { key: 'hero', t, snap, decimals: cfg.decimals, onDecimalsChange, turbo: cfg.turbo, onTurboChange }),\n React.createElement(CountdownRow, { key: 'countdown', t, snap }),\n React.createElement('div', {\n key: 'ratesHead',\n style: {\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n gap: 8, flexWrap: 'wrap', margin: '2px 1px -1px',\n },\n }, [\n React.createElement('span', {\n key: 't',\n style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' },\n }, t('sectionRates')),\n React.createElement(PeriodSelect, {\n key: 'period',\n t,\n value: view,\n onChange: setView,\n year: viewYear,\n months: yearData.months,\n }),\n ]),\n React.createElement('div', {\n key: 'ratesHint',\n style: { fontSize: 10.5, color: C.label3, ...NUM },\n }, viewHint),\n React.createElement(RatesGrid, { key: 'rates', cards: viewCards }),\n viewNote\n ? React.createElement('div', {\n key: 'ratesNote',\n style: { fontSize: 10.5, color: C.label3, display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'badge',\n style: {\n color: C.label2, fontWeight: 600,\n background: `color-mix(in srgb, ${GOLD_TINT} 14%, transparent)`,\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 32%, transparent)`,\n borderRadius: 999, padding: '1px 8px',\n },\n }, t('maxHolidayBadge')),\n React.createElement('span', { key: 'txt' }, viewNote),\n ])\n : null,\n React.createElement(SectionTitle, { key: 'detailTitle', title: t('sectionDetail') }),\n React.createElement(DetailsFooter, { key: 'footer', t, snap, holidaySource }),\n React.createElement(HolidaysCard, {\n key: 'holidays',\n t,\n holidaySource,\n extraWorkdays: cfg.extraWorkdays,\n }),\n React.createElement(SettingsSection, {\n key: 'settings',\n t,\n form,\n setField,\n setCheck,\n save,\n onSave,\n }),\n ]),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u63D2\u4EF6\u4F53\n * ------------------------------------------------------------------ */\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(LOCALE_NS, { zh, en }), `${LOCALE_NS}: dictionaries`);\n\n // \u4FA7\u680F\u5165\u53E3\uFF1Aid \u5FC5\u987B\u4E0E main \u9762\u677F\u7684 key \u540C\u540D\uFF0C\u5426\u5219\u70B9\u4FA7\u680F\u9009\u4E0D\u4E2D\u9762\u677F\u3002\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: SLOT_ID,\n order: 120,\n label: () => '\u725B\u9A6C',\n locale: LOCALE_NS,\n }, NiumaIcon));\n\n // \u4E2D\u680F\u72EC\u7ACB\u9762\u677F\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: SLOT_ID,\n locale: LOCALE_NS,\n }, NiumaPanel));\n}\n", "/**\n * \u4E2D\u56FD\u6CD5\u5B9A\u8282\u5047\u65E5\u4E0E\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u7EAF\u6570\u636E\uFF0C\u5BBF\u4E3B + \u6D4F\u89C8\u5668\u5171\u7528\uFF09\u3002\n *\n * \u6570\u636E\u5206\u4E24\u90E8\u5206\uFF1A\n * 1. **2026 \u5B98\u65B9\u6570\u636E**\uFF1A\u56FD\u52A1\u9662\u529E\u516C\u5385\u300A\u5173\u4E8E2026\u5E74\u90E8\u5206\u8282\u5047\u65E5\u5B89\u6392\u7684\u901A\u77E5\u300B\uFF08\u56FD\u529E\u53D1\u660E\u7535\u30142025\u30157\u53F7\uFF09\uFF0C\n * \u53D1\u5E03\u65E5\u671F 2025-11-04\uFF0C\u9010\u6761\u6838\u5BF9\u81EA\u5B98\u65B9\u539F\u6587\uFF1A\n * https://www.gov.cn/zhengce/content/202511/content_7047090.htm\n * 2. **2027 \u9884\u4F30\u6570\u636E**\uFF08`HOLIDAY_ESTIMATE_2027.estimated === true`\uFF0C**\u5B98\u65B9\u5C1A\u672A\u516C\u5E03**\uFF09\uFF1A\n * \u6309 2024 \u5E74\u4FEE\u8BA2\u7684\u300A\u5168\u56FD\u5E74\u8282\u53CA\u7EAA\u5FF5\u65E5\u653E\u5047\u529E\u6CD5\u300B\u4E0E\u5F80\u5E74\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u7528\u4E8E\u63D0\u524D\u67E5\u770B\uFF1B\n * \u5B98\u65B9\u901A\u77E5\u53D1\u5E03\u540E\uFF08\u5F80\u5E74 11 \u6708\u521D\uFF09\u66FF\u6362\u4E3A\u6B63\u5F0F\u6570\u636E\u5E76\u5347\u7248\u672C\u3002\n *\n * @module dsh-niuma/holidays\n */\n\n/* ------------------------------------------------------------------ *\n * 2026 \u5B98\u65B9\u6570\u636E\n * ------------------------------------------------------------------ */\n\n/** 2026 \u5E74\u6CD5\u5B9A\u653E\u5047\u65E5\u671F\uFF08\u542B\u4E0E\u5468\u672B\u987A\u8FDE\u7684\u4F11\u606F\u65E5\uFF1B\u8FD9\u4E9B\u65E5\u671F\u4E00\u5F8B\u4E0D\u7B97\u5DE5\u4F5C\u65E5\uFF09 */\nexport const OFFICIAL_HOLIDAYS_2026 = Object.freeze([\n // \u5143\u65E6\uFF1A1\u67081\u65E5\uFF08\u5468\u56DB\uFF09\u81F33\u65E5\uFF08\u5468\u516D\uFF09\n '2026-01-01', '2026-01-02', '2026-01-03',\n // \u6625\u8282\uFF1A2\u670815\u65E5\uFF08\u5468\u65E5\uFF09\u81F323\u65E5\uFF08\u5468\u4E00\uFF09\uFF0C\u5171 9 \u5929\n '2026-02-15', '2026-02-16', '2026-02-17', '2026-02-18', '2026-02-19',\n '2026-02-20', '2026-02-21', '2026-02-22', '2026-02-23',\n // \u6E05\u660E\u8282\uFF1A4\u67084\u65E5\uFF08\u5468\u516D\uFF09\u81F36\u65E5\uFF08\u5468\u4E00\uFF09\n '2026-04-04', '2026-04-05', '2026-04-06',\n // \u52B3\u52A8\u8282\uFF1A5\u67081\u65E5\uFF08\u5468\u4E94\uFF09\u81F35\u65E5\uFF08\u5468\u4E8C\uFF09\n '2026-05-01', '2026-05-02', '2026-05-03', '2026-05-04', '2026-05-05',\n // \u7AEF\u5348\u8282\uFF1A6\u670819\u65E5\uFF08\u5468\u4E94\uFF09\u81F321\u65E5\uFF08\u5468\u65E5\uFF09\n '2026-06-19', '2026-06-20', '2026-06-21',\n // \u4E2D\u79CB\u8282\uFF1A9\u670825\u65E5\uFF08\u5468\u4E94\uFF09\u81F327\u65E5\uFF08\u5468\u65E5\uFF09\n '2026-09-25', '2026-09-26', '2026-09-27',\n // \u56FD\u5E86\u8282\uFF1A10\u67081\u65E5\uFF08\u5468\u56DB\uFF09\u81F37\u65E5\uFF08\u5468\u4E09\uFF09\n '2026-10-01', '2026-10-02', '2026-10-03', '2026-10-04', '2026-10-05',\n '2026-10-06', '2026-10-07',\n]);\n\n/** 2026 \u5E74\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u5468\u672B\u8865\u73ED\uFF0C\u7B97\u5DE5\u4F5C\u65E5\uFF09 */\nexport const OFFICIAL_EXTRA_WORKDAYS_2026 = Object.freeze([\n '2026-01-04', // \u5143\u65E6\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\n '2026-02-14', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-02-28', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-05-09', // \u52B3\u52A8\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-09-20', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\n '2026-10-10', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n]);\n\n/** 2026 \u5E74\u4E03\u4E2A\u6CD5\u5B9A\u8282\u5047\u65E5\u533A\u6BB5\uFF08\u9762\u677F\u300C\u8282\u5047\u65E5\u300D\u5361\u7247\u7528\uFF0C\u4E0E\u4E0A\u9762\u9010\u6BB5\u5BF9\u5E94\uFF09 */\nexport const HOLIDAY_BLOCKS = Object.freeze([\n { id: 'newYear', year: 2026, from: '2026-01-01', to: '2026-01-03', days: 3, estimated: false },\n { id: 'spring', year: 2026, from: '2026-02-15', to: '2026-02-23', days: 9, estimated: false },\n { id: 'qingming', year: 2026, from: '2026-04-04', to: '2026-04-06', days: 3, estimated: false },\n { id: 'labour', year: 2026, from: '2026-05-01', to: '2026-05-05', days: 5, estimated: false },\n { id: 'dragon', year: 2026, from: '2026-06-19', to: '2026-06-21', days: 3, estimated: false },\n { id: 'midAutumn', year: 2026, from: '2026-09-25', to: '2026-09-27', days: 3, estimated: false },\n { id: 'national', year: 2026, from: '2026-10-01', to: '2026-10-07', days: 7, estimated: false },\n]);\n\n/** 2026 \u5B98\u65B9\u6570\u636E\u51FA\u5904\uFF0C\u9762\u677F\u811A\u6CE8\u5C55\u793A\u7528 */\nexport const HOLIDAY_SOURCE = Object.freeze({\n year: 2026,\n estimated: false,\n title: '\u56FD\u52A1\u9662\u529E\u516C\u5385\u5173\u4E8E2026\u5E74\u90E8\u5206\u8282\u5047\u65E5\u5B89\u6392\u7684\u901A\u77E5\uFF08\u56FD\u529E\u53D1\u660E\u7535\u30142025\u30157\u53F7\uFF09',\n url: 'https://www.gov.cn/zhengce/content/202511/content_7047090.htm',\n});\n\n/* ------------------------------------------------------------------ *\n * 2027 \u9884\u4F30\u6570\u636E\uFF08\u5B98\u65B9\u672A\u516C\u5E03\uFF0C\u4EC5\u6309\u89C4\u5219\u4E0E\u60EF\u4F8B\u63A8\u7B97\uFF09\n * ------------------------------------------------------------------ */\n\n/** 2027 \u5E74\u653E\u5047\u65E5\u671F\uFF08\u9884\u4F30\uFF09\uFF1A\u5143\u65E6 3 \u5929 / \u6625\u8282 9 \u5929 / \u6E05\u660E 3 \u5929 / \u52B3\u52A8 5 \u5929 / \u7AEF\u5348 1 \u5929 / \u4E2D\u79CB 1 \u5929 / \u56FD\u5E86 7 \u5929 */\nexport const ESTIMATED_HOLIDAYS_2027 = Object.freeze([\n '2027-01-01', '2027-01-02', '2027-01-03',\n '2027-02-05', '2027-02-06', '2027-02-07', '2027-02-08', '2027-02-09',\n '2027-02-10', '2027-02-11', '2027-02-12', '2027-02-13',\n '2027-04-03', '2027-04-04', '2027-04-05',\n '2027-05-01', '2027-05-02', '2027-05-03', '2027-05-04', '2027-05-05',\n '2027-06-09',\n '2027-09-15',\n '2027-10-01', '2027-10-02', '2027-10-03', '2027-10-04', '2027-10-05',\n '2027-10-06', '2027-10-07',\n]);\n\n/** 2027 \u5E74\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u9884\u4F30\uFF0C\u5468\u672B\u8865\u73ED\uFF09 */\nexport const ESTIMATED_EXTRA_WORKDAYS_2027 = Object.freeze([\n '2027-01-31', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-02-14', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-05-08', // \u52B3\u52A8\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-09-26', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-10-09', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n]);\n\n/** 2027 \u5E74\u4E03\u4E2A\u6CD5\u5B9A\u8282\u5047\u65E5\u533A\u6BB5\uFF08\u9884\u4F30\uFF1B`estimated: true` \u7528\u4E8E\u9762\u677F\u6807\u6CE8\uFF09 */\nexport const HOLIDAY_BLOCKS_2027_ESTIMATED = Object.freeze([\n { id: 'newYear', year: 2027, from: '2027-01-01', to: '2027-01-03', days: 3, estimated: true },\n { id: 'spring', year: 2027, from: '2027-02-05', to: '2027-02-13', days: 9, estimated: true },\n { id: 'qingming', year: 2027, from: '2027-04-03', to: '2027-04-05', days: 3, estimated: true },\n { id: 'labour', year: 2027, from: '2027-05-01', to: '2027-05-05', days: 5, estimated: true },\n { id: 'dragon', year: 2027, from: '2027-06-09', to: '2027-06-09', days: 1, estimated: true },\n { id: 'midAutumn', year: 2027, from: '2027-09-15', to: '2027-09-15', days: 1, estimated: true },\n { id: 'national', year: 2027, from: '2027-10-01', to: '2027-10-07', days: 7, estimated: true },\n]);\n\n/** 2027 \u9884\u4F30\u6570\u636E\u7684\u51FA\u5904\u4E0E\u514D\u8D23\u8BF4\u660E\uFF08\u9762\u677F\u5FC5\u987B\u663E\u8457\u6807\u6CE8\u300C\u9884\u4F30\u300D\uFF09 */\nexport const HOLIDAY_ESTIMATE_2027 = Object.freeze({\n year: 2027,\n estimated: true,\n announced: false,\n title: '2027 \u5E74\u653E\u5047\u5B89\u6392\uFF08\u9884\u4F30\uFF0C\u5B98\u65B9\u5C1A\u672A\u516C\u5E03\uFF09',\n note: '\u5B98\u65B9\u901A\u77E5\u901A\u5E38\u5728\u524D\u4E00\u5E74 11 \u6708\u521D\u53D1\u5E03\uFF1B\u4EE5\u4E0B\u4E3A\u6309 2024 \u5E74\u4FEE\u8BA2\u7684\u300A\u5168\u56FD\u5E74\u8282\u53CA\u7EAA\u5FF5\u65E5\u653E\u5047\u529E\u6CD5\u300B\u4E0E\u5F80\u5E74\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u8BF7\u4EE5\u56FD\u52A1\u9662\u901A\u77E5\u4E3A\u51C6\u3002',\n basis: [\n '\u6625\u8282\u81EA\u9664\u5915\u8D77\u653E\u5047\u8C03\u4F11\uFF0C\u4E00\u822C\u8FDE\u4F11 8\u20139 \u5929',\n '\u56FD\u5E86 7 \u5929\u3001\u52B3\u52A8\u8282 5 \u5929',\n '\u5143\u65E6 / \u6E05\u660E / \u7AEF\u5348 / \u4E2D\u79CB\u5404 1 \u5929\u6CD5\u5B9A\u5047\uFF0C\u9047\u5468\u672B\u987A\u8FDE',\n ],\n url: 'https://www.gov.cn/zhengce/xxgk/',\n});\n\n/* ------------------------------------------------------------------ *\n * \u9ED8\u8BA4\u503C\uFF082026 \u5B98\u65B9 + 2027 \u9884\u4F30\uFF1B\u8DE8\u5E74\u4E5F\u80FD\u7B97\uFF0C\u4F46 2027 \u4F1A\u6807\u6CE8\u9884\u4F30\uFF09\n * ------------------------------------------------------------------ */\n\n/** \u9ED8\u8BA4\u8282\u5047\u65E5\uFF1A2026 \u5B98\u65B9 + 2027 \u9884\u4F30 */\nexport const DEFAULT_HOLIDAYS = Object.freeze([...OFFICIAL_HOLIDAYS_2026, ...ESTIMATED_HOLIDAYS_2027]);\n\n/** \u9ED8\u8BA4\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF1A2026 \u5B98\u65B9 + 2027 \u9884\u4F30 */\nexport const DEFAULT_EXTRA_WORKDAYS = Object.freeze([...OFFICIAL_EXTRA_WORKDAYS_2026, ...ESTIMATED_EXTRA_WORKDAYS_2027]);\n", "/**\n * \u725B\u9A6C\u52A0\u901F\u5668\u6838\u5FC3\u903B\u8F91\uFF08\u7EAF\u51FD\u6570\uFF0C\u5BBF\u4E3B\u4E0E\u6D4F\u89C8\u5668\u5171\u7528\uFF09\u3002\n *\n * \u8BBE\u8BA1\u7EA6\u675F\uFF1A\n * - \u4E0D\u4F9D\u8D56 DOM / Node API / \u5168\u5C40\u72B6\u6001\uFF0C\u53EF\u5728\u6D4F\u89C8\u5668 bundle \u4E0E Node \u6D4B\u8BD5\u91CC\u540C\u6837\u8FD0\u884C\u3002\n * - \u6240\u6709\u65F6\u95F4\u6309**\u672C\u673A\u672C\u5730\u65F6\u533A**\u7406\u89E3\uFF1B\u65E5\u671F\u952E\u662F\u672C\u5730 `YYYY-MM-DD`\u3002\n * - \u91D1\u989D\u4E0D\u505A\u53D6\u6574\uFF08\u5C55\u793A\u5C42\u7528 formatMoney \u63A7\u5236\u5C0F\u6570\u4F4D\uFF09\uFF0C\u907F\u514D\u9010\u79D2\u7D2F\u8BA1\u8BEF\u5DEE\u3002\n *\n * \u53E3\u5F84\uFF08\u8BE6\u89C1 SPEC.md \u00A71\uFF09\uFF1A\n * \u65E5\u6709\u6548\u5DE5\u65F6 = \u4E0A\u73ED~\u4E0B\u73ED\u8DE8\u5EA6 - \uFF08\u5348\u4F11\u542F\u7528\u4E14\u5348\u4F11\u4E0D\u7B97\u5DE5\u65F6 ? \u5348\u4F11\u8DE8\u5EA6 : 0\uFF09\n * \u65E5\u5DE5\u8D44 = \u5B9E\u6536\u6708\u85AA / \u5F53\u6708\u5DE5\u4F5C\u65E5\u6570\uFF08\u5468\u672B\u4E0E\u6CD5\u5B9A\u8282\u5047\u65E5\u4E0D\u7B97\uFF0C\u8C03\u4F11\u4E0A\u73ED\u65E5\u7B97\uFF09\n * \u65F6\u5DE5\u8D44 = \u65E5\u5DE5\u8D44 / \u65E5\u6709\u6548\u5DE5\u65F6\uFF1B\u5206/\u79D2\u5DE5\u8D44\u9010\u7EA7\u9664 60\n * \u5468\u5DE5\u8D44 = \u65E5\u5DE5\u8D44 \u00D7 \u672C\u5468\uFF08\u5468\u4E00~\u5468\u65E5\uFF09\u5DE5\u4F5C\u65E5\u6570\n *\n * @module dsh-niuma/core\n */\nimport { DEFAULT_HOLIDAYS, DEFAULT_EXTRA_WORKDAYS } from './holidays.mjs';\n\n/** \u9ED8\u8BA4\u914D\u7F6E\uFF1A\u5B57\u6BB5\u4E0E\u9ED8\u8BA4\u503C\u7684\u552F\u4E00\u6765\u6E90\uFF08settings schema / \u9762\u677F / \u5BBF\u4E3B\u5171\u7528\uFF09\u3002 */\nexport const DEFAULTS = Object.freeze({\n monthlySalary: 10000,\n workStart: '09:00',\n workEnd: '18:00',\n lunchEnabled: true,\n lunchStart: '12:00',\n lunchEnd: '13:00',\n lunchPaid: false,\n holidays: DEFAULT_HOLIDAYS,\n extraWorkdays: DEFAULT_EXTRA_WORKDAYS,\n /** \u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D\uFF080-6\uFF09 */\n decimals: 4,\n /** \u9762\u677F\u5237\u65B0\u95F4\u9694 ms\uFF1A1000=\u6309\u79D2\uFF1B16\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF08\u8FDE\u7EED\u6EDA\u52A8\uFF09\uFF1B\u4E2D\u95F4\u503C\u4E3A\u6BEB\u79D2\u7EA7 */\n updateMs: 1000,\n /** \u52A0\u901F\uFF08\u6EDA\u52A8\u6A21\u5F0F\uFF09\uFF1Atrue \u65F6\u5F3A\u5236\u6BEB\u79D2\u7EA7\u5237\u65B0\uFF08\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF09\uFF0C\u6570\u5B57\u8FDE\u7EED\u6EDA\u52A8 */\n turbo: false,\n});\n\nconst SALARY_MAX = 10_000_000;\nconst DAY_MS = 86_400_000;\nconst DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/* ------------------------------------------------------------------ *\n * \u65F6\u95F4\u89E3\u6790 / \u683C\u5F0F\u5316\n * ------------------------------------------------------------------ */\n\n/**\n * \u628A 'HH:mm' \u89E3\u6790\u6210\u5F53\u5929\u5206\u949F\u6570\u3002\n * @param {string} text\n * @returns {number|null} 0..1439\uFF1B\u975E\u6CD5\u503C\u8FD4\u56DE null\u3002\n */\nexport function parseHm(text) {\n if (typeof text !== 'string') return null;\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(text.trim());\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (hour > 23 || minute > 59) return null;\n return hour * 60 + minute;\n}\n\n/**\n * \u628A\u5206\u949F\u6570\u683C\u5F0F\u5316\u4E3A 'HH:mm'\u3002\n * @param {number} minutes\n * @returns {string}\n */\nexport function formatHm(minutes) {\n const total = Math.max(0, Math.min(24 * 60 - 1, Math.round(Number(minutes) || 0)));\n const hour = Math.floor(total / 60);\n const minute = total % 60;\n return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n}\n\n/**\n * \u672C\u5730\u65E5\u671F\u952E 'YYYY-MM-DD'\u3002\n * @param {Date} date\n * @returns {string}\n */\nexport function dateKeyOf(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * \u628A 'YYYY-MM-DD' \u89E3\u6790\u6210**\u672C\u5730**\u96F6\u70B9 Date\u3002\n * @param {string} key\n * @returns {Date|null} \u975E\u6CD5\u65E5\u671F\u8FD4\u56DE null\u3002\n */\nexport function parseDateKey(key) {\n if (typeof key !== 'string' || !DATE_RE.test(key)) return null;\n const [year, month, day] = key.split('-').map(Number);\n const date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return null;\n return date;\n}\n\n/* ------------------------------------------------------------------ *\n * \u914D\u7F6E\u6821\u9A8C\n * ------------------------------------------------------------------ */\n\nfunction normalizeDateList(value) {\n const errors = [];\n const list = [];\n const seen = new Set();\n const items = Array.isArray(value) ? value : [];\n for (const raw of items) {\n if (typeof raw !== 'string' || !DATE_RE.test(raw.trim())) {\n errors.push(`\u65E5\u671F\u683C\u5F0F\u5E94\u4E3A YYYY-MM-DD\uFF1A${String(raw)}`);\n continue;\n }\n const key = raw.trim();\n if (parseDateKey(key) === null) {\n errors.push(`\u4E0D\u662F\u771F\u5B9E\u65E5\u671F\uFF1A${key}`);\n continue;\n }\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(key);\n }\n list.sort();\n return { list, errors };\n}\n\n/**\n * \u5408\u5E76\u9ED8\u8BA4\u503C\u5E76\u6821\u9A8C\uFF1B**\u4E0D\u629B\u9519**\uFF0C\u628A\u6240\u6709\u95EE\u9898\u6536\u96C6\u5230 errors\uFF08\u9762\u677F\u53EF\u5373\u65F6\u63D0\u793A\uFF09\u3002\n * @param {object} patch \u90E8\u5206\u6216\u5B8C\u6574\u914D\u7F6E\n * @returns {{ config: object, errors: string[] }}\n */\nexport function normalizeConfig(patch) {\n const source = patch && typeof patch === 'object' ? patch : {};\n const merged = { ...DEFAULTS };\n for (const key of Object.keys(DEFAULTS)) {\n if (source[key] !== undefined) merged[key] = source[key];\n }\n const errors = [];\n\n // \u6708\u85AA\n const salary = Number(merged.monthlySalary);\n if (!Number.isFinite(salary) || salary <= 0 || salary > SALARY_MAX) {\n errors.push(`\u6708\u85AA\u9700\u8981\u662F 0~${SALARY_MAX} \u4E4B\u95F4\u7684\u6570\u5B57`);\n merged.monthlySalary = salary;\n } else {\n merged.monthlySalary = salary;\n }\n\n // \u65F6\u95F4\n const start = parseHm(merged.workStart);\n const end = parseHm(merged.workEnd);\n const lunchStart = parseHm(merged.lunchStart);\n const lunchEnd = parseHm(merged.lunchEnd);\n if (start === null) errors.push('\u4E0A\u73ED\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (end === null) errors.push('\u4E0B\u73ED\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (summaryLunchEnabled(merged) && lunchStart === null) errors.push('\u5348\u4F11\u5F00\u59CB\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (summaryLunchEnabled(merged) && lunchEnd === null) errors.push('\u5348\u4F11\u7ED3\u675F\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (start !== null && end !== null && end <= start) errors.push('\u4E0B\u73ED\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u4E0A\u73ED\u65F6\u95F4\uFF08\u6682\u4E0D\u652F\u6301\u8DE8\u591C\u73ED\uFF09');\n if (summaryLunchEnabled(merged) && start !== null && end !== null && lunchStart !== null && lunchEnd !== null) {\n if (lunchStart < start) errors.push('\u5348\u4F11\u5F00\u59CB\u4E0D\u80FD\u65E9\u4E8E\u4E0A\u73ED\u65F6\u95F4');\n if (lunchEnd > end) errors.push('\u5348\u4F11\u7ED3\u675F\u4E0D\u80FD\u665A\u4E8E\u4E0B\u73ED\u65F6\u95F4');\n if (lunchEnd <= lunchStart) errors.push('\u5348\u4F11\u7ED3\u675F\u5FC5\u987B\u665A\u4E8E\u5348\u4F11\u5F00\u59CB');\n if (lunchEnd - lunchStart >= end - start) errors.push('\u5348\u4F11\u65F6\u957F\u4E0D\u80FD\u8986\u76D6\u6574\u4E2A\u5DE5\u4F5C\u65F6\u95F4');\n }\n\n // \u5E03\u5C14\n merged.lunchEnabled = merged.lunchEnabled !== false;\n merged.lunchPaid = merged.lunchPaid === true;\n\n // \u5C55\u793A/\u5237\u65B0\u504F\u597D\uFF1A\u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D 0-6\uFF1B\u5237\u65B0\u95F4\u9694 16-1000ms\uFF0816 \u2248 \u5C4F\u5E55\u5237\u65B0\u7387\uFF09\uFF1B\u52A0\u901F\u5F00\u5173\n merged.turbo = merged.turbo === true;\n const decimals = Number(merged.decimals);\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 6) {\n errors.push('\u5C0F\u6570\u4F4D\u6570\u9700\u8981\u662F 0~6 \u7684\u6574\u6570');\n merged.decimals = Number.isInteger(decimals) ? decimals : DEFAULTS.decimals;\n } else {\n merged.decimals = decimals;\n }\n const updateMs = Number(merged.updateMs);\n if (!Number.isInteger(updateMs) || updateMs < 16 || updateMs > 1000) {\n errors.push('\u5237\u65B0\u95F4\u9694\u9700\u8981\u662F 16~1000ms \u7684\u6574\u6570');\n merged.updateMs = Number.isInteger(updateMs) ? updateMs : DEFAULTS.updateMs;\n } else {\n merged.updateMs = updateMs;\n }\n\n // \u65E5\u671F\u5217\u8868\n const holidays = normalizeDateList(merged.holidays);\n const extraWorkdays = normalizeDateList(merged.extraWorkdays);\n errors.push(...holidays.errors, ...extraWorkdays.errors);\n merged.holidays = holidays.list;\n merged.extraWorkdays = extraWorkdays.list;\n\n return { config: merged, errors };\n}\n\nfunction summaryLunchEnabled(config) {\n return config?.lunchEnabled !== false;\n}\n\n/**\n * \u6821\u9A8C\u5E76\u8FD4\u56DE\u89C4\u8303\u5316\u914D\u7F6E\uFF1B\u975E\u6CD5\u65F6\u629B\u9519\uFF08\u5BBF\u4E3B\u5199\u63A5\u53E3\u7528\uFF09\u3002\n * @param {object} patch\n * @returns {object} \u89C4\u8303\u5316\u540E\u7684\u5B8C\u6574\u914D\u7F6E\n */\nexport function validateConfig(patch) {\n const { config, errors } = normalizeConfig(patch);\n if (errors.length > 0) throw new Error(errors.join('\uFF1B'));\n return config;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5DE5\u4F5C\u65E5 / \u5DE5\u8D44\u7387\n * ------------------------------------------------------------------ */\n\n/** \u5224\u65AD\u67D0\u4E00\u5929\u662F\u5426\u5DE5\u4F5C\u65E5\uFF08\u8C03\u4F11\u4E0A\u73ED\u65E5 > \u6CD5\u5B9A\u8282\u5047\u65E5 > \u5468\u4E00~\u5468\u4E94\uFF09\u3002 */\nexport function isWorkday(key, config) {\n const holidays = new Set(config.holidays ?? DEFAULTS.holidays);\n const extra = new Set(config.extraWorkdays ?? DEFAULTS.extraWorkdays);\n if (extra.has(key)) return true;\n if (holidays.has(key)) return false;\n const date = parseDateKey(key);\n if (date === null) return false;\n const day = date.getDay();\n return day >= 1 && day <= 5;\n}\n\n/**\n * \u67D0\u81EA\u7136\u6708\u7684\u5DE5\u4F5C\u65E5\u6570\u3002\n * @param {number} year\n * @param {number} monthIndex 0-11\n * @param {object} config\n * @returns {number}\n */\nexport function workdaysInMonth(year, monthIndex, config) {\n const last = new Date(year, monthIndex + 1, 0).getDate();\n let count = 0;\n for (let day = 1; day <= last; day += 1) {\n if (isWorkday(dateKeyOf(new Date(year, monthIndex, day)), config)) count += 1;\n }\n return count;\n}\n\n/**\n * \u67D0\u4E00\u5929\u6240\u5728\u81EA\u7136\u5468\uFF08\u5468\u4E00~\u5468\u65E5\uFF09\u7684\u5DE5\u4F5C\u65E5\u6570\u3002\n * @param {string} key\n * @param {object} config\n * @returns {number}\n */\nexport function workdaysInWeek(key, config) {\n const date = parseDateKey(key);\n if (date === null) return 0;\n const offsetToMonday = (date.getDay() + 6) % 7; // \u5468\u4E00=0\n const monday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - offsetToMonday);\n let count = 0;\n for (let i = 0; i < 7; i += 1) {\n const day = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() + i);\n if (isWorkday(dateKeyOf(day), config)) count += 1;\n }\n return count;\n}\n\n/**\n * \u6BCF\u5929\u7684\u6709\u6548\u8BA1\u85AA\u5206\u949F\u6570\uFF08\u6263\u6389\u4E0D\u8BA1\u85AA\u7684\u5348\u4F11\uFF09\u3002\n * @param {object} config\n * @returns {number}\n */\nexport function paidMinutesPerDay(config) {\n const start = parseHm(config.workStart);\n const end = parseHm(config.workEnd);\n if (start === null || end === null || end <= start) return 0;\n let minutes = end - start;\n if (config.lunchEnabled !== false && config.lunchPaid !== true) {\n const lunchStart = parseHm(config.lunchStart);\n const lunchEnd = parseHm(config.lunchEnd);\n if (lunchStart !== null && lunchEnd !== null && lunchStart >= start && lunchEnd <= end && lunchEnd > lunchStart) {\n minutes -= lunchEnd - lunchStart;\n }\n }\n return Math.max(0, minutes);\n}\n\nfunction stripTimeToSeconds(date) {\n return date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();\n}\n\n/**\n * \u8BA1\u7B97\u67D0\u5929\u7684\u5DE5\u8D44\u7387\uFF08\u65E5/\u65F6/\u5206/\u79D2/\u5468/\u6708\uFF09\u3002\n * @param {object} config\n * @param {string} [dateKey] \u51B3\u5B9A\u300C\u5F53\u6708/\u5F53\u5468\u300D\u53E3\u5F84\u7684\u65E5\u671F\u952E\uFF0C\u9ED8\u8BA4\u4ECA\u5929\n * @returns {object}\n */\nexport function computeRates(config, dateKey) {\n const todayKey = dateKey ?? dateKeyOf(new Date());\n const date = parseDateKey(todayKey) ?? new Date();\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const monthlySalary = Number(config.monthlySalary) || 0;\n const monthlyWorkdays = workdaysInMonth(year, monthIndex, config);\n const weekWorkdays = workdaysInWeek(todayKey, config);\n const paidMinutes = paidMinutesPerDay(config);\n const dailyWage = monthlyWorkdays > 0 ? monthlySalary / monthlyWorkdays : 0;\n const paidHours = paidMinutes / 60;\n const hourlyWage = paidHours > 0 ? dailyWage / paidHours : 0;\n return {\n monthlySalary,\n monthlyWorkdays,\n weekWorkdays,\n paidMinutes,\n paidHours,\n dailyWage,\n hourlyWage,\n minuteWage: hourlyWage / 60,\n secondWage: hourlyWage / 3600,\n weeklyWage: dailyWage * weekWorkdays,\n monthlyWage: monthlySalary,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * \u4ECA\u65E5\u5DF2\u8D5A / \u533A\u95F4\u8FDB\u5EA6\n * ------------------------------------------------------------------ */\n\n/**\n * \u4ECA\u65E5\uFF08\u6216\u6307\u5B9A Date\uFF09\u7684\u5B9E\u65F6\u6536\u76CA\u4E0E\u72B6\u6001\u3002\n * @param {object} config\n * @param {Date} now\n * @returns {object}\n */\nexport function earnedToday(config, now) {\n const date = now instanceof Date && !Number.isNaN(now.getTime()) ? now : new Date();\n const key = dateKeyOf(date);\n const rates = computeRates(config, key);\n const workday = isWorkday(key, config);\n const startSec = (parseHm(config.workStart) ?? 0) * 60;\n const endSec = (parseHm(config.workEnd) ?? 0) * 60;\n const paidTotalSec = rates.paidMinutes * 60;\n const nowSec = stripTimeToSeconds(date);\n\n let status;\n if (!workday) status = 'rest';\n else if (nowSec < startSec) status = 'before';\n else if (nowSec >= endSec) status = 'off';\n else if (isWithinUnpaidLunch(config, nowSec)) status = 'lunch';\n else status = 'working';\n\n let elapsedSec = 0;\n if (workday) {\n elapsedSec = Math.max(0, Math.min(nowSec, endSec) - startSec);\n // \u4E0D\u8BA1\u85AA\u5348\u4F11\uFF1A\u6309\u201C\u5F53\u524D\u5DF2\u8FDB\u5165\u5348\u4F11\u7684\u7D2F\u8BA1\u91CD\u53E0\u201D\u6263\u9664\uFF08\u5348\u4F11\u4E2D\u51BB\u7ED3\u3001\u5348\u4F11\u540E\u7EE7\u7EED\uFF09\n if (config.lunchEnabled !== false && config.lunchPaid !== true) {\n const lunchStart = (parseHm(config.lunchStart) ?? 0) * 60;\n const lunchEnd = (parseHm(config.lunchEnd) ?? 0) * 60;\n if (lunchEnd > lunchStart) {\n const lunchLength = lunchEnd - lunchStart;\n const overlap = Math.max(0, Math.min(Math.min(nowSec, endSec), lunchEnd) - lunchStart);\n elapsedSec -= Math.min(overlap, lunchLength);\n }\n }\n elapsedSec = Math.max(0, Math.min(elapsedSec, paidTotalSec));\n }\n\n const todayEarned = Math.min(rates.dailyWage, elapsedSec * rates.secondWage);\n const todayTarget = workday ? rates.dailyWage : 0;\n const todayProgress = workday && paidTotalSec > 0 ? Math.min(1, elapsedSec / paidTotalSec) : 0;\n const monthEarned = earnedThisMonth(config, key, date, todayEarned, rates);\n const secondsToStart = workday && nowSec < startSec ? startSec - nowSec : 0;\n const secondsToEnd = workday && nowSec < endSec ? endSec - nowSec : 0;\n\n // \u672C\u6708\u5DE5\u4F5C\u5929\u6570\u8FDB\u5EA6\uFF1A\u5DF2\u5B8C\u6210 = \u4ECA\u5929\u4E4B\u524D\u7684\u5B8C\u6574\u5DE5\u4F5C\u65E5 +\uFF08\u4ECA\u5929\u5DF2\u4E0B\u73ED\u5219 +1\uFF09\uFF1B\n // \u300C\u4ECA\u5929\u300D\u5728\u4E0A\u73ED/\u5348\u4F11\u4E2D\u65F6\u7B97\u5269\u4F59\uFF08\u8FD8\u6CA1\u5E72\u5B8C\uFF09\uFF0C\u8FD9\u6837\u300C\u5DF2\u5DE5\u4F5C + \u5269\u4F59 = \u672C\u6708\u603B\u5DE5\u4F5C\u65E5\u300D\u3002\n const monthWorkdays = rates.monthlyWorkdays;\n let monthWorkdaysDone = 0;\n for (let day = 1; day < date.getDate(); day += 1) {\n if (isWorkday(dateKeyOf(new Date(date.getFullYear(), date.getMonth(), day)), config)) monthWorkdaysDone += 1;\n }\n if (workday && status === 'off') monthWorkdaysDone += 1;\n const monthWorkdaysLeft = Math.max(0, monthWorkdays - monthWorkdaysDone);\n\n return {\n dateKey: key,\n isWorkday: workday,\n status,\n paidSecondsElapsed: elapsedSec,\n paidSecondsTotal: paidTotalSec,\n todayEarned,\n todayTarget,\n todayProgress,\n monthEarned,\n monthWorkdays,\n monthWorkdaysDone,\n monthWorkdaysLeft,\n secondsToStart,\n secondsToEnd,\n rates,\n };\n}\n\nfunction isWithinUnpaidLunch(config, nowSec) {\n if (config.lunchEnabled === false || config.lunchPaid === true) return false;\n const lunchStart = parseHm(config.lunchStart);\n const lunchEnd = parseHm(config.lunchEnd);\n if (lunchStart === null || lunchEnd === null || lunchEnd <= lunchStart) return false;\n const from = lunchStart * 60;\n const to = lunchEnd * 60;\n return nowSec >= from && nowSec < to;\n}\n\nfunction earnedThisMonth(config, key, date, todayEarned, rates) {\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const today = date.getDate();\n let previousWorkdays = 0;\n for (let day = 1; day < today; day += 1) {\n const dayKey = dateKeyOf(new Date(year, monthIndex, day));\n if (isWorkday(dayKey, config)) previousWorkdays += 1;\n }\n return previousWorkdays * rates.dailyWage + todayEarned;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C55\u793A\u683C\u5F0F\u5316\n * ------------------------------------------------------------------ */\n\n/**\n * \u91D1\u989D\u683C\u5F0F\u5316\uFF1A\u56FA\u5B9A\u5C0F\u6570\u4F4D + \u5343\u5206\u4F4D\u3002\n * @param {number} value\n * @param {number} [digits]\n * @returns {string}\n */\nexport function formatMoney(value, digits = 2) {\n const number = Number(value);\n const safe = Number.isFinite(number) ? number : 0;\n const fixed = Math.abs(safe).toFixed(Math.max(0, Math.min(6, digits)));\n const [intPart, decPart] = fixed.split('.');\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return `${safe < 0 ? '-' : ''}${grouped}${decPart ? `.${decPart}` : ''}`;\n}\n\n/**\n * \u79D2\u6570\u683C\u5F0F\u5316\u4E3A\u4E2D\u6587\u65F6\u957F\u3002\n * @param {number} seconds\n * @returns {string}\n */\nexport function formatDuration(seconds) {\n const total = Math.max(0, Math.floor(Number(seconds) || 0));\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n if (hours > 0) return `${hours}\u5C0F\u65F6 ${minutes}\u5206 ${rest}\u79D2`;\n if (minutes > 0) return `${minutes}\u5206 ${rest}\u79D2`;\n return `${rest}\u79D2`;\n}\n\n/** \u4F9B\u9762\u677F\u811A\u6CE8\uFF1A\u5F53\u6708\u5DE5\u4F5C\u65E5\u660E\u7EC6\u7528\uFF08\u8FD4\u56DE\u8BE5\u6708\u6240\u6709\u5DE5\u4F5C\u65E5\u65E5\u671F\u952E\uFF09\u3002 */\nexport function workdaysOfMonth(year, monthIndex, config) {\n const last = new Date(year, monthIndex + 1, 0).getDate();\n const out = [];\n for (let day = 1; day <= last; day += 1) {\n const key = dateKeyOf(new Date(year, monthIndex, day));\n if (isWorkday(key, config)) out.push(key);\n }\n return out;\n}\n\n/** \u4ECA\u5929\u662F\u5426\u662F\u6CD5\u5B9A\u8282\u5047\u65E5\uFF08\u4E0D\u542B\u666E\u901A\u5468\u672B\uFF09\uFF0C\u7528\u4E8E\u6587\u6848\u533A\u5206\u3002 */\nexport function isStatutoryHoliday(key, config) {\n return new Set(config.holidays ?? DEFAULTS.holidays).has(key);\n}\n\nexport { DAY_MS };\n\n/* ------------------------------------------------------------------ *\n * \u6708\u5EA6 / \u5168\u5E74\u89C6\u89D2\uFF08\u53EA\u5F71\u54CD\u300C\u67E5\u770B\u300D\uFF0C\u4E0D\u5F71\u54CD\u4ECA\u65E5\u8BA1\u6570\u5668\uFF09\n * ------------------------------------------------------------------ */\n\n/** \u67D0\u5E74\u67D0\u6708\u91CC\u914D\u7F6E\u4E2D\u7684\u6CD5\u5B9A\u8282\u5047\u65E5\u65E5\u671F\u6570\uFF08\u6309\u65E5\u671F\u952E\u524D\u7F00\u7EDF\u8BA1\uFF0C\u65E0\u8BBA\u662F\u5426\u843D\u5728\u5468\u672B\uFF09\u3002 */\nexport function holidayDaysInMonth(year, monthIndex, config) {\n const prefix = `${year}-${String(monthIndex + 1).padStart(2, '0')}-`;\n return (config.holidays ?? DEFAULTS.holidays).filter((key) => key.startsWith(prefix)).length;\n}\n\n/**\n * \u5355\u6708\u6982\u89C8\uFF1A\u5DE5\u4F5C\u65E5\u6570\u3001\u6CD5\u5B9A\u5047\u65E5\u6570\u3001\u65E5/\u65F6/\u5206/\u79D2\u5DE5\u8D44\u7B49\u3002\n *\n * \u53E3\u5F84\u4E0E\u4ECA\u65E5\u8BA1\u6570\u4E00\u81F4\uFF1A\u6708\u85AA / \u5F53\u6708\u5DE5\u4F5C\u65E5 = \u65E5\u5DE5\u8D44\uFF08\u8282\u5047\u65E5\u4E0D\u7B97\u5DE5\u4F5C\u65E5 \u2192 \u65E5\u5DE5\u8D44\u66F4\u9AD8\uFF09\u3002\n * @param {object} config\n * @param {number} year\n * @param {number} monthIndex 0-11\n * @returns {object}\n */\nexport function monthSummary(config, year, monthIndex) {\n const daysInMonth = new Date(year, monthIndex + 1, 0).getDate();\n const workdays = workdaysInMonth(year, monthIndex, config);\n const holidayDays = holidayDaysInMonth(year, monthIndex, config);\n const monthlySalary = Number(config.monthlySalary) || 0;\n const paidMinutes = paidMinutesPerDay(config);\n const paidHours = paidMinutes / 60;\n const dailyWage = workdays > 0 ? monthlySalary / workdays : 0;\n const hourlyWage = paidHours > 0 ? dailyWage / paidHours : 0;\n return {\n year,\n monthIndex,\n month: monthIndex + 1,\n daysInMonth,\n workdays,\n holidayDays,\n restDays: daysInMonth - workdays,\n monthlySalary,\n paidMinutes,\n paidHours,\n dailyWage,\n hourlyWage,\n minuteWage: hourlyWage / 60,\n secondWage: hourlyWage / 3600,\n };\n}\n\n/**\n * \u5168\u5E74\u6982\u89C8\uFF1A12 \u4E2A\u6708\u6C47\u603B + \u5168\u5E74\u5E73\u5747\u5DE5\u8D44 + \u6CD5\u5B9A\u5047\u65E5\u6700\u591A\u7684\u6708\u4EFD\u3002\n *\n * \u300C\u5168\u5E74\u5E73\u5747\u300D\u53E3\u5F84\uFF1A\u5E74\u6536\u5165 = \u5B9E\u6536\u6708\u85AA \u00D7 12\uFF1B\u5E73\u5747\u65E5\u85AA = \u5E74\u6536\u5165 / \u5168\u5E74\u5DE5\u4F5C\u65E5\uFF1B\n * \u5E73\u5747\u65F6\u85AA = \u5E73\u5747\u65E5\u85AA / \u65E5\u6709\u6548\u5DE5\u65F6\u3002\u5E73\u5747\u6708\u85AA = \u5B9E\u6536\u6708\u85AA\uFF08\u4E0D\u56E0\u6708\u4EFD\u6D6E\u52A8\uFF09\u3002\n * @param {object} config\n * @param {number} year\n * @returns {object}\n */\nexport function yearSummary(config, year) {\n const months = Array.from({ length: 12 }, (_, monthIndex) => monthSummary(config, year, monthIndex));\n const totalWorkdays = months.reduce((sum, item) => sum + item.workdays, 0);\n const totalHolidayDays = months.reduce((sum, item) => sum + item.holidayDays, 0);\n const monthlySalary = Number(config.monthlySalary) || 0;\n const annualIncome = monthlySalary * 12;\n const paidMinutes = paidMinutesPerDay(config);\n const paidHours = paidMinutes / 60;\n const averageDailyWage = totalWorkdays > 0 ? annualIncome / totalWorkdays : 0;\n const averageHourlyWage = paidHours > 0 ? averageDailyWage / paidHours : 0;\n const maxHolidayMonth = months.reduce((best, item) => {\n if (item.holidayDays !== best.holidayDays) return item.holidayDays > best.holidayDays ? item : best;\n if (item.workdays !== best.workdays) return item.workdays < best.workdays ? item : best;\n return item.month < best.month ? item : best;\n }, months[0]);\n return {\n year,\n months,\n totalWorkdays,\n totalHolidayDays,\n paidMinutes,\n paidHours,\n monthlySalary,\n annualIncome,\n averageMonthlyWage: monthlySalary,\n averageDailyWage,\n averageHourlyWage,\n averageMinuteWage: averageHourlyWage / 60,\n averageSecondWage: averageHourlyWage / 3600,\n maxHolidayMonth,\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react';\nimport {\n DEFAULTS,\n computeRates,\n earnedToday,\n formatDuration,\n formatMoney,\n monthSummary,\n normalizeConfig,\n yearSummary,\n} from '../core.mjs';\nimport {\n HOLIDAY_BLOCKS,\n HOLIDAY_BLOCKS_2027_ESTIMATED,\n HOLIDAY_ESTIMATE_2027,\n HOLIDAY_SOURCE,\n} from '../holidays.mjs';\n\n/**\n * dsh-niuma \u6D4F\u89C8\u5668\u534A\u4FA7\uFF1ADSH \u4FA7\u680F\u300C\u725B\u9A6C\u300D\u5165\u53E3 + \u4E2D\u680F\u5DE5\u8D44\u5B9E\u65F6\u8BA1\u6570\u5668\u9762\u677F\u3002\n *\n * \u6570\u636E\u6765\u6E90\uFF1A\n * GET /niuma/config \u2014\u2014 \u5BBF\u4E3B\u4FA7\u914D\u7F6E\uFF08\u62FF\u4E0D\u5230\u5C31\u7528\u5185\u7F6E DEFAULTS\uFF0C\u4ECD\u7136\u8BA1\u65F6\uFF09\n * POST /niuma/settings \u2014\u2014 \u9762\u677F\u5185\u6539\u914D\u7F6E\n *\n * \u8BA1\u7B97\u4E00\u5F8B\u8C03\u7528 ../core.mjs \u7684\u7EAF\u51FD\u6570\uFF08\u5BBF\u4E3B\u534A\u4FA7\u540C\u6E90\uFF09\uFF0C\u8FD9\u91CC\u53EA\u505A\u6E32\u67D3\u4E0E\u4EA4\u4E92\u3002\n * \u6837\u5F0F\u53EA\u7528 DSH \u4E3B\u9898\u53D8\u91CF --dsw-alias-*\uFF0C\u6DF1\u6D45\u8272\u4E3B\u9898\u4E0B\u90FD\u8DDF\u968F\u754C\u9762\uFF0C\u65E0\u9700\u4E3B\u9898\u68C0\u6D4B\u3002\n */\n\n/** \u5305\u540D\u5728\u6784\u5EFA\u671F\u7531 tools/build-client.mjs \u6CE8\u5165\uFF08define: __DSH_PLUGIN_NAME__\uFF09\u3002 */\nconst PKG_NAME = typeof __DSH_PLUGIN_NAME__ === 'string' ? __DSH_PLUGIN_NAME__ : 'dsh-niuma';\nconst SHORT_NAME = PKG_NAME.replace(/^dsh-/, '');\n/** \u4FA7\u680F id \u4E0E main \u9762\u677F key \u5FC5\u987B\u540C\u540D\uFF1BSPEC \u51BB\u7ED3\u4E3A 'niuma'\u3002 */\nconst SLOT_ID = SHORT_NAME === 'niuma' ? 'niuma' : SHORT_NAME;\nconst LOCALE_NS = SLOT_ID;\nconst ROUTE_BASE = `/${SHORT_NAME}`;\n\n/* ------------------------------------------------------------------ *\n * \u4E3B\u9898\u8272\uFF08\u5168\u90E8\u57FA\u4E8E DSH \u7684 --dsw-alias-* \u53D8\u91CF\uFF0C\u62EC\u53F7\u91CC\u662F\u53D8\u91CF\u7684\u515C\u5E95\u503C\uFF09\n * ------------------------------------------------------------------ */\nconst C = {\n label: 'var(--dsw-alias-label-primary, #1f2329)',\n label2: 'var(--dsw-alias-label-secondary, #5a6472)',\n label3: 'var(--dsw-alias-label-tertiary, #8a94a6)',\n border: 'var(--dsw-alias-border-l2, rgba(128,128,128,.28))',\n border1: 'var(--dsw-alias-border-l1, rgba(128,128,128,.16))',\n layer1: 'var(--dsw-alias-bg-layer-1, rgba(128,128,128,.06))',\n layer2: 'var(--dsw-alias-bg-layer-2, rgba(128,128,128,.10))',\n brand: 'var(--dsw-alias-brand-primary, #2f7dff)',\n ok: 'var(--dsw-alias-state-success-primary, #3fb950)',\n warn: 'var(--dsw-alias-state-warn-primary, #e3b341)',\n error: 'var(--dsw-alias-state-error-primary, #f85149)',\n};\n\n/** \u540C\u6392\u5361\u7247\u7EDF\u4E00\uFF1A\u5706\u89D2 / \u9634\u5F71 / \u5E95\u8272 / \u8FB9\u6846\u5B8C\u5168\u4E00\u81F4\u3002 */\nconst CARD = {\n border: `1px solid ${C.border1}`,\n borderRadius: 12,\n background: C.layer1,\n boxShadow: '0 1px 2px rgba(0,0,0,.07)',\n padding: '10px 12px',\n boxSizing: 'border-box',\n};\n\n/** \u6570\u5B57\uFF1A\u7B49\u5BBD\u6570\u4F4D + \u4E0D\u6362\u884C\uFF08\u6BCF\u79D2\u8DF3\u52A8\u65F6\u5BBD\u5EA6\u4E0D\u6296\uFF09\u3002 */\nconst NUM = { fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap' };\n\n/** \u91D1\u8272\u91D1\u989D\uFF1A\u6E10\u53D8\u91D1\u5C5E\u8D28\u611F + \u5355\u8272\u56DE\u9000\uFF08\u4E0D\u652F\u6301 background-clip:text \u65F6\u663E\u793A\u91D1\u8272\uFF09\u3002 */\nconst GOLD = {\n color: '#D9A441',\n backgroundImage: 'linear-gradient(180deg, #FFE9A8 0%, #F2C14E 40%, #D79A2B 72%, #B87A16 100%)',\n WebkitBackgroundClip: 'text',\n backgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n textShadow: '0 1px 0 rgba(0,0,0,.05)',\n};\nconst GOLD_TINT = '#E7B84D';\n\n/** \u72B6\u6001\u5FBD\u6807\u914D\u8272\uFF1A\u989C\u8272\u4E0E\u8BED\u4E49\u4E00\u81F4\uFF0C\u6DF1\u6D45\u8272\u90FD\u9760\u4E3B\u9898\u53D8\u91CF\u3002 */\nconst STATUS_META = {\n rest: { key: 'statusRest', color: C.label3 },\n before: { key: 'statusBefore', color: C.warn },\n working: { key: 'statusWorking', color: C.ok },\n lunch: { key: 'statusLunch', color: C.brand },\n off: { key: 'statusOff', color: C.label2 },\n};\n\n/* ------------------------------------------------------------------ *\n * \u6587\u6848\uFF08zh / en \u8986\u76D6\u9762\u677F\u6240\u6709\u53EF\u89C1\u6587\u6848\uFF09\n * ------------------------------------------------------------------ */\nconst zh = {\n 'nav': '\u725B\u9A6C',\n 'title': '\u725B\u9A6C\u52A0\u901F\u5668',\n 'subtitle': '\u4ECA\u65E5\u5DE5\u8D44\u5B9E\u65F6\u8BA1\u6570\u5668',\n 'earnedToday': '\u4ECA\u65E5\u5DF2\u8D5A',\n 'todayOn': '\u4ECA\u5929',\n 'perSecond': '\u6BCF\u79D2\u8FDB\u8D26',\n 'statusRest': '\u4F11\u606F\u65E5',\n 'statusBefore': '\u672A\u4E0A\u73ED',\n 'statusWorking': '\u642C\u7816\u4E2D',\n 'statusLunch': '\u5348\u4F11\u4E2D',\n 'statusOff': '\u5DF2\u4E0B\u73ED',\n 'todayProgress': '\u4ECA\u65E5\u8FDB\u5EA6',\n 'progressOfTarget': '\u5DF2\u8D5A / \u76EE\u6807',\n 'toStart': '\u8DDD\u4E0A\u73ED',\n 'toEnd': '\u8DDD\u4E0B\u73ED',\n 'secondWage': '\u79D2\u5DE5\u8D44',\n 'minuteWage': '\u5206\u5DE5\u8D44',\n 'hourlyWage': '\u65F6\u5DE5\u8D44',\n 'dailyWage': '\u65E5\u5DE5\u8D44',\n 'weeklyWage': '\u5468\u5DE5\u8D44',\n 'monthlyWage': '\u6708\u5DE5\u8D44',\n 'details': '\u660E\u7EC6',\n 'monthlySalaryLabel': '\u5B9E\u6536\u6708\u85AA',\n 'workdaysThisMonth': '\u5F53\u6708\u5DE5\u4F5C\u65E5',\n 'paidHoursPerDay': '\u65E5\u6709\u6548\u5DE5\u65F6',\n 'todayTarget': '\u4ECA\u65E5\u76EE\u6807',\n 'monthEarned': '\u672C\u6708\u5DF2\u8D5A',\n 'monthWorkedDays': '\u672C\u6708\u5DF2\u5DE5\u4F5C',\n 'monthRemainingDays': '\u5269\u4F59\u5DE5\u4F5C\u65E5',\n 'holidaySourceLink': '\u56FD\u52A1\u9662\u529E\u516C\u5385 2026 \u5E74\u8282\u5047\u65E5\u5B89\u6392',\n 'configLoading': '\u6B63\u5728\u8BFB\u53D6\u8BBE\u7F6E\u2026',\n 'configFailed': '\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C',\n 'retry': '\u91CD\u8BD5',\n 'settings': '\u8BBE\u7F6E',\n 'decimalsLabel': '\u5C0F\u6570',\n 'decimalsUnit': '\u4F4D',\n 'turboLabel': '\u52A0\u901F',\n 'updateAvailable': '\u53D1\u73B0\u65B0\u7248\u672C v{version}',\n 'updateNow': '\u7ACB\u5373\u66F4\u65B0',\n 'updating': '\u6B63\u5728\u4E0B\u8F7D\u65B0\u7248\u672C\u2026',\n 'updateStaged': 'v{version} \u5DF2\u4E0B\u8F7D \u00B7 \u91CD\u542F DSH \u751F\u6548',\n 'refreshRate': '\u5237\u65B0\u9891\u7387',\n 'rateSecond': '\u6309\u79D2\uFF081s\uFF09',\n 'rateFrame': '\u5237\u65B0\u7387\uFF08\u224816ms\uFF09',\n 'settingsHint': '\u6539\u5B8C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF1B\u683C\u5F0F\u4E0D\u5BF9\u4F1A\u5728\u4E0B\u65B9\u7EA2\u5B57\u63D0\u793A\uFF0C\u4E0D\u5F71\u54CD\u8BA1\u65F6\u3002',\n 'salaryField': '\u5B9E\u6536\u6708\u85AA',\n 'groupSalary': '\u5DE5\u8D44',\n 'groupWorkTime': '\u5DE5\u4F5C\u65F6\u95F4',\n 'groupLunch': '\u5348\u4F11',\n 'salaryUnit': '\u5143 / \u6708',\n 'workStartField': '\u4E0A\u73ED\u65F6\u95F4',\n 'workEndField': '\u4E0B\u73ED\u65F6\u95F4',\n 'lunchEnabledField': '\u542F\u7528\u5348\u4F11',\n 'lunchEnabledShort': '\u542F\u7528',\n 'lunchStartField': '\u5348\u4F11\u5F00\u59CB',\n 'lunchEndField': '\u5348\u4F11\u7ED3\u675F',\n 'lunchPaidField': '\u5348\u4F11\u7B97\u5DE5\u65F6',\n 'lunchPaidShort': '\u7B97\u5DE5\u65F6',\n 'holidaysCardTitle': '\u8282\u5047\u65E5\u5B89\u6392',\n 'holidays2026Label': '2026 \u5E74\uFF08\u5B98\u65B9\uFF09',\n 'holidays2027Label': '2027 \u5E74\uFF08\u9884\u4F30\uFF09',\n 'holidayEstimateTag': '\u9884\u4F30',\n 'holidayEstimateNote': '\u5B98\u65B9\u5C1A\u672A\u516C\u5E03\uFF0C\u4EE5\u4E0A\u4E3A\u6309\u89C4\u5219\u4E0E\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4EE5\u56FD\u52A1\u9662\u901A\u77E5\u4E3A\u51C6\u3002',\n 'holidayEstimateShort': '2027 \u4E3A\u9884\u4F30\u503C',\n 'settingsDataNote': '\u8282\u5047\u65E5\u4E0E\u8C03\u4F11\u6570\u636E\u89C1\u4E0A\u65B9\u300C\u8282\u5047\u65E5\u5B89\u6392\u300D\u5361\u7247\uFF082027 \u5E74\u4E3A\u9884\u4F30\u503C\uFF0C\u4E0D\u53EF\u5728\u672C\u9875\u7F16\u8F91\uFF09\u3002',\n\n 'holidaysCardSub': '\u6CD5\u5B9A\u5047\u65E5 {days} \u5929 \u00B7 \u8C03\u4F11\u4E0A\u73ED {extra} \u5929',\n 'holidaysDaysShort': '{days} \u5929',\n 'holidaysExtraNote': '\u8C03\u4F11\u4E0A\u73ED\u65E5 {extra} \u5929\uFF08\u5468\u672B\u8865\u73ED\uFF0C\u6309\u5DE5\u4F5C\u65E5\u8BA1\uFF09',\n 'holidayNewYear': '\u5143\u65E6',\n 'holidaySpring': '\u6625\u8282',\n 'holidayQingming': '\u6E05\u660E',\n 'holidayLabour': '\u52B3\u52A8\u8282',\n 'holidayDragon': '\u7AEF\u5348',\n 'holidayMidAutumn': '\u4E2D\u79CB',\n 'holidayNational': '\u56FD\u5E86',\n 'save': '\u4FDD\u5B58',\n 'saving': '\u4FDD\u5B58\u4E2D\u2026',\n 'saved': '\u5DF2\u4FDD\u5B58',\n 'saveFailed': '\u4FDD\u5B58\u5931\u8D25\uFF1A',\n 'dayUnit': '\u5929',\n 'hourUnit': '\u5C0F\u65F6',\n 'minuteUnit': '\u5206\u949F',\n 'viewLabel': '\u67E5\u770B',\n 'viewCurrent': '\u672C\u6708',\n 'viewYear': '\u5168\u5E74\u5E73\u5747',\n 'monthUnit': '\u6708',\n 'holidayShort': '\u5047',\n 'currentHint': '\u6309\u6BCF\u6708 {days} \u4E2A\u5DE5\u4F5C\u65E5\u3001\u6BCF\u5929 {hours} \u5C0F\u65F6\u8BA1',\n 'monthHint': '{year} \u5E74 {month} \u6708 \u00B7 \u5DE5\u4F5C\u65E5 {workdays} \u5929 \u00B7 \u6CD5\u5B9A\u5047\u65E5 {holidays} \u5929',\n 'yearHint': '{year} \u5168\u5E74 \u00B7 {workdays} \u4E2A\u5DE5\u4F5C\u65E5 \u00B7 \u6309\u5E74\u6536\u5165\u6298\u7B97',\n 'viewOnlyHint': '\u4EC5\u6362\u7B97\uFF0C\u4E0D\u5F71\u54CD\u4ECA\u65E5\u8BA1\u6570\u5668',\n 'yearWorkdays': '\u5168\u5E74\u5DE5\u4F5C\u65E5',\n 'yearIncome': '\u5168\u5E74\u6536\u5165',\n 'averageDaily': '\u5E73\u5747\u65E5\u85AA',\n 'averageHourly': '\u5E73\u5747\u65F6\u85AA',\n 'averageMinute': '\u5E73\u5747\u5206\u85AA',\n 'averageSecond': '\u5E73\u5747\u79D2\u85AA',\n 'monthWorkdaysCard': '\u5DE5\u4F5C\u65E5',\n 'maxHolidayBadge': '\u5168\u5E74\u5047\u65E5\u6700\u591A',\n 'maxHolidayNote': '\u5168\u5E74\u5047\u65E5\u6700\u591A\uFF1A{month} \u6708\uFF08\u6CD5\u5B9A\u5047\u65E5 {days} \u5929\uFF09',\n 'maxHolidayThis': '\u5168\u5E74\u5047\u65E5\u6700\u591A\u7684\u6708\u4EFD\uFF08\u6CD5\u5B9A\u5047\u65E5 {days} \u5929\uFF09',\n 'sectionRates': '\u5DE5\u8D44\u6362\u7B97',\n 'sectionRatesHint': '\u6309\u6BCF\u6708 {days} \u4E2A\u5DE5\u4F5C\u65E5\u3001\u6BCF\u5929 {hours} \u5C0F\u65F6\u8BA1',\n 'sectionDetail': '\u4ECA\u65E5\u53E3\u5F84\u660E\u7EC6',\n 'restHint': '\u4ECA\u5929\u4F11\u606F\uFF0C\u597D\u597D\u8EBA\u5E73',\n 'liveNow': '\u5B9E\u65F6',\n};\n\nconst en = {\n 'nav': 'Niuma',\n 'title': 'Niuma Booster',\n 'subtitle': 'Real-time salary ticker',\n 'earnedToday': 'Earned today',\n 'todayOn': 'Today',\n 'perSecond': 'Per second',\n 'statusRest': 'Day off',\n 'statusBefore': 'Not started',\n 'statusWorking': 'Working',\n 'statusLunch': 'Lunch break',\n 'statusOff': 'Off work',\n 'todayProgress': 'Today progress',\n 'progressOfTarget': 'Earned / target',\n 'toStart': 'Until start',\n 'toEnd': 'Until off',\n 'secondWage': 'Per second',\n 'minuteWage': 'Per minute',\n 'hourlyWage': 'Per hour',\n 'dailyWage': 'Per day',\n 'weeklyWage': 'Per week',\n 'monthlyWage': 'Per month',\n 'details': 'Details',\n 'monthlySalaryLabel': 'Net monthly salary',\n 'workdaysThisMonth': 'Workdays this month',\n 'paidHoursPerDay': 'Paid hours / day',\n 'todayTarget': \"Today's target\",\n 'monthEarned': 'Earned this month',\n 'monthWorkedDays': 'Worked this month',\n 'monthRemainingDays': 'Workdays left',\n 'holidaySourceLink': 'State Council 2026 holiday schedule',\n 'configLoading': 'Loading settings\u2026',\n 'configFailed': 'Failed to load settings, using defaults',\n 'retry': 'Retry',\n 'settings': 'Settings',\n 'decimalsLabel': 'Decimals',\n 'decimalsUnit': 'dp',\n 'turboLabel': 'Turbo',\n 'updateAvailable': 'New version v{version}',\n 'updateNow': 'Update now',\n 'updating': 'Downloading update\u2026',\n 'updateStaged': 'v{version} downloaded \u00B7 restart DSH to apply',\n 'refreshRate': 'Refresh rate',\n 'rateSecond': 'Per second (1s)',\n 'rateFrame': 'Display rate (~16ms)',\n 'settingsHint': 'Click Save to apply. Invalid input is shown in red below; the ticker keeps running.',\n 'salaryField': 'Net monthly salary',\n 'groupSalary': 'Salary',\n 'groupWorkTime': 'Working hours',\n 'groupLunch': 'Lunch break',\n 'salaryUnit': 'CNY / month',\n 'workStartField': 'Work start',\n 'workEndField': 'Work end',\n 'lunchEnabledField': 'Enable lunch break',\n 'lunchEnabledShort': 'On',\n 'lunchStartField': 'Lunch start',\n 'lunchEndField': 'Lunch end',\n 'lunchPaidField': 'Lunch is paid',\n 'lunchPaidShort': 'Paid',\n 'holidaysCardTitle': 'Holiday calendar',\n 'holidays2026Label': '2026 (official)',\n 'holidays2027Label': '2027 (estimated)',\n 'holidayEstimateTag': 'estimate',\n 'holidayEstimateNote': 'Not announced officially yet \u2014 estimated from the rules and past practice, for reference only.',\n 'holidayEstimateShort': '2027 is estimated',\n 'settingsDataNote': 'Holiday data lives in the calendar card above (2027 values are estimates and not editable here).',\n\n 'holidaysCardSub': '{days} statutory days \u00B7 {extra} make-up workdays',\n 'holidaysDaysShort': '{days} d',\n 'holidaysExtraNote': '{extra} make-up workdays (weekend shifts, counted as workdays)',\n 'holidayNewYear': \"New Year's Day\",\n 'holidaySpring': 'Spring Festival',\n 'holidayQingming': 'Qingming',\n 'holidayLabour': 'Labour Day',\n 'holidayDragon': 'Dragon Boat',\n 'holidayMidAutumn': 'Mid-Autumn',\n 'holidayNational': 'National Day',\n 'save': 'Save',\n 'saving': 'Saving\u2026',\n 'saved': 'Saved',\n 'saveFailed': 'Save failed: ',\n 'dayUnit': 'd',\n 'hourUnit': 'h',\n 'minuteUnit': 'min',\n 'viewLabel': 'View',\n 'viewCurrent': 'This month',\n 'viewYear': 'Year average',\n 'monthUnit': 'M',\n 'holidayShort': 'hol.',\n 'currentHint': '{days} workdays / month \u00B7 {hours} h / day',\n 'monthHint': '{year}-{month} \u00B7 {workdays} workdays \u00B7 {holidays} statutory holidays',\n 'yearHint': '{year} \u00B7 {workdays} workdays \u00B7 averaged over the year',\n 'viewOnlyHint': 'Conversion only \u2014 today\\'s ticker is unaffected',\n 'yearWorkdays': 'Workdays / year',\n 'yearIncome': 'Annual income',\n 'averageDaily': 'Avg per day',\n 'averageHourly': 'Avg per hour',\n 'averageMinute': 'Avg per minute',\n 'averageSecond': 'Avg per second',\n 'monthWorkdaysCard': 'Workdays',\n 'maxHolidayBadge': 'Most holidays',\n 'maxHolidayNote': 'Most holidays: month {month} ({days} statutory days)',\n 'maxHolidayThis': 'The month with the most holidays ({days} statutory days)',\n 'sectionRates': 'Pay rates',\n 'sectionRatesHint': '{days} workdays / month \u00B7 {hours} h / day',\n 'sectionDetail': \"Today's basis\",\n 'restHint': 'Day off \u2014 enjoy it',\n 'liveNow': 'LIVE',\n};\n\n/** \u7EC4\u4EF6\u5728\u6CA1\u6709 locale \u6CE8\u5165 t \u65F6\uFF08\u6D4B\u8BD5 / \u515C\u5E95\uFF09\u76F4\u63A5\u8BFB\u4E2D\u6587\u8868\uFF0C\u7EDD\u4E0D\u767D\u5C4F\u3002 */\nconst fallbackTranslate = (key) => (zh[key] != null ? zh[key] : key);\n\n/* ------------------------------------------------------------------ *\n * \u683C\u5F0F\u5316\u5C0F\u5DE5\u5177\n * ------------------------------------------------------------------ */\nconst money = (value, digits = 2) => `${formatMoney(value, digits)} \u5143`;\n\n/** 8.00 -> '8'\uFF0C8.50 -> '8.5'\uFF08\u5DE5\u65F6\u5C55\u793A\u7528\uFF09 */\nfunction trimNumber(value, digits = 2) {\n const fixed = Number(value || 0).toFixed(digits);\n return fixed.replace(/\\.?0+$/, '') || '0';\n}\n\n/** \u914D\u7F6E -> \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F\uFF08\u6240\u6709\u8F93\u5165\u6846\u90FD\u662F\u5B57\u7B26\u4E32 / \u5E03\u5C14\uFF0C\u7F16\u8F91\u4E2D\u4E0D\u6253\u65AD\u8BA1\u65F6\uFF09\u3002 */\nfunction formFromConfig(config) {\n return {\n monthlySalary: String(config.monthlySalary == null ? '' : config.monthlySalary),\n workStart: String(config.workStart == null ? '' : config.workStart),\n workEnd: String(config.workEnd == null ? '' : config.workEnd),\n lunchEnabled: config.lunchEnabled !== false,\n lunchStart: String(config.lunchStart == null ? '' : config.lunchStart),\n lunchEnd: String(config.lunchEnd == null ? '' : config.lunchEnd),\n lunchPaid: config.lunchPaid === true,\n updateMs: String(config.updateMs == null ? 1000 : config.updateMs),\n };\n}\n\n/** \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F -> \u63D0\u4EA4\u7ED9\u5BBF\u4E3B\u7684\u914D\u7F6E patch\u3002 */\nfunction patchFromForm(form) {\n const salaryText = String(form.monthlySalary == null ? '' : form.monthlySalary).trim();\n return {\n monthlySalary: salaryText === '' ? Number.NaN : Number(salaryText),\n workStart: String(form.workStart || '').trim(),\n workEnd: String(form.workEnd || '').trim(),\n lunchEnabled: Boolean(form.lunchEnabled),\n lunchStart: String(form.lunchStart || '').trim(),\n lunchEnd: String(form.lunchEnd || '').trim(),\n lunchPaid: Boolean(form.lunchPaid),\n updateMs: Number(form.updateMs),\n };\n}\n\n/* ------------------------------------------------------------------ *\n * \u6570\u636E\u83B7\u53D6\n * ------------------------------------------------------------------ */\n/**\n * \u8BFB\u53D6\u5BBF\u4E3B\u914D\u7F6E\u3002\u5931\u8D25\u65F6 state.status='failed'\uFF0C\u9762\u677F\u7528 DEFAULTS \u7EE7\u7EED\u8BA1\u65F6\u5E76\u7ED9\u51FA\u53EF\u8BFB\u63D0\u793A\u3002\n * \u8F6E\u8BE2\uFF1A\u53EA\u6709\u300C\u91CD\u8BD5\u300D\u6309\u94AE\u4F1A refresh\u3002\n */\nfunction useRemoteConfig() {\n const [state, setState] = React.useState({ status: 'loading', data: null, error: null });\n const [tick, setTick] = React.useState(0);\n React.useEffect(() => {\n let alive = true;\n if (typeof fetch !== 'function') {\n setState({ status: 'failed', data: null, error: 'fetch unavailable' });\n return undefined;\n }\n setState((prev) => ({ status: prev.data ? 'ready' : 'loading', data: prev.data, error: null }));\n fetch(`${ROUTE_BASE}/config`, { cache: 'no-store', credentials: 'same-origin' })\n .then(async (response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const body = await response.json();\n if (!body || body.ok !== true) throw new Error((body && body.error) || 'bad payload');\n return body.data || null;\n })\n .then((data) => {\n if (alive) setState({ status: 'ready', data, error: null });\n })\n .catch((error) => {\n if (alive) {\n setState((prev) => ({\n status: 'failed',\n data: prev.data,\n error: String((error && error.message) || error),\n }));\n }\n });\n return () => { alive = false; };\n }, [tick]);\n const refresh = React.useCallback(() => setTick((n) => n + 1), []);\n return { ...state, refresh };\n}\n\n/** \u7248\u672C / \u81EA\u52A8\u66F4\u65B0\u72B6\u6001\uFF1A\u6302\u8F7D\u65F6\u67E5\u4E00\u6B21\u3001\u6BCF 6 \u5C0F\u65F6\u5237\u65B0\uFF1B\u70B9\u300C\u7ACB\u5373\u66F4\u65B0\u300D\u89E6\u53D1\u4E0B\u8F7D\u6682\u5B58\u3002 */\nfunction useUpdateInfo() {\n const [state, setState] = React.useState({ status: 'loading', data: null, error: null });\n const load = React.useCallback(() => {\n if (typeof fetch !== 'function') {\n setState({ status: 'failed', data: null, error: 'fetch unavailable' });\n return;\n }\n fetch(`${ROUTE_BASE}/update`, { cache: 'no-store', credentials: 'same-origin' })\n .then(async (response) => {\n const body = await response.json();\n if (!response.ok || !body || body.ok !== true) throw new Error((body && body.error) || `HTTP ${response.status}`);\n return body.data || null;\n })\n .then((data) => setState({ status: 'ready', data, error: null }))\n .catch((error) => setState({ status: 'failed', data: null, error: String((error && error.message) || error) }));\n }, []);\n React.useEffect(() => {\n load();\n const timer = setInterval(load, 6 * 3600 * 1000);\n return () => clearInterval(timer);\n }, [load]);\n const download = React.useCallback(() => {\n setState((prev) => ({ ...prev, status: 'updating' }));\n if (typeof fetch !== 'function') return;\n fetch(`${ROUTE_BASE}/update`, { method: 'POST', credentials: 'same-origin' })\n .then(async (response) => {\n const body = await response.json();\n if (!response.ok || !body || body.ok !== true) throw new Error((body && body.error) || `HTTP ${response.status}`);\n return body.data || null;\n })\n .then((data) => setState({ status: 'ready', data, error: null }))\n .catch((error) => setState({ status: 'failed', data: null, error: String((error && error.message) || error) }));\n }, []);\n return { ...state, reload: load, download };\n}\n\n/**\n * \u5F53\u524D\u65F6\u95F4\uFF1A\u6309\u914D\u7F6E\u7684\u5237\u65B0\u95F4\u9694\u66F4\u65B0\u3002\n * - updateMs >= 50\uFF1AsetInterval\uFF08\u6309\u79D2 / 200ms / 100ms\uFF09\n * - updateMs <= 16\uFF1ArequestAnimationFrame\uFF08\u8DDF\u968F\u5C4F\u5E55\u5237\u65B0\u7387\u8FDE\u7EED\u6EDA\u52A8\uFF09\n */\nfunction useClock(updateMs) {\n const [now, setNow] = React.useState(() => new Date());\n React.useEffect(() => {\n if (updateMs <= 16) {\n let raf = 0;\n const loop = () => {\n setNow(new Date());\n raf = requestAnimationFrame(loop);\n };\n raf = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(raf);\n }\n const timer = setInterval(() => setNow(new Date()), updateMs);\n return () => clearInterval(timer);\n }, [updateMs]);\n return now;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C0F\u7EC4\u4EF6\n * ------------------------------------------------------------------ */\n/** \u4FA7\u680F\u5165\u53E3\u56FE\u6807\uFF1A\u949E\u7968 + \u786C\u5E01\uFF08\u81EA\u7ED8 SVG\uFF0C\u4E0D\u4F9D\u8D56 primitives\uFF09\u3002 */\nfunction NiumaIcon(props) {\n const size = (props && props.size) || 16;\n const active = props && props.active;\n return React.createElement('svg', {\n width: size,\n height: size,\n viewBox: '0 0 16 16',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.3,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n style: { opacity: active ? 1 : 0.82 },\n 'aria-hidden': 'true',\n }, [\n React.createElement('rect', { key: 'a', x: '1.4', y: '3.6', width: '13.2', height: '8.8', rx: '1.8' }),\n React.createElement('circle', { key: 'b', cx: '8', cy: '8', r: '2.1' }),\n React.createElement('path', { key: 'c', d: 'M4 8h.01M12 8h.01' }),\n ]);\n}\n\n/** \u5168\u5C40\u5C0F\u6837\u5F0F\uFF1A\u53EA\u653E\u52A8\u6548 keyframes\uFF08\u5185\u8054 style \u5199\u4E0D\u4E86 keyframes\uFF09\u3002\u7EC4\u4EF6\u5185\u8054\u6837\u5F0F\u4ECD\u662F\u4E3B\u4F53\u3002 */\nconst PANEL_CSS = `\n@keyframes niumaPulse { 0%,100% { opacity: .95; transform: scale(1); } 50% { opacity: .3; transform: scale(.68); } }\n@media (prefers-reduced-motion: reduce) { .niuma-live-dot { animation: none !important; } }\n`;\n\nfunction StyleTag() {\n return React.createElement('style', null, PANEL_CSS);\n}\n\n/** \u72B6\u6001\u5FBD\u6807\uFF1A\u4F11\u606F\u65E5 / \u672A\u4E0A\u73ED / \u642C\u7816\u4E2D / \u5348\u4F11\u4E2D / \u5DF2\u4E0B\u73ED\u3002 */\nfunction StatusBadge(props) {\n const t = props.t;\n const meta = STATUS_META[props.status] || STATUS_META.rest;\n const live = props.status === 'working';\n return React.createElement('span', {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 11px 4px 9px',\n borderRadius: 999,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.5,\n color: meta.color,\n border: `1px solid color-mix(in srgb, ${meta.color} 42%, transparent)`,\n background: `color-mix(in srgb, ${meta.color} 12%, transparent)`,\n whiteSpace: 'nowrap',\n },\n }, [\n React.createElement('i', {\n key: 'dot',\n className: live ? 'niuma-live-dot' : undefined,\n style: { width: 6, height: 6, borderRadius: '50%', background: meta.color, display: 'inline-block' },\n }),\n t(meta.key),\n ]);\n}\n\n/** \u5C0F\u8282\u6807\u9898\uFF1A\u5DE6\u6807\u9898 + \u53F3\u53E3\u5F84\u63D0\u793A\uFF08\u540C\u4E00\u884C\uFF0C\u7A84\u5C4F\u81EA\u52A8\u6362\u884C\uFF09\u3002 */\nfunction SectionTitle(props) {\n return React.createElement('div', {\n style: {\n display: 'flex', alignItems: 'baseline', justifyContent: 'space-between',\n gap: 8, flexWrap: 'wrap', margin: '2px 1px -1px',\n },\n }, [\n React.createElement('span', {\n key: 't',\n style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' },\n }, props.title),\n props.hint\n ? React.createElement('span', { key: 'h', style: { fontSize: 10.5, color: C.label3, ...NUM } }, props.hint)\n : null,\n ]);\n}\n\n/** \u4ECA\u65E5\u5DF2\u8D5A\u4E3B\u5361\uFF1A\u6E10\u53D8\u5E95 + \u8D85\u5927\u91D1\u989D + \u8FDB\u5EA6\u6761\uFF08\u89C6\u89C9\u7126\u70B9\u53EA\u6709\u8FD9\u4E00\u5904\uFF09\u3002 */\n/* ------------------------------------------------------------------ *\n * \u4E3B\u91D1\u989D\uFF1A\u6BEB\u79D2\u7EA7\u5237\u65B0\u65F6\u6570\u5B57\u672C\u8EAB\u9AD8\u901F\u53D8\u5316\uFF08\u672B\u4F4D\u5C0F\u6570\u5728 60fps \u4E0B\u6BCF\u5E27\u90FD\u5728\u8DF3\uFF09\uFF0C\n * \u89C6\u89C9\u4E0A\u5C31\u662F\u300C\u6B3B\u6B3B\u300D\u5F80\u4E0A\u6EDA\uFF1B\u4E0D\u505A\u9010\u4F4D\u8F6E\u76D8\uFF0C\u907F\u514D\u6EDA\u52A8\u88C1\u5207\u5E26\u6765\u7684\u91CD\u5F71\u3002\n * ------------------------------------------------------------------ */\nfunction RollingMoney(props) {\n const decimals = Math.max(0, Math.min(6, Number.isInteger(props.decimals) ? props.decimals : 4));\n return React.createElement('span', {\n style: {\n display: 'inline-block', whiteSpace: 'nowrap', letterSpacing: '-1.2px',\n fontVariantNumeric: 'tabular-nums',\n ...(props.style || {}),\n },\n }, formatMoney(props.value, decimals));\n}\n\nfunction HeroCard(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\n const decimals = Number.isInteger(props.decimals) ? props.decimals : 4;\n const onDecimalsChange = props.onDecimalsChange;\n const turbo = props.turbo === true;\n const onTurboChange = props.onTurboChange;\n const progress = Math.max(0, Math.min(1, Number(snap.todayProgress) || 0));\n const percentText = `${(progress * 100).toFixed(1)}%`;\n const live = snap.status === 'working';\n const rest = snap.status === 'rest';\n const heroBackground = 'linear-gradient(135deg, '\n + 'color-mix(in srgb, ' + C.brand + ' 17%, ' + C.layer1 + ') 0%, '\n + C.layer1 + ' 58%, ' + C.layer1 + ' 100%)';\n return React.createElement('div', {\n style: {\n position: 'relative',\n overflow: 'hidden',\n borderRadius: 18,\n padding: '16px 18px 14px',\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 34%, ${C.border1})`,\n background: heroBackground,\n boxShadow: '0 12px 30px rgba(0,0,0,.10)',\n boxSizing: 'border-box',\n minWidth: 0,\n },\n }, [\n React.createElement('div', {\n key: 'glow',\n 'aria-hidden': 'true',\n style: {\n position: 'absolute', right: -52, top: -72, width: 188, height: 188, borderRadius: '50%',\n background: `radial-gradient(circle, color-mix(in srgb, ${GOLD_TINT} 30%, transparent) 0%, transparent 68%)`,\n pointerEvents: 'none',\n },\n }),\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'a',\n style: { display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 12.5, fontWeight: 600, color: C.label2 },\n }, [\n live\n ? React.createElement('i', {\n key: 'dot',\n className: 'niuma-live-dot',\n style: { width: 7, height: 7, borderRadius: '50%', background: C.ok, display: 'inline-block' },\n })\n : null,\n t('earnedToday'),\n ]),\n React.createElement('div', {\n key: 'b',\n style: { display: 'flex', flexDirection: 'column', alignItems: 'flex-end', gap: 4 },\n }, [\n React.createElement('span', { key: 'd', style: { fontSize: 11, color: C.label3, ...NUM } },\n `${t('todayOn')} ${snap.dateKey}`),\n React.createElement('div', { key: 'c', style: { display: 'inline-flex', alignItems: 'center', gap: 6 } }, [\n React.createElement('label', {\n key: 'dec', title: t('decimalsLabel'),\n style: { display: 'inline-flex', alignItems: 'center', gap: 3, fontSize: 10, color: C.label3, ...NUM },\n }, [\n React.createElement('span', { key: 'l' }, t('decimalsLabel')),\n React.createElement('select', {\n key: 's', value: String(decimals), 'aria-label': t('decimalsLabel'),\n onChange: (event) => onDecimalsChange && onDecimalsChange(Number(event.target.value)),\n style: {\n height: 22, padding: '0 2px', borderRadius: 6,\n border: `1px solid ${C.border1}`, background: C.layer2, color: C.label2,\n fontSize: 10.5, fontVariantNumeric: 'tabular-nums', outline: 'none', cursor: 'pointer',\n },\n }, [0, 1, 2, 3, 4, 5, 6].map((n) => React.createElement('option', { key: n, value: String(n) }, String(n)))),\n React.createElement('span', { key: 'u' }, t('decimalsUnit')),\n ]),\n React.createElement('label', {\n key: 'turbo', title: t('turboLabel'),\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 3,\n fontSize: 10, padding: '1px 6px', borderRadius: 999,\n border: `1px solid ${turbo ? `color-mix(in srgb, ${GOLD_TINT} 60%, ${C.border1})` : C.border1}`,\n background: turbo ? `color-mix(in srgb, ${GOLD_TINT} 16%, transparent)` : 'transparent',\n color: turbo ? C.label2 : C.label3, cursor: 'pointer', ...NUM,\n },\n }, [\n React.createElement('input', {\n key: 'i', type: 'checkbox', checked: turbo,\n onChange: (event) => onTurboChange && onTurboChange(event.target.checked),\n style: { accentColor: GOLD_TINT, width: 12, height: 12, margin: 0, cursor: 'inherit' },\n }),\n React.createElement('span', { key: 'l' }, t('turboLabel')),\n ]),\n ]),\n ]),\n ]),\n React.createElement('div', {\n key: 'amt',\n style: { display: 'flex', alignItems: 'baseline', gap: 7, marginTop: 4, flexWrap: 'wrap' },\n }, [\n React.createElement(RollingMoney, {\n key: 'val',\n value: snap.todayEarned,\n decimals,\n style: {\n fontSize: 46, lineHeight: 1.12, fontWeight: 800,\n color: '#D9A441',\n ...NUM,\n ...(rest ? { opacity: 0.62 } : {}),\n },\n }),\n React.createElement('span', {\n key: 'unit',\n style: { fontSize: 18, fontWeight: 700, color: C.label2, ...NUM },\n }, '\u5143'),\n ]),\n React.createElement('div', {\n key: 'chips',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, marginTop: 5, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'per',\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4,\n fontSize: 11.5, fontWeight: 600, color: C.label2,\n background: `color-mix(in srgb, ${C.brand} 11%, transparent)`,\n border: `1px solid color-mix(in srgb, ${C.brand} 22%, transparent)`,\n borderRadius: 999, padding: '2px 9px', ...NUM,\n },\n }, `${t('perSecond')} +${money(rates.secondWage, 4)}`),\n React.createElement('span', { key: 'target', style: { fontSize: 11, color: C.label3, ...NUM } },\n rest ? t('restHint') : `${t('todayTarget')} ${money(snap.todayTarget, 2)}`),\n ]),\n React.createElement('div', {\n key: 'progTop',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, marginTop: 13, flexWrap: 'wrap' },\n }, [\n React.createElement('span', { key: 'l', style: { fontSize: 11.5, color: C.label3 } }, t('todayProgress')),\n React.createElement('span', { key: 'p', style: { fontSize: 12.5, fontWeight: 700, color: C.brand, ...NUM } }, percentText),\n ]),\n React.createElement('div', {\n key: 'bar',\n style: { marginTop: 5, height: 9, borderRadius: 999, background: `color-mix(in srgb, ${C.label} 9%, transparent)`, overflow: 'hidden' },\n }, [\n React.createElement('div', {\n key: 'fill',\n style: {\n width: `${(progress * 100).toFixed(2)}%`, height: '100%', borderRadius: 999,\n background: `linear-gradient(90deg, ${C.brand} 0%, color-mix(in srgb, ${C.brand} 55%, ${C.ok}) 100%)`,\n transition: 'width .35s linear',\n },\n }),\n ]),\n React.createElement('div', {\n key: 'progNum',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, marginTop: 5, flexWrap: 'wrap', fontSize: 10.5, color: C.label3 },\n }, [\n React.createElement('span', { key: 'a' }, t('progressOfTarget')),\n React.createElement('span', { key: 'b', style: { color: C.label2, fontWeight: 600, ...NUM } },\n `${money(snap.todayEarned, 2)} / ${money(snap.todayTarget, 2)}`),\n ]),\n ]);\n}\n\n/** \u5012\u8BA1\u65F6\u4E24\u5F20\u5C0F\u5361\uFF1A\u8DDD\u4E0A\u73ED / \u8DDD\u4E0B\u73ED\u3002 */\nfunction CountdownRow(props) {\n const t = props.t;\n const snap = props.snap;\n const chip = (key, label, value, accent) => React.createElement('div', {\n key,\n style: {\n flex: '1 1 120px', minWidth: 116,\n display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8,\n padding: '9px 12px', borderRadius: 12,\n background: accent ? `color-mix(in srgb, ${GOLD_TINT} 9%, ${C.layer1})` : C.layer1,\n border: `1px solid ${accent ? `color-mix(in srgb, ${GOLD_TINT} 38%, ${C.border1})` : C.border1}`,\n boxSizing: 'border-box',\n },\n }, [\n React.createElement('span', {\n key: 'l',\n style: { fontSize: 11, color: accent ? C.label2 : C.label3, whiteSpace: 'nowrap' },\n }, label),\n React.createElement('span', {\n key: 'v',\n style: { fontSize: 13.5, fontWeight: 700, color: C.label, ...NUM },\n }, value),\n ]);\n return React.createElement('div', {\n style: { display: 'flex', flexWrap: 'wrap', gap: 9 },\n }, [\n chip('start', t('toStart'), Number(snap.secondsToStart) > 0 ? formatDuration(snap.secondsToStart) : '\u2014'),\n chip('end', t('toEnd'), Number(snap.secondsToEnd) > 0 ? formatDuration(snap.secondsToEnd) : '\u2014'),\n chip('month', t('monthEarned'), money(snap.monthEarned, 2), true),\n ]);\n}\n\n/** \u516D\u5BAB\u683C\uFF1A\u79D2 / \u5206 / \u65F6 / \u65E5 / \u5468 / \u6708\u5DE5\u8D44\uFF1B\u7B2C\u4E00\u5F20\u300C\u79D2\u5DE5\u8D44\u300D\u7528\u54C1\u724C\u8272\u5F3A\u8C03\u3002 */\nconst RATE_CARDS = [\n { key: 'secondWage', label: 'secondWage', digits: 4 },\n { key: 'minuteWage', label: 'minuteWage', digits: 4 },\n { key: 'hourlyWage', label: 'hourlyWage', digits: 2 },\n { key: 'dailyWage', label: 'dailyWage', digits: 2 },\n { key: 'weeklyWage', label: 'weeklyWage', digits: 2 },\n { key: 'monthlyWage', label: 'monthlyWage', digits: 2 },\n];\n\n/** \u5DE5\u8D44\u6362\u7B97\u7F51\u683C\uFF1A\u7531\u8C03\u7528\u65B9\u7ED9\u51FA {key,label,value,accent} \u5361\u7247\uFF08\u672C\u6708 / \u6307\u5B9A\u6708 / \u5168\u5E74\u5E73\u5747\u4E09\u79CD\u89C6\u89D2\uFF09\u3002 */\nfunction RatesGrid(props) {\n const cards = Array.isArray(props.cards) ? props.cards : [];\n return React.createElement('div', {\n style: { display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 8 },\n }, cards.map((card, index) => {\n const accent = card.accent === true;\n return React.createElement('div', {\n key: card.key,\n 'data-stat': `stat-${index}`,\n style: {\n ...CARD,\n padding: '10px 11px',\n borderRadius: 12,\n ...(accent ? {\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 46%, ${C.border1})`,\n background: `color-mix(in srgb, ${GOLD_TINT} 9%, ${C.layer1})`,\n } : {}),\n },\n }, [\n React.createElement('div', {\n key: 'l',\n style: { fontSize: 11, color: accent ? C.label2 : C.label3, fontWeight: accent ? 600 : 400 },\n }, card.label),\n React.createElement('div', {\n key: 'v',\n style: {\n fontSize: 15.5, fontWeight: 700, letterSpacing: '-.2px',\n color: accent ? C.label : C.label, marginTop: 2, ...NUM,\n },\n }, card.value),\n ]);\n }));\n}\n\n/** \u6708\u4EFD / \u5168\u5E74\u89C6\u89D2\u9009\u62E9\u5668\uFF08\u539F\u751F select\uFF0C\u6DF1\u6D45\u8272\u90FD\u7528\u4E3B\u9898\u53D8\u91CF\uFF09\u3002 */\nfunction PeriodSelect(props) {\n const t = props.t;\n const year = props.year;\n const months = props.months;\n const style = {\n appearance: 'none',\n WebkitAppearance: 'none',\n border: `1px solid ${C.border}`,\n background: C.layer2,\n color: C.label,\n borderRadius: 8,\n padding: '4px 9px',\n fontSize: 12,\n fontWeight: 600,\n cursor: 'pointer',\n outline: 'none',\n maxWidth: 220,\n };\n return React.createElement('select', {\n value: props.value,\n 'aria-label': t('viewLabel'),\n onChange: (event) => props.onChange(event.target.value),\n style,\n }, [\n React.createElement('option', { key: 'current', value: 'current' }, t('viewCurrent')),\n ...months.map((month) => React.createElement('option', {\n key: `m${month.month}`,\n value: `m${month.month}`,\n }, `${month.month}${t('monthUnit')} \u00B7 ${month.workdays}${t('dayUnit')} \u00B7 ${t('holidayShort')}${month.holidayDays}`)),\n React.createElement('option', { key: 'year', value: 'year' }, `${year} ${t('viewYear')}`),\n ]);\n}\n\n/** \u53E3\u5F84\u660E\u7EC6\uFF1A\u6708\u85AA / \u5DE5\u4F5C\u65E5 / \u65E5\u5DE5\u65F6 / \u4ECA\u65E5\u76EE\u6807 / \u672C\u6708\u5DF2\u8D5A\uFF08\u8282\u5047\u65E5\u6765\u6E90\u7EDF\u4E00\u653E\u5728\u8282\u5047\u65E5\u5361\u7247\uFF09\u3002 */\nfunction DetailsFooter(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\n const items = [\n { key: 'salary', label: t('monthlySalaryLabel'), value: money(rates.monthlySalary, 2) },\n { key: 'workdays', label: t('workdaysThisMonth'), value: `${rates.monthlyWorkdays}${t('dayUnit')}` },\n { key: 'hours', label: t('paidHoursPerDay'), value: `${trimNumber(rates.paidHours, 2)}${t('hourUnit')}` },\n { key: 'target', label: t('todayTarget'), value: money(snap.todayTarget, 2) },\n { key: 'month', label: t('monthEarned'), value: money(snap.monthEarned, 2) },\n { key: 'worked', label: t('monthWorkedDays'), value: `${snap.monthWorkdaysDone}${t('dayUnit')}` },\n { key: 'left', label: t('monthRemainingDays'), value: `${snap.monthWorkdaysLeft}${t('dayUnit')}` },\n ];\n return React.createElement('div', {\n style: {\n background: C.layer1, border: `1px solid ${C.border1}`, borderRadius: 12,\n padding: '10px 12px', fontSize: 11, color: C.label3, lineHeight: 1.6,\n },\n }, [\n React.createElement('div', {\n key: 'items',\n style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(118px, 1fr))', gap: '7px 12px' },\n }, items.map((item) => React.createElement('div', {\n key: item.key,\n style: { minWidth: 0 },\n }, [\n React.createElement('div', { key: 'l', style: { fontSize: 10.5, color: C.label3 } }, item.label),\n React.createElement('div', {\n key: 'v',\n style: { fontSize: 13, fontWeight: 650, color: C.label2, ...NUM },\n }, item.value),\n ]))),\n ]);\n}\n\n/** \u8282\u5047\u65E5\u5361\u7247\uFF1A2026 \u5B98\u65B9 / 2027 \u9884\u4F30\u4E24\u6BB5\uFF0C\u4E03\u6BB5\u5047\u65E5\u533A\u6BB5 + \u8C03\u4F11\u4E0A\u73ED\u65E5\u7EDF\u8BA1\u3002 */\nconst HOLIDAY_LABEL_KEYS = {\n newYear: 'holidayNewYear',\n spring: 'holidaySpring',\n qingming: 'holidayQingming',\n labour: 'holidayLabour',\n dragon: 'holidayDragon',\n midAutumn: 'holidayMidAutumn',\n national: 'holidayNational',\n};\n\nfunction HolidaysCard(props) {\n const t = props.t;\n const source = props.holidaySource || HOLIDAY_SOURCE;\n const extra = Array.isArray(props.extraWorkdays) ? props.extraWorkdays : [];\n const countYear = (year) => extra.filter((key) => String(key).startsWith(`${year}-`)).length;\n const shortDate = (key) => key.slice(5).replace('-', '/');\n const sections = [\n {\n key: 'official',\n label: t('holidays2026Label'),\n blocks: HOLIDAY_BLOCKS,\n estimated: false,\n extraCount: countYear(2026),\n tag: null,\n },\n {\n key: 'estimate',\n label: t('holidays2027Label'),\n blocks: HOLIDAY_BLOCKS_2027_ESTIMATED,\n estimated: true,\n extraCount: countYear(2027),\n tag: t('holidayEstimateTag'),\n },\n ];\n const sumDays = (blocks) => blocks.reduce((sum, block) => sum + block.days, 0);\n const renderSection = (section) => React.createElement('div', { key: section.key, style: { marginTop: section.key === 'official' ? 8 : 12 } }, [\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'baseline', flexWrap: 'wrap', gap: 8 },\n }, [\n React.createElement('span', { key: 'l', style: { fontSize: 11.5, fontWeight: 700, color: C.label2 } }, section.label),\n section.tag\n ? React.createElement('span', {\n key: 'tag',\n style: {\n fontSize: 9.5, fontWeight: 700, color: C.label2,\n border: `1px dashed color-mix(in srgb, ${GOLD_TINT} 60%, transparent)`,\n borderRadius: 999, padding: '0 6px', lineHeight: 1.6,\n },\n }, section.tag)\n : null,\n React.createElement('span', { key: 's', style: { marginLeft: 'auto', fontSize: 10, color: C.label3, ...NUM } },\n t('holidaysCardSub').replace('{days}', String(sumDays(section.blocks))).replace('{extra}', String(section.extraCount))),\n ]),\n React.createElement('div', {\n key: 'grid',\n style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(118px, 1fr))', gap: 7, marginTop: 6 },\n }, section.blocks.map((block) => React.createElement('div', {\n key: block.id,\n style: {\n border: section.estimated\n ? `1px dashed color-mix(in srgb, ${GOLD_TINT} 40%, ${C.border1})`\n : `1px solid ${C.border1}`,\n borderRadius: 9,\n padding: '6px 8px',\n background: `color-mix(in srgb, ${GOLD_TINT} ${section.estimated ? 3 : 6}%, transparent)`,\n },\n }, [\n React.createElement('div', {\n key: 'row',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 6 },\n }, [\n React.createElement('span', { key: 'n', style: { fontSize: 11.5, fontWeight: 650, color: C.label } },\n t(HOLIDAY_LABEL_KEYS[block.id])),\n React.createElement('span', {\n key: 'd',\n style: {\n fontSize: 10, fontWeight: 700, color: C.label2,\n background: `color-mix(in srgb, ${GOLD_TINT} 16%, transparent)`,\n borderRadius: 999, padding: '0 6px', ...NUM,\n },\n }, t('holidaysDaysShort').replace('{days}', String(block.days))),\n ]),\n React.createElement('div', { key: 'r', style: { fontSize: 10, color: C.label3, marginTop: 2, ...NUM } },\n `${shortDate(block.from)} \u2013 ${shortDate(block.to)}`),\n ]))),\n section.estimated\n ? React.createElement('div', {\n key: 'est-note',\n style: { marginTop: 6, fontSize: 10.5, color: C.label3, lineHeight: 1.5 },\n }, `\u26A0 ${t('holidayEstimateNote')}`)\n : null,\n ]);\n return React.createElement('div', {\n style: {\n background: C.layer1,\n border: `1px solid ${C.border1}`,\n borderRadius: 12,\n padding: '10px 12px',\n },\n }, [\n React.createElement('div', {\n key: 'title',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('span', { key: 't', style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' } },\n t('holidaysCardTitle')),\n React.createElement('a', {\n key: 'a',\n href: source.url,\n target: '_blank',\n rel: 'noreferrer',\n title: source.title,\n style: { fontSize: 10.5, color: C.brand, textDecoration: 'none', fontWeight: 600 },\n }, `${source.year} ${t('holidaySourceLink')} \u2197`),\n ]),\n sections.map(renderSection),\n React.createElement('div', {\n key: 'foot',\n style: { marginTop: 8, fontSize: 10.5, color: C.label3 },\n }, t('holidaysExtraNote').replace('{extra}', String(extra.length))),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u8BBE\u7F6E\u533A\uFF08<details> \u539F\u751F\u6298\u53E0\uFF0C\u4E0D\u989D\u5916\u5360\u4E00\u4E2A hook\uFF09\n * ------------------------------------------------------------------ */\nfunction SettingsSection(props) {\n const t = props.t;\n const form = props.form;\n const setField = props.setField;\n const setCheck = props.setCheck;\n const save = props.save;\n const onSave = props.onSave;\n\n // E \u65B9\u6848\uFF1A\u884C\u5F0F\u77ED\u63A7\u4EF6 \u2014\u2014 \u6807\u7B7E\u56FA\u5B9A\u5DE6\u5217\uFF0C\u63A7\u4EF6\u90FD\u6309\u5185\u5BB9\u5B9A\u5BBD\uFF08\u4E0D\u62C9\u6EE1\uFF09\n const rowStyle = {\n display: 'flex', alignItems: 'center', gap: 10,\n minHeight: 33, padding: '2px 0', borderTop: `1px solid ${C.border1}`,\n };\n const rowKeyStyle = { width: 62, flex: '0 0 62px', fontSize: 11.5, color: C.label3 };\n const rowValStyle = { display: 'flex', alignItems: 'center', gap: 4, flexWrap: 'wrap', minWidth: 0 };\n const inputStyle = {\n boxSizing: 'border-box', width: 88, minHeight: 28, padding: '4px 8px',\n borderRadius: 7, border: `1px solid ${C.border}`, background: C.layer2,\n color: C.label, fontSize: 12.5, fontVariantNumeric: 'tabular-nums', outline: 'none',\n };\n const selectStyle = {\n boxSizing: 'border-box', width: 48, minHeight: 28, padding: '4px 2px 4px 6px',\n borderRadius: 7, border: `1px solid ${C.border}`, background: C.layer2,\n color: C.label, fontSize: 12.5, fontVariantNumeric: 'tabular-nums', outline: 'none', cursor: 'pointer',\n };\n const unitStyle = { fontSize: 10.5, color: C.label3, whiteSpace: 'nowrap' };\n const dashStyle = { fontSize: 11, color: C.label3, margin: '0 1px' };\n const HOUR_OPTIONS = Array.from({ length: 24 }, (_, i) => String(i).padStart(2, '0'));\n const MINUTE_OPTIONS = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, '0'));\n\n const row = (key, label, values) => React.createElement('div', { key, style: rowStyle }, [\n React.createElement('span', { key: 'k', style: rowKeyStyle }, label),\n React.createElement('div', { key: 'v', style: rowValStyle }, values),\n ]);\n\n /** 24 \u5C0F\u65F6\u5236\u65F6\u95F4\uFF1A\u5C0F\u65F6/\u5206\u949F\u4E24\u4E2A\u4E0B\u62C9\uFF0C\u5404 46px\uFF08\u4E0D\u53D7\u6D4F\u89C8\u5668 locale \u5F71\u54CD\uFF09\u3002 */\n const timeSelects = (field, label, disabled = false) => {\n const [rawHour = '00', rawMinute = '00'] = String(form[field] || '00:00').split(':');\n const hour = HOUR_OPTIONS.includes(rawHour) ? rawHour : '00';\n const minute = MINUTE_OPTIONS.includes(rawMinute) ? rawMinute : '00';\n const commit = (nextHour, nextMinute) => setField(field, `${nextHour}:${nextMinute}`);\n const style = { ...selectStyle, opacity: disabled ? 0.45 : 1, cursor: disabled ? 'default' : 'pointer' };\n return React.createElement('span', { key: field, style: { display: 'inline-flex', alignItems: 'center', gap: 2 } }, [\n React.createElement('select', {\n key: 'h', value: hour, disabled, 'aria-label': `${label} ${t('hourUnit')}`,\n onChange: (event) => commit(event.target.value, minute), style,\n }, HOUR_OPTIONS.map((value) => React.createElement('option', { key: value, value }, value))),\n React.createElement('span', { key: 'c', style: { color: C.label3, fontWeight: 700, fontSize: 12 } }, ':'),\n React.createElement('select', {\n key: 'm', value: minute, disabled, 'aria-label': `${label} ${t('minuteUnit')}`,\n onChange: (event) => commit(hour, event.target.value), style,\n }, MINUTE_OPTIONS.map((value) => React.createElement('option', { key: value, value }, value))),\n ]);\n };\n\n const timeRange = (startField, endField, label, disabled) => React.createElement('span', {\n key: `${startField}-${endField}`,\n style: { display: 'inline-flex', alignItems: 'center', gap: 2 },\n }, [\n timeSelects(startField, label, disabled),\n React.createElement('span', { key: 'dash', style: dashStyle }, '\u2013'),\n timeSelects(endField, label, disabled),\n ]);\n\n const toggle = (field, labelKey, disabled) => React.createElement('label', {\n key: field,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 5,\n padding: '2px 6px', borderRadius: 8,\n border: `1px solid ${C.border1}`, background: C.layer2,\n fontSize: 10.5, color: disabled ? C.label3 : C.label2, whiteSpace: 'nowrap',\n cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.55 : 1,\n },\n }, [\n React.createElement('input', {\n key: 'i', type: 'checkbox', checked: Boolean(form[field]), disabled,\n onChange: (event) => setCheck(field, event.target.checked),\n style: { accentColor: GOLD_TINT, width: 13, height: 13, margin: 0, cursor: 'inherit' },\n }),\n React.createElement('span', { key: 'l' }, t(labelKey)),\n ]);\n\n const lunchDisabled = !form.lunchEnabled;\n const RATE_OPTIONS = [\n ['1000', t('rateSecond')],\n ['250', '250 ms'],\n ['100', '100 ms'],\n ['50', '50 ms'],\n ['16', t('rateFrame')],\n ];\n\n return React.createElement('details', {\n open: true,\n style: { background: C.layer1, border: `1px solid ${C.border1}`, borderRadius: 12, padding: '10px 12px' },\n }, [\n React.createElement('summary', {\n key: 'sum',\n style: { cursor: 'pointer', fontSize: 12.5, fontWeight: 650, color: C.label, userSelect: 'none' },\n }, t('settings')),\n React.createElement('div', { key: 'body', style: { marginTop: 7 } }, [\n row('salary', t('salaryField'), [\n React.createElement('input', {\n key: 'i', type: 'text', inputMode: 'decimal', value: form.monthlySalary, placeholder: '10000',\n onChange: (event) => setField('monthlySalary', event.target.value), style: inputStyle,\n }),\n React.createElement('span', { key: 'u', style: unitStyle }, t('salaryUnit')),\n ]),\n row('worktime', t('groupWorkTime'), [\n timeRange('workStart', 'workEnd', t('groupWorkTime'), false),\n ]),\n row('lunch', t('groupLunch'), [\n // \u65F6\u95F4\u5728\u524D\u3001\u4E24\u4E2A\u5F00\u5173\u5728\u540E\uFF08\u653E\u5230\u884C\u5C3E\uFF09\n timeRange('lunchStart', 'lunchEnd', t('groupLunch'), lunchDisabled),\n toggle('lunchEnabled', 'lunchEnabledShort', false),\n toggle('lunchPaid', 'lunchPaidShort', lunchDisabled),\n ]),\n row('refresh', t('refreshRate'), [\n React.createElement('select', {\n key: 'r',\n value: String(form.updateMs),\n onChange: (event) => setField('updateMs', event.target.value),\n style: { ...selectStyle, width: 128, padding: '4px 6px' },\n }, RATE_OPTIONS.map(([value, label]) => React.createElement('option', { key: value, value }, label))),\n ]),\n ]),\n React.createElement('div', {\n key: 'actions',\n style: { display: 'flex', alignItems: 'center', gap: 10, marginTop: 7, paddingTop: 7, borderTop: `1px solid ${C.border1}` },\n }, [\n React.createElement('button', {\n key: 'save',\n type: 'button',\n onClick: onSave,\n disabled: save.status === 'saving',\n style: {\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 72%, rgba(0,0,0,.18))`,\n color: '#3A2A05',\n background: save.status === 'saving'\n ? `color-mix(in srgb, ${GOLD_TINT} 52%, #fff)`\n : 'linear-gradient(180deg, #F8DC86 0%, #EFC258 52%, #D99D2C 100%)',\n borderRadius: 8,\n padding: '5px 16px',\n fontSize: 12.5,\n fontWeight: 700,\n letterSpacing: '.3px',\n cursor: save.status === 'saving' ? 'default' : 'pointer',\n opacity: save.status === 'saving' ? 0.72 : 1,\n boxShadow: `0 2px 9px color-mix(in srgb, ${GOLD_TINT} 34%, transparent), inset 0 1px 0 rgba(255,255,255,.45)`,\n textShadow: '0 1px 0 rgba(255,255,255,.28)',\n },\n }, save.status === 'saving' ? t('saving') : t('save')),\n save.status === 'ok'\n ? React.createElement('span', { key: 'ok', style: { fontSize: 11.5, color: C.ok } }, save.message || t('saved'))\n : null,\n save.status === 'error'\n ? React.createElement('span', {\n key: 'err',\n style: { fontSize: 11.5, color: C.error, flex: '1 1 200px', whiteSpace: 'pre-wrap' },\n }, `${t('saveFailed')}${save.errors.join('\uFF1B')}`)\n : null,\n ]),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u9762\u677F\u4E3B\u4F53\n * ------------------------------------------------------------------ */\nfunction NiumaPanel(props) {\n const t = props && typeof props.t === 'function' ? props.t : fallbackTranslate;\n\n const remote = useRemoteConfig();\n const update = useUpdateInfo();\n\n // \u670D\u52A1\u7AEF\u914D\u7F6E -> \u89C4\u8303\u5316\u914D\u7F6E\uFF1B\u574F\u6570\u636E/\u7F3A\u5B57\u6BB5\u4E00\u5F8B\u9000\u56DE DEFAULTS\uFF08\u8BA1\u7B97\u4E0D\u4F1A\u629B\uFF09\u3002\n const cfg = React.useMemo(() => {\n const raw = remote.data && remote.data.config ? remote.data.config : null;\n if (!raw) return DEFAULTS;\n try {\n const result = normalizeConfig(raw);\n return result.config || DEFAULTS;\n } catch (error) {\n return DEFAULTS;\n }\n }, [remote.data]);\n\n // \u5237\u65B0\u9891\u7387\uFF1A1000=\u6309\u79D2\uFF1B16\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF08\u8FDE\u7EED\u6EDA\u52A8\uFF09\uFF1B\u4E2D\u95F4\u503C\u4E3A\u6BEB\u79D2\u7EA7\n const updateMs = cfg.turbo === true ? 16 : (Number.isInteger(cfg.updateMs) ? cfg.updateMs : 1000);\n const now = useClock(updateMs);\n\n // \u6BCF\u6B21\u5237\u65B0\u91CD\u7B97\uFF08core \u662F\u7EAF\u51FD\u6570\uFF0C\u91CD\u7B97\u4EE3\u4EF7\u6781\u5C0F\uFF1B\u5DF2\u4E0B\u73ED/\u4F11\u606F\u65E5\u4F1A\u7A33\u5B9A\u5728\u65E5\u5DE5\u8D44\u6216 0\uFF09\u3002\n const snap = React.useMemo(() => earnedToday(cfg, now), [cfg, now]);\n const rates = snap && snap.rates ? snap.rates : computeRates(cfg, snap && snap.dateKey);\n const baseForm = React.useMemo(() => formFromConfig(cfg), [cfg]);\n\n /**\n * \u300C\u5DE5\u8D44\u6362\u7B97\u300D\u89C6\u89D2\uFF1A\u672C\u6708\uFF08\u8DDF\u968F\u4ECA\u65E5\u53E3\u5F84\uFF09/ \u6307\u5B9A\u6708\u4EFD / \u5168\u5E74\u5E73\u5747\u3002\n * \u53EA\u5F71\u54CD\u6362\u7B97\u5C55\u793A\uFF0C\u4E0D\u5F71\u54CD\u9876\u90E8\u300C\u4ECA\u65E5\u5DF2\u8D5A\u300D\u8BA1\u6570\u5668\uFF08\u8BA1\u6570\u5668\u6C38\u8FDC\u6309\u4ECA\u5929\u7B97\uFF09\u3002\n */\n const viewYear = Number(String(snap && snap.dateKey ? snap.dateKey : '').slice(0, 4)) || new Date().getFullYear();\n const yearEstimated = viewYear === HOLIDAY_ESTIMATE_2027.year;\n const yearData = React.useMemo(() => yearSummary(cfg, viewYear), [cfg, viewYear]);\n const [view, setView] = React.useState('current');\n const selectedMonth = view.startsWith('m') ? yearData.months[Number(view.slice(1)) - 1] : null;\n const maxHolidayMonth = yearData.maxHolidayMonth;\n const maxHolidayText = t('maxHolidayNote')\n .replace('{month}', String(maxHolidayMonth.month))\n .replace('{days}', String(maxHolidayMonth.holidayDays));\n let viewCards;\n let viewHint;\n let viewNote;\n if (view === 'year') {\n // \u4E0E\u300C\u672C\u6708\u300D\u4FDD\u6301\u540C\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5\uFF0C\u518D\u653E\u8BE5\u89C6\u89D2\u7684\u6C47\u603B\u9879\n viewCards = [\n { key: 'avgSecond', label: t('averageSecond'), value: money(yearData.averageSecondWage, 4), accent: true },\n { key: 'avgMinute', label: t('averageMinute'), value: money(yearData.averageMinuteWage, 4) },\n { key: 'avgHourly', label: t('averageHourly'), value: money(yearData.averageHourlyWage, 2) },\n { key: 'avgDaily', label: t('averageDaily'), value: money(yearData.averageDailyWage, 2) },\n { key: 'yearWorkdays', label: t('yearWorkdays'), value: `${yearData.totalWorkdays}${t('dayUnit')}` },\n { key: 'yearIncome', label: t('yearIncome'), value: money(yearData.annualIncome, 2) },\n ];\n viewHint = `${t('yearHint').replace('{year}', String(viewYear)).replace('{workdays}', String(yearData.totalWorkdays))} \u00B7 ${t('viewOnlyHint')}`\n + (yearEstimated ? ` \u00B7 ${t('holidayEstimateShort')}` : '');\n viewNote = yearEstimated ? t('holidayEstimateNote') : maxHolidayText;\n } else if (selectedMonth) {\n // \u4E0E\u300C\u672C\u6708\u300D\u4FDD\u6301\u540C\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5 \u2192 \u6708 \u2192 \u5DE5\u4F5C\u65E5\n viewCards = [\n { key: 'secondWage', label: t('secondWage'), value: money(selectedMonth.secondWage, 4), accent: true },\n { key: 'minuteWage', label: t('minuteWage'), value: money(selectedMonth.minuteWage, 4) },\n { key: 'hourlyWage', label: t('hourlyWage'), value: money(selectedMonth.hourlyWage, 2) },\n { key: 'dailyWage', label: t('dailyWage'), value: money(selectedMonth.dailyWage, 2) },\n { key: 'monthlyWage', label: t('monthlyWage'), value: money(selectedMonth.monthlySalary, 2) },\n { key: 'monthWorkdays', label: t('monthWorkdaysCard'), value: `${selectedMonth.workdays}${t('dayUnit')}` },\n ];\n viewHint = `${t('monthHint')\n .replace('{year}', String(viewYear))\n .replace('{month}', String(selectedMonth.month))\n .replace('{workdays}', String(selectedMonth.workdays))\n .replace('{holidays}', String(selectedMonth.holidayDays))} \u00B7 ${t('viewOnlyHint')}`\n + (yearEstimated ? ` \u00B7 ${t('holidayEstimateShort')}` : '');\n viewNote = yearEstimated\n ? t('holidayEstimateNote')\n : (selectedMonth.month === maxHolidayMonth.month\n ? `\u2605 ${t('maxHolidayThis').replace('{days}', String(maxHolidayMonth.holidayDays))}`\n : maxHolidayText);\n } else {\n // \u7EDF\u4E00\u9605\u8BFB\u987A\u5E8F\uFF1A\u79D2 \u2192 \u5206 \u2192 \u65F6 \u2192 \u65E5 \u2192 \u5468 \u2192 \u6708\uFF08\u6240\u6709\u89C6\u89D2\u90FD\u4ECE\u300C\u79D2\u300D\u5F00\u59CB\u3001\u4ECE\u5C0F\u5230\u5927\uFF09\n viewCards = RATE_CARDS.map((spec) => ({\n key: spec.key,\n label: t(spec.label),\n value: money(rates[spec.key], spec.digits),\n accent: spec.key === 'secondWage',\n }));\n viewHint = t('currentHint')\n .replace('{days}', String(rates.monthlyWorkdays))\n .replace('{hours}', trimNumber(rates.paidHours, 2));\n viewNote = maxHolidayText;\n }\n\n // \u8BBE\u7F6E\u8868\u5355\u8349\u7A3F\uFF1Anull = \u8FD8\u6CA1\u6539\u8FC7\uFF0C\u76F4\u63A5\u663E\u793A\u5F53\u524D\u914D\u7F6E\u3002\n const [draft, setDraft] = React.useState(null);\n const [save, setSave] = React.useState({ status: 'idle', errors: [], message: '' });\n const form = draft || baseForm;\n\n const setField = (field, value) => {\n setDraft((prev) => ({ ...(prev || baseForm), [field]: value }));\n if (save.status !== 'idle') setSave({ status: 'idle', errors: [], message: '' });\n };\n const setCheck = (field, checked) => setField(field, checked);\n\n const onSave = () => {\n const patch = patchFromForm(form);\n // \u5148\u5728\u672C\u5730\u8DD1\u540C\u4E00\u5957\u6821\u9A8C\uFF1A\u975E\u6CD5\u8F93\u5165\u5C31\u5730\u7EA2\u5B57\uFF0C\u4E0D\u53D1\u8BF7\u6C42\u4E5F\u4E0D\u4F1A\u767D\u5C4F\u3002\n const checked = normalizeConfig(patch);\n if (checked.errors && checked.errors.length > 0) {\n setSave({ status: 'error', errors: checked.errors, message: '' });\n return;\n }\n if (typeof fetch !== 'function') {\n setSave({ status: 'error', errors: ['fetch unavailable'], message: '' });\n return;\n }\n setSave({ status: 'saving', errors: [], message: '' });\n fetch(`${ROUTE_BASE}/settings`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(patch),\n })\n .then(async (response) => {\n let body = null;\n try {\n body = await response.json();\n } catch (error) {\n body = null;\n }\n if (!response.ok || !body || body.ok !== true) {\n throw new Error((body && body.error) || `HTTP ${response.status}`);\n }\n return body;\n })\n .then(() => {\n setDraft(null);\n setSave({ status: 'ok', errors: [], message: t('saved') });\n remote.refresh();\n })\n .catch((error) => {\n setSave({ status: 'error', errors: [String((error && error.message) || error)], message: '' });\n });\n };\n\n // \u5FEB\u901F\u4FDD\u5B58\uFF1A\u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D\u8FD9\u79CD\u5373\u65F6\u504F\u597D\uFF0C\u4E0D\u8D70\u8BBE\u7F6E\u8868\u5355\u7684\u300C\u4FDD\u5B58\u300D\u6D41\u7A0B\n const [quickError, setQuickError] = React.useState('');\n const postConfig = React.useCallback((patch) => {\n if (typeof fetch !== 'function') return;\n fetch(`${ROUTE_BASE}/settings`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(patch),\n })\n .then(async (response) => {\n let body = null;\n try { body = await response.json(); } catch (error) { body = null; }\n if (!response.ok || !body || body.ok !== true) throw new Error((body && body.error) || `HTTP ${response.status}`);\n setQuickError('');\n remote.refresh();\n })\n .catch((error) => setQuickError(String((error && error.message) || error)));\n }, [remote.refresh]);\n const onDecimalsChange = (value) => postConfig({ decimals: value });\n const onTurboChange = (checked) => postConfig({ turbo: Boolean(checked) });\n\n const holidaySource = (remote.data && remote.data.holidaySource) || HOLIDAY_SOURCE;\n const versionText = (remote.data && remote.data.version) || (update.data && update.data.currentVersion) || '';\n const banner = remote.status === 'failed'\n ? {\n color: C.warn,\n text: `${t('configFailed')}${remote.error ? `\uFF08${remote.error}\uFF09` : ''}`,\n retry: true,\n }\n : remote.status === 'loading'\n ? { color: C.label3, text: t('configLoading'), retry: false }\n : null;\n\n return React.createElement('div', {\n style: {\n // DSH \u7684 main slot \u7ED9\u7684\u662F\u5B9A\u9AD8\u5BB9\u5668\uFF1A\u63D2\u4EF6\u5FC5\u987B\u81EA\u5DF1\u5F53\u6EDA\u52A8\u5BB9\u5668\uFF0C\u5426\u5219\u5C55\u5F00\u8BBE\u7F6E\u540E\u5E95\u90E8\u4F1A\u88AB\u88C1\u6389\u3002\n // \u6CE8\u610F\uFF1A\u8FD9\u91CC\u7528 block + \u5185\u5C42 flex \u7684\u5199\u6CD5 \u2014\u2014 \u5982\u679C\u6839\u76F4\u63A5 display:flex\uFF0C\u5B50\u9879\u4F1A\u5728\u5B9A\u9AD8\u5BB9\u5668\u91CC\n // \u88AB flex-shrink \u538B\u6241\uFF08\u5C55\u5F00\u8BBE\u7F6E\u65F6\u6574\u5F20\u4E3B\u5361\u9AD8\u5EA6\u88AB\u538B\u7F29\u3001\u5185\u5BB9\u88AB overflow \u88C1\u6389\uFF09\u3002\n height: '100%',\n width: '100%',\n overflowY: 'auto',\n overflowX: 'hidden',\n overscrollBehavior: 'contain',\n scrollbarGutter: 'stable',\n boxSizing: 'border-box',\n fontSize: 13,\n lineHeight: 1.45,\n color: C.label,\n fontFamily: 'inherit',\n },\n }, [\n React.createElement(StyleTag, { key: 'css' }),\n React.createElement('div', {\n key: 'inner',\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: 11,\n width: '100%',\n maxWidth: 820,\n margin: '0 auto',\n padding: '16px 18px 40px',\n boxSizing: 'border-box',\n minWidth: 0,\n },\n }, [\n // \u54C1\u724C\u5934\uFF1A\u56FE\u6807\u5757 + \u6807\u9898/\u526F\u6807\u9898 + \u72B6\u6001\u5FBD\u6807\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', gap: 11, flexWrap: 'wrap' },\n }, [\n React.createElement('div', {\n key: 'icon',\n style: {\n width: 38, height: 38, borderRadius: 12, flex: '0 0 auto',\n display: 'grid', placeItems: 'center',\n color: C.brand,\n background: `color-mix(in srgb, ${C.brand} 13%, transparent)`,\n border: `1px solid color-mix(in srgb, ${C.brand} 26%, transparent)`,\n },\n }, React.createElement(NiumaIcon, { size: 21 })),\n React.createElement('div', { key: 'tt', style: { marginRight: 'auto', minWidth: 0 } }, [\n React.createElement('div', {\n key: 't',\n style: { fontSize: 17.5, fontWeight: 800, letterSpacing: '-.3px', color: C.label },\n }, t('title')),\n React.createElement('div', {\n key: 's',\n style: { fontSize: 11, color: C.label3, marginTop: 1 },\n }, t('subtitle')),\n ]),\n React.createElement(StatusBadge, { key: 'badge', t, status: snap.status }),\n ]),\n\n // \u914D\u7F6E\u8BFB\u53D6\u72B6\u6001\n banner\n ? React.createElement('div', {\n key: 'banner',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap',\n fontSize: 12, color: banner.color, padding: '6px 10px',\n borderRadius: 9, border: `1px solid color-mix(in srgb, ${banner.color} 45%, transparent)`,\n background: `color-mix(in srgb, ${banner.color} 10%, transparent)`,\n },\n }, [\n React.createElement('span', { key: 'txt', style: { flex: '1 1 160px' } }, banner.text),\n banner.retry\n ? React.createElement('button', {\n key: 'retry',\n type: 'button',\n onClick: remote.refresh,\n style: {\n border: `1px solid ${banner.color}`, color: banner.color, background: 'transparent',\n borderRadius: 6, padding: '2px 10px', fontSize: 12, cursor: 'pointer',\n },\n }, t('retry'))\n : null,\n ])\n : null,\n\n // \u7248\u672C / \u81EA\u52A8\u66F4\u65B0\u63D0\u793A\uFF1A\u5DF2\u4E0B\u8F7D\u2192\u63D0\u793A\u91CD\u542F\uFF1B\u53D1\u73B0\u65B0\u7248\u2192\u4E00\u952E\u66F4\u65B0\n update.data && update.data.staged\n ? React.createElement('div', {\n key: 'update',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap',\n fontSize: 11.5, color: C.label2, padding: '6px 10px', borderRadius: 9,\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 45%, transparent)`,\n background: `color-mix(in srgb, ${GOLD_TINT} 10%, transparent)`,\n },\n }, [\n React.createElement('span', { key: 'dot', 'aria-hidden': 'true', style: { width: 6, height: 6, borderRadius: '50%', background: GOLD_TINT } }),\n React.createElement('span', { key: 'txt', style: { flex: '1 1 160px' } },\n t('updateStaged').replace('{version}', String(update.data.stagedVersion || update.data.latestVersion || ''))),\n ])\n : update.status === 'updating'\n ? React.createElement('div', {\n key: 'update',\n style: { fontSize: 11.5, color: C.label3, padding: '2px 2px' },\n }, t('updating'))\n : update.data && update.data.hasUpdate\n ? React.createElement('div', {\n key: 'update',\n style: {\n display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap',\n fontSize: 11.5, color: C.label2, padding: '6px 10px', borderRadius: 9,\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 45%, transparent)`,\n background: `color-mix(in srgb, ${GOLD_TINT} 10%, transparent)`,\n },\n }, [\n React.createElement('span', { key: 'txt', style: { flex: '1 1 160px' } },\n t('updateAvailable').replace('{version}', String(update.data.latestVersion || ''))),\n React.createElement('button', {\n key: 'go',\n type: 'button',\n onClick: update.download,\n style: {\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 70%, rgba(0,0,0,.15))`,\n color: '#3A2A05',\n background: 'linear-gradient(180deg, #F8DC86 0%, #EFC258 52%, #D99D2C 100%)',\n borderRadius: 7, padding: '3px 12px', fontSize: 11.5, fontWeight: 700, cursor: 'pointer',\n },\n }, t('updateNow')),\n ])\n : null,\n React.createElement(HeroCard, { key: 'hero', t, snap, decimals: cfg.decimals, onDecimalsChange, turbo: cfg.turbo, onTurboChange }),\n React.createElement(CountdownRow, { key: 'countdown', t, snap }),\n React.createElement('div', {\n key: 'ratesHead',\n style: {\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n gap: 8, flexWrap: 'wrap', margin: '2px 1px -1px',\n },\n }, [\n React.createElement('span', {\n key: 't',\n style: { fontSize: 12.5, fontWeight: 700, color: C.label2, letterSpacing: '.2px' },\n }, t('sectionRates')),\n React.createElement(PeriodSelect, {\n key: 'period',\n t,\n value: view,\n onChange: setView,\n year: viewYear,\n months: yearData.months,\n }),\n ]),\n React.createElement('div', {\n key: 'ratesHint',\n style: { fontSize: 10.5, color: C.label3, ...NUM },\n }, viewHint),\n React.createElement(RatesGrid, { key: 'rates', cards: viewCards }),\n viewNote\n ? React.createElement('div', {\n key: 'ratesNote',\n style: { fontSize: 10.5, color: C.label3, display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'badge',\n style: {\n color: C.label2, fontWeight: 600,\n background: `color-mix(in srgb, ${GOLD_TINT} 14%, transparent)`,\n border: `1px solid color-mix(in srgb, ${GOLD_TINT} 32%, transparent)`,\n borderRadius: 999, padding: '1px 8px',\n },\n }, t('maxHolidayBadge')),\n React.createElement('span', { key: 'txt' }, viewNote),\n ])\n : null,\n React.createElement(SectionTitle, { key: 'detailTitle', title: t('sectionDetail') }),\n React.createElement(DetailsFooter, { key: 'footer', t, snap, holidaySource }),\n React.createElement(HolidaysCard, {\n key: 'holidays',\n t,\n holidaySource,\n extraWorkdays: cfg.extraWorkdays,\n }),\n React.createElement(SettingsSection, {\n key: 'settings',\n t,\n form,\n setField,\n setCheck,\n save,\n onSave,\n }),\n // \u7248\u672C\u4FE1\u606F\u56FA\u5B9A\u653E\u5728\u9762\u677F\u6700\u5E95\u90E8\n React.createElement('div', {\n key: 'version',\n style: {\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,\n padding: '4px 0 0', fontSize: 10.5, color: C.label3, ...NUM,\n },\n }, [\n versionText ? React.createElement('span', { key: 'v' }, `\u725B\u9A6C\u52A0\u901F\u5668 v${versionText}`) : null,\n update.data && update.data.staged\n ? React.createElement('span', { key: 's', style: { color: C.label3 } },\n `\u00B7 ${t('updateStaged').replace('{version}', String(update.data.stagedVersion || update.data.latestVersion || ''))}`)\n : null,\n ]),\n ]),\n ]);\n}\n\n/* ------------------------------------------------------------------ *\n * \u63D2\u4EF6\u4F53\n * ------------------------------------------------------------------ */\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n ctx.effect(() => ctx.locale.register(LOCALE_NS, { zh, en }), `${LOCALE_NS}: dictionaries`);\n\n // \u4FA7\u680F\u5165\u53E3\uFF1Aid \u5FC5\u987B\u4E0E main \u9762\u677F\u7684 key \u540C\u540D\uFF0C\u5426\u5219\u70B9\u4FA7\u680F\u9009\u4E0D\u4E2D\u9762\u677F\u3002\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: SLOT_ID,\n order: 120,\n label: () => '\u725B\u9A6C',\n locale: LOCALE_NS,\n }, NiumaIcon));\n\n // \u4E2D\u680F\u72EC\u7ACB\u9762\u677F\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: SLOT_ID,\n locale: LOCALE_NS,\n }, NiumaPanel));\n}\n", "/**\n * \u4E2D\u56FD\u6CD5\u5B9A\u8282\u5047\u65E5\u4E0E\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u7EAF\u6570\u636E\uFF0C\u5BBF\u4E3B + \u6D4F\u89C8\u5668\u5171\u7528\uFF09\u3002\n *\n * \u6570\u636E\u5206\u4E24\u90E8\u5206\uFF1A\n * 1. **2026 \u5B98\u65B9\u6570\u636E**\uFF1A\u56FD\u52A1\u9662\u529E\u516C\u5385\u300A\u5173\u4E8E2026\u5E74\u90E8\u5206\u8282\u5047\u65E5\u5B89\u6392\u7684\u901A\u77E5\u300B\uFF08\u56FD\u529E\u53D1\u660E\u7535\u30142025\u30157\u53F7\uFF09\uFF0C\n * \u53D1\u5E03\u65E5\u671F 2025-11-04\uFF0C\u9010\u6761\u6838\u5BF9\u81EA\u5B98\u65B9\u539F\u6587\uFF1A\n * https://www.gov.cn/zhengce/content/202511/content_7047090.htm\n * 2. **2027 \u9884\u4F30\u6570\u636E**\uFF08`HOLIDAY_ESTIMATE_2027.estimated === true`\uFF0C**\u5B98\u65B9\u5C1A\u672A\u516C\u5E03**\uFF09\uFF1A\n * \u6309 2024 \u5E74\u4FEE\u8BA2\u7684\u300A\u5168\u56FD\u5E74\u8282\u53CA\u7EAA\u5FF5\u65E5\u653E\u5047\u529E\u6CD5\u300B\u4E0E\u5F80\u5E74\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u7528\u4E8E\u63D0\u524D\u67E5\u770B\uFF1B\n * \u5B98\u65B9\u901A\u77E5\u53D1\u5E03\u540E\uFF08\u5F80\u5E74 11 \u6708\u521D\uFF09\u66FF\u6362\u4E3A\u6B63\u5F0F\u6570\u636E\u5E76\u5347\u7248\u672C\u3002\n *\n * @module dsh-niuma/holidays\n */\n\n/* ------------------------------------------------------------------ *\n * 2026 \u5B98\u65B9\u6570\u636E\n * ------------------------------------------------------------------ */\n\n/** 2026 \u5E74\u6CD5\u5B9A\u653E\u5047\u65E5\u671F\uFF08\u542B\u4E0E\u5468\u672B\u987A\u8FDE\u7684\u4F11\u606F\u65E5\uFF1B\u8FD9\u4E9B\u65E5\u671F\u4E00\u5F8B\u4E0D\u7B97\u5DE5\u4F5C\u65E5\uFF09 */\nexport const OFFICIAL_HOLIDAYS_2026 = Object.freeze([\n // \u5143\u65E6\uFF1A1\u67081\u65E5\uFF08\u5468\u56DB\uFF09\u81F33\u65E5\uFF08\u5468\u516D\uFF09\n '2026-01-01', '2026-01-02', '2026-01-03',\n // \u6625\u8282\uFF1A2\u670815\u65E5\uFF08\u5468\u65E5\uFF09\u81F323\u65E5\uFF08\u5468\u4E00\uFF09\uFF0C\u5171 9 \u5929\n '2026-02-15', '2026-02-16', '2026-02-17', '2026-02-18', '2026-02-19',\n '2026-02-20', '2026-02-21', '2026-02-22', '2026-02-23',\n // \u6E05\u660E\u8282\uFF1A4\u67084\u65E5\uFF08\u5468\u516D\uFF09\u81F36\u65E5\uFF08\u5468\u4E00\uFF09\n '2026-04-04', '2026-04-05', '2026-04-06',\n // \u52B3\u52A8\u8282\uFF1A5\u67081\u65E5\uFF08\u5468\u4E94\uFF09\u81F35\u65E5\uFF08\u5468\u4E8C\uFF09\n '2026-05-01', '2026-05-02', '2026-05-03', '2026-05-04', '2026-05-05',\n // \u7AEF\u5348\u8282\uFF1A6\u670819\u65E5\uFF08\u5468\u4E94\uFF09\u81F321\u65E5\uFF08\u5468\u65E5\uFF09\n '2026-06-19', '2026-06-20', '2026-06-21',\n // \u4E2D\u79CB\u8282\uFF1A9\u670825\u65E5\uFF08\u5468\u4E94\uFF09\u81F327\u65E5\uFF08\u5468\u65E5\uFF09\n '2026-09-25', '2026-09-26', '2026-09-27',\n // \u56FD\u5E86\u8282\uFF1A10\u67081\u65E5\uFF08\u5468\u56DB\uFF09\u81F37\u65E5\uFF08\u5468\u4E09\uFF09\n '2026-10-01', '2026-10-02', '2026-10-03', '2026-10-04', '2026-10-05',\n '2026-10-06', '2026-10-07',\n]);\n\n/** 2026 \u5E74\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u5468\u672B\u8865\u73ED\uFF0C\u7B97\u5DE5\u4F5C\u65E5\uFF09 */\nexport const OFFICIAL_EXTRA_WORKDAYS_2026 = Object.freeze([\n '2026-01-04', // \u5143\u65E6\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\n '2026-02-14', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-02-28', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-05-09', // \u52B3\u52A8\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n '2026-09-20', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\n '2026-10-10', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\n]);\n\n/** 2026 \u5E74\u4E03\u4E2A\u6CD5\u5B9A\u8282\u5047\u65E5\u533A\u6BB5\uFF08\u9762\u677F\u300C\u8282\u5047\u65E5\u300D\u5361\u7247\u7528\uFF0C\u4E0E\u4E0A\u9762\u9010\u6BB5\u5BF9\u5E94\uFF09 */\nexport const HOLIDAY_BLOCKS = Object.freeze([\n { id: 'newYear', year: 2026, from: '2026-01-01', to: '2026-01-03', days: 3, estimated: false },\n { id: 'spring', year: 2026, from: '2026-02-15', to: '2026-02-23', days: 9, estimated: false },\n { id: 'qingming', year: 2026, from: '2026-04-04', to: '2026-04-06', days: 3, estimated: false },\n { id: 'labour', year: 2026, from: '2026-05-01', to: '2026-05-05', days: 5, estimated: false },\n { id: 'dragon', year: 2026, from: '2026-06-19', to: '2026-06-21', days: 3, estimated: false },\n { id: 'midAutumn', year: 2026, from: '2026-09-25', to: '2026-09-27', days: 3, estimated: false },\n { id: 'national', year: 2026, from: '2026-10-01', to: '2026-10-07', days: 7, estimated: false },\n]);\n\n/** 2026 \u5B98\u65B9\u6570\u636E\u51FA\u5904\uFF0C\u9762\u677F\u811A\u6CE8\u5C55\u793A\u7528 */\nexport const HOLIDAY_SOURCE = Object.freeze({\n year: 2026,\n estimated: false,\n title: '\u56FD\u52A1\u9662\u529E\u516C\u5385\u5173\u4E8E2026\u5E74\u90E8\u5206\u8282\u5047\u65E5\u5B89\u6392\u7684\u901A\u77E5\uFF08\u56FD\u529E\u53D1\u660E\u7535\u30142025\u30157\u53F7\uFF09',\n url: 'https://www.gov.cn/zhengce/content/202511/content_7047090.htm',\n});\n\n/* ------------------------------------------------------------------ *\n * 2027 \u9884\u4F30\u6570\u636E\uFF08\u5B98\u65B9\u672A\u516C\u5E03\uFF0C\u4EC5\u6309\u89C4\u5219\u4E0E\u60EF\u4F8B\u63A8\u7B97\uFF09\n * ------------------------------------------------------------------ */\n\n/** 2027 \u5E74\u653E\u5047\u65E5\u671F\uFF08\u9884\u4F30\uFF09\uFF1A\u5143\u65E6 3 \u5929 / \u6625\u8282 9 \u5929 / \u6E05\u660E 3 \u5929 / \u52B3\u52A8 5 \u5929 / \u7AEF\u5348 1 \u5929 / \u4E2D\u79CB 1 \u5929 / \u56FD\u5E86 7 \u5929 */\nexport const ESTIMATED_HOLIDAYS_2027 = Object.freeze([\n '2027-01-01', '2027-01-02', '2027-01-03',\n '2027-02-05', '2027-02-06', '2027-02-07', '2027-02-08', '2027-02-09',\n '2027-02-10', '2027-02-11', '2027-02-12', '2027-02-13',\n '2027-04-03', '2027-04-04', '2027-04-05',\n '2027-05-01', '2027-05-02', '2027-05-03', '2027-05-04', '2027-05-05',\n '2027-06-09',\n '2027-09-15',\n '2027-10-01', '2027-10-02', '2027-10-03', '2027-10-04', '2027-10-05',\n '2027-10-06', '2027-10-07',\n]);\n\n/** 2027 \u5E74\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u9884\u4F30\uFF0C\u5468\u672B\u8865\u73ED\uFF09 */\nexport const ESTIMATED_EXTRA_WORKDAYS_2027 = Object.freeze([\n '2027-01-31', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-02-14', // \u6625\u8282\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-05-08', // \u52B3\u52A8\u8282\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-09-26', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u65E5\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n '2027-10-09', // \u56FD\u5E86\u8C03\u4F11\uFF1A\u5468\u516D\u4E0A\u73ED\uFF08\u9884\u4F30\uFF09\n]);\n\n/** 2027 \u5E74\u4E03\u4E2A\u6CD5\u5B9A\u8282\u5047\u65E5\u533A\u6BB5\uFF08\u9884\u4F30\uFF1B`estimated: true` \u7528\u4E8E\u9762\u677F\u6807\u6CE8\uFF09 */\nexport const HOLIDAY_BLOCKS_2027_ESTIMATED = Object.freeze([\n { id: 'newYear', year: 2027, from: '2027-01-01', to: '2027-01-03', days: 3, estimated: true },\n { id: 'spring', year: 2027, from: '2027-02-05', to: '2027-02-13', days: 9, estimated: true },\n { id: 'qingming', year: 2027, from: '2027-04-03', to: '2027-04-05', days: 3, estimated: true },\n { id: 'labour', year: 2027, from: '2027-05-01', to: '2027-05-05', days: 5, estimated: true },\n { id: 'dragon', year: 2027, from: '2027-06-09', to: '2027-06-09', days: 1, estimated: true },\n { id: 'midAutumn', year: 2027, from: '2027-09-15', to: '2027-09-15', days: 1, estimated: true },\n { id: 'national', year: 2027, from: '2027-10-01', to: '2027-10-07', days: 7, estimated: true },\n]);\n\n/** 2027 \u9884\u4F30\u6570\u636E\u7684\u51FA\u5904\u4E0E\u514D\u8D23\u8BF4\u660E\uFF08\u9762\u677F\u5FC5\u987B\u663E\u8457\u6807\u6CE8\u300C\u9884\u4F30\u300D\uFF09 */\nexport const HOLIDAY_ESTIMATE_2027 = Object.freeze({\n year: 2027,\n estimated: true,\n announced: false,\n title: '2027 \u5E74\u653E\u5047\u5B89\u6392\uFF08\u9884\u4F30\uFF0C\u5B98\u65B9\u5C1A\u672A\u516C\u5E03\uFF09',\n note: '\u5B98\u65B9\u901A\u77E5\u901A\u5E38\u5728\u524D\u4E00\u5E74 11 \u6708\u521D\u53D1\u5E03\uFF1B\u4EE5\u4E0B\u4E3A\u6309 2024 \u5E74\u4FEE\u8BA2\u7684\u300A\u5168\u56FD\u5E74\u8282\u53CA\u7EAA\u5FF5\u65E5\u653E\u5047\u529E\u6CD5\u300B\u4E0E\u5F80\u5E74\u60EF\u4F8B\u63A8\u7B97\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u8BF7\u4EE5\u56FD\u52A1\u9662\u901A\u77E5\u4E3A\u51C6\u3002',\n basis: [\n '\u6625\u8282\u81EA\u9664\u5915\u8D77\u653E\u5047\u8C03\u4F11\uFF0C\u4E00\u822C\u8FDE\u4F11 8\u20139 \u5929',\n '\u56FD\u5E86 7 \u5929\u3001\u52B3\u52A8\u8282 5 \u5929',\n '\u5143\u65E6 / \u6E05\u660E / \u7AEF\u5348 / \u4E2D\u79CB\u5404 1 \u5929\u6CD5\u5B9A\u5047\uFF0C\u9047\u5468\u672B\u987A\u8FDE',\n ],\n url: 'https://www.gov.cn/zhengce/xxgk/',\n});\n\n/* ------------------------------------------------------------------ *\n * \u9ED8\u8BA4\u503C\uFF082026 \u5B98\u65B9 + 2027 \u9884\u4F30\uFF1B\u8DE8\u5E74\u4E5F\u80FD\u7B97\uFF0C\u4F46 2027 \u4F1A\u6807\u6CE8\u9884\u4F30\uFF09\n * ------------------------------------------------------------------ */\n\n/** \u9ED8\u8BA4\u8282\u5047\u65E5\uFF1A2026 \u5B98\u65B9 + 2027 \u9884\u4F30 */\nexport const DEFAULT_HOLIDAYS = Object.freeze([...OFFICIAL_HOLIDAYS_2026, ...ESTIMATED_HOLIDAYS_2027]);\n\n/** \u9ED8\u8BA4\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF1A2026 \u5B98\u65B9 + 2027 \u9884\u4F30 */\nexport const DEFAULT_EXTRA_WORKDAYS = Object.freeze([...OFFICIAL_EXTRA_WORKDAYS_2026, ...ESTIMATED_EXTRA_WORKDAYS_2027]);\n", "/**\n * \u725B\u9A6C\u52A0\u901F\u5668\u6838\u5FC3\u903B\u8F91\uFF08\u7EAF\u51FD\u6570\uFF0C\u5BBF\u4E3B\u4E0E\u6D4F\u89C8\u5668\u5171\u7528\uFF09\u3002\n *\n * \u8BBE\u8BA1\u7EA6\u675F\uFF1A\n * - \u4E0D\u4F9D\u8D56 DOM / Node API / \u5168\u5C40\u72B6\u6001\uFF0C\u53EF\u5728\u6D4F\u89C8\u5668 bundle \u4E0E Node \u6D4B\u8BD5\u91CC\u540C\u6837\u8FD0\u884C\u3002\n * - \u6240\u6709\u65F6\u95F4\u6309**\u672C\u673A\u672C\u5730\u65F6\u533A**\u7406\u89E3\uFF1B\u65E5\u671F\u952E\u662F\u672C\u5730 `YYYY-MM-DD`\u3002\n * - \u91D1\u989D\u4E0D\u505A\u53D6\u6574\uFF08\u5C55\u793A\u5C42\u7528 formatMoney \u63A7\u5236\u5C0F\u6570\u4F4D\uFF09\uFF0C\u907F\u514D\u9010\u79D2\u7D2F\u8BA1\u8BEF\u5DEE\u3002\n *\n * \u53E3\u5F84\uFF08\u8BE6\u89C1 SPEC.md \u00A71\uFF09\uFF1A\n * \u65E5\u6709\u6548\u5DE5\u65F6 = \u4E0A\u73ED~\u4E0B\u73ED\u8DE8\u5EA6 - \uFF08\u5348\u4F11\u542F\u7528\u4E14\u5348\u4F11\u4E0D\u7B97\u5DE5\u65F6 ? \u5348\u4F11\u8DE8\u5EA6 : 0\uFF09\n * \u65E5\u5DE5\u8D44 = \u5B9E\u6536\u6708\u85AA / \u5F53\u6708\u5DE5\u4F5C\u65E5\u6570\uFF08\u5468\u672B\u4E0E\u6CD5\u5B9A\u8282\u5047\u65E5\u4E0D\u7B97\uFF0C\u8C03\u4F11\u4E0A\u73ED\u65E5\u7B97\uFF09\n * \u65F6\u5DE5\u8D44 = \u65E5\u5DE5\u8D44 / \u65E5\u6709\u6548\u5DE5\u65F6\uFF1B\u5206/\u79D2\u5DE5\u8D44\u9010\u7EA7\u9664 60\n * \u5468\u5DE5\u8D44 = \u65E5\u5DE5\u8D44 \u00D7 \u672C\u5468\uFF08\u5468\u4E00~\u5468\u65E5\uFF09\u5DE5\u4F5C\u65E5\u6570\n *\n * @module dsh-niuma/core\n */\nimport { DEFAULT_HOLIDAYS, DEFAULT_EXTRA_WORKDAYS } from './holidays.mjs';\n\n/** \u9ED8\u8BA4\u914D\u7F6E\uFF1A\u5B57\u6BB5\u4E0E\u9ED8\u8BA4\u503C\u7684\u552F\u4E00\u6765\u6E90\uFF08settings schema / \u9762\u677F / \u5BBF\u4E3B\u5171\u7528\uFF09\u3002 */\nexport const DEFAULTS = Object.freeze({\n monthlySalary: 10000,\n workStart: '09:00',\n workEnd: '18:00',\n lunchEnabled: true,\n lunchStart: '12:00',\n lunchEnd: '13:00',\n lunchPaid: false,\n holidays: DEFAULT_HOLIDAYS,\n extraWorkdays: DEFAULT_EXTRA_WORKDAYS,\n /** \u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D\uFF080-6\uFF09 */\n decimals: 4,\n /** \u9762\u677F\u5237\u65B0\u95F4\u9694 ms\uFF1A1000=\u6309\u79D2\uFF1B16\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF08\u8FDE\u7EED\u6EDA\u52A8\uFF09\uFF1B\u4E2D\u95F4\u503C\u4E3A\u6BEB\u79D2\u7EA7 */\n updateMs: 1000,\n /** \u52A0\u901F\uFF08\u6EDA\u52A8\u6A21\u5F0F\uFF09\uFF1Atrue \u65F6\u5F3A\u5236\u6BEB\u79D2\u7EA7\u5237\u65B0\uFF08\u2248\u5C4F\u5E55\u5237\u65B0\u7387\uFF09\uFF0C\u6570\u5B57\u8FDE\u7EED\u6EDA\u52A8 */\n turbo: false,\n});\n\nconst SALARY_MAX = 10_000_000;\nconst DAY_MS = 86_400_000;\nconst DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/* ------------------------------------------------------------------ *\n * \u65F6\u95F4\u89E3\u6790 / \u683C\u5F0F\u5316\n * ------------------------------------------------------------------ */\n\n/**\n * \u628A 'HH:mm' \u89E3\u6790\u6210\u5F53\u5929\u5206\u949F\u6570\u3002\n * @param {string} text\n * @returns {number|null} 0..1439\uFF1B\u975E\u6CD5\u503C\u8FD4\u56DE null\u3002\n */\nexport function parseHm(text) {\n if (typeof text !== 'string') return null;\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(text.trim());\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (hour > 23 || minute > 59) return null;\n return hour * 60 + minute;\n}\n\n/**\n * \u628A\u5206\u949F\u6570\u683C\u5F0F\u5316\u4E3A 'HH:mm'\u3002\n * @param {number} minutes\n * @returns {string}\n */\nexport function formatHm(minutes) {\n const total = Math.max(0, Math.min(24 * 60 - 1, Math.round(Number(minutes) || 0)));\n const hour = Math.floor(total / 60);\n const minute = total % 60;\n return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n}\n\n/**\n * \u672C\u5730\u65E5\u671F\u952E 'YYYY-MM-DD'\u3002\n * @param {Date} date\n * @returns {string}\n */\nexport function dateKeyOf(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * \u628A 'YYYY-MM-DD' \u89E3\u6790\u6210**\u672C\u5730**\u96F6\u70B9 Date\u3002\n * @param {string} key\n * @returns {Date|null} \u975E\u6CD5\u65E5\u671F\u8FD4\u56DE null\u3002\n */\nexport function parseDateKey(key) {\n if (typeof key !== 'string' || !DATE_RE.test(key)) return null;\n const [year, month, day] = key.split('-').map(Number);\n const date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return null;\n return date;\n}\n\n/* ------------------------------------------------------------------ *\n * \u914D\u7F6E\u6821\u9A8C\n * ------------------------------------------------------------------ */\n\nfunction normalizeDateList(value) {\n const errors = [];\n const list = [];\n const seen = new Set();\n const items = Array.isArray(value) ? value : [];\n for (const raw of items) {\n if (typeof raw !== 'string' || !DATE_RE.test(raw.trim())) {\n errors.push(`\u65E5\u671F\u683C\u5F0F\u5E94\u4E3A YYYY-MM-DD\uFF1A${String(raw)}`);\n continue;\n }\n const key = raw.trim();\n if (parseDateKey(key) === null) {\n errors.push(`\u4E0D\u662F\u771F\u5B9E\u65E5\u671F\uFF1A${key}`);\n continue;\n }\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(key);\n }\n list.sort();\n return { list, errors };\n}\n\n/**\n * \u5408\u5E76\u9ED8\u8BA4\u503C\u5E76\u6821\u9A8C\uFF1B**\u4E0D\u629B\u9519**\uFF0C\u628A\u6240\u6709\u95EE\u9898\u6536\u96C6\u5230 errors\uFF08\u9762\u677F\u53EF\u5373\u65F6\u63D0\u793A\uFF09\u3002\n * @param {object} patch \u90E8\u5206\u6216\u5B8C\u6574\u914D\u7F6E\n * @returns {{ config: object, errors: string[] }}\n */\nexport function normalizeConfig(patch) {\n const source = patch && typeof patch === 'object' ? patch : {};\n const merged = { ...DEFAULTS };\n for (const key of Object.keys(DEFAULTS)) {\n if (source[key] !== undefined) merged[key] = source[key];\n }\n const errors = [];\n\n // \u6708\u85AA\n const salary = Number(merged.monthlySalary);\n if (!Number.isFinite(salary) || salary <= 0 || salary > SALARY_MAX) {\n errors.push(`\u6708\u85AA\u9700\u8981\u662F 0~${SALARY_MAX} \u4E4B\u95F4\u7684\u6570\u5B57`);\n merged.monthlySalary = salary;\n } else {\n merged.monthlySalary = salary;\n }\n\n // \u65F6\u95F4\n const start = parseHm(merged.workStart);\n const end = parseHm(merged.workEnd);\n const lunchStart = parseHm(merged.lunchStart);\n const lunchEnd = parseHm(merged.lunchEnd);\n if (start === null) errors.push('\u4E0A\u73ED\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (end === null) errors.push('\u4E0B\u73ED\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (summaryLunchEnabled(merged) && lunchStart === null) errors.push('\u5348\u4F11\u5F00\u59CB\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (summaryLunchEnabled(merged) && lunchEnd === null) errors.push('\u5348\u4F11\u7ED3\u675F\u65F6\u95F4\u683C\u5F0F\u5E94\u4E3A HH:mm');\n if (start !== null && end !== null && end <= start) errors.push('\u4E0B\u73ED\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u4E0A\u73ED\u65F6\u95F4\uFF08\u6682\u4E0D\u652F\u6301\u8DE8\u591C\u73ED\uFF09');\n if (summaryLunchEnabled(merged) && start !== null && end !== null && lunchStart !== null && lunchEnd !== null) {\n if (lunchStart < start) errors.push('\u5348\u4F11\u5F00\u59CB\u4E0D\u80FD\u65E9\u4E8E\u4E0A\u73ED\u65F6\u95F4');\n if (lunchEnd > end) errors.push('\u5348\u4F11\u7ED3\u675F\u4E0D\u80FD\u665A\u4E8E\u4E0B\u73ED\u65F6\u95F4');\n if (lunchEnd <= lunchStart) errors.push('\u5348\u4F11\u7ED3\u675F\u5FC5\u987B\u665A\u4E8E\u5348\u4F11\u5F00\u59CB');\n if (lunchEnd - lunchStart >= end - start) errors.push('\u5348\u4F11\u65F6\u957F\u4E0D\u80FD\u8986\u76D6\u6574\u4E2A\u5DE5\u4F5C\u65F6\u95F4');\n }\n\n // \u5E03\u5C14\n merged.lunchEnabled = merged.lunchEnabled !== false;\n merged.lunchPaid = merged.lunchPaid === true;\n\n // \u5C55\u793A/\u5237\u65B0\u504F\u597D\uFF1A\u4E3B\u91D1\u989D\u5C0F\u6570\u4F4D 0-6\uFF1B\u5237\u65B0\u95F4\u9694 16-1000ms\uFF0816 \u2248 \u5C4F\u5E55\u5237\u65B0\u7387\uFF09\uFF1B\u52A0\u901F\u5F00\u5173\n merged.turbo = merged.turbo === true;\n const decimals = Number(merged.decimals);\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 6) {\n errors.push('\u5C0F\u6570\u4F4D\u6570\u9700\u8981\u662F 0~6 \u7684\u6574\u6570');\n merged.decimals = Number.isInteger(decimals) ? decimals : DEFAULTS.decimals;\n } else {\n merged.decimals = decimals;\n }\n const updateMs = Number(merged.updateMs);\n if (!Number.isInteger(updateMs) || updateMs < 16 || updateMs > 1000) {\n errors.push('\u5237\u65B0\u95F4\u9694\u9700\u8981\u662F 16~1000ms \u7684\u6574\u6570');\n merged.updateMs = Number.isInteger(updateMs) ? updateMs : DEFAULTS.updateMs;\n } else {\n merged.updateMs = updateMs;\n }\n\n // \u65E5\u671F\u5217\u8868\n const holidays = normalizeDateList(merged.holidays);\n const extraWorkdays = normalizeDateList(merged.extraWorkdays);\n errors.push(...holidays.errors, ...extraWorkdays.errors);\n merged.holidays = holidays.list;\n merged.extraWorkdays = extraWorkdays.list;\n\n return { config: merged, errors };\n}\n\nfunction summaryLunchEnabled(config) {\n return config?.lunchEnabled !== false;\n}\n\n/**\n * \u6821\u9A8C\u5E76\u8FD4\u56DE\u89C4\u8303\u5316\u914D\u7F6E\uFF1B\u975E\u6CD5\u65F6\u629B\u9519\uFF08\u5BBF\u4E3B\u5199\u63A5\u53E3\u7528\uFF09\u3002\n * @param {object} patch\n * @returns {object} \u89C4\u8303\u5316\u540E\u7684\u5B8C\u6574\u914D\u7F6E\n */\nexport function validateConfig(patch) {\n const { config, errors } = normalizeConfig(patch);\n if (errors.length > 0) throw new Error(errors.join('\uFF1B'));\n return config;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5DE5\u4F5C\u65E5 / \u5DE5\u8D44\u7387\n * ------------------------------------------------------------------ */\n\n/** \u5224\u65AD\u67D0\u4E00\u5929\u662F\u5426\u5DE5\u4F5C\u65E5\uFF08\u8C03\u4F11\u4E0A\u73ED\u65E5 > \u6CD5\u5B9A\u8282\u5047\u65E5 > \u5468\u4E00~\u5468\u4E94\uFF09\u3002 */\nexport function isWorkday(key, config) {\n const holidays = new Set(config.holidays ?? DEFAULTS.holidays);\n const extra = new Set(config.extraWorkdays ?? DEFAULTS.extraWorkdays);\n if (extra.has(key)) return true;\n if (holidays.has(key)) return false;\n const date = parseDateKey(key);\n if (date === null) return false;\n const day = date.getDay();\n return day >= 1 && day <= 5;\n}\n\n/**\n * \u67D0\u81EA\u7136\u6708\u7684\u5DE5\u4F5C\u65E5\u6570\u3002\n * @param {number} year\n * @param {number} monthIndex 0-11\n * @param {object} config\n * @returns {number}\n */\nexport function workdaysInMonth(year, monthIndex, config) {\n const last = new Date(year, monthIndex + 1, 0).getDate();\n let count = 0;\n for (let day = 1; day <= last; day += 1) {\n if (isWorkday(dateKeyOf(new Date(year, monthIndex, day)), config)) count += 1;\n }\n return count;\n}\n\n/**\n * \u67D0\u4E00\u5929\u6240\u5728\u81EA\u7136\u5468\uFF08\u5468\u4E00~\u5468\u65E5\uFF09\u7684\u5DE5\u4F5C\u65E5\u6570\u3002\n * @param {string} key\n * @param {object} config\n * @returns {number}\n */\nexport function workdaysInWeek(key, config) {\n const date = parseDateKey(key);\n if (date === null) return 0;\n const offsetToMonday = (date.getDay() + 6) % 7; // \u5468\u4E00=0\n const monday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - offsetToMonday);\n let count = 0;\n for (let i = 0; i < 7; i += 1) {\n const day = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() + i);\n if (isWorkday(dateKeyOf(day), config)) count += 1;\n }\n return count;\n}\n\n/**\n * \u6BCF\u5929\u7684\u6709\u6548\u8BA1\u85AA\u5206\u949F\u6570\uFF08\u6263\u6389\u4E0D\u8BA1\u85AA\u7684\u5348\u4F11\uFF09\u3002\n * @param {object} config\n * @returns {number}\n */\nexport function paidMinutesPerDay(config) {\n const start = parseHm(config.workStart);\n const end = parseHm(config.workEnd);\n if (start === null || end === null || end <= start) return 0;\n let minutes = end - start;\n if (config.lunchEnabled !== false && config.lunchPaid !== true) {\n const lunchStart = parseHm(config.lunchStart);\n const lunchEnd = parseHm(config.lunchEnd);\n if (lunchStart !== null && lunchEnd !== null && lunchStart >= start && lunchEnd <= end && lunchEnd > lunchStart) {\n minutes -= lunchEnd - lunchStart;\n }\n }\n return Math.max(0, minutes);\n}\n\nfunction stripTimeToSeconds(date) {\n return date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();\n}\n\n/**\n * \u8BA1\u7B97\u67D0\u5929\u7684\u5DE5\u8D44\u7387\uFF08\u65E5/\u65F6/\u5206/\u79D2/\u5468/\u6708\uFF09\u3002\n * @param {object} config\n * @param {string} [dateKey] \u51B3\u5B9A\u300C\u5F53\u6708/\u5F53\u5468\u300D\u53E3\u5F84\u7684\u65E5\u671F\u952E\uFF0C\u9ED8\u8BA4\u4ECA\u5929\n * @returns {object}\n */\nexport function computeRates(config, dateKey) {\n const todayKey = dateKey ?? dateKeyOf(new Date());\n const date = parseDateKey(todayKey) ?? new Date();\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const monthlySalary = Number(config.monthlySalary) || 0;\n const monthlyWorkdays = workdaysInMonth(year, monthIndex, config);\n const weekWorkdays = workdaysInWeek(todayKey, config);\n const paidMinutes = paidMinutesPerDay(config);\n const dailyWage = monthlyWorkdays > 0 ? monthlySalary / monthlyWorkdays : 0;\n const paidHours = paidMinutes / 60;\n const hourlyWage = paidHours > 0 ? dailyWage / paidHours : 0;\n return {\n monthlySalary,\n monthlyWorkdays,\n weekWorkdays,\n paidMinutes,\n paidHours,\n dailyWage,\n hourlyWage,\n minuteWage: hourlyWage / 60,\n secondWage: hourlyWage / 3600,\n weeklyWage: dailyWage * weekWorkdays,\n monthlyWage: monthlySalary,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * \u4ECA\u65E5\u5DF2\u8D5A / \u533A\u95F4\u8FDB\u5EA6\n * ------------------------------------------------------------------ */\n\n/**\n * \u4ECA\u65E5\uFF08\u6216\u6307\u5B9A Date\uFF09\u7684\u5B9E\u65F6\u6536\u76CA\u4E0E\u72B6\u6001\u3002\n * @param {object} config\n * @param {Date} now\n * @returns {object}\n */\nexport function earnedToday(config, now) {\n const date = now instanceof Date && !Number.isNaN(now.getTime()) ? now : new Date();\n const key = dateKeyOf(date);\n const rates = computeRates(config, key);\n const workday = isWorkday(key, config);\n const startSec = (parseHm(config.workStart) ?? 0) * 60;\n const endSec = (parseHm(config.workEnd) ?? 0) * 60;\n const paidTotalSec = rates.paidMinutes * 60;\n const nowSec = stripTimeToSeconds(date);\n\n let status;\n if (!workday) status = 'rest';\n else if (nowSec < startSec) status = 'before';\n else if (nowSec >= endSec) status = 'off';\n else if (isWithinUnpaidLunch(config, nowSec)) status = 'lunch';\n else status = 'working';\n\n let elapsedSec = 0;\n if (workday) {\n elapsedSec = Math.max(0, Math.min(nowSec, endSec) - startSec);\n // \u4E0D\u8BA1\u85AA\u5348\u4F11\uFF1A\u6309\u201C\u5F53\u524D\u5DF2\u8FDB\u5165\u5348\u4F11\u7684\u7D2F\u8BA1\u91CD\u53E0\u201D\u6263\u9664\uFF08\u5348\u4F11\u4E2D\u51BB\u7ED3\u3001\u5348\u4F11\u540E\u7EE7\u7EED\uFF09\n if (config.lunchEnabled !== false && config.lunchPaid !== true) {\n const lunchStart = (parseHm(config.lunchStart) ?? 0) * 60;\n const lunchEnd = (parseHm(config.lunchEnd) ?? 0) * 60;\n if (lunchEnd > lunchStart) {\n const lunchLength = lunchEnd - lunchStart;\n const overlap = Math.max(0, Math.min(Math.min(nowSec, endSec), lunchEnd) - lunchStart);\n elapsedSec -= Math.min(overlap, lunchLength);\n }\n }\n elapsedSec = Math.max(0, Math.min(elapsedSec, paidTotalSec));\n }\n\n const todayEarned = Math.min(rates.dailyWage, elapsedSec * rates.secondWage);\n const todayTarget = workday ? rates.dailyWage : 0;\n const todayProgress = workday && paidTotalSec > 0 ? Math.min(1, elapsedSec / paidTotalSec) : 0;\n const monthEarned = earnedThisMonth(config, key, date, todayEarned, rates);\n const secondsToStart = workday && nowSec < startSec ? startSec - nowSec : 0;\n const secondsToEnd = workday && nowSec < endSec ? endSec - nowSec : 0;\n\n // \u672C\u6708\u5DE5\u4F5C\u5929\u6570\u8FDB\u5EA6\uFF1A\u5DF2\u5B8C\u6210 = \u4ECA\u5929\u4E4B\u524D\u7684\u5B8C\u6574\u5DE5\u4F5C\u65E5 +\uFF08\u4ECA\u5929\u5DF2\u4E0B\u73ED\u5219 +1\uFF09\uFF1B\n // \u300C\u4ECA\u5929\u300D\u5728\u4E0A\u73ED/\u5348\u4F11\u4E2D\u65F6\u7B97\u5269\u4F59\uFF08\u8FD8\u6CA1\u5E72\u5B8C\uFF09\uFF0C\u8FD9\u6837\u300C\u5DF2\u5DE5\u4F5C + \u5269\u4F59 = \u672C\u6708\u603B\u5DE5\u4F5C\u65E5\u300D\u3002\n const monthWorkdays = rates.monthlyWorkdays;\n let monthWorkdaysDone = 0;\n for (let day = 1; day < date.getDate(); day += 1) {\n if (isWorkday(dateKeyOf(new Date(date.getFullYear(), date.getMonth(), day)), config)) monthWorkdaysDone += 1;\n }\n if (workday && status === 'off') monthWorkdaysDone += 1;\n const monthWorkdaysLeft = Math.max(0, monthWorkdays - monthWorkdaysDone);\n\n return {\n dateKey: key,\n isWorkday: workday,\n status,\n paidSecondsElapsed: elapsedSec,\n paidSecondsTotal: paidTotalSec,\n todayEarned,\n todayTarget,\n todayProgress,\n monthEarned,\n monthWorkdays,\n monthWorkdaysDone,\n monthWorkdaysLeft,\n secondsToStart,\n secondsToEnd,\n rates,\n };\n}\n\nfunction isWithinUnpaidLunch(config, nowSec) {\n if (config.lunchEnabled === false || config.lunchPaid === true) return false;\n const lunchStart = parseHm(config.lunchStart);\n const lunchEnd = parseHm(config.lunchEnd);\n if (lunchStart === null || lunchEnd === null || lunchEnd <= lunchStart) return false;\n const from = lunchStart * 60;\n const to = lunchEnd * 60;\n return nowSec >= from && nowSec < to;\n}\n\nfunction earnedThisMonth(config, key, date, todayEarned, rates) {\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const today = date.getDate();\n let previousWorkdays = 0;\n for (let day = 1; day < today; day += 1) {\n const dayKey = dateKeyOf(new Date(year, monthIndex, day));\n if (isWorkday(dayKey, config)) previousWorkdays += 1;\n }\n return previousWorkdays * rates.dailyWage + todayEarned;\n}\n\n/* ------------------------------------------------------------------ *\n * \u5C55\u793A\u683C\u5F0F\u5316\n * ------------------------------------------------------------------ */\n\n/**\n * \u91D1\u989D\u683C\u5F0F\u5316\uFF1A\u56FA\u5B9A\u5C0F\u6570\u4F4D + \u5343\u5206\u4F4D\u3002\n * @param {number} value\n * @param {number} [digits]\n * @returns {string}\n */\nexport function formatMoney(value, digits = 2) {\n const number = Number(value);\n const safe = Number.isFinite(number) ? number : 0;\n const fixed = Math.abs(safe).toFixed(Math.max(0, Math.min(6, digits)));\n const [intPart, decPart] = fixed.split('.');\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return `${safe < 0 ? '-' : ''}${grouped}${decPart ? `.${decPart}` : ''}`;\n}\n\n/**\n * \u79D2\u6570\u683C\u5F0F\u5316\u4E3A\u4E2D\u6587\u65F6\u957F\u3002\n * @param {number} seconds\n * @returns {string}\n */\nexport function formatDuration(seconds) {\n const total = Math.max(0, Math.floor(Number(seconds) || 0));\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n if (hours > 0) return `${hours}\u5C0F\u65F6 ${minutes}\u5206 ${rest}\u79D2`;\n if (minutes > 0) return `${minutes}\u5206 ${rest}\u79D2`;\n return `${rest}\u79D2`;\n}\n\n/** \u4F9B\u9762\u677F\u811A\u6CE8\uFF1A\u5F53\u6708\u5DE5\u4F5C\u65E5\u660E\u7EC6\u7528\uFF08\u8FD4\u56DE\u8BE5\u6708\u6240\u6709\u5DE5\u4F5C\u65E5\u65E5\u671F\u952E\uFF09\u3002 */\nexport function workdaysOfMonth(year, monthIndex, config) {\n const last = new Date(year, monthIndex + 1, 0).getDate();\n const out = [];\n for (let day = 1; day <= last; day += 1) {\n const key = dateKeyOf(new Date(year, monthIndex, day));\n if (isWorkday(key, config)) out.push(key);\n }\n return out;\n}\n\n/** \u4ECA\u5929\u662F\u5426\u662F\u6CD5\u5B9A\u8282\u5047\u65E5\uFF08\u4E0D\u542B\u666E\u901A\u5468\u672B\uFF09\uFF0C\u7528\u4E8E\u6587\u6848\u533A\u5206\u3002 */\nexport function isStatutoryHoliday(key, config) {\n return new Set(config.holidays ?? DEFAULTS.holidays).has(key);\n}\n\nexport { DAY_MS };\n\n/* ------------------------------------------------------------------ *\n * \u6708\u5EA6 / \u5168\u5E74\u89C6\u89D2\uFF08\u53EA\u5F71\u54CD\u300C\u67E5\u770B\u300D\uFF0C\u4E0D\u5F71\u54CD\u4ECA\u65E5\u8BA1\u6570\u5668\uFF09\n * ------------------------------------------------------------------ */\n\n/** \u67D0\u5E74\u67D0\u6708\u91CC\u914D\u7F6E\u4E2D\u7684\u6CD5\u5B9A\u8282\u5047\u65E5\u65E5\u671F\u6570\uFF08\u6309\u65E5\u671F\u952E\u524D\u7F00\u7EDF\u8BA1\uFF0C\u65E0\u8BBA\u662F\u5426\u843D\u5728\u5468\u672B\uFF09\u3002 */\nexport function holidayDaysInMonth(year, monthIndex, config) {\n const prefix = `${year}-${String(monthIndex + 1).padStart(2, '0')}-`;\n return (config.holidays ?? DEFAULTS.holidays).filter((key) => key.startsWith(prefix)).length;\n}\n\n/**\n * \u5355\u6708\u6982\u89C8\uFF1A\u5DE5\u4F5C\u65E5\u6570\u3001\u6CD5\u5B9A\u5047\u65E5\u6570\u3001\u65E5/\u65F6/\u5206/\u79D2\u5DE5\u8D44\u7B49\u3002\n *\n * \u53E3\u5F84\u4E0E\u4ECA\u65E5\u8BA1\u6570\u4E00\u81F4\uFF1A\u6708\u85AA / \u5F53\u6708\u5DE5\u4F5C\u65E5 = \u65E5\u5DE5\u8D44\uFF08\u8282\u5047\u65E5\u4E0D\u7B97\u5DE5\u4F5C\u65E5 \u2192 \u65E5\u5DE5\u8D44\u66F4\u9AD8\uFF09\u3002\n * @param {object} config\n * @param {number} year\n * @param {number} monthIndex 0-11\n * @returns {object}\n */\nexport function monthSummary(config, year, monthIndex) {\n const daysInMonth = new Date(year, monthIndex + 1, 0).getDate();\n const workdays = workdaysInMonth(year, monthIndex, config);\n const holidayDays = holidayDaysInMonth(year, monthIndex, config);\n const monthlySalary = Number(config.monthlySalary) || 0;\n const paidMinutes = paidMinutesPerDay(config);\n const paidHours = paidMinutes / 60;\n const dailyWage = workdays > 0 ? monthlySalary / workdays : 0;\n const hourlyWage = paidHours > 0 ? dailyWage / paidHours : 0;\n return {\n year,\n monthIndex,\n month: monthIndex + 1,\n daysInMonth,\n workdays,\n holidayDays,\n restDays: daysInMonth - workdays,\n monthlySalary,\n paidMinutes,\n paidHours,\n dailyWage,\n hourlyWage,\n minuteWage: hourlyWage / 60,\n secondWage: hourlyWage / 3600,\n };\n}\n\n/**\n * \u5168\u5E74\u6982\u89C8\uFF1A12 \u4E2A\u6708\u6C47\u603B + \u5168\u5E74\u5E73\u5747\u5DE5\u8D44 + \u6CD5\u5B9A\u5047\u65E5\u6700\u591A\u7684\u6708\u4EFD\u3002\n *\n * \u300C\u5168\u5E74\u5E73\u5747\u300D\u53E3\u5F84\uFF1A\u5E74\u6536\u5165 = \u5B9E\u6536\u6708\u85AA \u00D7 12\uFF1B\u5E73\u5747\u65E5\u85AA = \u5E74\u6536\u5165 / \u5168\u5E74\u5DE5\u4F5C\u65E5\uFF1B\n * \u5E73\u5747\u65F6\u85AA = \u5E73\u5747\u65E5\u85AA / \u65E5\u6709\u6548\u5DE5\u65F6\u3002\u5E73\u5747\u6708\u85AA = \u5B9E\u6536\u6708\u85AA\uFF08\u4E0D\u56E0\u6708\u4EFD\u6D6E\u52A8\uFF09\u3002\n * @param {object} config\n * @param {number} year\n * @returns {object}\n */\nexport function yearSummary(config, year) {\n const months = Array.from({ length: 12 }, (_, monthIndex) => monthSummary(config, year, monthIndex));\n const totalWorkdays = months.reduce((sum, item) => sum + item.workdays, 0);\n const totalHolidayDays = months.reduce((sum, item) => sum + item.holidayDays, 0);\n const monthlySalary = Number(config.monthlySalary) || 0;\n const annualIncome = monthlySalary * 12;\n const paidMinutes = paidMinutesPerDay(config);\n const paidHours = paidMinutes / 60;\n const averageDailyWage = totalWorkdays > 0 ? annualIncome / totalWorkdays : 0;\n const averageHourlyWage = paidHours > 0 ? averageDailyWage / paidHours : 0;\n const maxHolidayMonth = months.reduce((best, item) => {\n if (item.holidayDays !== best.holidayDays) return item.holidayDays > best.holidayDays ? item : best;\n if (item.workdays !== best.workdays) return item.workdays < best.workdays ? item : best;\n return item.month < best.month ? item : best;\n }, months[0]);\n return {\n year,\n months,\n totalWorkdays,\n totalHolidayDays,\n paidMinutes,\n paidHours,\n monthlySalary,\n annualIncome,\n averageMonthlyWage: monthlySalary,\n averageDailyWage,\n averageHourlyWage,\n averageMinuteWage: averageHourlyWage / 60,\n averageSecondWage: averageHourlyWage / 3600,\n maxHolidayMonth,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["React"]
7
7
  }