@diagrammo/dgmo 0.50.2 → 0.52.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.
- package/.cursorrules +15 -19
- package/.github/copilot-instructions.md +15 -19
- package/.windsurfrules +15 -19
- package/SKILL.md +15 -19
- package/dist/advanced.d.ts +155 -65
- package/dist/advanced.js +231 -189
- package/dist/{analyzer-UYKBXAKR.js → analyzer-BJ54GIFB.js} +3 -3
- package/dist/auto.css +31 -8
- package/dist/auto.d.ts +6 -0
- package/dist/auto.js +171 -133
- package/dist/auto.mjs +3062 -1478
- package/dist/block.css +28 -8
- package/dist/block.js +138 -72
- package/dist/charts-d3-MXEP6BNP.js +26 -0
- package/dist/{chunk-3YPY3OXD.js → chunk-3HF5YEFJ.js} +17 -7
- package/dist/{chunk-4MJ7M6YL.js → chunk-3HGU63UY.js} +14 -13
- package/dist/chunk-3LK5DNED.js +35 -0
- package/dist/{chunk-3Y2DRD7S.js → chunk-3QD7VP3U.js} +9 -4
- package/dist/{chunk-6BFZKBGD.js → chunk-3YRPZ7ZZ.js} +2 -2
- package/dist/{chunk-WW32K72E.js → chunk-44VCIPHF.js} +25 -21
- package/dist/{chunk-TN35C5KM.js → chunk-4AQRFDXL.js} +2 -2
- package/dist/{chunk-HHXOONLX.js → chunk-4B5YISOR.js} +38 -1
- package/dist/{chunk-PGEGPSCZ.js → chunk-4IHAV6O7.js} +2 -2
- package/dist/{chunk-7L3R6I3U.js → chunk-4UNQ6X24.js} +10 -7
- package/dist/{chunk-O7NUCTFU.js → chunk-4YFKQ5WT.js} +7 -4
- package/dist/{chunk-5WFIYXQ6.js → chunk-5223KXFD.js} +122 -242
- package/dist/{chunk-PFHVU7UA.js → chunk-5BHJZH62.js} +3 -3
- package/dist/{chunk-QYTPPDAO.js → chunk-5HILBT7X.js} +2 -2
- package/dist/{chunk-GKC3HILQ.js → chunk-5NGAO4QK.js} +27 -4
- package/dist/{chunk-IAEC4KLA.js → chunk-5QKQSSPO.js} +2 -2
- package/dist/{chunk-DSWVNQVS.js → chunk-5RP7JRVP.js} +4 -59
- package/dist/{chunk-MCZ5LBZD.js → chunk-5SEVICBT.js} +8 -8
- package/dist/{chunk-GBE54KY6.js → chunk-6EJITS44.js} +8 -5
- package/dist/{chunk-BBGDM4NQ.js → chunk-6HQH6JZE.js} +35 -16
- package/dist/{chunk-66NVRO4K.js → chunk-6LBQ7ELG.js} +17 -18
- package/dist/{chunk-4XK3FLFB.js → chunk-6NYWYNBI.js} +3 -3
- package/dist/{chunk-VBYSIOOY.js → chunk-75G3Q4DK.js} +3 -3
- package/dist/{chunk-3NODSS6A.js → chunk-77FGAVZC.js} +13 -10
- package/dist/{chunk-6IAA2QQ2.js → chunk-7BIZCTAX.js} +2 -2
- package/dist/{chunk-TWQUYVP3.js → chunk-7DF4J4RL.js} +4 -4
- package/dist/{chunk-66RUL3XF.js → chunk-7KINELPI.js} +111 -49
- package/dist/{chunk-L3UHP6TD.js → chunk-7L4UJOY6.js} +1 -2
- package/dist/{chunk-QJP6PG7F.js → chunk-7QE3XMRK.js} +19 -18
- package/dist/{chunk-P7CE7LXL.js → chunk-AAXZDUOV.js} +18 -17
- package/dist/{chunk-SXRTRMEE.js → chunk-AL672HNE.js} +3 -3
- package/dist/chunk-APKUAJ2L.js +220 -0
- package/dist/{chunk-SCHXJTZL.js → chunk-ARGMQ3H4.js} +2 -2
- package/dist/{chunk-HEVYAHLW.js → chunk-AUIM2NVH.js} +5 -5
- package/dist/{chunk-3LH5CLP4.js → chunk-BKVOYV6I.js} +143 -6
- package/dist/{chunk-RZ6YKEUJ.js → chunk-BPIZNB5O.js} +17 -15
- package/dist/{chunk-QROYX7TT.js → chunk-BPY242XU.js} +6 -4
- package/dist/{chunk-OTAL43EH.js → chunk-BRENJ2BQ.js} +39 -3
- package/dist/{chunk-FA6K3FWM.js → chunk-CCNDLW7Z.js} +44 -22
- package/dist/{chunk-2KGXHFYK.js → chunk-CIRFIL4M.js} +49 -29
- package/dist/chunk-DAOFNU6J.js +283 -0
- package/dist/{chunk-QJJZSROI.js → chunk-DYWQFQJP.js} +48 -38
- package/dist/{chunk-XEGTMVYY.js → chunk-EMLPOL77.js} +15 -8
- package/dist/{chunk-NWED7CYO.js → chunk-FHGVORFO.js} +29 -25
- package/dist/{chunk-U2HGPLZS.js → chunk-FQ7HTV52.js} +17 -2
- package/dist/{chunk-H73FP42Q.js → chunk-FQMUHRVC.js} +70 -31
- package/dist/{chunk-BTUTZMPT.js → chunk-FT3ZYWET.js} +108 -42
- package/dist/{chunk-T5SHNNGP.js → chunk-FUPF2UYQ.js} +92 -34
- package/dist/{chunk-3XPUDB7B.js → chunk-FY5MSZAP.js} +279 -39
- package/dist/{chunk-M5RXSRO2.js → chunk-GCYTI3DE.js} +42 -33
- package/dist/{chunk-DN66GPY5.js → chunk-GJFAMOGK.js} +24 -3
- package/dist/{chunk-F2L5GCQ4.js → chunk-GU46PPT3.js} +3 -3
- package/dist/{chunk-6IUAK7RZ.js → chunk-H6PI3KJT.js} +2 -2
- package/dist/{chunk-ONA5KPV3.js → chunk-H7KENAZO.js} +18 -14
- package/dist/{chunk-SQLNBA64.js → chunk-HBPDFCQY.js} +3 -3
- package/dist/{chunk-SCQ5VPUF.js → chunk-HFMYN6N2.js} +2 -2
- package/dist/{chunk-FJUNPCYI.js → chunk-HHKO6SKY.js} +2 -2
- package/dist/{chunk-DZXYF2F5.js → chunk-HQQNCY7W.js} +21 -8
- package/dist/{chunk-7TV5Y53Y.js → chunk-HWX6ZHF3.js} +3 -3
- package/dist/{chunk-3P2DKJCG.js → chunk-ICPJPQ5C.js} +2 -2
- package/dist/{chunk-VUJGMJE6.js → chunk-IM6PDDCE.js} +4 -4
- package/dist/{chunk-JJUOHGX2.js → chunk-INE5YJBZ.js} +13 -8
- package/dist/{chunk-HTMN2Z6U.js → chunk-J6QROYDA.js} +58 -11
- package/dist/{chunk-NX4EQS3U.js → chunk-J76PIKAT.js} +2 -2
- package/dist/{chunk-SVTI362O.js → chunk-J7KJR3R6.js} +129 -109
- package/dist/{chunk-JEUJOX5X.js → chunk-J7TLCB2Q.js} +2 -2
- package/dist/{chunk-O7WP4ZD4.js → chunk-JED6ZDEE.js} +2 -2
- package/dist/{chunk-J6K7RP6P.js → chunk-JRCOYRRH.js} +19 -7
- package/dist/{chunk-7QKLIMRZ.js → chunk-K2I2XOZD.js} +46 -51
- package/dist/{chunk-EAMEADTV.js → chunk-K4EOKJA6.js} +96 -24
- package/dist/{chunk-5OWVC2A6.js → chunk-KGVZ5VGH.js} +13 -10
- package/dist/{chunk-DFTFPYUD.js → chunk-LBMS4AW6.js} +22 -21
- package/dist/{chunk-VVW3F3MD.js → chunk-LGT3PZCJ.js} +27 -19
- package/dist/{chunk-OMNGQPEZ.js → chunk-LTXOLDUZ.js} +9 -6
- package/dist/{chunk-Q4V4XQWV.js → chunk-MUE65OTD.js} +5 -4
- package/dist/{chunk-5GJYGP5Z.js → chunk-MUVJ57EP.js} +14 -18
- package/dist/{chunk-CLD2OKV7.js → chunk-MX2EY5Y7.js} +2 -2
- package/dist/{chunk-OTQKUHRS.js → chunk-NNS4E7CW.js} +6 -4
- package/dist/{chunk-NNAAJVBU.js → chunk-NR5HCAUD.js} +1 -1
- package/dist/{chunk-KFZYNWWO.js → chunk-ONU3U4GL.js} +4 -4
- package/dist/{chunk-YNRDWYZP.js → chunk-OQKP2X3D.js} +170 -51
- package/dist/{chunk-AHGF2YYA.js → chunk-OTOHI4JO.js} +2 -2
- package/dist/{chunk-EOFPYPAU.js → chunk-P3NRSSUU.js} +51 -11
- package/dist/{chunk-QXKWYZNR.js → chunk-PRI2OD4E.js} +10 -3
- package/dist/{chunk-U6EQI3U6.js → chunk-QBZYACOG.js} +3 -3
- package/dist/{chunk-C2CVAM3U.js → chunk-QGATPIPX.js} +170 -91
- package/dist/{chunk-PZFVK3IH.js → chunk-QHXCAEMX.js} +8 -5
- package/dist/{chunk-BH3UYK36.js → chunk-QJMKPUYK.js} +15 -5
- package/dist/{chunk-HQCHYB5F.js → chunk-QOOUC2J5.js} +2 -2
- package/dist/{chunk-Z6XJQ6KO.js → chunk-QVENJMNX.js} +2 -2
- package/dist/{chunk-IUMPEA64.js → chunk-QZX5S6R3.js} +4 -4
- package/dist/{chunk-I7F2A35O.js → chunk-R3YSD62R.js} +25 -47
- package/dist/{chunk-NU3XLTGP.js → chunk-REJAIQ5S.js} +4 -4
- package/dist/{chunk-2C56LEML.js → chunk-ROOE4R4Y.js} +8 -5
- package/dist/{chunk-XHVV4NVW.js → chunk-RT7ACF77.js} +12 -2
- package/dist/{chunk-I2WKW7C7.js → chunk-SMRFPVLQ.js} +3 -3
- package/dist/{chunk-VDOOQZUD.js → chunk-SWSIKFEB.js} +4 -4
- package/dist/{chunk-HLJVEAOF.js → chunk-T4A4TSTJ.js} +19 -45
- package/dist/{chunk-KHEYDLMT.js → chunk-TJVLKNGR.js} +20 -10
- package/dist/{chunk-GL5UZ6NY.js → chunk-TPFKKXCB.js} +3 -3
- package/dist/{chunk-X6EZPSW6.js → chunk-TTIM6YTT.js} +31 -21
- package/dist/{chunk-BCYVE3N5.js → chunk-TYS6CSS5.js} +2 -2
- package/dist/{chunk-T4VOVZT5.js → chunk-UBLHQTLV.js} +15 -14
- package/dist/{chunk-3LKM6FMW.js → chunk-UNURMIQO.js} +2 -2
- package/dist/{chunk-TSA237IM.js → chunk-VILVLS7P.js} +5 -3
- package/dist/{chunk-HGN652MU.js → chunk-VL2O2F3W.js} +2 -2
- package/dist/{chunk-3XGZF2QJ.js → chunk-VQOCMUWI.js} +39 -28
- package/dist/{chunk-P6T66CCZ.js → chunk-WBM7ZNDI.js} +3 -2
- package/dist/{chunk-CMCR5WBW.js → chunk-WBRZJOEC.js} +3 -3
- package/dist/{chunk-5LWQH6QV.js → chunk-WCT3NYCV.js} +1 -1
- package/dist/{chunk-C4GQDB5L.js → chunk-WRNFDFPU.js} +2 -2
- package/dist/{chunk-6HJBFVLO.js → chunk-XD6ZYURY.js} +9 -4
- package/dist/{chunk-C63UWAKM.js → chunk-Y2ZE3MSG.js} +2 -2
- package/dist/{chunk-7UEMZREK.js → chunk-YAA6IID3.js} +2 -2
- package/dist/{chunk-F7BFXWNQ.js → chunk-YIBAWQGJ.js} +7 -4
- package/dist/{chunk-PH5X4GIP.js → chunk-YTMTPUH4.js} +8 -5
- package/dist/{chunk-3UIKSPFB.js → chunk-Z5QVYKR7.js} +11 -3
- package/dist/{chunk-KQ57MHRO.js → chunk-ZEF5M5MB.js} +155 -87
- package/dist/{chunk-LE4MYMLI.js → chunk-ZJV7GYR4.js} +6 -6
- package/dist/{chunk-XJLKLU4D.js → chunk-ZNWAYU6N.js} +11 -7
- package/dist/cli.cjs +165 -148
- package/dist/clock.js +105 -25
- package/dist/countdown.js +208 -82
- package/dist/dgmo-router-X7ZGAPIE.js +86 -0
- package/dist/dimensions-45H6JQEY.js +22 -0
- package/dist/editor.js +17 -2
- package/dist/element.d.ts +6 -0
- package/dist/element.js +172 -134
- package/dist/element.mjs +3026 -1463
- package/dist/{flowchart-parser-OE4WHLTF.js → flowchart-parser-UKELHBSB.js} +4 -4
- package/dist/{flowchart-renderer-GPCSMTOR.js → flowchart-renderer-MNCDS7MV.js} +10 -10
- package/dist/highlight.d.ts +21 -1
- package/dist/highlight.js +106 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +59 -57
- package/dist/{layout-FWODLIMP.js → layout-2L3WMRYU.js} +6 -6
- package/dist/{layout-7SKMFYHL.js → layout-46N4JJYK.js} +5 -5
- package/dist/{layout-7H4H46CS.js → layout-7QXCNOVS.js} +3 -3
- package/dist/layout-A4XWNVID.js +14 -0
- package/dist/{layout-46366KBT.js → layout-A5UHRWVH.js} +3 -3
- package/dist/{layout-NXG63LWH.js → layout-AM2JWW3X.js} +4 -4
- package/dist/{layout-DC4TVXER.js → layout-EE6GE46Y.js} +5 -5
- package/dist/{layout-FGQWRYYW.js → layout-F4WO357A.js} +3 -3
- package/dist/layout-G23F7LDH.js +9 -0
- package/dist/{layout-QNUQLEHU.js → layout-GM4UGR7B.js} +5 -4
- package/dist/{layout-7MZ5NF2N.js → layout-GQQJXNYH.js} +5 -5
- package/dist/{layout-5BG6DFCU.js → layout-IIE2S5FK.js} +6 -6
- package/dist/{layout-34CLNICW.js → layout-OAC4PEAC.js} +5 -5
- package/dist/layout-VMCRX66I.js +14 -0
- package/dist/{layout-PUQCB6AN.js → layout-ZDOSXL5G.js} +7 -7
- package/dist/{layout-search-QS44PI5R.js → layout-search-55FU6HD3.js} +6 -157
- package/dist/map-data/gazetteer.json +1 -1
- package/dist/{palettes-PRJ2RI6D.js → palettes-UDLZ2SA4.js} +2 -2
- package/dist/{parser-D5VILGN2.js → parser-2ECN6JA2.js} +4 -4
- package/dist/{parser-LWKKBNSA.js → parser-4WTIHM5J.js} +3 -3
- package/dist/{parser-DFFEDKHH.js → parser-5H2BTSJQ.js} +3 -3
- package/dist/{parser-4NO6VZ6S.js → parser-75KVXUNS.js} +4 -4
- package/dist/{parser-VKOJM7KS.js → parser-774AC53T.js} +4 -4
- package/dist/{parser-IBWNAPY4.js → parser-BE4YCSRU.js} +3 -3
- package/dist/{parser-4AI5ZN5F.js → parser-CNGUQUQI.js} +3 -3
- package/dist/{parser-36HVKU5U.js → parser-DEUUSQIN.js} +7 -6
- package/dist/{parser-H3XEPFPV.js → parser-DQAFLUJB.js} +4 -4
- package/dist/{parser-5OXGPNBF.js → parser-EYCKNKQA.js} +5 -5
- package/dist/{parser-TGQZJ5OT.js → parser-FXISIU6A.js} +4 -4
- package/dist/{parser-JJR52VAT.js → parser-GTB4XC7P.js} +5 -5
- package/dist/{parser-AGVYTQXV.js → parser-GVEPAUSD.js} +4 -4
- package/dist/{parser-WAV5JRPT.js → parser-HSQGTY4G.js} +4 -4
- package/dist/{parser-YS7TOS2K.js → parser-HVKRINUS.js} +3 -3
- package/dist/{parser-W4PQUGX3.js → parser-J5MIEYO4.js} +5 -5
- package/dist/parser-KMZIXLDZ.js +13 -0
- package/dist/{parser-HYRTF3DO.js → parser-LJHXWSXU.js} +3 -3
- package/dist/{parser-KCR2WS3V.js → parser-PT3W72G5.js} +4 -4
- package/dist/{parser-CVMEDULU.js → parser-SBJQDPHL.js} +4 -4
- package/dist/{parser-RZPVAQVX.js → parser-SUWWWCMX.js} +4 -3
- package/dist/{parser-TXND652E.js → parser-SXDRNZOA.js} +4 -4
- package/dist/parser-UMILOW3M.js +14 -0
- package/dist/{parser-RV4M6AS2.js → parser-UP3AZ367.js} +4 -4
- package/dist/{parser-IJBMRXMC.js → parser-WHPRV3X5.js} +5 -5
- package/dist/{parser-MPCE5JBG.js → parser-WX3UODSJ.js} +4 -4
- package/dist/{parser-K3XXLMUW.js → parser-XCIEN3KN.js} +4 -4
- package/dist/{parser-AXKBDGNO.js → parser-XIRTUMVN.js} +5 -5
- package/dist/{parser-B5FVS7O6.js → parser-YKCGIG45.js} +3 -3
- package/dist/{parser-PSA4UBSP.js → parser-YKYMQG3B.js} +4 -4
- package/dist/{parser-MTOMTWTD.js → parser-ZGM2OJ6Y.js} +6 -5
- package/dist/{parser-CSFUN3CT.js → parser-ZL5QUFVH.js} +5 -4
- package/dist/pert.d.ts +2 -2
- package/dist/{renderer-PPIHO5FI.js → renderer-3F7OS2AX.js} +14 -13
- package/dist/{renderer-SBS3YWU5.js → renderer-4QB4K7Q3.js} +9 -9
- package/dist/{renderer-GHPZMFU2.js → renderer-5DAKMIU2.js} +3 -3
- package/dist/{renderer-R2WNIC2C.js → renderer-5H4SY7YY.js} +9 -9
- package/dist/{renderer-DAXMXIKD.js → renderer-5PIQPFOX.js} +5 -4
- package/dist/{renderer-45PSOL3E.js → renderer-6MU37QF5.js} +6 -6
- package/dist/renderer-AQVMWJ4M.js +27 -0
- package/dist/{renderer-A5VE5BCI.js → renderer-BDDW6K7N.js} +9 -9
- package/dist/{renderer-AUW2BE6G.js → renderer-BNB3VIDY.js} +10 -10
- package/dist/{renderer-4ITCHBT7.js → renderer-CQY6ATOS.js} +6 -6
- package/dist/{renderer-6OKF44KS.js → renderer-CVW75CXL.js} +15 -15
- package/dist/{renderer-7RH2SI3B.js → renderer-DT4XRFEP.js} +5 -4
- package/dist/{renderer-B5TBNZJE.js → renderer-ERHBSTQT.js} +9 -9
- package/dist/{renderer-HVCU2C3Z.js → renderer-HSHHVYWF.js} +5 -4
- package/dist/renderer-IDPVUFNB.js +28 -0
- package/dist/renderer-ILX6BGKR.js +21 -0
- package/dist/renderer-JP663HKG.js +22 -0
- package/dist/{renderer-KS7YZJE2.js → renderer-KNFTTOBL.js} +11 -11
- package/dist/{renderer-2AZ5HJFK.js → renderer-MVUZBESR.js} +5 -5
- package/dist/{renderer-QAOBLRXV.js → renderer-N4EBR2FV.js} +11 -11
- package/dist/{renderer-P5ROYQGU.js → renderer-NHO46CT2.js} +4 -4
- package/dist/{renderer-NGXZTRK6.js → renderer-NO2QJ5LZ.js} +10 -10
- package/dist/{renderer-FPE3J5VZ.js → renderer-OGFV5RXX.js} +12 -12
- package/dist/{renderer-ODUUOPVT.js → renderer-PDLESJMS.js} +15 -15
- package/dist/renderer-T4MTNINC.js +24 -0
- package/dist/renderer-TOUGFGTM.js +24 -0
- package/dist/{renderer-BSR2O2H6.js → renderer-U3KPD43Y.js} +14 -13
- package/dist/{renderer-JCCHNECZ.js → renderer-X334IJU2.js} +10 -10
- package/dist/{renderer-5DSEWF74.js → renderer-Y5OAMOCR.js} +9 -9
- package/dist/{renderer-5KVCNMOJ.js → renderer-YONAKAJU.js} +5 -3
- package/dist/{renderer-7SD6MSBS.js → renderer-YWMI6Y2U.js} +12 -12
- package/dist/{renderer-2QPMJ2DA.js → renderer-ZWIH4WDW.js} +10 -10
- package/dist/renderer-radial-7CGZMVMS.js +21 -0
- package/dist/{resolver-FHBCO3PL.js → resolver-EMTGNR3D.js} +4 -3
- package/dist/{state-parser-3REXRK3R.js → state-parser-BATWAID2.js} +4 -4
- package/dist/{state-renderer-XYLNRWXR.js → state-renderer-3FKZJ3LP.js} +10 -10
- package/dist/{themes-PdPR1-hC.d.ts → themes-32xj5ZTW.d.ts} +27 -0
- package/docs/ai-integration.md +15 -19
- package/docs/language-reference.md +106 -21
- package/gallery/fixtures/clock.dgmo +3 -3
- package/gallery/fixtures/countdown-tz.dgmo +5 -0
- package/package.json +1 -1
- package/dist/charts-d3-MUW3LTML.js +0 -26
- package/dist/dgmo-router-CE2G67FV.js +0 -84
- package/dist/dimensions-OTBKC5M6.js +0 -22
- package/dist/layout-6RDJHS6E.js +0 -9
- package/dist/layout-J36454XU.js +0 -14
- package/dist/layout-LD6XTLD6.js +0 -14
- package/dist/parser-4WQQQXCG.js +0 -13
- package/dist/parser-O4HIUN6G.js +0 -13
- package/dist/renderer-CYB4LK3G.js +0 -22
- package/dist/renderer-FF24KZCI.js +0 -24
- package/dist/renderer-FYSVXL7M.js +0 -28
- package/dist/renderer-HDCCZURL.js +0 -24
- package/dist/renderer-PSMMZCKH.js +0 -21
- package/dist/renderer-UYMQQCJK.js +0 -24
- package/dist/renderer-radial-F7X5F2VU.js +0 -21
|
@@ -1,30 +1,37 @@
|
|
|
1
1
|
import {
|
|
2
2
|
monthIndex,
|
|
3
3
|
resolveNext,
|
|
4
|
+
targetToMs,
|
|
4
5
|
weekdayIndex
|
|
5
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OQKP2X3D.js";
|
|
7
|
+
import {
|
|
8
|
+
normalizeDate
|
|
9
|
+
} from "./chunk-DAOFNU6J.js";
|
|
6
10
|
import {
|
|
7
11
|
extractColor,
|
|
12
|
+
fillModeFromToken,
|
|
8
13
|
measureIndent,
|
|
9
14
|
parseFirstLine
|
|
10
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BRENJ2BQ.js";
|
|
11
16
|
import {
|
|
12
17
|
makeDgmoError,
|
|
13
18
|
makeFail
|
|
14
19
|
} from "./chunk-CXK4DZH3.js";
|
|
15
20
|
|
|
16
21
|
// src/countdown/parser.ts
|
|
17
|
-
var DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
18
22
|
var TIME_24H_RE = /^(\d{1,2}):(\d{2})$/;
|
|
19
23
|
var AMPM_RE = /^(\d{1,2})(?::(\d{2}))?\s*([ap]m)$/i;
|
|
20
|
-
function
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
function targetToMs2(target, tz = null) {
|
|
25
|
+
const ms = targetToMs(target, tz);
|
|
26
|
+
return Number.isFinite(ms) ? ms : null;
|
|
27
|
+
}
|
|
28
|
+
function isValidZone(zone) {
|
|
29
|
+
try {
|
|
30
|
+
new Intl.DateTimeFormat("en-US", { timeZone: zone });
|
|
31
|
+
return true;
|
|
32
|
+
} catch {
|
|
33
|
+
return false;
|
|
25
34
|
}
|
|
26
|
-
const t = new Date(s).getTime();
|
|
27
|
-
return Number.isFinite(t) ? t : null;
|
|
28
35
|
}
|
|
29
36
|
function ordinalToken(tok) {
|
|
30
37
|
const t = tok.toLowerCase();
|
|
@@ -71,6 +78,7 @@ function parseCountdown(content, palette) {
|
|
|
71
78
|
rule: null,
|
|
72
79
|
resolvedMs: null,
|
|
73
80
|
hasTime: false,
|
|
81
|
+
tz: null,
|
|
74
82
|
since: null,
|
|
75
83
|
sinceLabel: null,
|
|
76
84
|
units: "human",
|
|
@@ -99,12 +107,19 @@ function parseCountdown(content, palette) {
|
|
|
99
107
|
let intervalUnit = "day";
|
|
100
108
|
let onSpec = null;
|
|
101
109
|
let atTime = null;
|
|
110
|
+
let targetRaw = null;
|
|
111
|
+
let targetIsNow = false;
|
|
112
|
+
let targetLine = 1;
|
|
113
|
+
let fromRaw = null;
|
|
114
|
+
let fromLine = 1;
|
|
102
115
|
let anchorMs = null;
|
|
103
116
|
let targetMs = null;
|
|
104
117
|
let hasTargetLine = false;
|
|
105
118
|
let hasEvery = false;
|
|
106
119
|
const noteBody = [];
|
|
107
120
|
let inNote = false;
|
|
121
|
+
let dateOrder = "mdy";
|
|
122
|
+
let baseYear = null;
|
|
108
123
|
for (let i = 0; i < lines.length; i++) {
|
|
109
124
|
const lineNum = i + 1;
|
|
110
125
|
const raw = lines[i];
|
|
@@ -146,22 +161,14 @@ function parseCountdown(content, palette) {
|
|
|
146
161
|
// ── One-shot target ──
|
|
147
162
|
case "target": {
|
|
148
163
|
hasTargetLine = true;
|
|
164
|
+
targetLine = lineNum;
|
|
149
165
|
if (/^now$/i.test(rest)) {
|
|
150
|
-
|
|
151
|
-
result.target = new Date(targetMs).toISOString();
|
|
166
|
+
targetIsNow = true;
|
|
152
167
|
result.hasTime = true;
|
|
153
168
|
} else {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
lineNum,
|
|
158
|
-
`"target" needs an ISO date/datetime or "now" (got "${rest}").`
|
|
159
|
-
);
|
|
160
|
-
} else {
|
|
161
|
-
result.target = rest;
|
|
162
|
-
targetMs = ms;
|
|
163
|
-
if (rest.includes("T")) result.hasTime = true;
|
|
164
|
-
}
|
|
169
|
+
targetRaw = rest;
|
|
170
|
+
result.target = rest;
|
|
171
|
+
if (rest.includes("T")) result.hasTime = true;
|
|
165
172
|
}
|
|
166
173
|
break;
|
|
167
174
|
}
|
|
@@ -217,15 +224,8 @@ function parseCountdown(content, palette) {
|
|
|
217
224
|
if (seg.at.length)
|
|
218
225
|
atTime = parseAt(seg.at.join(" "), lineNum, softError);
|
|
219
226
|
if (seg.from.length) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
softError(
|
|
223
|
-
lineNum,
|
|
224
|
-
`"from" needs an anchor date (got "${seg.from.join(" ")}").`
|
|
225
|
-
);
|
|
226
|
-
} else {
|
|
227
|
-
anchorMs = ms;
|
|
228
|
-
}
|
|
227
|
+
fromRaw = seg.from.join(" ");
|
|
228
|
+
fromLine = lineNum;
|
|
229
229
|
}
|
|
230
230
|
break;
|
|
231
231
|
}
|
|
@@ -240,12 +240,22 @@ function parseCountdown(content, palette) {
|
|
|
240
240
|
break;
|
|
241
241
|
}
|
|
242
242
|
case "from": {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
243
|
+
fromRaw = rest;
|
|
244
|
+
fromLine = lineNum;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
// ── Universal date directives (§ BL-121) ──
|
|
248
|
+
case "date-order": {
|
|
249
|
+
const v = rest.toLowerCase();
|
|
250
|
+
if (v === "mdy" || v === "dmy") dateOrder = v;
|
|
251
|
+
else
|
|
252
|
+
softError(lineNum, `"date-order" is "mdy" or "dmy" (got "${rest}").`);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
case "year": {
|
|
256
|
+
const y = parseInt(rest, 10);
|
|
257
|
+
if (Number.isInteger(y) && y > 0) baseYear = y;
|
|
258
|
+
else softError(lineNum, `"year" needs a 4-digit year (got "${rest}").`);
|
|
249
259
|
break;
|
|
250
260
|
}
|
|
251
261
|
// ── Ordinal / since — numbers a yearly occurrence (resolvedYear − since) ──
|
|
@@ -291,6 +301,22 @@ function parseCountdown(content, palette) {
|
|
|
291
301
|
case "lang":
|
|
292
302
|
result.lang = rest.toLowerCase() || "en";
|
|
293
303
|
break;
|
|
304
|
+
// ── `tz <IANA>` — pin authored wall-clock times to a zone (§36 tz slot).
|
|
305
|
+
// Space-separated (no colon), an IANA id like `America/New_York`. ──
|
|
306
|
+
case "tz": {
|
|
307
|
+
const zone = rest.trim();
|
|
308
|
+
if (!zone) {
|
|
309
|
+
warn(lineNum, '"tz" needs an IANA zone like America/New_York.');
|
|
310
|
+
} else if (!isValidZone(zone)) {
|
|
311
|
+
warn(
|
|
312
|
+
lineNum,
|
|
313
|
+
`Unknown time zone "${zone}" \u2014 use an IANA id like America/New_York. Counting viewer-local.`
|
|
314
|
+
);
|
|
315
|
+
} else {
|
|
316
|
+
result.tz = zone;
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
294
320
|
case "on-day":
|
|
295
321
|
result.onDay = rest || null;
|
|
296
322
|
break;
|
|
@@ -301,6 +327,16 @@ function parseCountdown(content, palette) {
|
|
|
301
327
|
case "no-visual":
|
|
302
328
|
result.noVisual = true;
|
|
303
329
|
break;
|
|
330
|
+
// ── §1.9 fill family — mutually exclusive bare flags, last one wins;
|
|
331
|
+
// `fill-tint` is the explicit spelling of the default (clears it). ──
|
|
332
|
+
case "fill-tint":
|
|
333
|
+
case "fill-solid":
|
|
334
|
+
case "fill-outline": {
|
|
335
|
+
const fm = fillModeFromToken(key);
|
|
336
|
+
if (fm === "solid" || fm === "outline") result.fillMode = fm;
|
|
337
|
+
else delete result.fillMode;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
304
340
|
// ── `note` — markdown caption; inline value or indented body block. ──
|
|
305
341
|
case "note":
|
|
306
342
|
inNote = true;
|
|
@@ -311,6 +347,35 @@ function parseCountdown(content, palette) {
|
|
|
311
347
|
}
|
|
312
348
|
}
|
|
313
349
|
if (noteBody.length) result.note = noteBody.join("\n");
|
|
350
|
+
if (targetIsNow) {
|
|
351
|
+
targetMs = Date.now();
|
|
352
|
+
result.target = new Date(targetMs).toISOString();
|
|
353
|
+
} else if (targetRaw !== null) {
|
|
354
|
+
const iso = normalizeDate(targetRaw, { order: dateOrder, year: baseYear });
|
|
355
|
+
const effective = iso ?? targetRaw;
|
|
356
|
+
const ms = targetToMs2(effective, result.tz);
|
|
357
|
+
if (ms === null) {
|
|
358
|
+
softError(
|
|
359
|
+
targetLine,
|
|
360
|
+
`"target" needs a date/datetime or "now" (got "${targetRaw}").`
|
|
361
|
+
);
|
|
362
|
+
} else {
|
|
363
|
+
targetMs = ms;
|
|
364
|
+
if (iso) {
|
|
365
|
+
result.target = iso;
|
|
366
|
+
if (iso.includes(":")) result.hasTime = true;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (fromRaw !== null) {
|
|
371
|
+
const iso = normalizeDate(fromRaw, { order: dateOrder, year: baseYear });
|
|
372
|
+
const ms = targetToMs2(iso ?? fromRaw, result.tz);
|
|
373
|
+
if (ms === null) {
|
|
374
|
+
softError(fromLine, `"from" needs an anchor date (got "${fromRaw}").`);
|
|
375
|
+
} else {
|
|
376
|
+
anchorMs = ms;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
314
379
|
if (hasEvery && hasTargetLine) {
|
|
315
380
|
softError(
|
|
316
381
|
result.titleLineNumber ?? 1,
|
|
@@ -333,8 +398,9 @@ function parseCountdown(content, palette) {
|
|
|
333
398
|
softError
|
|
334
399
|
);
|
|
335
400
|
if (rule) {
|
|
336
|
-
result.rule
|
|
337
|
-
result.
|
|
401
|
+
const tzRule = result.tz ? { ...rule, tz: result.tz } : rule;
|
|
402
|
+
result.rule = tzRule;
|
|
403
|
+
result.resolvedMs = resolveNext(tzRule, Date.now());
|
|
338
404
|
if (atTime) result.hasTime = true;
|
|
339
405
|
}
|
|
340
406
|
} else if (targetMs !== null) {
|
|
@@ -476,7 +542,7 @@ function emitFreeProseError(lineNum, rest, softError) {
|
|
|
476
542
|
}
|
|
477
543
|
|
|
478
544
|
export {
|
|
479
|
-
targetToMs,
|
|
545
|
+
targetToMs2 as targetToMs,
|
|
480
546
|
parseCountdown
|
|
481
547
|
};
|
|
482
|
-
//# sourceMappingURL=chunk-
|
|
548
|
+
//# sourceMappingURL=chunk-FT3ZYWET.js.map
|
|
@@ -8,22 +8,26 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
DAY_MS,
|
|
10
10
|
applyOrdinalTemplate,
|
|
11
|
+
dayStart,
|
|
11
12
|
formatCompound,
|
|
12
13
|
formatCount,
|
|
13
14
|
formatDateShort,
|
|
14
15
|
formatFooter,
|
|
15
16
|
formatHuman,
|
|
16
17
|
formatWordsDetail,
|
|
17
|
-
ordinalFor
|
|
18
|
-
|
|
18
|
+
ordinalFor,
|
|
19
|
+
sameDay,
|
|
20
|
+
splitClockSeconds
|
|
21
|
+
} from "./chunk-OQKP2X3D.js";
|
|
19
22
|
import {
|
|
20
23
|
FONT_FAMILY
|
|
21
24
|
} from "./chunk-6KFWC4CO.js";
|
|
22
25
|
import {
|
|
26
|
+
contrastText,
|
|
23
27
|
getSeriesColors,
|
|
24
28
|
mix,
|
|
25
29
|
themeBaseBg
|
|
26
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-WBM7ZNDI.js";
|
|
27
31
|
import {
|
|
28
32
|
resolveColor
|
|
29
33
|
} from "./chunk-TLVIHFRO.js";
|
|
@@ -33,23 +37,24 @@ import * as d3Selection from "d3-selection";
|
|
|
33
37
|
function bakedHero(parsed, now) {
|
|
34
38
|
const resolved = parsed.resolvedMs;
|
|
35
39
|
if (resolved === null) return "\u2014";
|
|
40
|
+
const tz = parsed.tz;
|
|
36
41
|
const remaining = resolved - now;
|
|
37
42
|
if (!parsed.rule && remaining <= 0) {
|
|
38
43
|
if (parsed.expired !== null) return parsed.expired;
|
|
39
44
|
const elapsed = -remaining;
|
|
40
45
|
if (elapsed <= 0) return "Now!";
|
|
41
46
|
if (parsed.units === "compound" || parsed.units === "human")
|
|
42
|
-
return `${formatCompound(resolved, now)} ago`;
|
|
47
|
+
return `${formatCompound(resolved, now, 2, tz)} ago`;
|
|
43
48
|
const bu = parsed.units === "full" || parsed.units === "clock" ? "days" : parsed.units;
|
|
44
49
|
return `${formatCount(elapsed, { units: bu, round: parsed.round, fields: parsed.fields })} ago`;
|
|
45
50
|
}
|
|
46
|
-
if (parsed.rule &&
|
|
51
|
+
if (parsed.rule && sameDay(resolved, now, tz))
|
|
47
52
|
return parsed.onDay ?? "Today!";
|
|
48
53
|
if (parsed.units === "human") {
|
|
49
|
-
const [hn, ht] = parsed.hasTime ? [now, resolved] : [
|
|
50
|
-
return formatHuman(hn, ht).big;
|
|
54
|
+
const [hn, ht] = parsed.hasTime ? [now, resolved] : [dayStart(now, tz), dayStart(resolved, tz)];
|
|
55
|
+
return formatHuman(hn, ht, tz).big;
|
|
51
56
|
}
|
|
52
|
-
if (parsed.units === "compound") return formatCompound(now, resolved);
|
|
57
|
+
if (parsed.units === "compound") return formatCompound(now, resolved, 2, tz);
|
|
53
58
|
const bakeUnits = parsed.units === "full" || parsed.units === "clock" ? "days" : parsed.units;
|
|
54
59
|
return formatCount(Math.max(0, remaining), {
|
|
55
60
|
units: bakeUnits,
|
|
@@ -57,11 +62,6 @@ function bakedHero(parsed, now) {
|
|
|
57
62
|
fields: parsed.fields
|
|
58
63
|
});
|
|
59
64
|
}
|
|
60
|
-
function sameLocalDay(a, b) {
|
|
61
|
-
const x = new Date(a);
|
|
62
|
-
const y = new Date(b);
|
|
63
|
-
return x.getFullYear() === y.getFullYear() && x.getMonth() === y.getMonth() && x.getDate() === y.getDate();
|
|
64
|
-
}
|
|
65
65
|
function stampRecur(sel, parsed) {
|
|
66
66
|
const r = parsed.rule;
|
|
67
67
|
if (!r) return;
|
|
@@ -78,6 +78,7 @@ function stampRecur(sel, parsed) {
|
|
|
78
78
|
if (r.intervalUnit !== void 0)
|
|
79
79
|
sel.attr("data-dgmo-recur-interval-unit", r.intervalUnit);
|
|
80
80
|
if (r.anchorMs !== void 0) sel.attr("data-dgmo-recur-anchor", r.anchorMs);
|
|
81
|
+
if (r.tz !== void 0) sel.attr("data-dgmo-recur-tz", r.tz);
|
|
81
82
|
}
|
|
82
83
|
var MON_ABBR = [
|
|
83
84
|
"Jan",
|
|
@@ -103,7 +104,7 @@ var keyOf = (ms) => {
|
|
|
103
104
|
const d = new Date(ms);
|
|
104
105
|
return d.getFullYear() * 1e4 + d.getMonth() * 100 + d.getDate();
|
|
105
106
|
};
|
|
106
|
-
function bandColors(palette, accent, muted, faint) {
|
|
107
|
+
function bandColors(palette, accent, muted, faint, isDark, fillMode) {
|
|
107
108
|
const blue = resolveColor("blue", palette) ?? mix(palette.text, palette.bg, 45);
|
|
108
109
|
const collides = accent.toLowerCase() === blue.toLowerCase();
|
|
109
110
|
const now = collides ? resolveColor("teal", palette) ?? resolveColor("cyan", palette) ?? mix(palette.text, palette.bg, 55) : blue;
|
|
@@ -118,7 +119,11 @@ function bandColors(palette, accent, muted, faint) {
|
|
|
118
119
|
event: accent,
|
|
119
120
|
midSoft: mix(mid, palette.bg, 24),
|
|
120
121
|
inert: mix(palette.text, palette.bg, 7),
|
|
121
|
-
inertBorder: mix(palette.text, palette.bg, 22)
|
|
122
|
+
inertBorder: mix(palette.text, palette.bg, 22),
|
|
123
|
+
fillMode,
|
|
124
|
+
baseBg: themeBaseBg(palette, isDark),
|
|
125
|
+
onLight: palette.textOnFillLight,
|
|
126
|
+
onDark: palette.textOnFillDark
|
|
122
127
|
};
|
|
123
128
|
}
|
|
124
129
|
function roleStyle(C, role) {
|
|
@@ -128,15 +133,26 @@ function roleStyle(C, role) {
|
|
|
128
133
|
case "future":
|
|
129
134
|
return { fill: C.inert, stroke: C.inertBorder, text: C.muted };
|
|
130
135
|
case "today":
|
|
131
|
-
return
|
|
136
|
+
return chipStyle(C, C.now);
|
|
132
137
|
case "event":
|
|
133
|
-
return
|
|
138
|
+
return chipStyle(C, C.event);
|
|
134
139
|
}
|
|
135
140
|
}
|
|
141
|
+
function chipStyle(C, color) {
|
|
142
|
+
if (C.fillMode === "outline")
|
|
143
|
+
return { fill: C.baseBg, stroke: color, text: color };
|
|
144
|
+
if (C.fillMode === "solid")
|
|
145
|
+
return {
|
|
146
|
+
fill: color,
|
|
147
|
+
stroke: color,
|
|
148
|
+
text: contrastText(color, C.onLight, C.onDark)
|
|
149
|
+
};
|
|
150
|
+
return { fill: color, stroke: color, text: C.bg };
|
|
151
|
+
}
|
|
136
152
|
function gradStyle(C, frac) {
|
|
137
153
|
const t = Math.max(0, Math.min(1, frac));
|
|
138
154
|
const f = mix(C.event, C.now, Math.round(t * 100));
|
|
139
|
-
return
|
|
155
|
+
return chipStyle(C, f);
|
|
140
156
|
}
|
|
141
157
|
function aText(svg, x, y, size, fill, weight, anchor, txt, extra) {
|
|
142
158
|
const t = svg.append("text").attr("x", x).attr("y", y).attr("text-anchor", anchor).attr("font-size", size).attr("font-weight", weight).attr("fill", fill).attr("font-family", FONT_FAMILY).attr("font-variant-numeric", "tabular-nums").text(txt);
|
|
@@ -150,7 +166,7 @@ function aLine(svg, x1, y1, x2, y2, stroke, sw, opacity) {
|
|
|
150
166
|
const l = svg.append("line").attr("x1", x1).attr("y1", y1).attr("x2", x2).attr("y2", y2).attr("stroke", stroke).attr("stroke-width", sw);
|
|
151
167
|
if (opacity != null) l.attr("opacity", opacity);
|
|
152
168
|
}
|
|
153
|
-
var REPEAT_ICON_PATH = "m17 2 4 4-4 4 M3 11v-1a4 4 0 0 1 4-4h14
|
|
169
|
+
var REPEAT_ICON_PATH = "m17 2 4 4-4 4 M3 11v-1a4 4 0 0 1 4-4h14 M7 22l-4-4 4-4 M21 13v1a4 4 0 0 1-4 4H3";
|
|
154
170
|
function recurGlyph(svg, cx, cy, r, color) {
|
|
155
171
|
const side = r * 2.4;
|
|
156
172
|
const scale = side / 24;
|
|
@@ -162,7 +178,7 @@ function recurGlyph(svg, cx, cy, r, color) {
|
|
|
162
178
|
}
|
|
163
179
|
function haloRect(svg, x, y, w, h, rx, C) {
|
|
164
180
|
aRect(svg, x - 1, y - 1, w + 2, h + 2, rx + 1, "none", C.bg, 2);
|
|
165
|
-
|
|
181
|
+
svg.append("rect").attr("class", "dgmo-countdown-target-ring").attr("x", x - 3).attr("y", y - 3).attr("width", w + 6).attr("height", h + 6).attr("rx", rx + 3).attr("fill", "none").attr("stroke", C.event).attr("stroke-width", 2);
|
|
166
182
|
}
|
|
167
183
|
function pickBand(nowMs, resolvedMs, hasTime) {
|
|
168
184
|
const days = dayDelta(nowMs, resolvedMs);
|
|
@@ -658,13 +674,14 @@ function vizToday(svg, g, resolvedMs, C) {
|
|
|
658
674
|
}
|
|
659
675
|
const w = Math.min(120, g.contentW * 0.16);
|
|
660
676
|
const h = g.height * 0.52;
|
|
661
|
-
|
|
677
|
+
const st = roleStyle(C, "event");
|
|
678
|
+
aRect(svg, cx - w / 2, cy - h / 2, w, h, 18, st.fill, st.stroke, 2);
|
|
662
679
|
aText(
|
|
663
680
|
svg,
|
|
664
681
|
cx,
|
|
665
682
|
cy - h * 0.14,
|
|
666
683
|
14,
|
|
667
|
-
|
|
684
|
+
st.text,
|
|
668
685
|
700,
|
|
669
686
|
"middle",
|
|
670
687
|
MON_ABBR[ev.getMonth()].toUpperCase(),
|
|
@@ -675,7 +692,7 @@ function vizToday(svg, g, resolvedMs, C) {
|
|
|
675
692
|
cx,
|
|
676
693
|
cy + h * 0.22,
|
|
677
694
|
Math.min(48, h * 0.4),
|
|
678
|
-
|
|
695
|
+
st.text,
|
|
679
696
|
800,
|
|
680
697
|
"middle",
|
|
681
698
|
String(ev.getDate())
|
|
@@ -826,6 +843,13 @@ function vizClock(svg, g, nowMs, targetMs, C) {
|
|
|
826
843
|
function pad2(n) {
|
|
827
844
|
return n < 10 ? "0" + n : String(n);
|
|
828
845
|
}
|
|
846
|
+
function paintClock(sel, str, secSize, secFill) {
|
|
847
|
+
const { lead, sec } = splitClockSeconds(str);
|
|
848
|
+
sel.attr("font-variant-numeric", "tabular-nums").attr("data-dgmo-cd-clock", "").attr("data-dgmo-cd-sec-size", secSize).attr("data-dgmo-cd-sec-fill", secFill).text(null);
|
|
849
|
+
sel.append("tspan").attr("data-cd-lead", "").text(lead);
|
|
850
|
+
if (sec !== null)
|
|
851
|
+
sel.append("tspan").attr("data-cd-sec", "").attr("font-size", secSize).attr("fill", secFill).attr("font-weight", 700).text(sec);
|
|
852
|
+
}
|
|
829
853
|
function drawBand(svg, kind, g, nowMs, resolvedMs, C) {
|
|
830
854
|
switch (kind) {
|
|
831
855
|
case "years":
|
|
@@ -874,6 +898,18 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
874
898
|
const banked = resolveColor("green", palette) ?? muted;
|
|
875
899
|
const faint = mix(palette.text, themeBaseBg(palette, isDark), 72);
|
|
876
900
|
const svg = d3Selection.select(container).append("svg").attr("width", width).attr("preserveAspectRatio", "xMidYMid meet").attr("xmlns", "http://www.w3.org/2000/svg").attr("role", "img").attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`).style("font-family", FONT_FAMILY);
|
|
901
|
+
svg.append("style").text(`
|
|
902
|
+
@keyframes dgmo-countdown-flash {
|
|
903
|
+
0%, 100% { opacity: 1; stroke-width: 2; }
|
|
904
|
+
50% { opacity: 0.45; stroke-width: 3; }
|
|
905
|
+
}
|
|
906
|
+
.dgmo-countdown-target-ring {
|
|
907
|
+
animation: dgmo-countdown-flash 1.8s ease-in-out infinite;
|
|
908
|
+
}
|
|
909
|
+
@media (prefers-reduced-motion: reduce) {
|
|
910
|
+
.dgmo-countdown-target-ring { animation: none; }
|
|
911
|
+
}
|
|
912
|
+
`);
|
|
877
913
|
const bgRect = svg.append("rect").attr("width", width).attr("fill", palette.bg);
|
|
878
914
|
const estWidth = (t, fs) => t.length * fs * 0.58;
|
|
879
915
|
const fitFont = (t, base, maxW, min) => {
|
|
@@ -893,10 +929,12 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
893
929
|
fields: parsed.fields
|
|
894
930
|
}) : hero;
|
|
895
931
|
const heroMaxW = contentW * 0.44;
|
|
896
|
-
const
|
|
897
|
-
const heroW = Math.min(heroMaxW, estWidth(heroSizeStr, heroFont));
|
|
932
|
+
const sizeStr = estWidth(hero, 1) > estWidth(heroSizeStr, 1) ? hero : heroSizeStr;
|
|
898
933
|
const gapMid = Math.max(28, Math.round(width * 0.03));
|
|
899
|
-
const
|
|
934
|
+
const stacked = estWidth(sizeStr, 26) > heroMaxW;
|
|
935
|
+
const heroFont = fitFont(sizeStr, 96, stacked ? contentW : heroMaxW, 26);
|
|
936
|
+
const heroW = stacked ? contentW : Math.min(heroMaxW, estWidth(sizeStr, heroFont));
|
|
937
|
+
const leftW = stacked ? contentW : Math.max(contentW * 0.42, contentW - heroW - gapMid);
|
|
900
938
|
const titleBase = 40;
|
|
901
939
|
let titleFont = 0;
|
|
902
940
|
let titleLines = [];
|
|
@@ -908,7 +946,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
908
946
|
}
|
|
909
947
|
const eyebrowText = ordinal !== null ? applyOrdinalTemplate(parsed.sinceLabel ?? `Nth ${label}`, ordinal) : null;
|
|
910
948
|
const eyebrowFont = 16;
|
|
911
|
-
const footerText = resolved !== null ? formatFooter(resolved, parsed.hasTime) : null;
|
|
949
|
+
const footerText = resolved !== null ? formatFooter(resolved, parsed.hasTime, parsed.tz) : null;
|
|
912
950
|
const footerFont = 17;
|
|
913
951
|
const noteFont = 19;
|
|
914
952
|
const asofFont = 13;
|
|
@@ -926,7 +964,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
926
964
|
});
|
|
927
965
|
y += Math.round(titleFont * 0.45);
|
|
928
966
|
const heroLeft = width - padX - heroW;
|
|
929
|
-
const ruleRight = Math.max(leftX + 40, heroLeft - 20);
|
|
967
|
+
const ruleRight = stacked ? width - padX : Math.max(leftX + 40, heroLeft - 20);
|
|
930
968
|
svg.append("line").attr("x1", leftX).attr("x2", ruleRight).attr("y1", y).attr("y2", y).attr("stroke", mix(palette.text, palette.bg, 14)).attr("stroke-width", 1.25);
|
|
931
969
|
y += Math.round(titleFont * 0.5);
|
|
932
970
|
}
|
|
@@ -974,8 +1012,12 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
974
1012
|
units: "clock",
|
|
975
1013
|
round: parsed.round,
|
|
976
1014
|
fields: parsed.fields
|
|
977
|
-
}) : formatHuman(
|
|
978
|
-
|
|
1015
|
+
}) : formatHuman(
|
|
1016
|
+
dayStart(now, parsed.tz),
|
|
1017
|
+
dayStart(resolved, parsed.tz),
|
|
1018
|
+
parsed.tz
|
|
1019
|
+
).sub || null : null;
|
|
1020
|
+
const heroCapTop = stacked ? leftBottom + Math.round(heroFont * 0.2) : padY + 0.28 * titleFont;
|
|
979
1021
|
const heroBaseline = heroCapTop + 0.72 * heroFont;
|
|
980
1022
|
const heroBlockBottom = heroBaseline + (subText ? heroFont * 0.28 + detailFont : 0);
|
|
981
1023
|
const contentBottom = Math.max(leftBottom, heroBlockBottom);
|
|
@@ -990,6 +1032,14 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
990
1032
|
);
|
|
991
1033
|
svg.attr("height", bannerH).attr("viewBox", `0 0 ${width} ${bannerH}`);
|
|
992
1034
|
bgRect.attr("height", bannerH);
|
|
1035
|
+
const bandC = bandColors(
|
|
1036
|
+
palette,
|
|
1037
|
+
accent,
|
|
1038
|
+
muted,
|
|
1039
|
+
faint,
|
|
1040
|
+
isDark,
|
|
1041
|
+
parsed.fillMode
|
|
1042
|
+
);
|
|
993
1043
|
if (hasBand && resolved !== null) {
|
|
994
1044
|
drawBand(
|
|
995
1045
|
svg,
|
|
@@ -997,10 +1047,11 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
997
1047
|
{ left: leftX, top: bandTop, contentW: width - 2 * padX, height: BAND_H },
|
|
998
1048
|
now,
|
|
999
1049
|
resolved,
|
|
1000
|
-
|
|
1050
|
+
bandC
|
|
1001
1051
|
);
|
|
1002
1052
|
}
|
|
1003
|
-
const value = svg.append("text").attr("class", "countdown-value").attr("x", width - padX).attr("y", heroBaseline).attr("text-anchor", "end").attr("dominant-baseline", "alphabetic").attr("fill", accent).attr("font-family", FONT_FAMILY).attr("font-size", heroFont).attr("font-weight", 800).attr("data-dgmo-countdown-units", parsed.units).attr("data-dgmo-countdown-round", parsed.round).attr("data-dgmo-countdown-fields", parsed.fields.join(",")).attr("data-dgmo-countdown-expired", parsed.expired).attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`)
|
|
1053
|
+
const value = svg.append("text").attr("class", "countdown-value").attr("x", stacked ? leftX : width - padX).attr("y", heroBaseline).attr("text-anchor", stacked ? "start" : "end").attr("dominant-baseline", "alphabetic").attr("fill", accent).attr("font-family", FONT_FAMILY).attr("font-size", heroFont).attr("font-weight", 800).attr("data-dgmo-countdown-units", parsed.units).attr("data-dgmo-countdown-round", parsed.round).attr("data-dgmo-countdown-fields", parsed.fields.join(",")).attr("data-dgmo-countdown-expired", parsed.expired).attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`);
|
|
1054
|
+
paintClock(value, hero, Math.round(heroFont * 0.55), bandC.now);
|
|
1004
1055
|
if (parsed.rule && resolved !== null) {
|
|
1005
1056
|
value.attr("data-dgmo-countdown", new Date(resolved).toISOString());
|
|
1006
1057
|
} else if (parsed.target) {
|
|
@@ -1009,6 +1060,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
1009
1060
|
if (parsed.title) value.attr("data-dgmo-countdown-title", parsed.title);
|
|
1010
1061
|
if (parsed.onDay) value.attr("data-dgmo-countdown-onday", parsed.onDay);
|
|
1011
1062
|
if (parsed.hasTime) value.attr("data-dgmo-countdown-hastime", "1");
|
|
1063
|
+
if (parsed.tz) value.attr("data-dgmo-countdown-tz", parsed.tz);
|
|
1012
1064
|
if (parsed.since !== null) {
|
|
1013
1065
|
value.attr("data-dgmo-countdown-since", parsed.since);
|
|
1014
1066
|
value.attr(
|
|
@@ -1018,7 +1070,13 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
|
|
|
1018
1070
|
}
|
|
1019
1071
|
stampRecur(value, parsed);
|
|
1020
1072
|
if (subText) {
|
|
1021
|
-
svg.append("text").attr("x", width - padX).attr("y", heroBaseline + heroFont * 0.28 + detailFont).attr("text-anchor", "end").attr("dominant-baseline", "alphabetic").attr("fill", muted).attr("font-family", FONT_FAMILY).attr("font-size", detailFont).attr("font-weight", 500).attr("data-dgmo-countdown-detail", "")
|
|
1073
|
+
const detailSel = svg.append("text").attr("x", stacked ? leftX : width - padX).attr("y", heroBaseline + heroFont * 0.28 + detailFont).attr("text-anchor", stacked ? "start" : "end").attr("dominant-baseline", "alphabetic").attr("fill", muted).attr("font-family", FONT_FAMILY).attr("font-size", detailFont).attr("font-weight", 500).attr("data-dgmo-countdown-detail", "");
|
|
1074
|
+
paintClock(
|
|
1075
|
+
detailSel,
|
|
1076
|
+
subText,
|
|
1077
|
+
Math.round(detailFont * 0.66),
|
|
1078
|
+
bandC.now
|
|
1079
|
+
);
|
|
1022
1080
|
}
|
|
1023
1081
|
}
|
|
1024
1082
|
function renderCountdownForExport(container, parsed, palette, isDark, exportDims) {
|
|
@@ -1029,4 +1087,4 @@ export {
|
|
|
1029
1087
|
renderCountdown,
|
|
1030
1088
|
renderCountdownForExport
|
|
1031
1089
|
};
|
|
1032
|
-
//# sourceMappingURL=chunk-
|
|
1090
|
+
//# sourceMappingURL=chunk-FUPF2UYQ.js.map
|