您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

777 行
22KB

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Time Management Planner</title>
  7. <style>
  8. :root {
  9. --ink: #202124;
  10. --muted: #5f6368;
  11. --line: #d8dde3;
  12. --page: #f6f7f9;
  13. --panel: #ffffff;
  14. --teal: #176b5d;
  15. --blue: #2f5f98;
  16. --coral: #b75542;
  17. --gold: #8a6500;
  18. --green: #4d7653;
  19. --violet: #7b5aa6;
  20. --shadow: 0 10px 28px rgba(32, 33, 36, 0.08);
  21. --radius: 8px;
  22. --space: clamp(14px, 2vw, 22px);
  23. font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  24. color: var(--ink);
  25. background: var(--page);
  26. }
  27. * {
  28. box-sizing: border-box;
  29. }
  30. body {
  31. margin: 0;
  32. min-width: 320px;
  33. background:
  34. linear-gradient(180deg, rgba(237, 244, 242, 0.9), rgba(246, 247, 249, 0.2) 280px),
  35. var(--page);
  36. }
  37. button,
  38. input,
  39. textarea {
  40. font: inherit;
  41. }
  42. .shell {
  43. max-width: 1180px;
  44. margin: 0 auto;
  45. padding: 24px var(--space) 48px;
  46. }
  47. .topbar {
  48. display: flex;
  49. align-items: flex-start;
  50. justify-content: space-between;
  51. gap: 16px;
  52. margin-bottom: 20px;
  53. }
  54. h1 {
  55. margin: 0 0 6px;
  56. font-size: 2rem;
  57. line-height: 1.08;
  58. letter-spacing: 0;
  59. }
  60. .subtitle {
  61. margin: 0;
  62. max-width: 780px;
  63. color: var(--muted);
  64. line-height: 1.45;
  65. }
  66. .toolbar {
  67. display: flex;
  68. gap: 8px;
  69. flex-wrap: wrap;
  70. justify-content: flex-end;
  71. min-width: 220px;
  72. }
  73. .button {
  74. min-height: 38px;
  75. border: 1px solid var(--line);
  76. border-radius: 6px;
  77. padding: 8px 12px;
  78. background: var(--panel);
  79. color: var(--ink);
  80. cursor: pointer;
  81. box-shadow: 0 1px 0 rgba(32, 33, 36, 0.04);
  82. }
  83. .button.primary {
  84. border-color: var(--teal);
  85. background: var(--teal);
  86. color: #fff;
  87. }
  88. .button:hover {
  89. filter: brightness(0.98);
  90. }
  91. .summary {
  92. display: grid;
  93. grid-template-columns: repeat(4, minmax(0, 1fr));
  94. gap: 12px;
  95. margin: 18px 0 22px;
  96. }
  97. .metric {
  98. background: var(--panel);
  99. border: 1px solid var(--line);
  100. border-radius: var(--radius);
  101. padding: 14px;
  102. box-shadow: var(--shadow);
  103. min-height: 108px;
  104. }
  105. .metric strong {
  106. display: block;
  107. font-size: 1.55rem;
  108. line-height: 1.05;
  109. margin-bottom: 6px;
  110. }
  111. .metric span {
  112. color: var(--muted);
  113. line-height: 1.35;
  114. display: block;
  115. }
  116. .layout {
  117. display: grid;
  118. grid-template-columns: minmax(0, 1fr) 330px;
  119. gap: 18px;
  120. align-items: start;
  121. }
  122. .section {
  123. margin-bottom: 18px;
  124. }
  125. .section-head {
  126. display: flex;
  127. align-items: center;
  128. justify-content: space-between;
  129. gap: 12px;
  130. margin-bottom: 10px;
  131. }
  132. h2 {
  133. margin: 0;
  134. font-size: 1.08rem;
  135. letter-spacing: 0;
  136. }
  137. .hint {
  138. color: var(--muted);
  139. font-size: 0.92rem;
  140. line-height: 1.35;
  141. margin: 0;
  142. }
  143. .week {
  144. display: grid;
  145. grid-template-columns: repeat(7, minmax(140px, 1fr));
  146. gap: 10px;
  147. overflow-x: auto;
  148. padding-bottom: 4px;
  149. }
  150. .day {
  151. background: var(--panel);
  152. border: 1px solid var(--line);
  153. border-radius: var(--radius);
  154. min-height: 460px;
  155. box-shadow: var(--shadow);
  156. display: flex;
  157. flex-direction: column;
  158. }
  159. .day header {
  160. padding: 12px 12px 8px;
  161. border-bottom: 1px solid var(--line);
  162. min-height: 62px;
  163. }
  164. .day h3 {
  165. margin: 0 0 4px;
  166. font-size: 1rem;
  167. letter-spacing: 0;
  168. }
  169. .day .tone {
  170. color: var(--muted);
  171. font-size: 0.8rem;
  172. line-height: 1.25;
  173. }
  174. .items {
  175. display: flex;
  176. flex-direction: column;
  177. gap: 8px;
  178. padding: 10px;
  179. }
  180. .block {
  181. border-left: 4px solid var(--line);
  182. background: #fafbfc;
  183. border-radius: 6px;
  184. padding: 9px 9px 9px 10px;
  185. min-height: 58px;
  186. }
  187. .block.work { border-left-color: var(--blue); }
  188. .block.spiritual { border-left-color: var(--teal); }
  189. .block.health { border-left-color: var(--green); }
  190. .block.home { border-left-color: var(--gold); }
  191. .block.creative { border-left-color: var(--coral); }
  192. .block.relationship { border-left-color: var(--violet); }
  193. .block.rest { border-left-color: #6c737f; }
  194. .time {
  195. display: block;
  196. color: var(--muted);
  197. font-size: 0.78rem;
  198. line-height: 1.3;
  199. margin-bottom: 4px;
  200. }
  201. .task {
  202. display: block;
  203. font-weight: 650;
  204. line-height: 1.25;
  205. overflow-wrap: anywhere;
  206. }
  207. .note {
  208. display: block;
  209. color: var(--muted);
  210. font-size: 0.82rem;
  211. line-height: 1.35;
  212. margin-top: 3px;
  213. overflow-wrap: anywhere;
  214. }
  215. .panel {
  216. background: var(--panel);
  217. border: 1px solid var(--line);
  218. border-radius: var(--radius);
  219. box-shadow: var(--shadow);
  220. padding: 14px;
  221. }
  222. .panel + .panel {
  223. margin-top: 14px;
  224. }
  225. .checklist {
  226. display: grid;
  227. gap: 8px;
  228. margin-top: 10px;
  229. }
  230. .check {
  231. display: grid;
  232. grid-template-columns: 22px minmax(0, 1fr);
  233. gap: 8px;
  234. align-items: start;
  235. padding: 8px;
  236. border: 1px solid var(--line);
  237. border-radius: 6px;
  238. background: #fbfcfd;
  239. min-height: 42px;
  240. }
  241. .check input {
  242. width: 18px;
  243. height: 18px;
  244. margin: 1px 0 0;
  245. accent-color: var(--teal);
  246. }
  247. .check span {
  248. line-height: 1.35;
  249. overflow-wrap: anywhere;
  250. }
  251. .check small {
  252. display: block;
  253. color: var(--muted);
  254. margin-top: 2px;
  255. line-height: 1.3;
  256. }
  257. .tags {
  258. display: flex;
  259. flex-wrap: wrap;
  260. gap: 7px;
  261. margin-top: 10px;
  262. }
  263. .tag {
  264. border-radius: 999px;
  265. padding: 5px 8px;
  266. border: 1px solid var(--line);
  267. background: #fbfcfd;
  268. color: var(--muted);
  269. font-size: 0.82rem;
  270. white-space: nowrap;
  271. }
  272. textarea {
  273. width: 100%;
  274. min-height: 120px;
  275. resize: vertical;
  276. border: 1px solid var(--line);
  277. border-radius: 6px;
  278. padding: 10px;
  279. color: var(--ink);
  280. background: #fbfcfd;
  281. line-height: 1.4;
  282. }
  283. .export-box {
  284. margin-top: 10px;
  285. min-height: 180px;
  286. white-space: pre-wrap;
  287. }
  288. .legend {
  289. display: grid;
  290. grid-template-columns: repeat(2, minmax(0, 1fr));
  291. gap: 8px;
  292. margin-top: 10px;
  293. }
  294. .legend-item {
  295. display: flex;
  296. align-items: center;
  297. gap: 8px;
  298. color: var(--muted);
  299. font-size: 0.88rem;
  300. min-width: 0;
  301. }
  302. .swatch {
  303. width: 12px;
  304. height: 12px;
  305. border-radius: 3px;
  306. flex: 0 0 12px;
  307. }
  308. .footer {
  309. margin-top: 18px;
  310. color: var(--muted);
  311. font-size: 0.9rem;
  312. line-height: 1.4;
  313. }
  314. @media (max-width: 980px) {
  315. .layout {
  316. grid-template-columns: 1fr;
  317. }
  318. .summary {
  319. grid-template-columns: repeat(2, minmax(0, 1fr));
  320. }
  321. .topbar {
  322. flex-direction: column;
  323. }
  324. .toolbar {
  325. justify-content: flex-start;
  326. }
  327. }
  328. @media (max-width: 560px) {
  329. .shell {
  330. padding-top: 18px;
  331. }
  332. h1 {
  333. font-size: 1.55rem;
  334. }
  335. .summary {
  336. grid-template-columns: 1fr;
  337. }
  338. .toolbar,
  339. .button {
  340. width: 100%;
  341. }
  342. .week {
  343. grid-template-columns: repeat(7, minmax(230px, 78vw));
  344. }
  345. .legend {
  346. grid-template-columns: 1fr;
  347. }
  348. }
  349. @media print {
  350. body {
  351. background: #fff;
  352. }
  353. .toolbar,
  354. .export-box,
  355. #exportText,
  356. .footer {
  357. display: none;
  358. }
  359. .shell {
  360. max-width: none;
  361. padding: 0;
  362. }
  363. .layout {
  364. grid-template-columns: 1fr;
  365. }
  366. .week {
  367. overflow: visible;
  368. grid-template-columns: repeat(2, 1fr);
  369. }
  370. .day,
  371. .metric,
  372. .panel {
  373. box-shadow: none;
  374. break-inside: avoid;
  375. }
  376. }
  377. </style>
  378. </head>
  379. <body>
  380. <main class="shell">
  381. <div class="topbar">
  382. <div>
  383. <h1>Time Management Planner</h1>
  384. <p class="subtitle">A first working rhythm for work, congregation care, marriage, home responsibilities, exercise, dance, guitar, Bible study, and flexible creative time.</p>
  385. </div>
  386. <div class="toolbar" aria-label="Planner actions">
  387. <button class="button primary" id="exportBtn" type="button">Export</button>
  388. <button class="button" id="printBtn" type="button">Print</button>
  389. <button class="button" id="resetBtn" type="button">Reset Checks</button>
  390. </div>
  391. </div>
  392. <section class="summary" aria-label="Weekly time summary">
  393. <div class="metric">
  394. <strong>45 min</strong>
  395. <span>Daily morning workout target.</span>
  396. </div>
  397. <div class="metric">
  398. <strong>10:00 PM</strong>
  399. <span>Hard stop for bedtime. No planned block ends after this.</span>
  400. </div>
  401. <div class="metric">
  402. <strong>90 min</strong>
  403. <span>Saturday elder and congregation care block.</span>
  404. </div>
  405. <div class="metric">
  406. <strong>Sunday</strong>
  407. <span>Lowest-pressure day: meeting, cleaning, rest, and light planning.</span>
  408. </div>
  409. </section>
  410. <div class="layout">
  411. <section class="section" aria-labelledby="weekTitle">
  412. <div class="section-head">
  413. <h2 id="weekTitle">Weekly Skeleton</h2>
  414. <p class="hint">Travel is built in as 15 minutes each way. Flexible blocks use first-draft times.</p>
  415. </div>
  416. <div class="week" id="weekGrid"></div>
  417. </section>
  418. <aside aria-label="Daily and weekly checklists">
  419. <section class="panel">
  420. <h2>Daily Anchors</h2>
  421. <div class="checklist" id="dailyChecks"></div>
  422. </section>
  423. <section class="panel">
  424. <h2>Weekly Responsibilities</h2>
  425. <div class="checklist" id="weeklyChecks"></div>
  426. </section>
  427. <section class="panel">
  428. <h2>Protected Roles</h2>
  429. <div class="tags">
  430. <span class="tag">IT Director</span>
  431. <span class="tag">Programmer</span>
  432. <span class="tag">Congregation elder</span>
  433. <span class="tag">Husband</span>
  434. <span class="tag">Homeowner/renter</span>
  435. </div>
  436. </section>
  437. <section class="panel">
  438. <h2>Color Key</h2>
  439. <div class="legend">
  440. <div class="legend-item"><span class="swatch" style="background: var(--blue)"></span>Work</div>
  441. <div class="legend-item"><span class="swatch" style="background: var(--teal)"></span>Spiritual</div>
  442. <div class="legend-item"><span class="swatch" style="background: var(--green)"></span>Health</div>
  443. <div class="legend-item"><span class="swatch" style="background: var(--gold)"></span>Home</div>
  444. <div class="legend-item"><span class="swatch" style="background: var(--coral)"></span>Creative</div>
  445. <div class="legend-item"><span class="swatch" style="background: var(--violet)"></span>Marriage</div>
  446. </div>
  447. </section>
  448. <section class="panel">
  449. <h2>Notes</h2>
  450. <textarea id="notes" aria-label="Planner notes">Saturday bills. Sunday light. Painting and writing are bonus creative blocks.</textarea>
  451. </section>
  452. <section class="panel">
  453. <h2>Export</h2>
  454. <textarea class="export-box" id="exportText" aria-label="Exported Markdown"></textarea>
  455. </section>
  456. </aside>
  457. </div>
  458. <p class="footer">Source: interview answers gathered for the time_managment project folder. This page saves checklist state and notes in this browser.</p>
  459. </main>
  460. <script>
  461. const planner = {
  462. days: [
  463. {
  464. name: "Monday",
  465. tone: "Best normal build day",
  466. blocks: [
  467. ["6:00-6:45 AM", "Workout", "45 minutes before work", "health"],
  468. ["8:30 AM-5:30 PM", "Work", "IT Director/programmer block", "work"],
  469. ["6:00-6:30 PM", "Wife connection", "Target 30 minutes", "relationship"],
  470. ["7:00-7:45 PM", "Bible study / meeting prep", "Use this as the main weekday study block", "spiritual"],
  471. ["9:15-10:00 PM", "Guitar", "30-45 minutes before hard stop", "creative"],
  472. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  473. ]
  474. },
  475. {
  476. name: "Tuesday",
  477. tone: "Meeting night",
  478. blocks: [
  479. ["6:00-6:45 AM", "Workout", "45 minutes before work", "health"],
  480. ["8:30 AM-5:30 PM", "Work", "IT Director/programmer block", "work"],
  481. ["6:45-9:00 PM", "Kingdom Hall", "15-minute travel each way plus 7:00-8:45 meeting", "spiritual"],
  482. ["9:15-9:35 PM", "Wife connection", "Short version after meeting", "relationship"],
  483. ["9:35-9:50 PM", "Guitar minimum", "15 minutes counts", "creative"],
  484. ["9:50-10:00 PM", "Light reset only", "Keep this simple", "home"],
  485. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  486. ]
  487. },
  488. {
  489. name: "Wednesday",
  490. tone: "Dance night",
  491. blocks: [
  492. ["6:00-6:45 AM", "Workout", "45 minutes before work", "health"],
  493. ["8:30 AM-5:30 PM", "Work", "IT Director/programmer block", "work"],
  494. ["5:45-7:45 PM", "Dance", "15-minute travel each way plus 6:00-7:30 class", "health"],
  495. ["8:00-8:30 PM", "Wife connection", "Target 30 minutes", "relationship"],
  496. ["9:15-9:45 PM", "Guitar minimum", "15-30 minutes", "creative"],
  497. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  498. ]
  499. },
  500. {
  501. name: "Thursday",
  502. tone: "Late dance night",
  503. blocks: [
  504. ["6:00-6:45 AM", "Workout", "45 minutes before work", "health"],
  505. ["8:30 AM-5:30 PM", "Work", "IT Director/programmer block", "work"],
  506. ["5:45-6:05 PM", "Quick elder check", "Messages, calls, urgent follow-up", "spiritual"],
  507. ["6:05-6:35 PM", "Wife connection", "Target 30 minutes before dance", "relationship"],
  508. ["7:45-9:30 PM", "Dance", "Travel plus 8:15-9:15 class", "health"],
  509. ["9:40-9:55 PM", "Guitar minimum", "15 minutes if energy is low", "creative"],
  510. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  511. ]
  512. },
  513. {
  514. name: "Friday",
  515. tone: "Lighter landing",
  516. blocks: [
  517. ["6:00-6:45 AM", "Workout", "45 minutes before work", "health"],
  518. ["8:30 AM-12:45 PM", "Work", "Morning work block", "work"],
  519. ["1:00-2:15 PM", "Dance", "Travel plus 1:15-2:00 class", "health"],
  520. ["2:15-5:30 PM", "Work", "Afternoon work block", "work"],
  521. ["6:00-6:30 PM", "Wife connection", "Keep the evening lighter", "relationship"],
  522. ["9:15-10:00 PM", "Guitar", "30-45 minutes if recovered", "creative"],
  523. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  524. ]
  525. },
  526. {
  527. name: "Saturday",
  528. tone: "Admin, service, and home",
  529. blocks: [
  530. ["7:00-7:45 AM", "Workout", "45 minutes", "health"],
  531. ["9:00-10:30 AM", "Elder/congregation block", "90 minutes for calls, shepherding, talks, prep, texts, organizing, ministry", "spiritual"],
  532. ["10:45-11:15 AM", "Bills", "Weekly money/admin pass", "home"],
  533. ["11:15 AM-12:45 PM", "Honey-do list and repairs", "Small weekly tasks", "home"],
  534. ["3:30-4:15 PM", "Bible study / family worship", "Use as needed for all-of-the-above study", "spiritual"],
  535. ["4:30-5:30 PM", "Painting or writing", "Optional creative block", "creative"],
  536. ["9:15-10:00 PM", "Guitar", "30-45 minutes", "creative"],
  537. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  538. ]
  539. },
  540. {
  541. name: "Sunday",
  542. tone: "Lowest-pressure day",
  543. blocks: [
  544. ["7:00-7:45 AM", "Workout", "45 minutes, easier pace if needed", "health"],
  545. ["9:30-11:30 AM", "Cleaning", "2 hours: kitchen floor, vacuum, master bath", "home"],
  546. ["12:45-3:15 PM", "Sunday meeting", "15-minute travel each way plus 1:00-3:00 meeting", "spiritual"],
  547. ["3:30-5:30 PM", "Wife/rest time", "Keep this protected", "relationship"],
  548. ["6:30-6:45 PM", "Light weekly planning", "Look at the week without loading the day", "rest"],
  549. ["9:15-9:30 PM", "Guitar minimum", "15 minutes only if it feels good", "creative"],
  550. ["10:00 PM", "Bedtime hard stop", "Stop the day here", "rest"]
  551. ]
  552. }
  553. ],
  554. daily: [
  555. ["Workout", "45 minutes, preferably morning"],
  556. ["Wife connection", "Target 30 minutes"],
  557. ["Guitar", "30-45 minutes late evening; 15-minute minimum; always end by 10:00 PM"],
  558. ["Quick elder check", "Messages, calls, urgent follow-up"],
  559. ["Basic reset", "Trash, small cleanup, next-day planning"],
  560. ["Spiritual minimum", "10-15 minutes on full days"],
  561. ["Bedtime", "10:00 PM hard stop"]
  562. ],
  563. weekly: [
  564. ["Bible study", "Personal study, meeting prep, talk/elder prep, family worship"],
  565. ["Saturday elder block", "90 minutes"],
  566. ["Bills", "Saturday"],
  567. ["House repairs", "Small weekly tasks"],
  568. ["Trash", "Weekly and as needed"],
  569. ["Honey-do list", "Small weekly tasks"],
  570. ["General cleaning", "Sunday cleaning plus small resets"],
  571. ["Watercolor painting", "Nice if possible"],
  572. ["Writing", "Nice if possible"]
  573. ]
  574. };
  575. const stateKey = "time-management-planner-state-v1";
  576. const state = loadState();
  577. function loadState() {
  578. try {
  579. return JSON.parse(localStorage.getItem(stateKey)) || { checks: {}, notes: "" };
  580. } catch (error) {
  581. return { checks: {}, notes: "" };
  582. }
  583. }
  584. function saveState() {
  585. localStorage.setItem(stateKey, JSON.stringify(state));
  586. }
  587. function blockMarkup(block) {
  588. const [time, task, note, type] = block;
  589. return `
  590. <div class="block ${type}">
  591. <span class="time">${time}</span>
  592. <span class="task">${task}</span>
  593. <span class="note">${note}</span>
  594. </div>
  595. `;
  596. }
  597. function renderWeek() {
  598. const grid = document.getElementById("weekGrid");
  599. grid.innerHTML = planner.days.map(day => `
  600. <article class="day">
  601. <header>
  602. <h3>${day.name}</h3>
  603. <span class="tone">${day.tone}</span>
  604. </header>
  605. <div class="items">
  606. ${day.blocks.map(blockMarkup).join("")}
  607. </div>
  608. </article>
  609. `).join("");
  610. }
  611. function renderChecks(list, id, prefix) {
  612. const target = document.getElementById(id);
  613. target.innerHTML = list.map(([label, detail], index) => {
  614. const key = `${prefix}-${index}`;
  615. const checked = state.checks[key] ? "checked" : "";
  616. return `
  617. <label class="check">
  618. <input type="checkbox" data-check-key="${key}" ${checked}>
  619. <span>${label}<small>${detail}</small></span>
  620. </label>
  621. `;
  622. }).join("");
  623. }
  624. function markdownExport() {
  625. const checks = [...document.querySelectorAll("[data-check-key]")].map(input => {
  626. const text = input.closest("label").innerText.trim().replace(/\n+/g, " - ");
  627. return `- [${input.checked ? "x" : " "}] ${text}`;
  628. }).join("\n");
  629. const days = planner.days.map(day => {
  630. const blocks = day.blocks.map(([time, task, note]) => `- ${time}: ${task} (${note})`).join("\n");
  631. return `## ${day.name}\n${blocks}`;
  632. }).join("\n\n");
  633. return `# Time Management Planner\n\n## Weekly Skeleton\n\n${days}\n\n## Checklists\n\n${checks}\n\n## Notes\n\n${document.getElementById("notes").value.trim()}`;
  634. }
  635. function updateExport() {
  636. document.getElementById("exportText").value = markdownExport();
  637. }
  638. function init() {
  639. renderWeek();
  640. renderChecks(planner.daily, "dailyChecks", "daily");
  641. renderChecks(planner.weekly, "weeklyChecks", "weekly");
  642. const notes = document.getElementById("notes");
  643. if (state.notes) {
  644. notes.value = state.notes;
  645. }
  646. document.addEventListener("change", event => {
  647. if (event.target.matches("[data-check-key]")) {
  648. state.checks[event.target.dataset.checkKey] = event.target.checked;
  649. saveState();
  650. updateExport();
  651. }
  652. });
  653. notes.addEventListener("input", () => {
  654. state.notes = notes.value;
  655. saveState();
  656. updateExport();
  657. });
  658. document.getElementById("exportBtn").addEventListener("click", async () => {
  659. updateExport();
  660. const text = document.getElementById("exportText").value;
  661. try {
  662. await navigator.clipboard.writeText(text);
  663. document.getElementById("exportBtn").textContent = "Copied";
  664. setTimeout(() => document.getElementById("exportBtn").textContent = "Export", 1200);
  665. } catch (error) {
  666. document.getElementById("exportText").focus();
  667. document.getElementById("exportText").select();
  668. }
  669. });
  670. document.getElementById("printBtn").addEventListener("click", () => window.print());
  671. document.getElementById("resetBtn").addEventListener("click", () => {
  672. state.checks = {};
  673. saveState();
  674. document.querySelectorAll("[data-check-key]").forEach(input => {
  675. input.checked = false;
  676. });
  677. updateExport();
  678. });
  679. updateExport();
  680. }
  681. init();
  682. </script>
  683. </body>
  684. </html>

Powered by TurnKey Linux.