@diagrammo/dgmo 0.48.2 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/.cursorrules +12 -3
  2. package/.github/copilot-instructions.md +12 -3
  3. package/.windsurfrules +12 -3
  4. package/SKILL.md +12 -3
  5. package/dist/advanced.d.ts +851 -1
  6. package/dist/advanced.js +601 -177
  7. package/dist/auto.css +63 -0
  8. package/dist/auto.js +220 -110
  9. package/dist/auto.mjs +45920 -33167
  10. package/dist/block.css +63 -0
  11. package/dist/block.d.ts +13 -5
  12. package/dist/block.js +239 -62
  13. package/dist/{charts-d3-QOZHKTCT.js → charts-d3-DKUD7MQE.js} +9 -8
  14. package/dist/{chunk-3MQQNXPD.js → chunk-2C56LEML.js} +3 -3
  15. package/dist/{chunk-L66GEFB6.js → chunk-2JJ2KNPI.js} +4 -4
  16. package/dist/{chunk-6SM5NJQH.js → chunk-2QYTMIRR.js} +4 -4
  17. package/dist/{chunk-RJE5JTVK.js → chunk-3G6TMNVF.js} +7 -7
  18. package/dist/{chunk-MO5YHHMQ.js → chunk-3LKM6FMW.js} +2 -2
  19. package/dist/{chunk-76OWZ3BA.js → chunk-3P2DKJCG.js} +2 -2
  20. package/dist/chunk-3TDRHT4J.js +1043 -0
  21. package/dist/chunk-3XPUDB7B.js +420 -0
  22. package/dist/{chunk-2LACINWN.js → chunk-3ZPC476N.js} +7 -7
  23. package/dist/{chunk-G2H74XJZ.js → chunk-4BMJQFNK.js} +8 -8
  24. package/dist/{chunk-THXCFRTU.js → chunk-4S723I74.js} +9 -9
  25. package/dist/{chunk-6NYWYNBI.js → chunk-4XK3FLFB.js} +3 -3
  26. package/dist/chunk-5JSWBPZZ.js +607 -0
  27. package/dist/{chunk-WCT3NYCV.js → chunk-5LWQH6QV.js} +1 -1
  28. package/dist/{chunk-7DTWEFUE.js → chunk-5Z736BSU.js} +8 -8
  29. package/dist/{chunk-ERLBPDGU.js → chunk-6BFZKBGD.js} +2 -2
  30. package/dist/{chunk-6HO5ZTXK.js → chunk-6IAA2QQ2.js} +2 -2
  31. package/dist/{chunk-H6PI3KJT.js → chunk-6IUAK7RZ.js} +2 -2
  32. package/dist/{chunk-RTLBSQ3G.js → chunk-6M5PJFQG.js} +3 -3
  33. package/dist/{chunk-Z5CGSFJB.js → chunk-6X4AKWLF.js} +4 -4
  34. package/dist/{chunk-OJR3MQYV.js → chunk-6ZT4U37Q.js} +291 -52
  35. package/dist/{chunk-5QXL4NYS.js → chunk-7G2ER4CY.js} +10 -5
  36. package/dist/chunk-7PQYTZMA.js +681 -0
  37. package/dist/{chunk-OURHMODR.js → chunk-7RB5Q6MB.js} +11 -11
  38. package/dist/{chunk-YAA6IID3.js → chunk-7UEMZREK.js} +2 -2
  39. package/dist/{chunk-AN2MOO5T.js → chunk-A3WQVFBS.js} +3 -3
  40. package/dist/{chunk-VOKGH627.js → chunk-AHGF2YYA.js} +13 -3
  41. package/dist/{chunk-CI2G3OEB.js → chunk-ASS5YYIZ.js} +12 -12
  42. package/dist/{chunk-TYS6CSS5.js → chunk-BCYVE3N5.js} +2 -2
  43. package/dist/chunk-BDXC7MDK.js +2395 -0
  44. package/dist/chunk-BTUTZMPT.js +482 -0
  45. package/dist/{chunk-YGJTDXVR.js → chunk-C4GQDB5L.js} +2 -2
  46. package/dist/{chunk-Y2ZE3MSG.js → chunk-C63UWAKM.js} +2 -2
  47. package/dist/{chunk-725LDASD.js → chunk-CLD2OKV7.js} +2 -2
  48. package/dist/{chunk-WBRZJOEC.js → chunk-CMCR5WBW.js} +3 -3
  49. package/dist/{chunk-IZMRON6C.js → chunk-CVV36CWI.js} +2 -2
  50. package/dist/chunk-DMJJ3CEQ.js +254 -0
  51. package/dist/{chunk-MZSBFAPJ.js → chunk-EJTKV7CY.js} +9 -9
  52. package/dist/{chunk-FITOLXSX.js → chunk-EOFPYPAU.js} +26 -2
  53. package/dist/{chunk-X5LCYCL5.js → chunk-ER5SCQWQ.js} +5 -5
  54. package/dist/{chunk-4OHACBGX.js → chunk-F2L5GCQ4.js} +2 -2
  55. package/dist/{chunk-FCIIHT24.js → chunk-F5UDBSJY.js} +7 -7
  56. package/dist/{chunk-3JLKYGBQ.js → chunk-F7BFXWNQ.js} +2 -2
  57. package/dist/{chunk-FANX6UJR.js → chunk-FAL7NOK3.js} +11 -11
  58. package/dist/{chunk-BUPDIHML.js → chunk-FB2WHOEQ.js} +4 -4
  59. package/dist/chunk-FL4IOQ37.js +379 -0
  60. package/dist/{chunk-LIOHW36Z.js → chunk-GBE54KY6.js} +6 -5
  61. package/dist/{chunk-RUNNI6VE.js → chunk-GL5UZ6NY.js} +3 -3
  62. package/dist/{chunk-4GRI7MEB.js → chunk-GPWHQ5FJ.js} +6 -6
  63. package/dist/chunk-GROQGHCT.js +960 -0
  64. package/dist/{chunk-SGZYXELT.js → chunk-H73FP42Q.js} +9 -6
  65. package/dist/{chunk-PBAHEPLQ.js → chunk-HGN652MU.js} +7 -6
  66. package/dist/{chunk-3SMGIJDD.js → chunk-HHXOONLX.js} +13 -1
  67. package/dist/{chunk-QOOUC2J5.js → chunk-HQCHYB5F.js} +2 -2
  68. package/dist/{chunk-AELOBFW5.js → chunk-I4IFRCUB.js} +3 -3
  69. package/dist/{chunk-GMR5MFHJ.js → chunk-I7F2A35O.js} +2 -2
  70. package/dist/{chunk-T2OE3YQB.js → chunk-IA3FJYWR.js} +3 -3
  71. package/dist/chunk-IAEC4KLA.js +492 -0
  72. package/dist/chunk-IVKC4GID.js +32 -0
  73. package/dist/{chunk-HSH73DP6.js → chunk-JFYIP7XU.js} +139 -39
  74. package/dist/{chunk-CKNVO24D.js → chunk-JZNMXEIV.js} +2 -2
  75. package/dist/chunk-KJXIHOVL.js +940 -0
  76. package/dist/chunk-L2ZTFHAY.js +331 -0
  77. package/dist/{chunk-B7JUCQUA.js → chunk-M5RXSRO2.js} +4 -4
  78. package/dist/{chunk-ULOEATBZ.js → chunk-NFFIKVNO.js} +106 -29
  79. package/dist/{chunk-PZMETGLY.js → chunk-NISQC5KW.js} +358 -122
  80. package/dist/chunk-O4VUFXIH.js +574 -0
  81. package/dist/{chunk-RVMRZAPB.js → chunk-O76UD6VJ.js} +3 -3
  82. package/dist/{chunk-JM4LEPY3.js → chunk-O7NUCTFU.js} +2 -2
  83. package/dist/{chunk-JED6ZDEE.js → chunk-O7WP4ZD4.js} +2 -2
  84. package/dist/{chunk-EVCVDTXE.js → chunk-OHQEMBLI.js} +3 -3
  85. package/dist/{chunk-ZBWMSD5N.js → chunk-ONA5KPV3.js} +4 -4
  86. package/dist/{chunk-Y3J7VR52.js → chunk-OTAL43EH.js} +34 -2
  87. package/dist/{chunk-WCSOJFU3.js → chunk-OTP5KVLO.js} +3 -3
  88. package/dist/{chunk-RYEGFMUO.js → chunk-PGEGPSCZ.js} +2 -2
  89. package/dist/{chunk-ZO27FGJS.js → chunk-PH5X4GIP.js} +2 -2
  90. package/dist/{chunk-ZJEL4H2R.js → chunk-PJUGRJHJ.js} +9 -9
  91. package/dist/{chunk-ZGR7ULFJ.js → chunk-PLZI6KPM.js} +26 -14
  92. package/dist/{chunk-3R5POCTZ.js → chunk-PMN3Q7RJ.js} +6 -6
  93. package/dist/{chunk-YGJZWZTY.js → chunk-PZFVK3IH.js} +2 -2
  94. package/dist/chunk-Q4V4XQWV.js +158 -0
  95. package/dist/chunk-QDFNCATJ.js +325 -0
  96. package/dist/{chunk-QEBUY5NY.js → chunk-QFQ35BTO.js} +4 -4
  97. package/dist/chunk-QQJUTGQH.js +135 -0
  98. package/dist/{chunk-PWIHZ6NJ.js → chunk-QUJGFNFN.js} +4 -4
  99. package/dist/{chunk-J5FIXQRT.js → chunk-R56LASIN.js} +4 -4
  100. package/dist/{chunk-SRTU6HMQ.js → chunk-RV26LTUU.js} +8 -8
  101. package/dist/chunk-RV6A2B5S.js +354 -0
  102. package/dist/{chunk-EB6FPQUP.js → chunk-S5GRONXL.js} +3 -3
  103. package/dist/{chunk-5MLYVTYM.js → chunk-SCHXJTZL.js} +2 -2
  104. package/dist/{chunk-T3UBLACL.js → chunk-SCQ5VPUF.js} +19 -5
  105. package/dist/{chunk-PBHE5UG6.js → chunk-SGFZZAUO.js} +46 -12
  106. package/dist/{chunk-BUVJFRPY.js → chunk-SU2VBK4L.js} +4 -4
  107. package/dist/{chunk-SML67VPV.js → chunk-T4BRO3Z6.js} +3 -3
  108. package/dist/{chunk-NURGB5Z4.js → chunk-TSA237IM.js} +2 -2
  109. package/dist/chunk-TWCLK2GA.js +273 -0
  110. package/dist/{chunk-IJZFN3HM.js → chunk-TWQUYVP3.js} +4 -4
  111. package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
  112. package/dist/{chunk-B65G5DNL.js → chunk-URSQLCTR.js} +3 -3
  113. package/dist/{chunk-ILKORZ3H.js → chunk-UUS2GIJZ.js} +7 -7
  114. package/dist/{chunk-XAKEUMEJ.js → chunk-UXOSVCLJ.js} +4 -4
  115. package/dist/{chunk-QLCCJEJI.js → chunk-WCUHAQKB.js} +2 -2
  116. package/dist/{chunk-WVAJFAIA.js → chunk-WWN566I7.js} +257 -101
  117. package/dist/{chunk-IPWPWM6R.js → chunk-X2NMFTG3.js} +111 -10
  118. package/dist/{chunk-UWN33VNX.js → chunk-XCLHOZAM.js} +10 -10
  119. package/dist/{chunk-P235SVAH.js → chunk-XDXNDSKO.js} +2 -2
  120. package/dist/chunk-XHVV4NVW.js +51 -0
  121. package/dist/{chunk-33LCUH4H.js → chunk-XMVQ5F4M.js} +4 -4
  122. package/dist/{chunk-MITI6NOL.js → chunk-YA7D2N2O.js} +11 -11
  123. package/dist/{chunk-7JEGTRLD.js → chunk-YB3FW24O.js} +3 -3
  124. package/dist/chunk-YNRDWYZP.js +295 -0
  125. package/dist/{chunk-44CM72SQ.js → chunk-YZLMKW4T.js} +3 -3
  126. package/dist/chunk-Z6XJQ6KO.js +452 -0
  127. package/dist/cli.cjs +179 -133
  128. package/dist/clock.d.ts +10 -0
  129. package/dist/clock.js +235 -0
  130. package/dist/countdown.d.ts +12 -0
  131. package/dist/countdown.js +450 -0
  132. package/dist/dgmo-router-QOMFCOOV.js +84 -0
  133. package/dist/dimensions-P5FSX2QN.js +22 -0
  134. package/dist/editor.js +43 -2
  135. package/dist/element.js +220 -110
  136. package/dist/element.mjs +45920 -33167
  137. package/dist/{flowchart-parser-ZNSKIBVR.js → flowchart-parser-OE4WHLTF.js} +4 -4
  138. package/dist/{flowchart-renderer-SNDSII4D.js → flowchart-renderer-GPCSMTOR.js} +8 -8
  139. package/dist/highlight.d.ts +17 -1
  140. package/dist/highlight.js +163 -6
  141. package/dist/index.d.ts +5 -1
  142. package/dist/index.js +199 -233
  143. package/dist/{layout-HRBZPFCN.js → layout-34CLNICW.js} +5 -5
  144. package/dist/layout-46366KBT.js +10 -0
  145. package/dist/{layout-HWDSRX5E.js → layout-5BG6DFCU.js} +6 -6
  146. package/dist/layout-6RDJHS6E.js +9 -0
  147. package/dist/{layout-7QXCNOVS.js → layout-7H4H46CS.js} +3 -3
  148. package/dist/{layout-46N4JJYK.js → layout-7SKMFYHL.js} +5 -5
  149. package/dist/{layout-EE6GE46Y.js → layout-DC4TVXER.js} +5 -5
  150. package/dist/layout-FGQWRYYW.js +14 -0
  151. package/dist/{layout-S2QBYSK2.js → layout-NXG63LWH.js} +3 -3
  152. package/dist/{layout-N76NR4ZO.js → layout-PUQCB6AN.js} +7 -7
  153. package/dist/{layout-HYZPWAK5.js → layout-QNUQLEHU.js} +3 -3
  154. package/dist/{layout-UM5F4DJB.js → layout-T3OZU5QW.js} +5 -5
  155. package/dist/layout-TJIWF7EM.js +14 -0
  156. package/dist/layout-VYELEAW7.js +14 -0
  157. package/dist/{layout-5RA6QWR6.js → layout-WZHNDT2O.js} +6 -6
  158. package/dist/{layout-search-OYV77HHS.js → layout-search-QS44PI5R.js} +6 -6
  159. package/dist/{parser-6BTRLKRZ.js → parser-45DENHFZ.js} +4 -4
  160. package/dist/{parser-TFZFBVWN.js → parser-4AI5ZN5F.js} +3 -3
  161. package/dist/{parser-XDVELHRK.js → parser-4P36TUVD.js} +4 -4
  162. package/dist/{parser-ZSDPZYQP.js → parser-5AURY4A6.js} +4 -4
  163. package/dist/{parser-N5O4IHUN.js → parser-A2BEFMGK.js} +4 -4
  164. package/dist/parser-B5FVS7O6.js +11 -0
  165. package/dist/{parser-NGU3ETO6.js → parser-C2HF2C2E.js} +4 -4
  166. package/dist/parser-CSFUN3CT.js +14 -0
  167. package/dist/{parser-TRTHDFPP.js → parser-D3QT6GWN.js} +5 -5
  168. package/dist/parser-D5637H5H.js +15 -0
  169. package/dist/{parser-VQP2UJ6W.js → parser-DFFEDKHH.js} +3 -3
  170. package/dist/parser-DOKMZXVZ.js +13 -0
  171. package/dist/parser-FMPCVFRK.js +15 -0
  172. package/dist/{parser-Y6WTBU76.js → parser-HYRTF3DO.js} +3 -3
  173. package/dist/{parser-I6KXEYFK.js → parser-I2UIJKVQ.js} +4 -4
  174. package/dist/{parser-O5J4VBII.js → parser-IBWNAPY4.js} +3 -3
  175. package/dist/{parser-PQ3POX45.js → parser-KUQWRPIT.js} +4 -4
  176. package/dist/{parser-2MFP2H2E.js → parser-LWKKBNSA.js} +3 -3
  177. package/dist/{parser-OV7NOBW6.js → parser-O4QFCUW7.js} +5 -5
  178. package/dist/{parser-IXSZZQHY.js → parser-PGMQDD4G.js} +4 -4
  179. package/dist/{parser-3STE62GB.js → parser-Q4QKCIWQ.js} +4 -4
  180. package/dist/parser-QTOB4KFL.js +14 -0
  181. package/dist/{parser-2EWECDSA.js → parser-QYYM4QVW.js} +4 -4
  182. package/dist/{parser-4OGOBJJ4.js → parser-RZMQP7MM.js} +4 -4
  183. package/dist/parser-RZPVAQVX.js +11 -0
  184. package/dist/parser-SOUJOEYI.js +13 -0
  185. package/dist/{parser-4FL2CMDG.js → parser-UQE5OWZI.js} +5 -5
  186. package/dist/{parser-NRAI6O25.js → parser-WAV5JRPT.js} +4 -4
  187. package/dist/{parser-KNSQSKQO.js → parser-YLKYBRIT.js} +5 -5
  188. package/dist/{parser-XKRP7QKP.js → parser-YS7TOS2K.js} +3 -3
  189. package/dist/{parser-AQETEVRW.js → parser-ZSOWUBML.js} +5 -5
  190. package/dist/{parser-CFZD5IBL.js → parser-ZTBATMLX.js} +4 -4
  191. package/dist/{renderer-VACVQYML.js → renderer-35HSIDMZ.js} +8 -8
  192. package/dist/{renderer-5MYBMBYO.js → renderer-4ITCHBT7.js} +5 -5
  193. package/dist/{renderer-CLJHQPBJ.js → renderer-67NPCBIS.js} +11 -11
  194. package/dist/{renderer-5NDVNDAZ.js → renderer-6GHYK7DX.js} +9 -9
  195. package/dist/{renderer-Z7I3W2PP.js → renderer-6RNGHC5Z.js} +8 -8
  196. package/dist/renderer-72LGR2YF.js +14 -0
  197. package/dist/{renderer-KQB7UGDS.js → renderer-7RH2SI3B.js} +3 -3
  198. package/dist/renderer-7SWMIFMM.js +21 -0
  199. package/dist/renderer-BBCEFILK.js +24 -0
  200. package/dist/{renderer-JGBKUCZD.js → renderer-BSW7SRIZ.js} +4 -4
  201. package/dist/{renderer-BYCNMBF7.js → renderer-BY533UWU.js} +11 -11
  202. package/dist/{renderer-6W5462RB.js → renderer-BZSBPTZJ.js} +9 -9
  203. package/dist/{renderer-7MVLWWQD.js → renderer-CXUC4KAD.js} +9 -9
  204. package/dist/{renderer-QIWVHWZO.js → renderer-DAXMXIKD.js} +3 -3
  205. package/dist/renderer-FZUKFUNZ.js +23 -0
  206. package/dist/renderer-G2NLGNKF.js +17 -0
  207. package/dist/renderer-GO3FE3RA.js +24 -0
  208. package/dist/{renderer-ZGNTUWC4.js → renderer-HPGR6USK.js} +8 -8
  209. package/dist/{renderer-UV6MI64M.js → renderer-HVCU2C3Z.js} +3 -3
  210. package/dist/renderer-ICJN2SA2.js +24 -0
  211. package/dist/{renderer-AWWAF6XD.js → renderer-INEXO7B6.js} +10 -10
  212. package/dist/{renderer-YY2OSF6E.js → renderer-KDYCFRBX.js} +8 -8
  213. package/dist/renderer-KY4KQBTF.js +19 -0
  214. package/dist/{renderer-B2OMQIQG.js → renderer-LBN65V45.js} +13 -13
  215. package/dist/{renderer-N43WR5GV.js → renderer-MGBWOCXG.js} +10 -10
  216. package/dist/{renderer-PGX2TKVS.js → renderer-O4JKUGKO.js} +8 -8
  217. package/dist/{renderer-4JHRUBE6.js → renderer-OOGFODWP.js} +10 -10
  218. package/dist/{renderer-6EEZHMH4.js → renderer-Q6ZKPLS6.js} +9 -9
  219. package/dist/{renderer-RPOA5YPZ.js → renderer-SZQ326M5.js} +12 -12
  220. package/dist/{renderer-ZRNG54CW.js → renderer-TKG6LS4U.js} +11 -11
  221. package/dist/{renderer-W4M6QLIJ.js → renderer-TQMZGDAX.js} +13 -13
  222. package/dist/renderer-radial-JELMHQ24.js +21 -0
  223. package/dist/{resolver-NOAA7ID7.js → resolver-FHBCO3PL.js} +3 -3
  224. package/dist/{state-parser-Z2V23ATR.js → state-parser-3REXRK3R.js} +4 -4
  225. package/dist/{state-renderer-B4DQBM6M.js → state-renderer-XYLNRWXR.js} +8 -8
  226. package/docs/ai-integration.md +12 -3
  227. package/docs/language-reference.md +429 -24
  228. package/gallery/fixtures/body.dgmo +17 -0
  229. package/gallery/fixtures/bracket.dgmo +30 -0
  230. package/gallery/fixtures/clock.dgmo +8 -0
  231. package/gallery/fixtures/countdown.dgmo +3 -0
  232. package/gallery/fixtures/family.dgmo +23 -0
  233. package/gallery/fixtures/goal.dgmo +4 -0
  234. package/gallery/fixtures/sketch.dgmo +22 -0
  235. package/package.json +12 -4
  236. package/dist/chunk-ODZVHU3R.js +0 -153
  237. package/dist/dgmo-router-X35VLZLM.js +0 -73
  238. package/dist/dimensions-J3FHIMJ6.js +0 -22
  239. package/dist/layout-5T6RH5M6.js +0 -14
  240. package/dist/layout-G23F7LDH.js +0 -9
  241. package/dist/layout-OB3RI63S.js +0 -14
  242. package/dist/parser-JAL2HD4I.js +0 -13
  243. package/dist/renderer-SMIBCRVB.js +0 -24
  244. package/dist/renderer-radial-C32GPJQ7.js +0 -21
