dsh-niuma 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/README.md +7 -0
- package/docs/preview-light-dark.png +0 -0
- package/lib/client.js +948 -259
- package/lib/client.js.map +2 -2
- package/lib/index.js +48 -118
- package/package.json +3 -8
- package/src/client/index.js +716 -208
- package/src/core.mjs +101 -0
- package/src/holidays.mjs +90 -10
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 normalizeConfig,\n} from '../core.mjs';\nimport { HOLIDAY_SOURCE } 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/** \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 'holidaySource': '\u8282\u5047\u65E5\u6765\u6E90',\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 '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\uFF08\u5143/\u6708\uFF09',\n 'workStartField': '\u4E0A\u73ED\u65F6\u95F4',\n 'workEndField': '\u4E0B\u73ED\u65F6\u95F4',\n 'lunchEnabledField': '\u542F\u7528\u5348\u4F11',\n 'lunchStartField': '\u5348\u4F11\u5F00\u59CB',\n 'lunchEndField': '\u5348\u4F11\u7ED3\u675F',\n 'lunchPaidField': '\u5348\u4F11\u7B97\u5DE5\u65F6',\n 'holidaysField': '\u8282\u5047\u65E5\uFF08\u4E00\u884C\u4E00\u4E2A YYYY-MM-DD\uFF09',\n 'extraWorkdaysField': '\u8C03\u4F11\u4E0A\u73ED\u65E5\uFF08\u4E00\u884C\u4E00\u4E2A YYYY-MM-DD\uFF09',\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};\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 'holidaySource': 'Holiday data',\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 'settingsHint': 'Click Save to apply. Invalid input is shown in red below; the ticker keeps running.',\n 'salaryField': 'Net monthly salary (CNY)',\n 'workStartField': 'Work start',\n 'workEndField': 'Work end',\n 'lunchEnabledField': 'Enable lunch break',\n 'lunchStartField': 'Lunch start',\n 'lunchEndField': 'Lunch end',\n 'lunchPaidField': 'Lunch is paid',\n 'holidaysField': 'Holidays (one YYYY-MM-DD per line)',\n 'extraWorkdaysField': 'Make-up workdays (one YYYY-MM-DD per line)',\n 'save': 'Save',\n 'saving': 'Saving\u2026',\n 'saved': 'Saved',\n 'saveFailed': 'Save failed: ',\n 'dayUnit': 'd',\n 'hourUnit': 'h',\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) => `\u00A5${formatMoney(value, digits)}`;\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\nfunction splitDateLines(text) {\n return String(text == null ? '' : text)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 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 holidaysText: (config.holidays || []).join('\\n'),\n extraWorkdaysText: (config.extraWorkdays || []).join('\\n'),\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 holidays: splitDateLines(form.holidaysText),\n extraWorkdays: splitDateLines(form.extraWorkdaysText),\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/** \u5F53\u524D\u65F6\u95F4\uFF1A\u6BCF 250ms \u68C0\u67E5\u4E00\u6B21\uFF0C\u53EA\u6709\u6574\u79D2\u53D8\u5316\u624D setState\uFF08\u6BCF\u79D2\u91CD\u7B97\u4E00\u6B21\uFF09\u3002 */\nfunction useSecondClock() {\n const [now, setNow] = React.useState(() => new Date());\n React.useEffect(() => {\n let lastSecond = -1;\n const timer = setInterval(() => {\n const second = Math.floor(Date.now() / 1000);\n if (second === lastSecond) return;\n lastSecond = second;\n setNow(new Date());\n }, 250);\n return () => clearInterval(timer);\n }, []);\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/** \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 return React.createElement('span', {\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '3px 10px',\n borderRadius: 999,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.5,\n color: meta.color,\n border: `1px solid ${meta.color}`,\n background: C.layer1,\n whiteSpace: 'nowrap',\n },\n }, [\n React.createElement('i', {\n key: 'dot',\n style: { width: 6, height: 6, borderRadius: '50%', background: meta.color, display: 'inline-block' },\n }),\n t(meta.key),\n ]);\n}\n\n/** \u4ECA\u65E5\u5DF2\u8D5A\uFF1A\u8D85\u5927\u6570\u5B57\uFF0C\u6BCF\u79D2\u8DF3\u52A8\u3002 */\nfunction HeroCard(props) {\n const t = props.t;\n const snap = props.snap;\n return React.createElement('div', { style: { ...CARD, padding: '13px 15px 12px' } }, [\n React.createElement('div', {\n key: 'head',\n style: {\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n gap: 8, flexWrap: 'wrap', fontSize: 12, color: C.label2,\n },\n }, [\n React.createElement('span', { key: 'a' }, t('earnedToday')),\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: 6, marginTop: 1, flexWrap: 'wrap' },\n }, [\n React.createElement('span', {\n key: 'cur',\n style: { fontSize: 22, fontWeight: 700, color: C.label2, ...NUM },\n }, '\u00A5'),\n React.createElement('span', {\n key: 'val',\n style: {\n fontSize: 40, lineHeight: 1.15, fontWeight: 760, letterSpacing: '-.5px',\n color: C.ok, ...NUM,\n },\n }, formatMoney(snap.todayEarned, 4)),\n ]),\n React.createElement('div', {\n key: 'sub',\n style: { fontSize: 11, color: C.label3, marginTop: 2, ...NUM },\n }, `${t('perSecond')} ${money(snap.rates.secondWage, 4)}`),\n ]);\n}\n\n/** \u4ECA\u65E5\u8FDB\u5EA6\u6761 + \u8DDD\u4E0A\u73ED / \u8DDD\u4E0B\u73ED\u5012\u8BA1\u65F6\u3002 */\nfunction ProgressCard(props) {\n const t = props.t;\n const snap = props.snap;\n const progress = Math.max(0, Math.min(1, Number(snap.todayProgress) || 0));\n const percentText = `${(progress * 100).toFixed(1)}%`;\n const countdownChip = (key, label, seconds) => React.createElement('div', {\n key,\n style: { ...CARD, flex: '1 1 130px', minWidth: 118, padding: '8px 10px' },\n }, [\n React.createElement('div', { key: 'l', style: { fontSize: 11, color: C.label3 } }, label),\n React.createElement('div', {\n key: 'v',\n style: { fontSize: 14, fontWeight: 650, color: C.label, marginTop: 2, ...NUM },\n }, Number(seconds) > 0 ? formatDuration(seconds) : '\u2014'),\n ]);\n return React.createElement('div', { style: CARD }, [\n React.createElement('div', {\n key: 'top',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('span', { key: 'l', style: { fontSize: 12, color: C.label2 } }, t('todayProgress')),\n React.createElement('span', {\n key: 'p',\n style: { fontSize: 13, fontWeight: 650, color: C.brand, ...NUM },\n }, percentText),\n ]),\n React.createElement('div', {\n key: 'bar',\n style: {\n marginTop: 6, height: 8, borderRadius: 999, background: C.layer2,\n overflow: 'hidden',\n },\n }, [\n React.createElement('div', {\n key: 'fill',\n style: {\n width: `${(progress * 100).toFixed(2)}%`,\n height: '100%',\n borderRadius: 999,\n background: C.brand,\n transition: 'width .4s linear',\n },\n }),\n ]),\n React.createElement('div', {\n key: 'nums',\n style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 8, marginTop: 5, flexWrap: 'wrap', fontSize: 11, color: C.label3 },\n }, [\n React.createElement('span', { key: 'a' }, t('progressOfTarget')),\n React.createElement('span', { key: 'b', style: { ...NUM } },\n `${money(snap.todayEarned, 2)} / ${money(snap.todayTarget, 2)}`),\n ]),\n React.createElement('div', {\n key: 'cd',\n style: { display: 'flex', flexWrap: 'wrap', gap: 8, marginTop: 8 },\n }, [\n countdownChip('start', t('toStart'), snap.secondsToStart),\n countdownChip('end', t('toEnd'), snap.secondsToEnd),\n ]),\n ]);\n}\n\n/** \u516D\u5BAB\u683C\uFF1A\u79D2 / \u5206 / \u65F6 / \u65E5 / \u5468 / \u6708\u5DE5\u8D44\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\nfunction RatesGrid(props) {\n const t = props.t;\n const rates = props.rates;\n return React.createElement('div', {\n style: { display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 8 },\n }, RATE_CARDS.map((spec, index) => React.createElement('div', {\n key: spec.key,\n 'data-stat': `stat-${index}`,\n style: { ...CARD, padding: '9px 10px' },\n }, [\n React.createElement('div', { key: 'l', style: { fontSize: 11, color: C.label3 } }, t(spec.label)),\n React.createElement('div', {\n key: 'v',\n style: { fontSize: 15, fontWeight: 650, color: C.label, marginTop: 2, ...NUM },\n }, money(rates[spec.key], spec.digits)),\n ])));\n}\n\n/** \u660E\u7EC6\u811A\u6CE8\uFF1A\u6708\u85AA / \u5F53\u6708\u5DE5\u4F5C\u65E5 / \u65E5\u6709\u6548\u5DE5\u65F6 / \u4ECA\u65E5\u76EE\u6807 / \u672C\u6708\u5DF2\u8D5A + \u8282\u5047\u65E5\u6765\u6E90\u3002 */\nfunction DetailsFooter(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\n const source = props.holidaySource || HOLIDAY_SOURCE;\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 ];\n return React.createElement('div', {\n style: { ...CARD, padding: '9px 12px', fontSize: 11, color: C.label3, lineHeight: 1.7 },\n }, [\n React.createElement('div', {\n key: 'items',\n style: { display: 'flex', flexWrap: 'wrap', gap: '2px 14px' },\n }, items.map((item) => React.createElement('span', {\n key: item.key,\n style: { display: 'inline-flex', alignItems: 'baseline', gap: 4, whiteSpace: 'nowrap' },\n }, [\n React.createElement('span', { key: 'l' }, `${item.label}`),\n React.createElement('span', {\n key: 'v',\n style: { color: C.label2, fontWeight: 600, ...NUM },\n }, item.value),\n ]))),\n React.createElement('div', {\n key: 'src',\n style: { display: 'flex', flexWrap: 'wrap', alignItems: 'baseline', gap: 4, marginTop: 2 },\n }, [\n React.createElement('span', { key: 'l' }, `${t('holidaySource')}\uFF1A`),\n React.createElement('a', {\n key: 'a',\n href: source.url,\n target: '_blank',\n rel: 'noreferrer',\n title: source.title,\n style: { color: C.brand, textDecoration: 'underline' },\n }, `${source.year} \u00B7 ${t('holidaySourceLink')} \u2197`),\n React.createElement('span', { key: 'n', style: { color: C.label3 } }, `\uFF08${source.title}\uFF09`),\n ]),\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 const inputStyle = {\n width: '100%',\n boxSizing: 'border-box',\n padding: '5px 8px',\n borderRadius: 8,\n border: `1px solid ${C.border}`,\n background: C.layer2,\n color: C.label,\n fontSize: 13,\n fontVariantNumeric: 'tabular-nums',\n outline: 'none',\n };\n const labelStyle = { fontSize: 11, color: C.label3 };\n\n const textField = (field, labelKey, placeholder) => React.createElement('label', {\n key: field,\n style: { display: 'flex', flexDirection: 'column', gap: 3, flex: '1 1 130px', minWidth: 112 },\n }, [\n React.createElement('span', { key: 'l', style: labelStyle }, t(labelKey)),\n React.createElement('input', {\n key: 'i',\n type: 'text',\n value: form[field],\n placeholder: placeholder || 'HH:mm',\n onChange: (event) => setField(field, event.target.value),\n style: inputStyle,\n }),\n ]);\n\n const checkField = (field, labelKey) => React.createElement('label', {\n key: field,\n style: {\n display: 'flex', alignItems: 'center', gap: 6, flex: '1 1 140px',\n fontSize: 12, color: C.label2, cursor: 'pointer', minHeight: 30,\n },\n }, [\n React.createElement('input', {\n key: 'i',\n type: 'checkbox',\n checked: Boolean(form[field]),\n onChange: (event) => setCheck(field, event.target.checked),\n }),\n React.createElement('span', { key: 'l' }, t(labelKey)),\n ]);\n\n const textareaField = (field, labelKey) => React.createElement('label', {\n key: field,\n style: { display: 'flex', flexDirection: 'column', gap: 3, flex: '1 1 220px', minWidth: 200 },\n }, [\n React.createElement('span', { key: 'l', style: labelStyle }, t(labelKey)),\n React.createElement('textarea', {\n key: 'i',\n rows: 4,\n value: form[field],\n spellCheck: false,\n onChange: (event) => setField(field, event.target.value),\n style: {\n ...inputStyle,\n resize: 'vertical',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n lineHeight: 1.5,\n },\n }),\n ]);\n\n return React.createElement('details', { style: { ...CARD, padding: '10px 12px' } }, [\n React.createElement('summary', {\n key: 'sum',\n style: { cursor: 'pointer', fontSize: 13, fontWeight: 600, color: C.label, userSelect: 'none' },\n }, t('settings')),\n React.createElement('div', {\n key: 'hint',\n style: { fontSize: 11, color: C.label3, margin: '4px 0 9px' },\n }, t('settingsHint')),\n React.createElement('div', {\n key: 'fields',\n style: { display: 'flex', flexWrap: 'wrap', gap: 8 },\n }, [\n textField('monthlySalary', 'salaryField', '10000'),\n textField('workStart', 'workStartField', '09:00'),\n textField('workEnd', 'workEndField', '18:00'),\n textField('lunchStart', 'lunchStartField', '12:00'),\n textField('lunchEnd', 'lunchEndField', '13:00'),\n checkField('lunchEnabled', 'lunchEnabledField'),\n checkField('lunchPaid', 'lunchPaidField'),\n ]),\n React.createElement('div', {\n key: 'lists',\n style: { display: 'flex', flexWrap: 'wrap', gap: 8, marginTop: 8 },\n }, [\n textareaField('holidaysText', 'holidaysField'),\n textareaField('extraWorkdaysText', 'extraWorkdaysField'),\n ]),\n React.createElement('div', {\n key: 'actions',\n style: { display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap', marginTop: 10 },\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 ${C.brand}`,\n color: C.brand,\n background: 'transparent',\n borderRadius: 8,\n padding: '6px 16px',\n fontSize: 13,\n fontWeight: 600,\n cursor: save.status === 'saving' ? 'default' : 'pointer',\n },\n }, save.status === 'saving' ? t('saving') : t('save')),\n save.status === 'ok'\n ? React.createElement('span', { key: 'ok', style: { fontSize: 12, color: C.ok } }, save.message || t('saved'))\n : null,\n save.status === 'error'\n ? React.createElement('span', {\n key: 'err',\n style: { fontSize: 12, color: C.error, flex: '1 1 220px', 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 now = useSecondClock();\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 // \u6BCF\u79D2\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 // \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 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 display: 'flex',\n flexDirection: 'column',\n gap: 9,\n minWidth: 0,\n padding: '2px 1px 18px',\n fontSize: 13,\n lineHeight: 1.45,\n color: C.label,\n fontFamily: 'inherit',\n },\n }, [\n // \u6807\u9898 + \u72B6\u6001\u5FBD\u6807\n React.createElement('div', {\n key: 'head',\n style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' },\n }, [\n React.createElement('div', { key: 'tt', style: { marginRight: 'auto', minWidth: 0 } }, [\n React.createElement('div', {\n key: 't',\n style: { fontSize: 16, fontWeight: 700, color: C.label },\n }, t('title')),\n React.createElement('div', {\n key: 's',\n style: { fontSize: 11, color: C.label3 },\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: '5px 9px',\n borderRadius: 8, border: `1px solid ${banner.color}`, background: C.layer1,\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 }),\n React.createElement(ProgressCard, { key: 'progress', t, snap }),\n React.createElement(RatesGrid, { key: 'rates', t, rates }),\n React.createElement(DetailsFooter, { key: 'footer', t, snap, holidaySource }),\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 * \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 * 2026 \u5E74\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 * \u6765\u6E90\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\u3002\u9010\u6761\u6838\u5BF9\u81EA\u5B98\u65B9\u539F\u6587\uFF1A\n * https://www.gov.cn/zhengce/content/202511/content_7047090.htm\n *\n * \u53EA\u6536\u5F55 2026 \u5E74\u3002\u8DE8\u5E74\u540E\u7528\u6237\u53EF\u5728\u9762\u677F\u300C\u8282\u5047\u65E5\u300D\u91CC\u81EA\u884C\u589E\u5220\uFF08\u4E00\u884C\u4E00\u4E2A YYYY-MM-DD\uFF09\u3002\n *\n * @module dsh-niuma/holidays\n */\n\n/** 2026 \u5E74\u653E\u5047\u65E5\u671F\uFF08\u4E0D\u542B\u5468\u672B\u7684\u666E\u901A\u4F11\u606F\u65E5\uFF1B\u8FD9\u4E9B\u65E5\u671F\u4E00\u5F8B\u4E0D\u7B97\u5DE5\u4F5C\u65E5\uFF09 */\nexport const DEFAULT_HOLIDAYS = 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 DEFAULT_EXTRA_WORKDAYS = 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/** \u6570\u636E\u51FA\u5904\uFF0C\u9762\u677F\u811A\u6CE8\u5C55\u793A\u7528 */\nexport const HOLIDAY_SOURCE = Object.freeze({\n year: 2026,\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 * \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});\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 // \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 return {\n dateKey: key,\n isWorkday: workday,\n status,\n paidSecondsElapsed: elapsedSec,\n paidSecondsTotal: paidTotalSec,\n todayEarned,\n todayTarget,\n todayProgress,\n monthEarned,\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"],
|
|
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 '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 '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 };\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 };\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/** \u5F53\u524D\u65F6\u95F4\uFF1A\u6BCF 250ms \u68C0\u67E5\u4E00\u6B21\uFF0C\u53EA\u6709\u6574\u79D2\u53D8\u5316\u624D setState\uFF08\u6BCF\u79D2\u91CD\u7B97\u4E00\u6B21\uFF09\u3002 */\nfunction useSecondClock() {\n const [now, setNow] = React.useState(() => new Date());\n React.useEffect(() => {\n let lastSecond = -1;\n const timer = setInterval(() => {\n const second = Math.floor(Date.now() / 1000);\n if (second === lastSecond) return;\n lastSecond = second;\n setNow(new Date());\n }, 250);\n return () => clearInterval(timer);\n }, []);\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 */\nfunction HeroCard(props) {\n const t = props.t;\n const snap = props.snap;\n const rates = snap.rates;\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('span', {\n key: 'val',\n style: {\n fontSize: 46, lineHeight: 1.12, fontWeight: 800, letterSpacing: '-1.2px',\n ...GOLD,\n ...NUM,\n ...(rest ? { opacity: 0.62 } : {}),\n },\n }, formatMoney(snap.todayEarned, 4)),\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\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 ]),\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 now = useSecondClock();\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 // \u6BCF\u79D2\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 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 }),\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});\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 // \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
|
}
|