@@ -0,0 +1,10 @@
1
+ /** Run one update pass over every clock row inside `root`. */
2
+ declare function tickClocks(root?: ParentNode): void;
3
+ /**
4
+ * Update `root` immediately, then (once per page) register a single 1s interval
5
+ * that re-scans the whole document. Idempotent — safe to call on every render /
6
+ * route change. No-op with no DOM.
7
+ */
8
+ declare function startClocks(root?: ParentNode): void;
9
+
10
+ export { startClocks, tickClocks };
package/dist/clock.js ADDED
@@ -0,0 +1,235 @@
1
+ // src/clock/resolve.ts
2
+ var SOON_MIN = 60;
3
+ var RAD = Math.PI / 180;
4
+ var DAY_MS = 864e5;
5
+ var J1970 = 2440588;
6
+ var J2000 = 2451545;
7
+ function zoneParts(zone, nowMs) {
8
+ const d = new Date(nowMs);
9
+ try {
10
+ const o = {};
11
+ new Intl.DateTimeFormat("en-US", {
12
+ timeZone: zone,
13
+ hour12: false,
14
+ hour: "2-digit",
15
+ minute: "2-digit",
16
+ second: "2-digit",
17
+ weekday: "short"
18
+ }).formatToParts(d).forEach((x) => {
19
+ o[x.type] = x.value;
20
+ });
21
+ const off = new Intl.DateTimeFormat("en-US", {
22
+ timeZone: zone,
23
+ timeZoneName: "shortOffset"
24
+ }).formatToParts(d).find((x) => x.type === "timeZoneName");
25
+ return {
26
+ h: parseInt(o["hour"], 10) % 24,
27
+ m: parseInt(o["minute"], 10),
28
+ s: parseInt(o["second"], 10),
29
+ weekday: o["weekday"],
30
+ offsetLabel: off ? off.value.replace("GMT", "UTC") : ""
31
+ };
32
+ } catch {
33
+ return {
34
+ h: d.getUTCHours(),
35
+ m: d.getUTCMinutes(),
36
+ s: d.getUTCSeconds(),
37
+ weekday: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][d.getUTCDay()],
38
+ offsetLabel: "UTC"
39
+ };
40
+ }
41
+ }
42
+ function pad2(n) {
43
+ return n < 10 ? "0" + n : String(n);
44
+ }
45
+ function formatTime(h, m, s, hours12) {
46
+ const sec = pad2(s);
47
+ if (hours12) {
48
+ const ap = h < 12 ? "am" : "pm";
49
+ let hr = h % 12;
50
+ if (hr === 0) hr = 12;
51
+ return { main: `${hr}:${pad2(m)}`, sec, ap };
52
+ }
53
+ return { main: `${pad2(h)}:${pad2(m)}`, sec, ap: "" };
54
+ }
55
+ function fmtDelta(ms) {
56
+ const m = Math.max(0, Math.round(ms / 6e4));
57
+ if (m < 90) return `${m}m`;
58
+ return `${Math.floor(m / 60)}h ${m % 60}m`;
59
+ }
60
+ function workStatus(parts, work) {
61
+ if (!work) return null;
62
+ const min = parts.h * 60 + parts.m;
63
+ if (!work.days[parts.weekday]) return { cls: "off", text: "Weekend" };
64
+ if (min < work.startMin) {
65
+ const d = work.startMin - min;
66
+ return {
67
+ cls: d <= SOON_MIN ? "soon" : "off",
68
+ text: `starts in ${fmtDelta(d * 6e4)}`
69
+ };
70
+ }
71
+ if (min < work.endMin) {
72
+ return { cls: "ok", text: `${fmtDelta((work.endMin - min) * 6e4)} left` };
73
+ }
74
+ return {
75
+ cls: "off",
76
+ text: `ended ${fmtDelta((min - work.endMin) * 6e4)} ago`
77
+ };
78
+ }
79
+ function toJulian(ms) {
80
+ return ms / DAY_MS - 0.5 + J1970;
81
+ }
82
+ function fromJulian(j) {
83
+ return (j + 0.5 - J1970) * DAY_MS;
84
+ }
85
+ function sunTimes(nowMs, lat, lon) {
86
+ const lw = -lon * RAD;
87
+ const phi = lat * RAD;
88
+ const J = toJulian(nowMs);
89
+ const n = Math.round(J - J2000 - 9e-4 - lw / (2 * Math.PI));
90
+ const Jn = J2000 + 9e-4 + lw / (2 * Math.PI) + n;
91
+ const M = (357.5291 + 0.98560028 * (Jn - J2000)) * RAD;
92
+ const C = (1.9148 * Math.sin(M) + 0.02 * Math.sin(2 * M) + 3e-4 * Math.sin(3 * M)) * RAD;
93
+ const L = M + C + Math.PI + 102.9372 * RAD;
94
+ const Jt = Jn + 53e-4 * Math.sin(M) - 69e-4 * Math.sin(2 * L);
95
+ const dec = Math.asin(Math.sin(L) * Math.sin(23.44 * RAD));
96
+ const cw = (Math.sin(-0.833 * RAD) - Math.sin(phi) * Math.sin(dec)) / (Math.cos(phi) * Math.cos(dec));
97
+ if (cw > 1) return { polar: "night" };
98
+ if (cw < -1) return { polar: "day" };
99
+ const w = Math.acos(cw);
100
+ const Jset = J2000 + 9e-4 + (w + lw) / (2 * Math.PI) + n + 53e-4 * Math.sin(M) - 69e-4 * Math.sin(2 * L);
101
+ return {
102
+ sunriseMs: fromJulian(Jt - (Jset - Jt)),
103
+ sunsetMs: fromJulian(Jset)
104
+ };
105
+ }
106
+ function sunLine(nowMs, lat, lon) {
107
+ const t = sunTimes(nowMs, lat, lon);
108
+ if (t.polar) {
109
+ return {
110
+ up: t.polar === "day",
111
+ text: t.polar === "day" ? "midnight sun" : "polar night"
112
+ };
113
+ }
114
+ if (nowMs < t.sunriseMs) {
115
+ return { up: false, text: `sunrise in ${fmtDelta(t.sunriseMs - nowMs)}` };
116
+ }
117
+ if (nowMs < t.sunsetMs) {
118
+ return { up: true, text: `sunset in ${fmtDelta(t.sunsetMs - nowMs)}` };
119
+ }
120
+ const tm = sunTimes(nowMs + DAY_MS, lat, lon);
121
+ if (tm.polar) return { up: false, text: "sunrise in \u2014" };
122
+ return { up: false, text: `sunrise in ${fmtDelta(tm.sunriseMs - nowMs)}` };
123
+ }
124
+ function handAngles(h, m, s) {
125
+ return {
126
+ hour: (h % 12 + m / 60) * 30,
127
+ minute: (m + s / 60) * 6,
128
+ second: s * 6
129
+ };
130
+ }
131
+
132
+ // src/clock/ticker.ts
133
+ function readWork(node) {
134
+ const start = node.getAttribute("data-dgmo-clock-work-start");
135
+ const end = node.getAttribute("data-dgmo-clock-work-end");
136
+ if (start === null || end === null) return null;
137
+ const days = {};
138
+ (node.getAttribute("data-dgmo-clock-work-days") ?? "").split(",").filter(Boolean).forEach((d) => {
139
+ days[d] = true;
140
+ });
141
+ return { startMin: Number(start), endMin: Number(end), days };
142
+ }
143
+ function setHand(group, which, angle) {
144
+ const hand = group.querySelector(`[data-dgmo-clock-hand="${which}"]`);
145
+ if (hand) hand.setAttribute("transform", `rotate(${angle} 50 50)`);
146
+ }
147
+ function setPart(group, sel, textContent) {
148
+ const el = group.querySelector(sel);
149
+ if (el && el.textContent !== textContent) el.textContent = textContent;
150
+ }
151
+ function updateRow(group, now) {
152
+ const zone = group.getAttribute("data-dgmo-clock-zone");
153
+ if (!zone) return;
154
+ const parts = zoneParts(zone, now);
155
+ const latAttr = group.getAttribute("data-dgmo-clock-lat");
156
+ const lonAttr = group.getAttribute("data-dgmo-clock-lon");
157
+ const sunOn = group.getAttribute("data-dgmo-clock-sun") === "1";
158
+ const hasCoords = latAttr !== null && lonAttr !== null;
159
+ const sun = sunOn && hasCoords ? sunLine(now, Number(latAttr), Number(lonAttr)) : null;
160
+ const up = sun ? sun.up : parts.h >= 6 && parts.h < 18;
161
+ const c = (name) => group.getAttribute(`data-dgmo-clock-c-${name}`) ?? "";
162
+ const stColor = up ? c("day") : c("night");
163
+ const stTint = up ? c("day-soft") : c("night-soft");
164
+ const hours12 = group.getAttribute("data-dgmo-clock-hours12") !== "0";
165
+ const ts = formatTime(parts.h, parts.m, parts.s, hours12);
166
+ const ang = handAngles(parts.h, parts.m, parts.s);
167
+ setHand(group, "h", ang.hour);
168
+ setHand(group, "m", ang.minute);
169
+ setHand(group, "s", ang.second);
170
+ const autoSolid = group.getAttribute("data-dgmo-clock-auto-solid");
171
+ const autoFace = group.getAttribute("data-dgmo-clock-auto-face");
172
+ const faceFill = autoFace ?? stTint;
173
+ const handColor = autoSolid ?? stColor;
174
+ const face = group.querySelector("[data-dgmo-clock-facebg]");
175
+ if (face) face.setAttribute("fill", faceFill);
176
+ const ring = group.querySelector("[data-dgmo-clock-facering]");
177
+ if (ring && autoSolid) ring.setAttribute("stroke", autoSolid);
178
+ const center = group.querySelector("[data-dgmo-clock-center]");
179
+ if (center) center.setAttribute("fill", handColor);
180
+ const secondHand = group.querySelector('[data-dgmo-clock-hand="s"]');
181
+ if (secondHand) secondHand.setAttribute("stroke", handColor);
182
+ setPart(group, '[data-dgmo-clock-digital-part="main"]', ts.main);
183
+ setPart(group, '[data-dgmo-clock-digital-part="sec"]', `:${ts.sec}`);
184
+ setPart(group, '[data-dgmo-clock-digital-part="ap"]', ` ${ts.ap}`);
185
+ setPart(group, "[data-dgmo-clock-ampm]", ts.ap.toUpperCase());
186
+ const work = readWork(group);
187
+ const status = workStatus(parts, work);
188
+ const statusEl = group.querySelector("[data-dgmo-clock-status]");
189
+ if (status && statusEl) {
190
+ const col = status.cls === "ok" ? c("ok") : status.cls === "soon" ? c("soon") : c("off");
191
+ if (statusEl.textContent !== status.text)
192
+ statusEl.textContent = status.text;
193
+ statusEl.setAttribute("fill", col);
194
+ const dot = group.querySelector("[data-dgmo-clock-status-dot]");
195
+ if (dot) {
196
+ if (status.cls === "off") {
197
+ dot.setAttribute("fill", "none");
198
+ dot.setAttribute("stroke", col);
199
+ dot.setAttribute("stroke-width", "1.4");
200
+ } else {
201
+ dot.setAttribute("fill", col);
202
+ dot.setAttribute("stroke", "none");
203
+ }
204
+ }
205
+ }
206
+ const sunEl = group.querySelector("[data-dgmo-clock-sun-line]");
207
+ if (sun && sunEl) {
208
+ if (sunEl.textContent !== sun.text) sunEl.textContent = sun.text;
209
+ const icon = group.querySelector("[data-dgmo-clock-sun-icon]");
210
+ if (icon) {
211
+ const sunG = icon.querySelector('[data-clock-glyph="sun"]');
212
+ const moonG = icon.querySelector('[data-clock-glyph="moon"]');
213
+ if (sunG) sunG.setAttribute("display", up ? "inline" : "none");
214
+ if (moonG) moonG.setAttribute("display", up ? "none" : "inline");
215
+ }
216
+ }
217
+ }
218
+ function tickClocks(root = document) {
219
+ if (typeof document === "undefined") return;
220
+ const now = Date.now();
221
+ root.querySelectorAll("[data-dgmo-clock]").forEach((group) => updateRow(group, now));
222
+ }
223
+ var intervalStarted = false;
224
+ function startClocks(root = document) {
225
+ if (typeof window === "undefined" || typeof document === "undefined") return;
226
+ tickClocks(root);
227
+ if (intervalStarted) return;
228
+ intervalStarted = true;
229
+ window.setInterval(() => tickClocks(document), 1e3);
230
+ }
231
+ export {
232
+ startClocks,
233
+ tickClocks
234
+ };
235
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1,12 @@
1
+ declare const DAY_MS = 86400000;
2
+
3
+ /** Run one update pass over every countdown node inside `root`. */
4
+ declare function tickCountdowns(root?: ParentNode): void;
5
+ /**
6
+ * Update `root` immediately, then (once per page) register a single 1s interval
7
+ * that re-scans the whole document. Idempotent — safe to call on every render /
8
+ * route change (mirrors remark's `clickHandlerBound` guard). No-op with no DOM.
9
+ */
10
+ declare function startCountdowns(root?: ParentNode): void;
11
+
12
+ export { DAY_MS, startCountdowns, tickCountdowns };