wxcn
componentweather-forecastsource: ok · hit
Weather Forecast
Weather forecast with optional atmospheric backgrounds.
npx shadcn add "https://wxcn.dev/r/react/weather-forecast.json"free
No selection tags yet — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lighticonslucide-react
Registry dependencies
cardbutton
Files12 · source cached 10/14/2026, 12:31:14 PM
packages/react/src/components/wxcn/cloud-texture.ts
// Generated from src/assets/weather-*.webp by tooling/registry/cloud-texture.mjs.
// Embedded so installed registry components never request a third-party image.
export const weatherCloudTextures = {
fair: 'data:image/webp;base64,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',
overcast:
'data:image/webp;base64,UklGRlJcAABXRUJQVlA4IEZcAABQ6wOdASoABgAEPlUqkEcpsK2roXKZmhAKiWlu3OrpH+HNH/55wv/776PEXMzj8qoj7qc2/3PP//j0+RzGqdyf9j4V3p3+u9gbyav+LwUfC/9r2FfOHzv/8bpHehFPx9GX9L6Tv3r0LHBP/+nfAP/zaf5o19Ow/wL//erz4P/++Z/4J/68znS//LuAP//1rp+wEgVQwW0vJGw1Ljd7ShYVs0oKd+LedwxjVtKhGyi2fmkrls1mwiI7z3C/IT1gwiI7dc1cgYI43etY8ZskKPCIo1qKsaCI/IX+fY/0uBezHSjhdbNhSotYI+xgg7C35l8VoSOA40vCK/41dOegNh55W8cKUDYrqaTc6YuPZBzn53dRD9nRYsHAVrkD//FKqHKqaEXh+NgTdmfQlE9Fj0GGgKhsk546rQ2lyCiJE1XcXb3Zho8TLTzpwbWq2Z2VqSpZ34q2iIOo7ppYX6q4ZPOPONZlex4ExuJ5umTvLCOJj0UNrKdaj9TxRpLhXUyUmvfS0lPWwc054g8rqOV/qOPuFvZI2cmcjGmiarUKGOvQbMstCi5Hp0aBGRFXWMIp68BeOmz54jA2qprkk6+UX1+GHaRWZWN1uTM7+t7T7OCqX1qzsyIt5TUAym5vxD+m/omY8gPmAlJqm9v6iyfJGwmtc7O4Q/pjvqrxdLc6kf4hNZVJE7PmHbjl7EBabMOpyneI+ifR0h7vELi6BIdwPpep6yQgAxZqzF3I2BMjqF98GgO/DLz1swGLPHqpBoaRwlbA59dB22WPaPYKLfrL12D0b2h3SEOpZE0UQZmTqbKgxlIADmtA1jJXTE5VPS9KIzoMfE0RSZbDKgvKYX1bUepebUpjOl49CTfBV+iYMhbcjNMSzHxFCNDRtLyRsAeOEJQOMqB3KrjEjbTq0rCSTP+tPivovi+nfGAoKncBNM8HjglQkuuYGjzRuADNSmqU4+rTZ/paEtC1qK/Z+du8aNP5g+GbZ2j7JYjh3CaKsNGndBEK45laeUWwfWopLWTvhLSvNkKN9Vo8aVJIkrwj8ime2RhkZM1bkWyreQfz9evKpNR84Fm+JFnKTBgdTxqrBQ73dJ6go5y6q86pkU76dXxYl7yFKpALM4xQDFm2aNHxUFyVhyQCJ6QdogBSZYCsBI0woMsjKPrj1FCaiLU4ZPazqh8StAu5GrNM7wy05ATIRa+IrGqFMOMW0v1Vs3OyMZzFcNMHj6lCnyZl5oTYaikHo7gF5agVEbABoKPPThYVNa1LIketkrJdXxP77l3zn9JmN7v09D9k75DcQ/BNcUzLnUFbJrMM1NigO+VG/OCcEQpRuxDs2jxQJcpRK7j7zWKwxWorC42iLqT6DBagrRUuuzPqX2noE/w3x9bNACuwdlRPl75xN5wCL6EROXL4c49edwt1Bjm9gRnetmXdKbFhbk+qbwLKGNmRl4+A81EwcFtBVlpkiiE72vd6fHDHLTH81MzG/uXlagtWmltS0HeXlVtOIZPs/uguApkpe7ZerKlibqgxiFCPSLrO13lswrq9hv7XFGmYBIKvy2jKbuKakVUyAgA2pMtVu+aGBwT4DIw86vAqTeAjDE0B6beTLwTLjb8ODinTYplPRH7Uh20QENXKByzQZYXLcWdgpj60LsW50oZlN7hEQkNeXhhxGcAkl088tA/pxvcLZft/LtUtLzc3o+tNxjWBfnca1AkT/eMb6IxUXmqCsnJ6FJ+aKir2nPuIIsRZJ8wDXYc1LDHtK7hOzHfAk36/2eii4RJWp09vSgJT4bQqimJec52Rw5Czdcaw+2DHjmsY4BDAuXLKFO7y40sFPMOTXUqFrCrLEJNjevi0gyKRN9lnxbANVv9T2l61wTv036FoRn119bMsPKOvvjyrVRReSNhNr+crm3wP9fa3Pxn0+e2Ui1ZpPNMHk0GjLv92Y+J1urf2Sem0Vz3XnEnssfw02kPMoyE1BWekFbl/HzM2W+Bat3HJNXHgVf4KWPRALfw5rosaKjmdiYvK5oXXH+etfIs9py873N+lStzKkQWRBLP93+qJ0rhqvnfVXjHVRxLYm+PgNAtt5By10K5GRksYU8snqEUqQhRaeLXOf0GPddGcLWeT4nlE+9qVpFrWIux9tYEps1trA5yGmikL1bKRs1ibOXa74kNowwcgNwSDyMaVJh7nVgg8g0hZ4UCsuFLRVHYZQ+ECRsJuRoLfxP8cIV6qeZjFwBx75rdB/FHYFsGH5hL3Qx1T2994fxFVGXnHVfmHmxLswnWT5LXAMfo07/Vv0hU0Ui3sUa/6PThejDLC9BsGPLN7ftLHjOM2LHeA4YeFR+O90yiKZ4Q0f4bq1LP/s8KopN6cgKOGPJ+DaJr5IzUOoG7iGfAfzNX05s3KmUE3GooOyKwxU8HoYjNnwheyRALum6kcTu/x7h2KOWHAR7SZGMiavNBPzEM956p1g2Nq+HlwKXNoAK3fvXBJPpsY+lIUnqwbN6ngadgoJthLhaYS3WeaZfZpb+ifIGSLvToFMSFgjTuaXoATbIQe/X0FKlSICH/oWtxInEh9p96EyChtH/aKMZ4fE0Iob4FsSJsJTdZ1fcq5WsfzV4aGWdmu/s4CV5StwqkaCbUt+LzCxDD6rw6zHYWMBd+piirhhrZkRi3dVv0vTM/oXED8nawHYHSoldsTXze1pp3QmeGYrn1er8gOxkY1LPz/t1Pfs6ajJ8H9o1UY6KaBKKqd/tAvC64M1lcbal9gk7cU2BKRegH33S9qymNeToNlphDPP55phv8Awor0pbO6sewaTcPQlIThjkP/cnJP/IrrpFYZAbSjKj6gy78hOazMvkLaFi6xWYgVz+fsTGDrUuzwzDCKzDCK2Yh4wmEJQN8AcOpBVG3lF2VlqdLchHKRnN8gsSaQ7YoxsLw3u511nxGBPLyOBUDevp6ndqK2XfbR5ffyJ7Fomh3awSPtEIZ1TgfnVwjqm1imRBTRdn6UwvRlopz85onkQNwy+FUYQ3zZRjnD7fk+77UkEE58Str8/Jrf/GgagCZF2RmWNZT6AV3NNUSmWsjiqXPT0FCcWVL9ZBeGQ5nCwBsSccQ5CvDLMt0YlzWNiCUZ4Wr3+sUw4ncYj30/54TmsAeo/I4ArUjbC0BprrPbC4pCLFqOXCytrIHQ0YtXK5IPVvIpi93Zd371OhKaSdkt6hl9MJVbW7tHFQyRIxRPT88mBzGAPzM9H5Tgy8TArKmUr1EaYleIIScGPZoNmSXwwEbMFrgJtTveXaV9fK2vfQ6JIyuFe8yLxP2Q7A7qqMt8ot0zjs3X5+ewYdWgft7pUyhI3qfvjPVTx7FcT2uFH/CxaH6BV6bI8b9BWZWHYOUuxPsR1O12jWpdAwifTvHp2jtSOwnjVmEdFMJHkY4n79JfQv2K+j+Pjgq3qd4Iagy20zG6UT9yM47aeGSxonI3phV/ovrTIq3GOaZ56zvXVfteKxNAjci2V531VTFdSfz7wrtsvzb/E3W409e3oUs+aXLWsqlSOm82ZY5Zt0IilcBMIYLPLtiMmvn/jYUQWq/eImWjp1uj1GHOPA3j1HYfjCdMx0wqqMPBSDWcJpPA9mEgWWcrsrSNk6QPQTPYeGW3980cg7Qq3DZGnt6016c8I/o2pDMdGabfRXHtFKLD1wHanbgeRqjAH/0Wn3CdmF6OFqJV1whmgqygrlQUT2vr+KJSoO3s4joOgc1pBhLCJ9TWngJCLluiaLNlXGKCpV34EZZedNANOsH3/vSicXLBEWImXc5z2ZsfXn2GvaTxmdlf86WJRsJuJlrI18a2SUa4ZkLn8v+0RCdJyYwhINs+MDC/CxuhqrreTkd3rzC1Dq44g7OuwtRDbMputqaliHSjIcz/e1u4mBOz5q/NIhZxyyTodYQJrhVSEqsXKT2UMjHGCYMdFyACNxXl0B7m72Rjs+bgik47SMAGXpINlSoI1NqjWzsT2GKQicaIvAZe7rF0sQncGHImvoNBmex0OsxyA7JJbM7CXhNKGA3YpnTLcPSKCNphfEu7L0BHqsVqLZDWKa8mF4jss0z980N+7DlQg3lhFlm4UcE46OKaorPqKqMYZhjxUCW+DHkJYk/f7xsK2ErUdxBDpEokMENPpjRAS8ts1qhIY6Weu456Uyj4v/a2i1Muo5WWBtRe/xpceLW555/sYN6x2OIla0/8VRwm29F77Uiei3caJ9ykQ+UBJjGRQZRpiq6Q6tqaIfXFw8XMc0R6PT62XGvlyoNUcpPLUTXOBOhnYHXwBxdcUUvl61FqVJzDVybHmXin3FIgWJ1AJGQzLa04BwKUmSacH2uHvPqJuekc9F7lapFfITfkF+obmUYQy3XCwks3SO7sUMXtM4KIeXTrixMC3ju1OglqRPT4Q68DOaD/ypQT6WEfn+6QIrq+3fnCulCkYB3hOLyXGu4CVmYr+pNxcZVDOoDFiK8b+AWjg2ikeZtM4AJYF3vYWUK1tHsyLkdOYCnh7dsbKlCChECiRsTbYc7tNYWjtsw0+d+U3OA+24UjDgRZXBcdlrEj4GkXyLe8COgah3k4Rg4b6cdOYhBS9QqOLQYCAPbFPa+FUXB3tTAzg42l5aBc5BswGjfWJyDo1RwwvxQ6s2B8YSlniJMiA1x1xIWCzrUinU1NdWwgZRY8nlVWCrUHXnNBVJsn6IgXjfI+rhGlavrhFK/e00zy3eqyiy+hFydDrUGFHos2ECnL1saQnDubrH1gtM2EwdjgR/3JJZhoPnJDN4yH/qKiiFWrboNKTO9lR6b9LFxToZwWK0lZUGF4odUDgVNnNfwnwJvVospmjUAuFF9x3VuaKFDul4d0s5GW4gD82SBSaAJUqtYxzmROqv9R+0GnGX8EDr50f/Ft7eBeK4bwsQ2vQmn/Pl4JA8TZRnDMGeEr48R0JBhceMo8hHFYa7StV1BaqH36MHiB7QyW2O6YqD7ucT1U1Wkbg1zo+P9ZtK4wYOyChaJufdYp+q1V6KDJC6vugM0lDBSuQ+TumYjcr8EHPhRnMrCWUY3hCGp7tbZ5t+IaUw5sFoThBicLplsxexzaUytgdQhydT/UD4ujia9t9n5CDD8hNsnIr69f5t1LsiIZo3v7ii/xuLtFD78sU8e4He63byxDx7nAqUzWVOUBT5t2SlEcpw5g6dyR6OhxnfOOOLXoQFjSkX2s8afS+mDyMXwR1NmA5Ba6hAEcn2M2iT2XxMmuedQTqkuFlQJosM8Dy5YLdr3ICBy166wu+QV9/vhC6KODVr5h+leXopTPxmyrDLEnoxVCydp16hWRgbTEx0wXv1AQFcbp6QFf1F/htHSgpK1k51BJcu2VWWRW+miAeAUKQKbGfkdiIugxK8Lv0CBNSXegAlX5C/mf7oIOjFfPRyWdBCsfYhqTpQv95YLBqO8TyGGQ8ZcJpFNMX3XUnyIYk9GfdMdQu9/KapZ8NMVEH56ffd7mpgLXYT75BJvIVLy9kEEjOfDxOoIJDZqOsqjycVLNTX2RKJ/Jk8MXSrD8ww6ULLlD79NWyusNVObPH3SNLxppb4XSsViMX751mACPbu6FFj3wPt4tRQzNqii3mBfhLlJWTt7qeYMspkrvSJgBWmzZU5kLSiRfjqci4GRj6s4+vYZZHady0LrkN9tUGGnBEWUZEeX/HY+TtlLT2yd3RkSO97ZJb1frAx3Sfy1+/WHKNcExtq/bLH5YSm71bgF81BKtNMvS0Hkd4o090PgGAw4DtN5I5vPNo4MWhT4VRLFZyNbHLXy8BMXoa0YaLsYYSxYvzBDn9CYd//z5BvjKudc63Juuw/nnL1hD4KVM49txiNXhPaiPGvaEbtuyzdFQgaH7cugETt/oDHrqaFa3FqJfv4pSSmemZ3IfU066QFwgRajB8B6F/w0pfrS8gOm+89tU1OwQL1ouYdBh0ENOEbLTXwFLgkPOLsDfu6O36RYaYehJkeU44lRfZkGRD7XtrebnW9GVfy+rZg7ZgjOtjb6pLl1x7OGSkad98LG2tUG4KeQGQI4cAtoIS0KPDVG9bZU/44O8rtmhD1XntR+YRWMuHBOOgzPDWWU/oI5yi54RN+C3xVJJISyd8cOnONbBvUvLXNzcfz/pRr2sqjO3vV3waocthJz2Z0Vpt9rCWS1DlNzTXS+6K18XrcHCCxxEJn0Kz0V1MJU6APZph6tUa2g3bBaQ7eQvQENca4t3C6usmXuiThOGDMdbtpm8H396qcxBDHqoYYkROe+F056o4JYEyXAdMJB7S7uHjgIAdODGFZIadHv8spN7vJvhGjG8ja/RNyXLWfnx6ap5Uk4kC3wKtY4ARhXYQtRyYcCfh4TM7eUiij849oLVCPgzxV8iXhrnEouEV5fMBrLrlmA8qbcHc7aZwGDk25lahcx+CZ0kbhwNw21OKGdy68YlBgQJv5srK8QOSL3Rru5lA5POnquMIcCqFRJJtsb8wfnLtxML3DkzDQV1jV9lOK6eKRtzR1baXpeCyV5WANz9QQBU5RQHgrz0IhaWnMz9z6HjGL8Dh3O/QZm1PJQxr1SQ3dRrauQNMuouYgFtT1+eYSEZ7+YV2RTYpwrbVdZvuo+3CklTvuKVnJrRCPhQUCvVlpONM3zhyoclvFnOyCkT3kVXb70n0NFZfdsiy2J1SYcm/v6nqeKKGuT/8llx+EY+yS8qVnG/8hwVU0oGRWNsxLRn74nm24b+iwpVLRt5aqX2W14QFSxRsXjZX6i3GCoODJ07AAxfXuNNggMo4BOaEgBfeBqWg4SQfg8D+/5IGMAuso8nWIGT6ucGTkPLRf7tYwyybKPFhTKztb1LNkBL1D5YGG3KR0QoM2iMRKhEJZmyfMxSzy/cRXV3GIwVKAnG6vfL3PF0ITNh8fIgMCjnb5DbtjGhcy2hRy/KhvAse70T42IYN43TooX+IYgssN3Al135S+82MC7DCphZczILQlHy+pJMNAtNo2/tzByoN9jrakjwXJh6jjE2UZbZICRa5E6+Ldjy+bnlMNPtEVgBJVyyfQixuRzTNv1lWBIz43+rc2qV8ul/Dff/ybBlcbmu5jVgOeVNLLqkuveUcdMLCMXII1JxW5c0v8c99kaacETci1TfNWhOqzKhhclggTX6mN22ju1D2Ewj+fHL/hGTLGZR+19MCF6IWMPT8P4FXXTtGSeasrDbHc1VSW0nETbaCUQbsFqyvJrapGgXjtm/cDSlg10dXyVBJVVU6o8uc8qn7pQT+9CA9MJcAJy/C9g4CJn8mYvqSFpMxFGEpfllCih3DboVa+4xmuL993bTAZd2v8dESPQcxbfo6JgDXSNvh3D57xmIEIvhkX7qB/UEuF9Dy3AQfuG7cYxtLfu2uEPMJDpqh52rkgNDeGWEoXXNVsiw+4jkTu1uEUDk9HCrcWudWVa1K0lKjIw51LKlb5autk0Hn6KkMsAVXQfD8Ni7tyb8t3T4CwnYIe+WfY4vIJAY2ldoP0qj9KM4v5ZH4pQw/ak6PPGV45Y8MuKbTRx4PNlFFOjrRJegY9sp6r/6SAECskytQHB6JIAj8igOudBp3Cyg1y7cQQCRkKcMWF1X6ZIDRqgcEfDPlpau6VVjBAHBM6k2Na6qVKtwwUsnI1sMDV4ilRIgvAMWSsN0+/vDmTR4Z6koSSyT/c6R5SgGF9Ih88eGm/bum3wquTqN4sYGoewBnCesN9ssNGQcMwcmQ0dTqqVkStiyhDd3OL6prwv7K6Z/JDZ25imCJjbcIzOZRZSuIoye+25bpyjwXm8OF8hpBzJTldL2vYBb3No3n+SCNQym/ebPDbHA/xz6qqS8poLqItjcoWJRTug6uoHNX8TuUDuE+mrK46PlE/foLjn0J3r3BMN8kTaVleBIThP+r2UnOFOT1z3ojki+Wmm2fIeHPQBunJ1rLlXEoKR5RG+fVa8sERdFRWDeppglzpIZ2LbifVDEtxDM/0t6CAMeTkKMAkukvPVL/7c+hhZuuJ8NMUxgzVe4N68DU9YdhHWPxVzJUno2Sfd7TOrkk/UQSNotifhOH2PYdsxSPL/ymnVzL/d0II1JtA1Jy0tsdSN6Nmgf9uPL6d+u1OUOVcmKIVxkaDREj85lFRpKs/xWE0E7TEgoc5ICDgpsLQWn5z5cf4tR6GuGKz3yLM1iZAEpYFWe4AsaU/Nm3VWk4x/RKE8ipyzX7CwMRxU648PfUS/lQMF2sM9YeGgY9xxttqHm2/bR6PsDdaLSeV1Vm9TtADu7YoWYLmclgf+De52cpsQnozx1IDXxDngR0RSRtRLz3xDVfRNQtXujAlBP3QYZErpsKudcZIiZs8RWZlwwFM/7Hfz2bm0DlcHQhsIeJyQbNJVvuUqLHjdd0eDantScRJJEvg4zvQeMe2eeZNIw1RjUFYSYdwNqAXpfCtpiuyYt1RL4dmupAgwqYNPXMHwAMloa4npUGa/X3sH75IJbzqNJc1nq7T0EOHRJW2Q9eAW/7sDx/AwVWPZBYTRn87Ah64DuaHUpP6OPFeC9yR9NnWRI1bAtHUFo9nkLQGcvdCNJqrI8c3nPANZh5qslfVrQIcAGAxY6lj5DOytRdnfbddKZpiULxmHpD8iUoap4f1ndh62vZLpw8Meph0JbA0UFSef0YeLtnyYUWm+v9G9ettV6c3rrl4rpoir3nfMTYTFNtDhrRba142p+q2d2Pe7LnedncKjtggy9ZWZKNYzytM8DsKoC7z5omeX3zFmZ4n329Z4IfZLPQmA9yDaVF+vFgikm0YO01RwFspwd+SuNkeIaFN11ibJTqaNL/t53WFue9aystuS8ZMKEk72vobgL3wUKd17qrUIHDCqDGSmMu6GOLAqFGE3hrS7OeiSccjqWKWXaH1AYhsD8xbxhwoRj46DXAH7thIi3j5dYwNnIFdna4dPxTOF+jCaPbBV66MPzCNUa3dgVPoN2ISye+dfxoMj4G7cvpzaTKAKc/iPnSSAdee51xMcYYnIRtfFPsXQz+QZY3Lts3CcPKsmaw1SzwOCfb/giXJvI0E3km4dJErNCripTxbuv0Rst/ziwzqIFPpR4zhC+bQsKbGNOTfWCrF1h5gHuaKLLdZq9azcWLELfPeeidfMeegRtuLc02igQ97aL1UFKxWcqS18spNxyaJOjQucAf1ng3vDq/N74KutRYjqlQu7SDBq7wBjJC1PXnH1vNCDgx9W9h0/n8vRF8LU2n/aO10jKnhlhZVFv5FKqcC6uEsjvRCq3M4qcfhFXepmiZ+SJeENlp/aP5cj6f3YbPZBBqY1L62Kw9T+gJutuuPZw7fFzhnd1Venj8AzxcPq/z+LzVm2dtzGwhtWR6l2QPi2Q+gLDKMSIVPgywrX1o+AZKjSBJImL+DGs3E7QGigKXH78qoGHkArMlPT+X6pzMmtZlajsaqhc48ELv9GtUk+lQbxuNuvSczQx8Ws4iywDm6JtkuSwCUf7jnJhNCzUELkvF80m1psKIKedUierTe9KTBeQtiUwLisLIuFf51CchAenL0svZElu/5kW/CHQtlEsV6UwM50AkT/ndPdTVnzZ53qsbLByMxnUfNZqLZsaIY15WSnOitYTcTLmmNGYCR/vH+e4+sfd00DzgYpvrZDAPMNf5KcdoGga6j3SlcGEeVbSPCAzHFxhaQ6fQrIaMMUruBCCeNUYH+GtxmvvfpHNVHOSQJsgfawAOlkkg1/MudGOnZBi2ucTemTyxGihkITK+QXzuDwS6ly1UsanZ7Zq8QcoE/1FZIosEmd6viwalScc2SLdSDscXOHSUytCpzYMqpp5Yhae4u5jSuw2SuVwG6k6EdC0yKrBwUx+eBkcbGm4BLzSHarHBgZ7Z9qjajzI6Qzhjmfchbn33AL1W5MTXpRsBVCzGf0a40u2Wv+4ge4L7DbHN8rUauZsp3Q373FTIsf/Oup81qn5XPXVaNtJt1o+2SpyVfJI2Af4/6jADgebnMXr1temmouvbluo3duxlXQPTHjmXQbB8oZ6mG4hnHAi6mxWx3v2xh9loCJQxf53n4IPu8FLbjh2OiVC+NGKv95F8+129uEQv/rlTjAYjfUO4aeGj4yAe3ctuGAsQFHb0zGMslVqAo9q6gnPN7u3wmvp68XKTMMn/CACTQwPJ78jqwnmVRyLHYnxnxXxaZSsxko8xgXdioroIq9iaiZ/wWk+DhV93He7et/I82expspmVEOVHPutoG1m7AaAg6DoripiCQ70Ee5KeHxCJuNgEYdnXqwXy+i/2oE2V6wir50YhNBKGBurIyUAN8f+6A0WRvFN5MUwgECNUVyNmQ/VAaZk3ERxqafA909+JyLUnyp6gt4DrOwNmA6QLjcXA0EN65emRCTZ/ZSQLMd4iWJkMpCecedD0WkT1O1FXcrSTqL1/C84h5plSnEACXXNvSOG85IPVbnUUUgGL9vStzblt9utThFQzCj9GvwH2E6E+jmjtpvOcGdPE2OCRclY9ZdAVv7R4w0l0onSNhse17TOyQUcDSIaz26gXfa/n28MeGGdCpoG/JjS1GInmZbIgOkorgZRFKHLl/gLWLeqW+sFTMWu1vPE7n/l8eV7Kx4dQZGG+mP5J/8WY6k0w5yfxlhA+aSamHWFGnzBPCnDtuWLh5CKiKpvXsXkYnVusb5VpwVexfYHdl2BM58ul04MCiQBa1azR1/LwgKm2WAi/M3QKWCOPLm0T6wDrfcqAZMKTLpsrkdiPTb3JxhxKCu94SgRhSshsflUhvemW1ABCaEAAP7VL7//nnm3m2ptbYhqxrkNjKyB/1KsBAIpYZ+yqmuKo14GQdhoAxiMPSCfqHWLUDEtLXTuRM19zbzbUTxbY1gFOSCc05uejf6XjW2dFNqDNLAKejYZ2dNDzzBXJzzkdz25G6zEId1XUhOPM/hWzgNJ1257HOVuC4cEGfu6VApQJLMBaMUirkXhYPohzKUBSTnUHKCaySvfYwdfV2TyjBpZzkOcOXqPvAo074TA/pN5QebsUX+haQ4hV2Wdr8pdeCCLhPY96t9jMtVs/+gxzv1E2COZGyunfhYnBS52+G6rThfEoo6y/fiWoY0/hlYQOskZdhDP66TyE9iP/IaADrlh9fqXGJydxXokPYZm6fnPHXvxXFibDrcA/rPkZ2vNKAr4SrcbtwN0M+Bfqk1X0wOR9CDObYtqWWOuk7NitTw02dL4WoWE1qP4KZ7ICYiTFkn+XSKCebBysgCp+No+jnrHs6PQdhK4JZI6BX2+rCA/VhQVv9MQYmLuEp/YrUjGebuHSSHbP7txfZERt3dsty0If5KTtRKTFYwZr2yTuwowmnIQFQkeYMcaU3hSnrvt7PAEyyWw7duET/3an2uyJgztviwAL2RumwnNEj+CTV9Hf7UD0n6DjNzh1HhnA3p5bnjRP2szDQwRdFnxjrcSU0CSHEaG/ADNknqSOdjf3ftr1Kx5hkgA1t61MG9qsnSnb8ctTVKgyyHLN4ZzDrRHEtOZxgO8rDYPc6bPT+fvvd/C6ZcEVA95NGR8bH34XVIRjDfutX6WzpR16XliMBYEVYo3jwcCmfAnCH9dycN8WhBmRU+IKPG+AhhxA+yqa3VERd7Z+Bsg0Qo8qM0SjvqEJ5vauR6lhoCTs/qSZKZS8lPcEMEoltkQ3o+87OJrfe7MQ0F4+mepWZwkmRJSE+aMLRfIoOdRVeX6dVku5vGOVqJwDuWbS+E/gc16PjybyeafxxY5accH7J+OL/Qe6eMHJ+7rjQjmoOzmcgEnir0SOrrNCGEKc7BLlmlO381hPinmqVTd+13OM7FjuCox5wxrZFdIR9cf+3yrzx5VOhTaYI0tECCeHkS8cyV59YDScV2d7sG14VD+EZLRelNwMrfAoMscoqzbyiTqA62D6QFEAheHYMPPrFajvEijrWjGq2731+l0kOSU9xFbizThD+4Qtub2bSlc9wVJ7SaHKuI44qxiENfTxzzPPsZo8kYnhu8sYUgrNq/fYF2waH1Ok4Hsp4Gs1V+iu/cCOhzQcJVXFlfpkPQKhdAAVf8oQ0/sdelZ0mqMzRSMBFOLwgArn+Pm5dQpUOEaFtrzwdiX1igbzVOk7COUh4V9+3BC56vqWRcQ4JgDnwn3CJDJTIWrxJIVxOrTPMWfcuIkz61xduwmbqbEz1Tz3r0mvXIgKCYMwuUqcOfUDmSub8LzAaMloCiZewtcAULm9XhcIGeVUOiT7pqWTQXbZ7rykjdCxnnV/waydv7GcuwzREw4Ap27tpcXacuC5DCs1okKkQCtTGdBrwF7Q7pdNp+RdVVPuAEOo9y0RHQyHhoY2qB8SzWUosF3mvJD3hAIzAKllGPm2kRCtwz9XEpZpYAxuhk7Xy5HJex+wlI4txk/tb5KzVPgf3tASj6gS6BDV2vg52uwAZ5ogOeJczMd53l8sKnDtopuiM6B1l+qQT8jG4Q/Rd6tBUo56rK0N4esm024F0TacYEmYCtXuMiwG0RbYyYMAAeWBWDykePyl+qm1Uzz1f4CCVHevIyhA6qU7pVPrI8bGW84kP3otZTwT3ZbpFUJ5vtliZMUAoEWbkSvP6HZuzKO8Nf0ncuCtQzNy0Pz+vH1fUjOIJOisc916QGLy3QPAaA9/AfXOGYevFHElIS9AORSoXO/xUjKeJey94yn4q1WB/WBI0f5JrSP2nKCYI+D2kSuPaoS300gdbB+L13QKVeq+p9YIfgBUWDLtIrrFTomMNh5e9RtT876duAAa5t5uF37XNZ0LDYo1WuFtgMIsYkH2Cp7PodsY9CtG4lpnVRWSwxG7hMyOOmSIN8e1cSdXJ809Q+06S7f/70Vxvng9VBGddN0sVGO4XRxy2oikIrnAkyEiFW7g6NQqNnHIYed/SzYcat0RxFaAHvOIibaLI0YMUxbMwEGOIIF1g+VBQUTEevNNHc9tAFuNvDnabn38PigGsSMTBAIVpUVGztwVwz9/OtEbeboRuRANrdt6hz3QJg0AnmQSLYUcuVZA1hQx23erBcIwzGstH4VmbXNHhSl2B9C5skGlq5qHeRtHcbm+LVzq0DWjZKIjMJNj3yg3tSwGMMAW9OhFcg7lYM70e7GCL3jG/fqcDl3GRvzsHxxZDp2z+I0lKE9W8QyQlGpp+s4VnRYQxUdXxk2rGweU52i2GpUh+lcsrnhjFSBaRt1J2V1FbJRHrzTWqQ7GCTa5rn4XSWldvrzFwlPFzXnJhGhFL1WB6IkVjpwmvwgB0QYAZNjTcw5pi4EvV1uNSGcCcZzAbHexpvco8vm33Jj1jK5nOsywpWw3Tzt+he87dlRvEXgLBC2Zxu1Zk4AlofzW95awqa0VTW9NwHhKx1gYt2SMQk+0DeOhiKXQs7114BlRZ4RJsLvoBptKVWIb4Q5fZZXbDUn8h6bJkV+ruaKEIPKmDIffKdjyAJp1xA01GmaYljoI9NZZ1X9z7pgzNAZwHccAwRsR4i8YJoXyZlv8hCbonOFfNxsGpNQAzJQVtqQSflOqHAq8KOjysbVlW2or+P5/r1zMRVt0EGP2NZ8kq6p3YbzW+nFdz/gdB/1l+wJ51dORihv+yRDxqohBH2AMxfrhD1tGn21NUr0dRb3SeB9DEdSQLgJaEWSuGKomkakzWAC1XAAAAS3+Hnk+JEgpPPYkOkrb3CpREOE6FD4sCn2pBc0kM+g7xQfFswRiqajN+9gcANeUOFTLBEg5nj7qgMQW5Vkmya3CXfMvqTVXkMenZKyJbPwurzaZxpv9C50UFMxHfXpGWOS00ewSBNTpUqNn/d6c8BeWBkKbF0I4lcOp+HmbUWjVDcInQuiucxLiAV2WUSNiYU4IwyEFwplipvF7VbToiyxs2nbphbpdODwx0iaptPJ7hHS9WzyuLW0d1ZGIANbaVkqIUPOCMIObCpdBMPjtr3nosbuode9ITOALNI+trMeGGdfMJC1dA6nTCLfANMGtAS/haqJuSO279AvlhbByARZt2cjywmTM2aBwp53tRZz24VCdNLBTZA+yS4Kv6lpEttRYF58P+0b3rC06iCYKzCdic+eYiqBNqeE6OAxyRdG4AEmMlXFsvo0uNzWDkU6riC3yj5ia5BeM9ZNWreUaSuNj/x3Jt5aP6+HMnTplqHZEnc5o2E6L9BcLh4YW0FdifRCLPtvyo2L5B2e7tzZFKg5XcRJwHrQrwwv2lxKIY4D/fBh+O6E58xJmIsNUrMb1FVJLFQR+FmPQxA5cszhV807vm1vfxHCtozPeVsyGrvtms80ig5Cpr66t6b8JYNhFiVXxwAUfAEk0ECWt5IW4J0rqY4mNQ2jSQwOQWEq2Rw46uq/hA8I6ZhWf3X9WoSiX96KdsGCFa1vYddb23xLqIIkcnmxWVELyGg8R3swu4vfl7AqNUXFnXOZgJ4D2kDzFP6k7TWWR7V8HBJAPhtSrjhW4BI2dW7pTQZHyO1cNBhJUeVzG4jGGhxzH5hg4BJjnUp1KeSoRng6mPk32EQNNL9Yg5rEWUXfhQA34JZYu7/iwdgC3TNkmoTSidDn4BEpKXd/J+xOYJbQdVAdCVAIeLlGcISrvLBRx7F5yUZ4A4ytHhUeIWny9IKyrFiCkVXw50iyxPd+f+4RrsbzM7LWdWhD0nkjZBJ0CYvcI8UsevmU0Y5W4y/wf58T1GVzMLmcKzmenimyL/eNrChXHuFqzJWkOW8lU3xlU9GVKTANiCNfqnpMghdWpiIf+WLav8+h03Jgz9xUmFLnKFNHtKsiKPzRtyqZaiks2TOHS2usneSD23x2Z0OQLdCcfzczUhHOkpJZ+B63a/uWuafZuaINJG1QtnznGJgU8FaguN6l7ZxpxztSktoZZ9OmJCa4p91UbjsvqCAej7KN6Hn0AM2aoBlUbuUoU8T7zBsMBvDtsu+Jab2pxeYRpSfe/L+MkjRSEKqoamIvSWRkF9XCnr7QTnvFk+31+sw55EiaRUet8+PX5mRTRnigWOw4zeK+HPw5SOLdfS6McVN4+mEbcVvQtwVg8w16msc5gJeqKUwlRMkvIHk2Iw4LEd7V4iAdY6bbar9MOZbccg9y6RPUGKLWHNxs1X6BOC6PiHsavaROHl93uSLCZDhAhqa2IjXiq4Y2OUCyYyn7NLt34Fcu0oCvtxS9Q5UgkgKwGk1eohKD2h4k3tZqOQ4CsoPGSE0+0oTD+Zn/+LMCF7ebOrIZosk5xH6PcHgYJU41wjt77Xdc/PTycez71Zbc/tzLbDuuvKE8meIKF4RsUAe35wmQN9hn9y4fSqcGRjTlXWZdmwsFU7rLbXWWN57BpP3RpgjU8pSGGgdeeIYWMtqZRuUMeV+HUHpbe2ITqokxbueEcGw3mZSroXtNk7sPfT3+BYHEJJFdW5qrHXf3QeUAFqzPvH2CyspF1B/UqeDJw2KsIT+Rxs4AyGBfwsYHo5aPQ+EwSX7zh65Uw0nbHK/A4uaw9pJhIHWdBAZcW0O+O34GUq7hSk0j7mKBjau/WzAhp+qYvApcxC763TpJOMOnmz4ZBIhnGpG9mNgNVAlhKXHdcBSn15xoDLeJdY8UxCnCzLVy33IdihH0nkB/CtEDTQ9fvQ7e9t/SIUv8OuXdxti1xBm1O8MYK9e8OS3ZMpFpLUVItAAvWOWqVp75dJqv/KjVfUv0MTiez1MW95xSoXdtbMcjXw6wpH08j3vX7uyWQyPXfvIBgcttgUh0FSGH8haY47mTM7UAjjH1qOeXTg1FCNKn1i+0p7fT1RayseVn/JFxyac7yCd73yiFH6v1lmh2UnDxGnyMb+1B6bqouN9y7vm/Cde3lzCu8CgPG4NwvMMAEc/CdMugXe9W5WW+9Donb/Yd734NS6psCDPrj7iDyyYLQ/aYlpyEk34WNJIG/j8NOBdrG2EVQkbQ6n9xt9yTQHdoVR70TezubWY+L8cOKcYCapLrHX2Gp4NW/FuNG8CwponMQA3fuRm8J2NwFJyE9VIFWXtUeyBM0GrNauGBnVK6Vcd0fVX2LzNq1Laza79PApMp07p+6P+YSRAEOgCy62W7/dX7VxaOBd9NcIPGa0hSxzdm5O/zXc4xJ13oZRyJn+gGRbEqtyKEt2F8HgxQ/7aUOP6NNNZdMgahgi/6QL3PNAJ1+S3i/NMT5soVgEbYNRIls9vxZJpuBJvdXAVdgkaa8ug6KWAUkCkq8AhfvXWl4ZAIA4ywXqcI7oEYkIM+u4mJLomKAp457acSC+rbvVnP4uCa0YEas84d2N16oDBg7X1TybblM0g2gx5bJKoBA7Pi7E9GeEy3f1ONXTjyzlUTpjw0DuQyawgcMB8yB9ivEhElzVbWIGo2JInmVjUTTYm7zclQnodxMiWHu/4gY1sJHZTYb1gnQ7Ost8HPeectGQrlXRYT3z7xsWicB6TyID3eelEShfgFlz7WC8ihsEC1ie4yFJ12RX3Mzy+tZ9vjLSHmTk1bWEnNaKj5e7s0VquzZeF+AFIIuEvHmlutO5pUZDMyO/PH0ImS5WtGvEPgNdhtCNl5FPoN6m0FeeM0P2jlU17+YINyfRgqRXQGgfdCoaqOTJyaNkkstlIzAoTwrfZVLrmlX5cNi4967BG1Na3peyz+2W37YUi1QWKLCWmNQv4f3UpJsArVWybWk/bjSlD3DhQSdXHVDRDnDC0dGdxEaXZQGoE/4feCjpN5f//+z6TOJmnJ44aPULIBS07kinOf6eulK75cDVbVIwvR22t9lvFE+TRm5MD6dwdA+/p8UWaWFPVJ/fIsk+OAeZ4xYR4SQw4LtkNah7VJkPNU8CNcMnsU5IOBGzq/WFjTwtkHjFw3xWAGz6pHo3iU7UkFt1ux6WleQOy+DGW+7bRcNd1/GHbkhQmsDZIYHevfFG+RgnLOprdBFsFcO3yhcloHpZl33754FGlbIssQQSepK7agsUh9f+GCt5nMbxPLAPolKRTnJ5ZDHB8r3pp9V1jYtVru1FAmNkpbOZevr0NK4uoSyGHGdNsySI4904GNmOHsZihxsRMSn3lp89JZWrWgOy0RMZlP5/mLCvaGlhiddjcJhySXR8qAemkUeVyMFcN9WnKezAKWyWCpTDkDOwboOmdVSS6MlkubX37DeziRgujqNtXw3ZMV0HJKpTpLmXoXUU/4lwvRMbgWYyabjz1Z5aktiyJDXzLQKz6jHCL/vvb68SQqnUJH7j5ZuTlZwuDCV9xz21CVVUwnIaadyfKvVTl+62PVDUnbEEeX7J77mZahMopK58uhG7qOuTqtqMlj/esFZePOMerg7MqRrP8kFbgXZGTEnFfezSIuPaLRr98SqHmFqpboqCQR+LmhbNTl/5VPexJL8UT84oTSEdM8OeKKSR2HPARwp92eHzNkkd1Pg5Zt9BHdSi/E1JsFrxnSfFBEd1KbqbZ9eNCjJSdwV78uqhDMhd4QF7jAVJUEV4DmgBTrxLb5kg8naQIR3ZR2foNosB6WGYlm8QAAj+rIjREbp+VjnHBGHhnQ1OSlrrIzj4esz6MSAlUYrtgUhoNha67QaACYhuKwYdialcS0V5UagCN+n9uH4LLecTC/hy/UAXJYB7UhNbszxDz8JLf5TXnnndjpGSqDzdrCTiJnutImiKQXEL/1S8gBBtbSvePweSiYH05ee1zZkJGEPOwdfshFw2WhSAJWnMgMKZX64jiB888hAjLQKGPHPmw2s76UpT8FXLlWOk2TZxQRto318OMzuws/N8BWWXl1IM0DI1jp1Nx2Pxr4XaEPaD4l9CyavWOdxkxLetTcx18jH1z2CjtA+qvsnc93w3b3jeqAfpfKUcwy4vruwunRKtmCxnNSYeN4I64NOV04SaisfcZCh6BhadQkuCUa5ayvT0PIn5JTRXEfmpoyRTaTQFakKqXCWom/ssfBKMFk/GJ+uxlOZyEKdlCBvekzjvvicRTYIQtfc9MAF9/6PwfufP1dgUjPGTt24XrDlpQAQBY1hx5Tb9alS4mgI7eLMNAqxRd0whQjSrllPFR6Ecq3zRDVtIy/+M9rU1RIUTTTixkyZNc7v7IbIRxmwj3gcFkrANfAge/+m5BDUBZOsjcmjf6T7iiY2+KwRrT0pvW2OZonrOnhuMvYviXnmpe1W7Ej2CHGGcgecDxpWm9gVAhQlhLS+eUdRUA8cM7qU5X859RNSqnLkGfx+VrgvxUNbTkTyMnA70e5IER3KmuB6HkMGJeWVfNmRk7WSBOn+GIazUk9BHANJn4ajbRa/BUwL/z3vdXp9R2emcnVIj61cndvQ5sJHMSYWVriV8/fmU+LvyxiJLwOxL/oVD2nXaHGGhAa1TstAWEYL0BGY/liVZGRYCNUOVwFgdkn9JYomwfXRMikBhUiDor3eeapPQaS7lHGs4vleGUtdzuTDAOLSM7IKMB+zOEPnc752d9I+QDbsoleUDr88E5DO+mA3Le1aErGPisq07SpJ9PYFXMPMpcgZj+QrGDvJhJaJi8AADHfEHTigDO4djqCOJLP7RF9e2Cq90XSPTTEG1cuXWNCtHq4H6C178oi7D28pAkljx4SNbsAKpCaJm83tMucxRiX3AsE3vbJnfCFR1vts4U42AkgXuvvruUw0NNQM19uY0r2/FSWFUEobqRItr5CpjNH2s1YntvzbG8psLOtfXyvyfifjlKZmXbmYIxe7tW/5AhZsWPJk50/VulP8/wzUPBQi8dAAkEdba5KMxp9rWE1lFjyu1+LG7svz1s2IPGRZ3UyQxSiDchoKew4Tn51Rki3cXjTsWpgPKT8jESp0nZ/NnW62wEZB9dVdnlmw9XClANWtrrvIXIBwPCXLCURRVE3Fcu8R7fhBAwCt3ziLrZKFamrHoX94+kaE9rmSBsmhFK6t9TyW/0PBBBo6q1l4YlQl+f4kt3M7CPTvlExbLwSPOxM4gC+VVQmlZK/4dI1zgSMmomGtWdFFCWTOOwLtYycBth3j4FI3OzWm34FHrrAEpeNQaOcyhVnvJEIAdYo3En8O2z323QC5KI0GG4KKVfzaaqgn95RzSDRjBT6kdZSekjZeo4xUI5kLt8pzXsA1n1C2X+CSx54u+P5kfxbVvVcuK3Po9dH/6f25LcMby/JJSyToOenT+kFiK+KLE5+qYG99rcOF5JuoNjTWVDkW3ey/Qi5pq5MwjvTQXPAmXFGzUoMnGJ0aU46cbfX92JbgFRiUlYUH4c5WYX4mrCnlcY6dKQit1qiL2ExtupPEiZrAH0ujoQyiBnMi0pGMprjSesasulUXmojypc/sgaN+zokFLcsUgSW75p76DzQEzXDf5vQMRof/ydP2DRs/2bABoeA8Lbi2XoPC57LojtFEsOHu9e103Jk0e8tE7McnC05jNPhuTwwlRMhsAFIderzgFCyRlxUnZwV8fEWhOf2zrYqI6QmCWlwiripLKX36ASTIKLNxcGNCB/pl5esLz6S863Bw88tcnzsa/U1wwXbwr2JUfN3akGOCVdKROTeiWv2XMolr8UeIc0IthT4teZuVVDn+hbL9y3oX1SUvo3Ztrsa/YdIQtt4SF/4j8k+kDtBAbWbKqY5xBjsXNemx9QTeZW/iBafODpBWHUBtWJHmPgP/uX+wmhyiYwVhYamr1SDGq6EiXdDSWx6ABUdk51alzjzBW/dvWi8teKaYwkauXXd1csp14Rb2ivtWH1A3DYyDlTrWu3nCumiGyiG28aEHJGMtMcCcf7SqreE7bEvi6Wh/HH8MJCiUpvXGXYyPDxJKIBpnbMU4C+skqR9YF458K6L08LO9RwT/AC6HdFfI+ErRdWh38Uyl+9Gxgvv/Fkg954iXPbr8qv6Y77jR9/rQYsngzUiNodVPIaOfKr0pq5nXLL+K8ELmjSDO/725Q53jIUZ5NhXth19Z3gnPcMeulYG1TF+TgGs3VRWWJafmK9NYJUmSv5oj3fcOyUlPdeg9amkSKB9FpUxZUG48PbHSBbTIcV7zW/L8/55rn/hOugsgosuAoOQqADY7yfA2gTBd21wWGrCHBJXihH2NaEeHvgSw5inIEVX1KOYHkwuUmJ0VWNbf96zoujpAXShzcZknnOUxGI8+nc+4AWReCFqCy0iLCozsCp3SizIJpjK88ArTcwrqeoploCZNZLW3vxaLgDk9xDA1W34n62q2+VHlUJHge6YvQm4SaaF6ykdpWbpzlfwr7q3oXqSVXLlDCbiFrGeSt2aQ7418QuRHms+Ad56lA8Zpcpb/nMatinAYjs9WMFzgSuPXnCfqliGXbsl9YGhH5X/GdiHgZnhBwTN83EW/0tzPv8U+aD79+9zuAcMX6tA6cLwbfkv5cQV3lalYO/ZcLbtwb3908XZQVnRN8wpSw20UOPiWU4VyDNTRn4KRpn0T8GqxUudvo61A0sYApyr2UFclPVdKs/BR7mQ85Zbt3AWJ5MJI18Uj0wxcFZHvyRiRqcTPyth0pdkhoUnBlbV1wdlhlqL/H7BybyIjQouJzDz6FDa6nqO0p1XBNKm9ZwE6IovgNw9C6oFwXEUlY2Yl8UbKgm0G70SSgMNfXzrZlLXuaZWb6iuS3/gNBduWtOl6OXDNP/h8cEvitZI2XmzFF+g11/uTPWi1bNJMxZygrgVW9w5TLWahyFibI4IdrFqPAApkOM6VOrd5ms91De7+VEogdjcmDB9lbOXyF9QLVskfX7GTpRDrg0Tewq2c0MoPY3vLYfRTqMimvnDnTcyeqRptEy/RPHtjjGRxYtztxlrwlME6MSrJwgJ8eOKQppW0JPahbPvbFF+tE1Stzlp2xpksEZGb3SaWpSh7zID+zID9ehOJuTyCnJT+AogRzvm6x1sB3Kk51+Xv1oImkH/vRzcXFDzzqNslQnXUCP9cDIjyCYPUybLl3draFmuka572djAE5DvxGikUI6p9o/z/x0tLpJNCpdvc0Z1wPc1UX7KhZnomW9wxlRPWqfDsYEpVQavEw5sZniWAp/6TKUdP0NkhwJJIoTHxMJqwVmte8EyI2XjaTwOwz1Ylwbd03MNQ2SBF1ZL6GgzeTIkm+On/V+0lPEs8E2vIK79udFVlw6SkmqSdkmcENPc/pzrgYrMY4PkpwH+g2Ib5R7lkZDJ83lePfcfI+UYm1//7eWpEE1w6MU1Ou/h93Js5Hp9/uV+Hn5+bwZYZa8VqSrbKfSqgJ5i/8Knk39d5IOeava3R16zPEuXcl3mkramGoDo4KFfLmXCn0arzIgyOVIU2eNFLnQdbO2hAFc+d2j2yMa4hilUbMglHdivFriO3NK0g9Njd2LwDrUtR3/WBT4SSfx/zwARjVCOFnQQAP1Xy/bddmfecET8vcVtdSU5aV72fbIzlwO1KQGDrpGTywHJgAAHqeMg29AQrmWqgM8gTAiBzsCS/qwxZgY4zC82erl+puooNGPgCuPT2IC8SauTVMMQmipHB3BDja+SAno+3KxYytYTDpR/7tbSysYHa1fGcPGICPaW6euMnnY9fOvuMhbcLYLM3JFfgortX6j+0/oUHsfZV6mFrCeVCDxrB//cIyb4TK4dsvh3H9ChfOzeF6vemHbSJ2IO2l231jkUU0WB3mUJULirLuINnW8f/jlKfXiv/m5PwX29Te0eii7r6DkA/i47dzZ6BMqRFcUwBvCpDFjOoPKm4fKglN174lONcfv2/ADk6ZXbQBOdxAAA9TjfdnNvyvHQm7qRXJPjoH7v33YT8R/5BAkjsTBBpfazpP5nGG/wuVmU0/G7FK0q6V7lrJoHB+2csJw/5BbP7ILnmaeAEGPTColds/G2alH19qguFnuK7tnGUcoaVIWlpp23hqL7C29nSwCjtgyj3vq13jsh0SopKvxdsxQGG0FCDle9IgsKhnqQ1eFfkH5rCc6FTecbBA3Tf5RQKpwtAYw5owRZlDR9Pwsn7j62Md4gEQUlb1J3bpQP8b/bnZZKK+AEA+SB0fAd4KaaJxoU4sXrwsYxyfy3KSAHZCKa99i2Is8ymNWqwg18Fv6M0f3ZRJzTmp3XIVJqRRlLUkWd9XlA2TqOGlWZMd0QaaxTSEaHnv5zA/f17IbucnmUM9+VP+5acICzVzvTkbqWz2mQHDAzFcrfkqr2djwjdk1CfAPlbY9kxrYZ0Tj/ARlUq8Fay5glZFaRfcEYGyaq5uuipKXF2JxM3AvFceUgD3bEuAphlUNBwx45OYNYJ5j3VNMDM5aCGDITRdyn0FIORawGqbnFw4JrMemc266FCOJhQ+VirpWMF2RtLsIAqhOHoSIx6RBpLmpDGwEUJ2SHef3AYyMalT0SMkHu7U7VxfGSNXGk06SLCUa9/JK9p6CqgaFXMbz0JsV4QA08JWgwpxKRgOLus+p7kFvYABd8H9MXk5Du6ZrCT4urOq9Y5Iv2Oc0DMtHch8RUiTq0WuxxOu4S8PbwDQaUHtteFbdf+uR9lU+WIuho6s1eFach6kzWwh/9WFPnpuidM/bwonsDjCXxQYwO4lVOm4nHUnKxkQ7bxkF0Z4VrZj+k5JuvCCq8hMLAVjpvJn/ZEta8AeWLoHDpEMmGHjnhVboZ1hq0JXOwYmXTtIWUznZxJEvPrDW8orNsYFJDOwzdoo1A717FtXbLsPsaiJXA33j4ZRHYxBuqpQWgFF9Tj/QL/0yWwcL6BKWjXJpcguC9p0gs1x6Ww/Z8jDVtfNw1XGUUMcO2TlkcXIr2eNj6FCwYHgVC78PFfDbQivPbpdIH+BXk0mIc790CiGe3TaE6Fesj6ZQfHznvjMyN/xyhV9KiSRJ9SaE6mp8y1929gXO+Il/AnLBkIYgxvYOjf/GTMp69QBJhTmj/dpW9N6kvDy8qGk6MEcnnDQBD8813d5Tk8V/YjoNmJ3IgNL2ySUS8aw2x2pgTETV2QWFZck0vXAuEG9YyxX0Sb6oAW99AUwSqXtZFrYyb10havOJlTPzSxlylbPicKFpkgMEwWzA0SRqMUkp1FSlwlstForvbyLosQC2xh36r3JhBViCTMSqoL+H1hgzYp4pEUAj7OcR5iB1njXhtKpWAy0HdtgerNAN3l1Gi+iCmrzqr/lEwVBFi3PeM36h44u4TJrmMJW1HTjMzcwxjH4dNuFvvsrBjLLgQjoIiwIBS/SorqJEc4jUTuObO/ZPKDEWs2M4EryZ0QqBT1p3SxKHroUsj4uhc5XuL9NWv13TLufJH5h4UYirgoktSGv4pW/IN3YCu22fabDuD1DaNUFYdG5ZcO753xpQjOUI6nO3mzeoVS03wLVXMit07ZRzhlt6JO4XVkyxSU69bU+Q8DmUgCPtu20s+05dVERuTLyil20eS4qvOcqCc9G2w4URj5VvJ7iyaprG5GykNcu9tVsr2XtqH4aVeBm6f1e+sZX4cQ4Kf8diCkqKv/wyLL8vfAU8WC+utRQ2JJIuCQPCNXWWqAbpFykQA4k1bWQFs6hv5JHN/2r251MlRmYOZ1SPv6IimPiCXbZkD0FIruUMi5QZtrYBhza/iEqKx0RDFphbywi9Pn4xBjtWRP4DqTDkZfS/CRxi3ZmXScJURExy/g++sY5w6f5G8OB5cni5LZ3J+ztburR8WHQRw/Dc0jGF+KZW2XfaYU1wQCmNyFZFwoEZbLm/t1kjK8WJbsFm7Qt+B4Ds+cbArTTHCPhB9Mq0bgb2LvXuh5v2VkIH6g+sKHJdNUbwoUs3lNlhzwe+EnGaBHhst3twdfgjBUMp7CiTqK6vXKmVQ30cfDzBNTjCsXfB475hgN/1V2Xei/Q0nl401yrT4fjky+gcE3JPyw4B7uyvvJpNrRZoBFD86jGHg0wP64nqzd53PTm/tmFAgVONYlcEk1+4NoenA+JRUge0qsmNueh5PwZgZjhYbURyn8R34DIPSwQBzKfEm/NK+s5187fUnUu9k1CGXbOQ6yjPqrQ94RAGC6WMqDqJD/je1G0TG+zpK28ozTPMHVbavYxyz4M34CKaVCWiJtwBCJhyJKLboaHXRrdn+P4NfbL4CO74rBQWQf2Gk01U0CUn446BnDPGwI/3ipNZ9eQlaHLvov9jBfjcav91RFjDVC2iisv1BHvgDfg+Xc25X9mvgH56o6JY17RsVZwaSqZOcTwC60htxVWeGf8BqlcqdOgDztdx7UXvMjepWgBLp7NAUFfq7SDWTizmbtVcENloS3XoLrvANKG8psqjE/AbsLQKDU4fombQYatepf+1aF+yl98ZzT5H+FGf99drVusQqIMdtx8I+uwcZw+xhaUZeBH2LCb1Q1q2qtMDlmBPf1T0D93dp7oHv+se05yyw3LO8h0paOuAgG32ISFRhBBEAxE9xb69PS4NT+4eZ+GksetCzq6KmoQEkKUI2lxSimfKkmo1gyiFylTC8ZsM/Git2M8kC7tpQor0hCsLQ0EI0crd+c++359Od+TqnSe7KqxT/lP/VlQ+GetJnU9L6v/RO91a6HQXXqX4wcunnj3KO0TAjRxkXYAtdP5FZ2Wjkv2Zgg8BF948nFPKTA1eVcZeXTmbYPHRDNrwIuArke6QpDWq57ubOUSOUFKoBzw57Jaj0mFM3ENGUjIp1yoU3WQACeU1lMR2NjUVZJVtbLZ0wwN4u1FWj/nEMU0vKLoBtXyeenyieKQbtzD6w38w9Kmqhzde+gSvW565wiVagHuAb8ym1jfkVymRqEliqgD06a89Knme6wk/VWd6rqSgUz+jQ0UrhpWj1cx/ziBO+gfeUIpbd1bfqOK4aA2tccbKC2ZkzURjNUHMecRotxWbVNQ/+iynXnn/zR5OcFcInN4aLUSWhcHcLg/3EQpQa286eoaN2B6bXiK/IpwuG5vaBfM76xTlf1q4PV5bOofFnIBsZVl+jed/wZoyAYPGx3XKmCXdBk4tUvfy13dmyEuj9WbCxx/c02TLMuoCy24m/2zWPI8qHHh9cMzMOXvX0aBZ/lSWPNMNSkH79i/AUvpM9iKUzMuk9DxOdWorcYDGDta+KIM1lAbnE0Yzb86QMJefLGAIKkQ9T9v3ayVRmHTaX/lObqqTp2EY0cjwsU5TgD2ygGKiesKRd+gHLE5f1905FHCyv8cZPSkM6Gubh3Np/SNGpjVtFRhIAe9KMvt8DOPPX/L5czbk8g3Dhx2aFkATrh9thyXjpUSNlCYe80xk2LE6nw2pnm4CsjX159YRRF5Nn/2bZo7azo59jKrj6ad1Y2rrD+fzuWsm78gAvmX670UwdEyGUrLlpmqxKajcJWl1XmjlZMp5lvhw8ONJyt1e7amezml5tx78zrOAlQQL94eeG6Dn455NZipjqNPdiUmWc004wqAZX0DiXuZa+YevCdqLXd7JQAEr1w7WwjQ3Nvc6si/CwD1DdXpUIbwwoaiDs/3cEVo782uGV12O2wbY9o6oHJrSDgAw3LULDC5xzoZjmFW5rFVrwKqWrel8bC7jlFJqe0V0MwFR+tbmW4l/Ruaqy/DJA3F8/Otc6W/ikVTw1m8CGt6RAfWByUq6tbUcCu1ov8B+JxuRpuOVv4uqsP+ikT3Rdmn0Hs8dGzyaCU8WBx2HPTZv7jxgZ6APkVwtkimTsRVB3nldwZoIU7vw3UWbSDN1dfvmBKTnAQSvTYbfZXR187/4KkNvroCVjG7XxNO7EwoJgNViRwDm7E7Q24UEbbtsJmo8CFmQQ9ix3YIgbqE1cAD9DSnZAvH9LIAxV3X371KLNZ/FvcWGZbCQSEAntuKPEKvkzmGCmACgqVtBOUTHgOyhTBmPYjrDX79DBQTRCDuljIVOXAIP+e0vQ3IXs+z3AJgCr74KtBzQ4Ezxt2DSscZXjwT0yg/R44NNAp/NEOTYXY24i42uE9sn1/+z1IBdQOOvaugQp7TzwrgmZaFUb18pC1u3svMZNYJcqb3xWTqg3hPxB/Yub/Q2XdJ5pLBifcX4w3zIILdvuQVgJ4tA7LW3YDqzhhvtQ2eF68jgKDzpuLrdWmurjqptX3OmJ0W4NIRNjSa07c14gAqLY8a84mI8eOQ9aqkWNHo7oHLIW
[truncated — showing 100000 of 178555 characters]packages/react/src/components/wxcn/weather-scenes.ts
// Shared by both photographic and monochrome rendering. Coverage, mist, and
// precipitation are independent so, for example, drizzle never looks like a downpour.
const scene = (
plate: 'fair' | 'overcast' | 'storm' | 'fog',
coverage: number,
mist = 0,
rain = 0,
snow = 0,
wind = 1
) => ({ plate, coverage, mist, rain, snow, wind });
export const weatherScenes = {
sunrise: scene('fair', 0.65),
sunset: scene('fair', 0.65),
clear: scene('fair', 0),
'partly-cloudy': scene('fair', 0.85),
haze: scene('fair', 0, 0.55),
fog: scene('fog', 1, 0.65),
wind: scene('fair', 0.6, 0.08, 0, 0, 3),
cloudy: scene('overcast', 1),
thunderstorm: scene('storm', 1, 0.12, 36, 0, 2.4),
rain: scene('overcast', 1, 0.15, 24),
'heavy-rain': scene('storm', 1, 0.3, 48, 0, 1.7),
drizzle: scene('overcast', 1, 0.3, 10),
snow: scene('overcast', 1, 0.25, 0, 20, 0.65),
'heavy-snow': scene('overcast', 1, 0.6, 0, 40, 1.3),
'wintry-mix': scene('overcast', 1, 0.3, 16, 14),
'clear-night': scene('fair', 0),
'partly-cloudy-night': scene('fair', 0.85),
'drizzle-night': scene('overcast', 1, 0.3, 10)
};
packages/react/src/components/wxcn/weather-forecast.tsx
'use client';
import { useEffect, useState } from 'react';
import { ForecastScreens, type ForecastAction, type OpenForecastDay } from './forecast-screens';
import { forecastDays, forecastDayNoon, type ForecastDay } from '@/lib/wxcn/forecast-days.js';
import { ForecastIcon, type IconSet, type IconName } from './forecast-icons';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { cn } from '@/lib/utils';
import { WeatherShaderBackground, type WeatherShaderMode } from './weather-shader-background';
import type {
ForecastType,
LocationInput,
WeatherPeriod,
CurrentWeather,
WeatherUnit,
WeatherBackground
} from '@/lib/wxcn/types.js';
import { sampleWeather, sampleCurrentWeather, convertWindSpeed } from '@/lib/wxcn/weather.js';
import { weatherOutlook, weatherDayHigh } from '@/lib/wxcn/weather-outlook.js';
import { getSkyState } from '@/lib/wxcn/sky.js';
export interface WeatherForecastProps {
interactive?: boolean;
iconType?: IconSet;
timeZone?: string;
type?: ForecastType;
size?: 'sm' | 'default' | 'lg';
density?: 'compact' | 'comfortable';
className?: string;
unit?: WeatherUnit;
location?: LocationInput;
forecast?: WeatherPeriod[];
hourlyForecast?: WeatherPeriod[];
currentWeather?: CurrentWeather | null;
showTemperatureTrend?: boolean;
showHighLow?: boolean;
at?: number;
sourceLabel?: string;
windUnit?: 'mph' | 'km/h' | 'm/s' | 'knots';
background?: WeatherBackground;
}
function condition(p: WeatherPeriod): WeatherShaderMode {
const s = p.shortForecast.toLowerCase();
if (/thunder|storm/.test(s)) return 'thunderstorm';
if (/sleet|freezing|wintry/.test(s)) return 'wintry-mix';
if (/snow/.test(s)) return s.includes('heavy') ? 'heavy-snow' : 'snow';
if (/drizzle/.test(s)) return p.isDaytime ? 'drizzle' : 'drizzle-night';
if (/rain|shower/.test(s)) return s.includes('heavy') ? 'heavy-rain' : 'rain';
if (/fog/.test(s)) return 'fog';
if (/haze|smoke/.test(s)) return 'haze';
if (/partly|mostly sunny/.test(s)) return p.isDaytime ? 'partly-cloudy' : 'partly-cloudy-night';
if (/cloud|overcast/.test(s)) return 'cloudy';
if (/wind|breezy/.test(s)) return 'wind';
return p.isDaytime ? 'clear' : 'clear-night';
}
function periodIcon(p: WeatherPeriod): IconName {
const c = condition(p);
return c.includes('rain') || c.includes('drizzle') || c === 'thunderstorm'
? 'rain'
: c.includes('snow') || c === 'wintry-mix'
? 'snow'
: c.includes('night')
? 'moon'
: c === 'clear'
? 'sun'
: 'weather';
}
export function WeatherForecast({
interactive = false,
iconType,
timeZone,
type = 'summary',
size = 'default',
density = 'comfortable',
className,
unit = 'fahrenheit',
location = {
label: 'Austin, TX',
latitude: 30.2672,
longitude: -97.7431,
timeZone: 'America/Chicago'
},
forecast = sampleWeather,
hourlyForecast = [],
currentWeather = forecast === sampleWeather ? sampleCurrentWeather : null,
showTemperatureTrend = false,
showHighLow = false,
at,
sourceLabel = forecast === sampleWeather ? 'Sample forecast' : '',
windUnit = 'mph',
background = 'none'
}: WeatherForecastProps) {
const [visitorTimeZone, setVisitorTimeZone] = useState('UTC');
const [clock, setClock] = useState<number | null>(null);
useEffect(() => {
setVisitorTimeZone(Intl.DateTimeFormat().resolvedOptions().timeZone);
setClock(Date.now());
const timer = setInterval(() => setClock(Date.now()), 60000);
return () => clearInterval(timer);
}, []);
const effectiveTime =
at ?? (forecast === sampleWeather ? Date.parse(sampleCurrentWeather.observedAt) : (clock ?? 0));
const periods = forecast.slice(0, type === 'detailed' ? 8 : density === 'compact' ? 3 : 5);
const currentSky = getSkyState(location.latitude, location.longitude, effectiveTime);
const current =
currentWeather && currentSky
? { ...currentWeather, isDaytime: currentSky.isDaytime }
: currentWeather;
const outlook = weatherOutlook(
current,
forecast,
unit,
timeZone ?? location.timeZone ?? visitorTimeZone,
effectiveTime
);
const temperature = (p: WeatherPeriod) =>
Math.round(
unit === 'celsius' && p.temperatureUnit === 'F'
? ((p.temperature - 32) * 5) / 9
: unit === 'fahrenheit' && p.temperatureUnit === 'C'
? (p.temperature * 9) / 5 + 32
: p.temperature
);
if (
forecast !== sampleWeather &&
(forecast.length > 0 || currentWeather) &&
at === undefined &&
clock === null
) {
return (
<Card className={className}>
<CardHeader>
<CardTitle>Weather</CardTitle>
<CardDescription>{location.label}</CardDescription>
</CardHeader>
<CardContent>
<p role="status">Loading current weather time…</p>
</CardContent>
</Card>
);
}
const days = forecastDays(
forecast.map((p) => ({
time: Date.parse(p.startTime),
label: p.name,
summary: `${temperature(p)}° · ${p.shortForecast}`,
details: `${p.detailedForecast || p.shortForecast} Wind: ${p.windDirection} ${convertWindSpeed(p.windSpeed, windUnit)}.`
})),
timeZone ?? location.timeZone ?? visitorTimeZone
);
function dayHours(day: ForecastDay) {
const date = new Intl.DateTimeFormat('en-CA', {
timeZone: timeZone ?? location.timeZone ?? visitorTimeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
return hourlyForecast
.filter(
(period) =>
Number.isFinite(Date.parse(period.startTime)) &&
date.format(new Date(period.startTime)) === day.key
)
.toSorted((a, b) => Date.parse(a.startTime) - Date.parse(b.startTime));
}
function dayPeriods(day: ForecastDay) {
return forecast
.filter((period) => day.entries.some((entry) => entry.time === Date.parse(period.startTime)))
.toSorted((a, b) => Date.parse(a.startTime) - Date.parse(b.startTime));
}
function cardView(
day: ForecastDay | undefined,
action: ForecastAction,
overviewVisible: boolean,
openDay: OpenForecastDay
) {
const displayedPeriods = day ? dayPeriods(day) : periods;
const view = day
? (displayedPeriods.find((period) => period.isDaytime) ?? displayedPeriods[0])
: current;
const sky =
day && view
? getSkyState(
location.latitude,
location.longitude,
forecastDayNoon(day.key, timeZone ?? location.timeZone ?? visitorTimeZone)
)
: currentSky;
const skyMode = view
? condition(day && sky ? { ...view, isDaytime: sky.isDaytime } : view)
: 'clear';
return (
<>
<div
className={cn(
day ? 'contents' : 'relative isolate overflow-hidden',
background === 'realistic' && view ? 'text-white' : 'text-card-foreground'
)}
>
{background === 'realistic' && view && (
<>
<div className="pointer-events-none absolute inset-0 -z-10" aria-hidden="true">
<WeatherShaderBackground mode={skyMode} sky={sky} paused={!overviewVisible} />
</div>
<div
className="pointer-events-none absolute inset-0 -z-10 bg-linear-to-b from-black/35 via-black/15 to-black/55"
aria-hidden="true"
/>
</>
)}
<CardHeader className="relative px-[var(--card-spacing,var(--wxcn-spacing))] pt-[var(--card-spacing,var(--wxcn-spacing))]">
<CardTitle className="min-w-0 truncate">{day?.label ?? 'Weather'}</CardTitle>
<CardDescription
className={cn('truncate', background === 'realistic' && view && 'text-white/80')}
>
{location.label ?? 'Local forecast'}
</CardDescription>
{action(background === 'realistic' && !!view)}
</CardHeader>
<CardContent className="relative grid min-w-0 shrink-0 grid-cols-1 gap-5 px-[var(--card-spacing,var(--wxcn-spacing))] py-[var(--card-spacing,var(--wxcn-spacing))]">
{view ? (
<>
<div className="min-w-0">
<p
className={cn(
'mb-2 text-xs',
background === 'realistic' ? 'text-white/75' : 'text-muted-foreground'
)}
>
{day ? (view.isDaytime ? 'Daytime' : 'Overnight') : 'Now'}
</p>
<p
style={{ fontSize: 'clamp(2.5rem,18cqw,5rem)' }}
className="leading-none font-medium tracking-tighter tabular-nums"
>
{temperature(view)}
<span className="align-top text-2xl">°</span>
</p>
<p
className="mt-3 line-clamp-2 min-h-10 text-sm wrap-break-word"
title={day ? view.shortForecast : undefined}
>
{view.shortForecast}
</p>
{!day && showTemperatureTrend && outlook.trend && (
<p className="mt-2 text-sm" data-slot="temperature-trend">
{outlook.trend}
</p>
)}
{!day && showHighLow && (
<div
className="mt-3 flex gap-4 text-sm tabular-nums"
data-slot="temperature-range"
>
{outlook.high !== null && (
<span aria-label={`High ${outlook.high} degrees`}>
<ForecastIcon
name="arrowUp"
iconSet={iconType}
className="inline size-3.5"
/>{' '}
{outlook.high}°
</span>
)}
{outlook.low !== null && (
<span aria-label={`Low ${outlook.low} degrees`}>
<ForecastIcon
name="arrowDown"
iconSet={iconType}
className="inline size-3.5"
/>{' '}
{outlook.low}°
</span>
)}
</div>
)}
</div>
<div className="flex flex-wrap items-center justify-between gap-3 text-xs">
<span className="flex items-center gap-2 opacity-80">
<ForecastIcon name="wind" iconSet={iconType} className="size-4" />
Wind
</span>
<span className="tabular-nums">
{view.windDirection} {convertWindSpeed(view.windSpeed, windUnit)}
</span>
</div>
</>
) : (
<p role="status" className="py-8 text-center text-sm text-muted-foreground">
Current conditions unavailable.
</p>
)}
{!day && type === 'simple' && sourceLabel && (
<p
className={cn(
'text-[10px]',
background === 'realistic' && view ? 'text-white/70' : 'text-muted-foreground'
)}
>
{sourceLabel}
</p>
)}
</CardContent>
</div>
{day && size === 'lg' && type !== 'simple' && dayHours(day).length > 0 ? (
<CardContent className="relative flex min-h-0 flex-1 flex-col px-[var(--card-spacing,var(--wxcn-spacing))] pb-[var(--card-spacing,var(--wxcn-spacing))]">
<p className="mb-3 shrink-0 text-base font-medium">Hourly forecast</p>
<div
className="min-h-0 flex-1 overflow-y-auto overscroll-contain"
tabIndex={0}
role="region"
aria-label="Hourly forecast"
data-slot="hourly-forecast"
>
<div className="grid min-h-full auto-rows-[minmax(3.5rem,1fr)] grid-cols-1">
{dayHours(day).map((hour) => (
<div
key={hour.startTime}
className="grid min-w-0 grid-cols-[1fr_auto_1fr] items-center gap-4 border-b border-current/15 text-lg last:border-0"
title={hour.shortForecast}
>
<span className="opacity-75">
{new Intl.DateTimeFormat('en-US', {
timeZone: timeZone ?? location.timeZone ?? visitorTimeZone,
hour: 'numeric'
}).format(new Date(hour.startTime))}
</span>
<ForecastIcon
name={periodIcon(hour)}
iconSet={iconType}
className="size-6 shrink-0"
/>
<span className="text-right font-medium tabular-nums">
{temperature(hour)}°
</span>
</div>
))}
</div>
</div>
</CardContent>
) : type !== 'simple' ? (
<CardContent className="relative min-h-0 min-w-0 px-[var(--card-spacing,var(--wxcn-spacing))] pb-[var(--card-spacing,var(--wxcn-spacing))]">
{displayedPeriods.length > 0 && (
<div className="divide-y">
{displayedPeriods.map((period, index) => {
const icon = periodIcon(period);
return (
<div
key={`${period.startTime}-${index}`}
className={cn(
'grid grid-cols-[minmax(0,1fr)_auto_auto] items-center gap-3 text-sm',
density === 'compact' ? 'py-2' : 'py-3'
)}
>
<div>
{interactive && !day ? (
<button
type="button"
className="min-h-8 text-left underline-offset-4 hover:underline focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring"
aria-label={`View details for ${period.name}`}
onClick={(event) => openDay(period.startTime, event.currentTarget)}
>
{period.name}
</button>
) : (
<p>{period.name}</p>
)}
{(type === 'detailed' || (day && size !== 'sm')) && (
<p
className={cn(
'mt-1 text-xs leading-5',
day && 'line-clamp-2',
day && background === 'realistic'
? 'text-white/75'
: 'text-muted-foreground'
)}
>
{type === 'detailed' ? period.detailedForecast : period.shortForecast}
</p>
)}
</div>
<ForecastIcon
name={icon}
iconSet={iconType}
className={cn(
'size-4',
day && background === 'realistic'
? 'text-white/75'
: 'text-muted-foreground'
)}
/>
<span className="min-w-9 text-right tabular-nums">
{temperature(period)}°
</span>
</div>
);
})}
</div>
)}
{!day && sourceLabel && (
<p className="mt-2 text-[10px] text-muted-foreground">{sourceLabel}</p>
)}
</CardContent>
) : null}
</>
);
}
return (
<Card
data-density={density}
style={
{
containerType: 'inline-size',
'--wxcn-spacing': size === 'sm' ? '1rem' : '1.5rem'
} as import('react').CSSProperties
}
data-card-size={size}
data-size={size === 'sm' ? 'sm' : 'default'}
className={cn(
'relative isolate min-w-0 gap-0 overflow-hidden py-0',
className
)}
>
<ForecastScreens
interactive={interactive}
days={days}
title="Weather"
density={density}
sourceLabel={sourceLabel}
iconType={iconType}
showWeek={size === 'sm' || type === 'simple'}
flush
daySummary={(day) => {
const values = dayPeriods(day);
const daytime = values.find((period) => period.isDaytime);
const overnight = values.find((period) => !period.isDaytime);
const representative = daytime ?? overnight;
const high = weatherDayHigh(
day.key,
values,
current,
unit,
timeZone ?? location.timeZone ?? visitorTimeZone
);
return (
<span className="grid w-full min-w-0 grid-cols-[minmax(0,1fr)_1.5em_3.75em_3.75em] items-center gap-2">
<span className="truncate font-medium">{day.label}</span>
{representative ? (
<span
className="flex justify-center"
title={representative.shortForecast}
aria-label={representative.shortForecast}
>
<ForecastIcon
name={periodIcon(representative)}
iconSet={iconType}
className="size-[1.4em] text-muted-foreground"
/>
</span>
) : (
<span />
)}
<span
className="grid grid-cols-[0.85em_minmax(0,1fr)] items-center gap-1 text-right tabular-nums"
aria-label={high !== null ? `High ${high} degrees` : 'High unavailable'}
>
<ForecastIcon
name="arrowUp"
iconSet={iconType}
className="size-[1em] text-muted-foreground"
/>
<span>{high !== null ? `${high}°` : '—'}</span>
</span>
<span
className="grid grid-cols-[0.85em_minmax(0,1fr)] items-center gap-1 text-right text-muted-foreground tabular-nums"
aria-label={overnight ? `Low ${temperature(overnight)} degrees` : 'Low unavailable'}
>
<ForecastIcon name="arrowDown" iconSet={iconType} className="size-[1em]" />
<span>{overnight ? `${temperature(overnight)}°` : '—'}</span>
</span>
</span>
);
}}
detail={(day, action) => (
<div
className={cn(
'relative isolate flex h-full min-h-0 w-full min-w-0 flex-col',
background === 'realistic' && 'text-white'
)}
>
{cardView(day, action, true, () => {})}
</div>
)}
>
{(openDay, action, visible) => cardView(undefined, action, visible, openDay)}
</ForecastScreens>
</Card>
);
}
packages/react/src/components/wxcn/forecast-screens.tsx
'use client';
import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react';
import { CardAction, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { ForecastIcon, type IconSet } from './forecast-icons';
import type { ForecastDay } from '@/lib/wxcn/forecast-days.js';
export type ForecastAction = (onSurface: boolean) => ReactNode;
export type OpenForecastDay = (time: string, trigger: HTMLElement) => void;
export interface ForecastScreensProps {
interactive: boolean;
days: ForecastDay[];
title: string;
density: string;
sourceLabel: string;
summary?: (availableHeight: number) => ReactNode;
daySummary?: (day: ForecastDay) => ReactNode;
actionLabel?: string;
summaryTitle?: string;
showWeek?: boolean;
iconType?: IconSet;
flush?: boolean;
detail: (day: ForecastDay, action: ForecastAction) => ReactNode;
children: (
openDay: OpenForecastDay,
action: ForecastAction,
overviewVisible: boolean
) => ReactNode;
}
export function ForecastScreens({
interactive,
days,
title,
summary,
daySummary,
actionLabel = 'View week',
summaryTitle = 'Upcoming tides',
showWeek = true,
iconType,
flush = false,
detail,
children
}: ForecastScreensProps) {
const [screen, setScreen] = useState<'overview' | 'week' | 'day'>('overview');
const [selectedKey, setSelectedKey] = useState('');
const [availableHeight, setAvailableHeight] = useState(0);
const surface = useRef<HTMLDivElement>(null);
const table = useRef<HTMLDivElement>(null);
const host = useRef<HTMLElement | null>(null);
const fromWeek = useRef(false);
const originIndex = useRef(0);
const originTrigger = useRef<HTMLElement | null>(null);
const focusTarget = useRef<'surface' | 'origin' | 'day' | null>(null);
const selected = days.find((day) => day.key === selectedKey);
const active = interactive && (screen !== 'day' || selected) ? screen : 'overview';
useEffect(() => {
if (active !== screen) setScreen('overview');
}, [active, screen]);
useLayoutEffect(() => {
if (active !== 'week' || !table.current) return;
const node = table.current;
const update = () => setAvailableHeight(node.clientHeight);
const observer = new ResizeObserver(update);
observer.observe(node);
update();
return () => observer.disconnect();
}, [active]);
useLayoutEffect(() => {
const target = focusTarget.current;
if (!target) return;
if (target === 'surface') {
surface.current?.focus({ preventScroll: true });
focusTarget.current = null;
return;
}
if ((target === 'day' && active !== 'week') || (target === 'origin' && active !== 'overview'))
return;
// Wait for the retained overview or resized detail surface to become visible.
let frame = requestAnimationFrame(() => {
frame = requestAnimationFrame(() => {
const trigger =
target === 'day'
? host.current?.querySelector<HTMLButtonElement>(`[data-forecast-day="${selectedKey}"]`)
: originTrigger.current?.isConnected
? originTrigger.current
: host.current?.querySelectorAll<HTMLButtonElement>('button')[originIndex.current];
trigger?.focus({ preventScroll: true });
if (document.activeElement === trigger) focusTarget.current = null;
});
});
return () => cancelAnimationFrame(frame);
}, [active, selectedKey, availableHeight]);
function open(next: 'week' | 'day', trigger: HTMLElement, key = '') {
if (active === 'overview') {
host.current = trigger.closest<HTMLElement>('[data-slot=card]');
originTrigger.current = trigger;
originIndex.current = host.current
? [...host.current.querySelectorAll('button')].indexOf(trigger as HTMLButtonElement)
: 0;
}
fromWeek.current = active === 'week';
setSelectedKey(key);
focusTarget.current = 'surface';
setScreen(next);
}
const openDay: OpenForecastDay = (time, trigger) => {
const day = days.find((day) => day.entries.some((entry) => entry.time === Date.parse(time)));
if (day) open('day', trigger, day.key);
};
function back() {
if (active === 'day' && fromWeek.current) {
focusTarget.current = 'day';
setScreen('week');
} else {
focusTarget.current = 'origin';
setScreen('overview');
}
}
const weekAction: ForecastAction = (onSurface) =>
interactive && showWeek ? (
<CardAction>
<Button
type="button"
variant="ghost"
size="sm"
className={`h-6 border border-transparent px-1.5 text-[10px] font-medium ${onSurface ? 'text-white/80 hover:bg-white/10 hover:text-white' : 'text-muted-foreground hover:text-foreground'}`}
aria-label={summary ? actionLabel : `View ${title.toLowerCase()} week`}
onClick={(event) => open('week', event.currentTarget)}
>
{actionLabel}
</Button>
</CardAction>
) : null;
const backAction: ForecastAction = (onSurface) => (
<CardAction>
<Button
type="button"
variant="ghost"
size="sm"
className={`h-6 gap-1 border border-transparent px-1.5 text-[10px] ${onSurface ? 'text-white/80 hover:bg-white/10 hover:text-white' : 'text-muted-foreground'}`}
onClick={back}
>
<ForecastIcon name="arrowDown" iconSet={iconType} className="size-3 rotate-90" />
Back
</Button>
</CardAction>
);
return (
<>
<div
className="contents"
style={{ visibility: active === 'overview' ? 'visible' : 'hidden' }}
inert={active !== 'overview'}
aria-hidden={active !== 'overview'}
>
{children(openDay, weekAction, active === 'overview')}
</div>
{active !== 'overview' && (
<div
ref={surface}
tabIndex={-1}
role="group"
aria-label={
active === 'day'
? `${selected?.label} ${title.toLowerCase()} forecast`
: summary
? summaryTitle
: `${title} • Week`
}
data-slot="forecast-screen"
onKeyDown={(event) => {
if (event.key === 'Escape') {
event.preventDefault();
back();
}
}}
className={`absolute inset-0 z-10 flex min-h-0 flex-col overflow-hidden rounded-[inherit] bg-card text-card-foreground outline-none ${active === 'day' && flush ? 'gap-0' : active === 'week' ? 'gap-2 py-3' : 'gap-[var(--card-spacing,var(--wxcn-spacing,1.5rem))] py-[var(--card-spacing,var(--wxcn-spacing,1.5rem))]'}`}
>
{active === 'day' && selected ? (
detail(selected, backAction)
) : (
<>
<CardHeader className="shrink-0">
<CardTitle className="truncate">
{summary ? summaryTitle : `${title} • Week`}
</CardTitle>
{backAction(false)}
</CardHeader>
<CardContent className="min-h-0 min-w-0 flex-1">
<div ref={table} className="h-full min-h-0" data-slot="forecast-week-table">
{summary ? (
summary(availableHeight)
) : (
<div
className={`grid h-full content-start gap-x-3 overflow-y-auto ${!daySummary && availableHeight < days.length * 28 ? 'grid-cols-2' : 'grid-cols-1'}`}
>
{days.map((day) => (
<button
key={day.key}
type="button"
data-forecast-day={day.key}
style={{
height: daySummary
? Math.max(32, availableHeight / days.length)
: Math.min(
28,
availableHeight /
(!daySummary && availableHeight < days.length * 28
? Math.ceil(days.length / 2)
: days.length)
),
fontSize: daySummary
? `clamp(12px, min(4.5cqw, ${availableHeight / days.length / 3}px), 20px)`
: undefined
}}
className="flex min-h-0 min-w-0 items-center justify-between gap-2 border-b text-left text-[11px] hover:bg-muted/50 focus-visible:outline-2 focus-visible:outline-ring"
aria-label={`View details for ${day.label}`}
onClick={(event) => open('day', event.currentTarget, day.key)}
>
{daySummary ? (
daySummary(day)
) : (
<>
<span className="shrink-0 font-medium">{day.label}</span>
<span
className="truncate text-muted-foreground"
title={day.entries.map((entry) => entry.summary).join(' · ')}
>
{day.entries.map((entry) => entry.summary).join(' · ')}
</span>
</>
)}
</button>
))}
</div>
)}
</div>
</CardContent>
</>
)}
</div>
)}
</>
);
}
packages/react/src/components/wxcn/weather-shader-background.tsx
'use client';
import { useEffect, useRef, useState, type CSSProperties } from 'react';
import { weatherCloudTextures } from './cloud-texture.js';
import { weatherScenes } from './weather-scenes.js';
import type { SkyState } from '@/lib/wxcn/sky.js';
export type WeatherShaderMode =
| 'sunrise'
| 'sunset'
| 'clear'
| 'partly-cloudy'
| 'haze'
| 'fog'
| 'wind'
| 'cloudy'
| 'thunderstorm'
| 'rain'
| 'heavy-rain'
| 'drizzle'
| 'snow'
| 'heavy-snow'
| 'wintry-mix'
| 'clear-night'
| 'partly-cloudy-night'
| 'drizzle-night';
const modes: WeatherShaderMode[] = [
'sunrise',
'sunset',
'clear',
'partly-cloudy',
'haze',
'fog',
'wind',
'cloudy',
'thunderstorm',
'rain',
'heavy-rain',
'drizzle',
'snow',
'heavy-snow',
'wintry-mix',
'clear-night',
'partly-cloudy-night',
'drizzle-night'
];
const particles = Array.from({ length: 48 }, (_, i) => {
const depth = i % 3;
return {
left: ((i * 61.803) % 112) - 6,
phase: (i * 0.61803398875) % 1,
depth,
speed: [1.6, 1, 0.6][depth] * (0.85 + ((i * 0.4142) % 1) * 0.3),
opacity: [0.14, 0.27, 0.38][depth],
blur: [0.15, 0.3, 1.1][depth],
size: [0.8, 1.5, 3.2][depth],
sway: 5 + ((i * 13.71) % 18)
};
});
export function WeatherShaderBackground({
mode = 'clear',
paused = false,
dithered = false,
sky = null
}: {
mode?: WeatherShaderMode;
paused?: boolean;
dithered?: boolean;
sky?: SkyState | null;
}) {
const atmosphere = weatherScenes[mode];
const rain = atmosphere.rain > 0,
snow = atmosphere.snow > 0;
function particleStyle(p: (typeof particles)[number], frozen: boolean): CSSProperties {
const duration =
((frozen ? 6 : mode.includes('drizzle') ? 1.8 : 0.9) * p.speed) / Math.sqrt(atmosphere.wind);
return {
left: `${p.left}%`,
animationDelay: `${-p.phase * duration}s`,
animationDuration: `${duration}s`,
opacity: p.opacity * (frozen ? 1.4 : 1),
filter: `blur(${p.blur}px)`,
'--size': `${p.size}px`,
'--sway': `${p.sway}px`,
'--drift': `${-12 * atmosphere.wind}cqh`,
'--angle': `${(Math.atan(0.12 * atmosphere.wind) * 180) / Math.PI}deg`,
'--length': `${(mode.includes('drizzle') ? 5 : 15) / p.speed}px`
} as CSSProperties;
}
const canvasRef = useRef<HTMLCanvasElement>(null);
const settings = useRef({ mode, paused, dithered, sky });
const redraw = useRef(() => {});
const [active, setActive] = useState(true);
useEffect(() => {
settings.current = { mode, paused, dithered, sky };
redraw.current();
}, [mode, paused, dithered, sky]);
useEffect(() => {
const element = canvasRef.current;
if (!element) return;
const canvas: HTMLCanvasElement = element;
if (!canvas) return;
const observer = new IntersectionObserver(([entry]) => setActive(entry.isIntersecting));
observer.observe(canvas);
return () => observer.disconnect();
}, []);
useEffect(() => {
const element = canvasRef.current;
if (!element) return;
const canvas: HTMLCanvasElement = element;
const gl = canvas.getContext('webgl', {
alpha: false,
antialias: false,
depth: false,
powerPreference: 'low-power'
});
if (!gl) return;
const shaders: WebGLShader[] = [];
function compile(type: number, source: string) {
const shader = gl!.createShader(type);
if (!shader) return null;
gl!.shaderSource(shader, source);
gl!.compileShader(shader);
if (!gl!.getShaderParameter(shader, gl!.COMPILE_STATUS)) {
gl!.deleteShader(shader);
return null;
}
shaders.push(shader);
return shader;
}
const vertex = compile(
gl.VERTEX_SHADER,
`attribute vec2 position; void main(){ gl_Position=vec4(position,0.,1.); }`
);
const fragment = compile(
gl.FRAGMENT_SHADER,
`
precision highp float;
uniform vec2 resolution;
uniform float time;
uniform float mode;
uniform float dithered;
uniform float pixelRatio;
uniform vec4 sunPosition;
uniform vec4 moonPosition;
uniform vec3 moonLight;
uniform float astronomical;
uniform sampler2D cloudPlate;
uniform vec4 atmosphere; // coverage, mist, wind, opaque plate
uniform float snowCover;
float hash(vec3 p){p=fract(p*.3183099+vec3(.1,.2,.3));p*=17.;return fract(p.x*p.y*p.z*(p.x+p.y+p.z));}
void main(){
vec2 uv=gl_FragCoord.xy/resolution;
float night=mix(step(14.5,mode),1.-smoothstep(-8.,1.,sunPosition.z),astronomical);
float storm=step(7.5,mode)*(1.-step(8.5,mode));
float dusk=mix(1.-step(1.5,mode),smoothstep(-8.,-1.,sunPosition.z)*(1.-smoothstep(2.,12.,sunPosition.z)),astronomical);
float fog=atmosphere.y;
float cloudy=atmosphere.w;
vec2 previewSun=mix(vec2(.8,.76),vec2(mix(.25,.75,step(.5,mode)),.12),1.-step(1.5,mode));
vec2 sunPoint=mix(previewSun,sunPosition.xy,astronomical);
vec2 sunDelta=uv-sunPoint;
sunDelta.x=mod(sunDelta.x+.5,1.)-.5;
sunDelta.x*=resolution.x/resolution.y;
float sunDistance=length(sunDelta);
float sunVisible=mix(1.-night,sunPosition.w,astronomical);
float height=pow(clamp(uv.y,0.,1.),.65);
vec3 sky=mix(vec3(.64,.77,.85),vec3(.085,.29,.52),height);
// Low-angle light stays near the horizon and the solar azimuth.
float horizon=exp(-max(uv.y-.10,0.)*4.8);
float solarLobe=exp(-abs(sunDelta.x)*2.8);
float warmLight=dusk*horizon*(.24+.76*solarLobe);
vec3 twilight=mix(vec3(.38,.46,.60),vec3(.88,.56,.32),horizon);
twilight=mix(twilight,vec3(.97,.72,.44),horizon*solarLobe*.45);
sky=mix(sky,twilight,dusk);
sky+=vec3(.10,.025,.006)*warmLight;
sky=mix(sky,mix(vec3(.43,.48,.51),vec3(.23,.30,.35),uv.y),cloudy*.75);
sky=mix(sky,mix(vec3(.10,.15,.23),vec3(.025,.045,.09),uv.y),night);
sky+=mix(vec3(1.,.87,.63),vec3(1.,.48,.18),dusk)*exp(-sunDistance*9.)*.19*sunVisible*(1.-cloudy);
sky+=vec3(1.,.88,.64)*exp(-sunDistance*60.)*.18*sunVisible;
float solarEdge=max(1./resolution.y,.0008);
sky=mix(sky,mix(vec3(1.,.99,.93),vec3(1.,.80,.54),dusk),(1.-smoothstep(.008-solarEdge,.008+solarEdge,sunDistance))*sunVisible);
float stars=pow(hash(vec3(floor(uv*resolution/2.),1.)),180.);
sky+=stars*.35*night;
vec2 moonDelta=uv-moonPosition.xy;
moonDelta.x=mod(moonDelta.x+.5,1.)-.5;
moonDelta.x*=resolution.x/resolution.y;
vec2 moonDisc=moonDelta/.022;
float moonRadius=length(moonDisc);
if(moonRadius<1. && moonPosition.w>.5){
vec3 normal=vec3(moonDisc,sqrt(max(0.,1.-dot(moonDisc,moonDisc))));
float lit=smoothstep(-.015,.015,dot(normal,moonLight));
float mask=(1.-smoothstep(.94,1.,moonRadius))*lit;
sky=mix(sky,vec3(.82,.85,.89),mask*mix(.5,1.,night));
}
// Photographic cloud structure, slowly drifting without a visible loop seam.
float aspect=resolution.x/resolution.y;
vec2 photoUv=(uv-.5)*vec2(min(aspect/1.5,1.),min(1.5/aspect,1.))*.88+.5;
photoUv+=vec2(sin(time*.012*atmosphere.z)*.035,sin(time*.008*atmosphere.z)*.012);
vec3 photo=texture2D(cloudPlate,photoUv).rgb;
float cloudMask=1.-smoothstep(.045,.24,photo.b-photo.r);
float cloudOpacity=mix(cloudMask*atmosphere.x,1.,cloudy);
vec3 fairTone=mix(vec3(.38,.45,.51),vec3(.98,.98,.96),smoothstep(.22,.95,photo.r));
vec3 cloudTone=mix(fairTone,photo,cloudy);
cloudTone=mix(cloudTone,cloudTone*vec3(.92,.96,1.)+.06,snowCover*.4);
// Preserve cool cloud shadows; warm only the illuminated structure.
float highlights=smoothstep(.28,.92,dot(photo,vec3(.2126,.7152,.0722)));
vec3 coolCloud=cloudTone*vec3(.62,.68,.82);
vec3 warmCloud=cloudTone*vec3(1.08,.76,.48);
cloudTone=mix(cloudTone,mix(coolCloud,warmCloud,highlights*(.3+.7*solarLobe)),dusk*.85);
// A restrained silver/gold edge where the sun backlights thin cloud.
float rim=cloudMask*(1.-cloudMask)*4.;
cloudTone+=vec3(1.,.80,.56)*rim*exp(-sunDistance*8.)*sunVisible*(1.-cloudy)*.16;
cloudTone=mix(cloudTone,cloudTone*vec3(.12,.17,.24),night);
cloudTone*=mix(1.,.85,storm);
vec3 color=mix(sky,cloudTone,cloudOpacity);
color=mix(color,mix(vec3(.69,.73,.74),vec3(.10,.14,.20),night),fog);
color+=(hash(vec3(gl_FragCoord.xy,0.))-.5)/255.;
if(dithered>.5){
// Fine, fixed stochastic dithering preserves cloud shading without a checkerboard.
vec2 cell=floor(gl_FragCoord.xy/pixelRatio);
float grain=hash(vec3(cell,7.));
float luminance=dot(clamp(color,0.,1.),vec3(.2126,.7152,.0722));
float ink=floor(luminance*7.+grain)/7.;
color=vec3(.28+ink*.64);
}
gl_FragColor=vec4(color,1.);
}`
);
if (!vertex || !fragment) {
shaders.forEach((s) => gl.deleteShader(s));
return;
}
const program = gl.createProgram();
if (!program) {
shaders.forEach((s) => gl.deleteShader(s));
return;
}
gl.attachShader(program, vertex);
gl.attachShader(program, fragment);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
gl.deleteProgram(program);
shaders.forEach((s) => gl.deleteShader(s));
return;
}
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),
gl.STATIC_DRAW
);
const position = gl.getAttribLocation(program, 'position');
const size = gl.getUniformLocation(program, 'resolution'),
clock = gl.getUniformLocation(program, 'time'),
scene = gl.getUniformLocation(program, 'mode'),
texture = gl.getUniformLocation(program, 'dithered'),
pixelRatio = gl.getUniformLocation(program, 'pixelRatio'),
sunPosition = gl.getUniformLocation(program, 'sunPosition'),
moonPosition = gl.getUniformLocation(program, 'moonPosition'),
moonLight = gl.getUniformLocation(program, 'moonLight'),
astronomical = gl.getUniformLocation(program, 'astronomical');
const plate = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, plate);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texImage2D(
gl.TEXTURE_2D,
0,
gl.RGBA,
1,
1,
0,
gl.RGBA,
gl.UNSIGNED_BYTE,
new Uint8Array([35, 95, 150, 255])
);
const photograph = new Image();
let disposed = false;
let loadedPlate = '';
function loadPlate() {
const source = weatherCloudTextures[weatherScenes[settings.current.mode].plate];
if (source !== loadedPlate) {
loadedPlate = source;
photograph.src = source;
}
}
photograph.onload = () => {
if (disposed || lost) return;
gl.bindTexture(gl.TEXTURE_2D, plate);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, photograph);
refresh();
};
const reduced = matchMedia('(prefers-reduced-motion: reduce)');
let visible = true,
frame = 0,
last = 0,
elapsed = 0,
lost = false;
function draw(now = performance.now(), force = false) {
const { mode, paused, dithered, sky } = settings.current;
const atmosphere = weatherScenes[mode];
const snow = atmosphere.snow > 0;
frame = 0;
if (lost || (!force && (!visible || document.hidden))) {
last = 0;
return;
}
if (last && !reduced.matches && !paused) elapsed += Math.min(now - last, 100) / 1000;
last = now;
const ratio = Math.min(devicePixelRatio || 1, 2);
const width = Math.max(1, Math.floor(canvas.clientWidth * ratio));
const height = Math.max(1, Math.floor(canvas.clientHeight * ratio));
if (canvas.width !== width) canvas.width = width;
if (canvas.height !== height) canvas.height = height;
gl!.viewport(0, 0, canvas.width, canvas.height);
gl!.useProgram(program);
gl!.bindBuffer(gl!.ARRAY_BUFFER, buffer);
gl!.enableVertexAttribArray(position);
gl!.vertexAttribPointer(position, 2, gl!.FLOAT, false, 0, 0);
gl!.uniform2f(size, canvas.width, canvas.height);
gl!.uniform1f(clock, elapsed);
gl!.uniform1f(scene, modes.indexOf(mode));
gl!.uniform1f(texture, dithered ? 1 : 0);
gl!.uniform1f(pixelRatio, ratio);
gl!.activeTexture(gl!.TEXTURE0);
gl!.bindTexture(gl!.TEXTURE_2D, plate);
gl!.uniform1i(gl!.getUniformLocation(program, 'cloudPlate'), 0);
gl!.uniform4f(
gl!.getUniformLocation(program, 'atmosphere'),
atmosphere.coverage,
atmosphere.mist,
atmosphere.wind,
atmosphere.plate === 'fair' ? 0 : 1
);
gl!.uniform1f(gl!.getUniformLocation(program, 'snowCover'), snow ? 1 : 0);
gl!.uniform1f(astronomical, sky ? 1 : 0);
gl!.uniform4f(
sunPosition,
sky?.sun.x ?? 0.8,
sky?.sun.y ?? 0.76,
sky?.sun.altitude ?? 45,
sky?.sun.visible ? 1 : 0
);
gl!.uniform4f(
moonPosition,
sky?.moon.x ?? 0,
sky?.moon.y ?? 0,
sky?.moon.altitude ?? -90,
sky?.moon.visible ? 1 : 0
);
gl!.uniform3f(moonLight, ...(sky?.moon.light ?? ([0, 0, -1] as [number, number, number])));
gl!.drawArrays(gl!.TRIANGLES, 0, 6);
if (visible && !document.hidden && !reduced.matches && !paused)
frame = requestAnimationFrame(tick);
}
function tick(now: number) {
if (now - last < 1000 / 24) {
frame = requestAnimationFrame(tick);
return;
}
draw(now);
}
function refresh() {
loadPlate();
cancelAnimationFrame(frame);
last = 0;
// Prop changes still need a static frame when an offscreen card is paused.
draw(performance.now(), true);
}
redraw.current = refresh;
const observer = new IntersectionObserver((entries) => {
visible = entries[0].isIntersecting;
refresh();
});
observer.observe(canvas);
const resize = new ResizeObserver(refresh);
resize.observe(canvas);
const lose = (event: Event) => {
event.preventDefault();
lost = true;
canvas.style.visibility = 'hidden';
cancelAnimationFrame(frame);
};
canvas.addEventListener('webglcontextlost', lose);
reduced.addEventListener('change', refresh);
document.addEventListener('visibilitychange', refresh);
refresh();
return () => {
disposed = true;
photograph.onload = null;
gl.deleteTexture(plate);
redraw.current = () => {};
cancelAnimationFrame(frame);
observer.disconnect();
resize.disconnect();
reduced.removeEventListener('change', refresh);
document.removeEventListener('visibilitychange', refresh);
canvas.removeEventListener('webglcontextlost', lose);
gl.deleteBuffer(buffer);
gl.deleteProgram(program);
shaders.forEach((s) => gl.deleteShader(s));
};
}, []);
return (
<div
className={`wxcn-sky ${(sky ? sky.period === 'night' : mode.includes('night')) ? 'night' : ''} ${paused || !active ? 'wxcn-still' : ''}`}
data-background-style={dithered ? 'dithered' : 'realistic'}
data-sky-period={sky?.period}
data-sun-altitude={sky?.sun.altitude}
data-moon-altitude={sky?.moon.altitude}
data-moon-phase={sky?.moon.phaseName}
aria-hidden="true"
>
<style>{`
.wxcn-sky {
container-type: size;
}
.wxcn-precipitation {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.wxcn-precipitation i {
position: absolute;
top: -20px;
display: block;
will-change: transform;
animation: wxcn-fall linear infinite;
}
.wxcn-rain i {
width: max(0.5px, calc(var(--size) * 0.4));
height: var(--length);
background: linear-gradient(
transparent,
rgba(226, 236, 244, 0.65) 35%,
rgba(245, 248, 250, 0.9) 75%,
transparent
);
transform: rotate(var(--angle));
}
.wxcn-snow i {
width: calc(var(--size) * 1.5);
height: calc(var(--size) * 1.8);
border-radius: 45% 55% 60% 40%;
background: radial-gradient(ellipse at 40% 35%, #fff 10%, #d8e3ec 45%, transparent 75%);
animation-name: wxcn-snowfall;
}
.wxcn-still i {
animation-play-state: paused;
}
@keyframes wxcn-fall {
from {
transform: translate(0, -20px) rotate(var(--angle));
}
to {
transform: translate(var(--drift), calc(100cqh + 40px)) rotate(var(--angle));
}
}
@keyframes wxcn-snowfall {
0% {
transform: translate(0, -20px);
}
50% {
transform: translate(calc(var(--drift) * 0.5 + var(--sway)), 50cqh) rotate(110deg);
}
100% {
transform: translate(var(--drift), calc(100cqh + 40px)) rotate(240deg);
}
}
@media (prefers-reduced-motion: reduce) {
.wxcn-precipitation i {
animation-play-state: paused;
}
}
.wxcn-sky {
position: absolute;
inset: 0;
overflow: hidden;
background: linear-gradient(160deg, #608da9, #c3d0d3);
}
.wxcn-sky.night {
background: linear-gradient(160deg, #101c32, #405269);
}
.wxcn-sky[data-sky-period='sunrise'] {
background: linear-gradient(180deg, #475575, #bd8290 70%, #dda472);
}
.wxcn-sky[data-sky-period='sunset'] {
background: linear-gradient(180deg, #424760, #b4716b 70%, #d39866);
}
/* Multiply grayscale ink by the base swatch. CSS keeps palette changes live,
including while the shader is paused for reduced motion. */
.wxcn-sky[data-background-style='dithered'] {
isolation: isolate;
background: var(--weather-base-color, var(--muted-foreground, #737373));
}
.wxcn-sky[data-background-style='dithered'] canvas {
mix-blend-mode: multiply;
}
.wxcn-sky[data-background-style='dithered'] .wxcn-precipitation {
color: color-mix(
in srgb,
var(--weather-base-color, var(--muted-foreground, #737373)) 25%,
white
);
}
.wxcn-sky[data-background-style='dithered'] .wxcn-rain i {
background: linear-gradient(transparent, currentColor 65%, transparent);
}
.wxcn-sky[data-background-style='dithered'] .wxcn-snow i {
background: radial-gradient(ellipse, currentColor 25%, transparent 75%);
}
.wxcn-sky canvas {
display: block;
width: 100%;
height: 100%;
}
`}</style>
<canvas ref={canvasRef} />
{rain && (
<div className="wxcn-precipitation wxcn-rain" data-precipitation="rain">
{particles.slice(0, atmosphere.rain).map((p, i) => (
<i key={i} data-depth={p.depth} style={particleStyle(p, false)} />
))}
</div>
)}
{snow && (
<div className="wxcn-precipitation wxcn-snow" data-precipitation="snow">
{particles.slice(0, atmosphere.snow).map((p, i) => (
<i key={i} data-depth={p.depth} style={particleStyle(p, true)} />
))}
</div>
)}
</div>
);
}
export default WeatherShaderBackground;
packages/react/src/components/wxcn/weather-gradient-background.tsx
import type { SkyState } from '@/lib/wxcn/sky.js';
import type { CSSProperties } from 'react';
import type { WeatherShaderMode } from './weather-shader-background';
export function WeatherGradientBackground({
mode = 'clear',
sky = null
}: {
mode?: WeatherShaderMode;
sky?: SkyState | null;
}) {
const period =
sky?.period ??
(mode.includes('night') ? 'night' : mode === 'sunrise' || mode === 'sunset' ? mode : 'midday');
const weather = /rain|drizzle|thunderstorm|wintry/.test(mode)
? 'rain'
: /snow/.test(mode)
? 'snow'
: /cloudy|fog|haze/.test(mode)
? 'cloud'
: 'clear';
const z = sky ? 2 * sky.moon.illumination - 1 : -1;
const moonPath = `M0 -1 A1 1 0 0 1 0 1 L${Array.from({ length: 65 }, (_, i) => {
const y = 1 - i / 32;
return `${-z * Math.sqrt(Math.max(0, 1 - y * y))} ${y}`;
}).join(' L')} Z`;
const moonAngle = sky ? (Math.atan2(-sky.moon.light[1], sky.moon.light[0]) * 180) / Math.PI : 0;
const style = {
'--sun-x': `${(sky?.sun.x ?? 0.8) * 100}%`,
'--sun-y': `${(1 - (sky?.sun.y ?? 0.76)) * 100}%`
} as CSSProperties;
return (
<div
className="wxcn-weather-gradient"
data-background-style="gradient"
data-sky-period={period}
data-weather={weather}
style={style}
aria-hidden="true"
>
{sky?.sun.visible && (
<span
className="wxcn-gradient-sun"
style={{ left: `${sky.sun.x * 100}%`, top: `${(1 - sky.sun.y) * 100}%` }}
/>
)}
{sky?.moon.visible && (
<svg
className="wxcn-gradient-moon"
viewBox="-1 -1 2 2"
style={{
left: `${sky.moon.x * 100}%`,
top: `${(1 - sky.moon.y) * 100}%`,
transform: `translate(-50%,-50%) rotate(${moonAngle}deg)`
}}
>
<path d={moonPath} fill="#d9dee6" />
</svg>
)}
<style>{`
.wxcn-weather-gradient{position:absolute;inset:0;overflow:hidden;container-type:size;background:radial-gradient(ellipse at var(--sun-x) var(--sun-y),#f5dba560,transparent 45%),linear-gradient(180deg,#32658b,#88b4c3)}
.wxcn-weather-gradient[data-sky-period=night]{background:linear-gradient(180deg,#0c1428,#29394f)}
.wxcn-weather-gradient[data-sky-period=sunrise]{background:radial-gradient(ellipse at var(--sun-x) var(--sun-y),#edab8370,transparent 65%),linear-gradient(180deg,#475575,#bd8290 70%,#dda472)}
.wxcn-weather-gradient[data-sky-period=sunset]{background:radial-gradient(ellipse at var(--sun-x) var(--sun-y),#fba44780,transparent 65%),linear-gradient(180deg,#424760,#b4716b 70%,#d39866)}
.wxcn-weather-gradient:after{content:'';position:absolute;inset:0;pointer-events:none}.wxcn-weather-gradient[data-weather=cloud]:after{background:#71818b55}.wxcn-weather-gradient[data-weather=rain]:after{background:#263c52aa}.wxcn-weather-gradient[data-weather=snow]:after{background:#a4b8c455}
.wxcn-gradient-sun,.wxcn-gradient-moon{position:absolute;transform:translate(-50%,-50%)}.wxcn-gradient-sun{width:3.2cqh;height:3.2cqh;border-radius:50%;background:#fff0bd;box-shadow:0 0 3cqh #f4c98966}.wxcn-gradient-moon{width:4.4cqh;height:4.4cqh}
`}</style>
</div>
);
}
export default WeatherGradientBackground;
packages/react/src/icons/forecast-icons.tsx
import { IconPlaceholder } from '@/components/icon-placeholder';
export type IconName = 'arrowUp' | 'arrowDown' | 'weather' | 'sun' | 'moon' | 'tide' | 'wind' | 'rain' | 'snow';
export type IconSet = 'lucide' | 'tabler' | 'phosphor' | 'hugeicons' | 'remixicon';
export type ForecastIconProps = { name: IconName; iconSet?: IconSet; className?: string };
export function ForecastIcon({ name, className = 'size-5' }: ForecastIconProps) {
switch (name) {
case 'arrowUp': return <IconPlaceholder lucide="ArrowUpIcon" tabler="IconArrowUp" phosphor="ArrowUpIcon" hugeicons="ArrowUp02Icon" remixicon="RiArrowUpLine" className={className} aria-hidden="true" />;
case 'arrowDown': return <IconPlaceholder lucide="ArrowDownIcon" tabler="IconArrowDown" phosphor="ArrowDownIcon" hugeicons="ArrowDown02Icon" remixicon="RiArrowDownLine" className={className} aria-hidden="true" />;
case 'weather': return <IconPlaceholder lucide="CloudSunIcon" tabler="IconCloud" phosphor="CloudSunIcon" hugeicons="SunCloud02Icon" remixicon="RiCloudy2Line" className={className} aria-hidden="true" />;
case 'sun': return <IconPlaceholder lucide="SunIcon" tabler="IconSun" phosphor="SunIcon" hugeicons="Sun03Icon" remixicon="RiSunLine" className={className} aria-hidden="true" />;
case 'moon': return <IconPlaceholder lucide="MoonIcon" tabler="IconMoon" phosphor="MoonIcon" hugeicons="Moon02Icon" remixicon="RiMoonLine" className={className} aria-hidden="true" />;
case 'tide': return <IconPlaceholder lucide="WavesIcon" tabler="IconWavesElectricity" phosphor="WavesIcon" hugeicons="WaterfallUp01Icon" remixicon="RiWaterFlashLine" className={className} aria-hidden="true" />;
case 'wind': return <IconPlaceholder lucide="WindIcon" tabler="IconWind" phosphor="WindIcon" hugeicons="WindPower02Icon" remixicon="RiWindyLine" className={className} aria-hidden="true" />;
case 'rain': return <IconPlaceholder lucide="CloudRainIcon" tabler="IconCloudRain" phosphor="CloudRainIcon" hugeicons="CloudRainIcon" remixicon="RiRainyLine" className={className} aria-hidden="true" />;
case 'snow': return <IconPlaceholder lucide="SnowflakeIcon" tabler="IconSnowflake" phosphor="SnowflakeIcon" hugeicons="SnowIcon" remixicon="RiSnowyLine" className={className} aria-hidden="true" />;
}
}
packages/core/src/types.ts
export type CardSize = 'sm' | 'default' | 'lg';
export type CardDensity = 'compact' | 'comfortable';
export type ForecastType = 'summary' | 'detailed' | 'simple';
export type IconSet = 'hugeicons' | 'phosphor-svelte' | 'lucide' | 'tabler' | 'remix';
export type WeatherUnit = 'fahrenheit' | 'celsius';
export type TideUnit = 'ft' | 'meter';
export type LocationInput = {
label?: string;
latitude: number;
longitude: number;
station?: string;
timeZone?: string;
};
export type WeatherPeriod = {
name: string;
startTime: string;
endTime?: string;
temperature: number;
temperatureUnit: string;
windSpeed: string;
windDirection: string;
shortForecast: string;
detailedForecast: string;
isDaytime: boolean;
};
export type TidePrediction = {
time: string;
height: string;
type: 'H' | 'L';
};
export type MoonForecast = {
date: string;
phaseName: string;
/** Astronomical phase cycle: 0 new, 0.25 first quarter, 0.5 full. */
phase?: number;
illumination: number;
age: number;
nextFullMoon: string;
nextNewMoon: string;
};
/** Feet above MLLW. Prefer ISO 8601 timestamps with an explicit offset. */
export type TidePoint = { time: string; height: string };
export type TideReading = TidePoint;
/** Current observed conditions; daily extrema use temperatureUnit and the location's calendar day. */
export type CurrentWeather = WeatherPeriod & {
observedAt: string;
highToday?: number;
lowToday?: number;
};
export type WeatherBackground = 'none' | 'realistic' | 'dithered' | 'gradient';
packages/core/src/forecast-days.ts
export type ForecastEntry = { time: number; label: string; summary: string; details: string };
export type ForecastDay = { key: string; label: string; entries: ForecastEntry[] };
/** Group supplied periods in the location's calendar, without inventing missing days. */
export function forecastDays(entries: ForecastEntry[], timeZone: string): ForecastDay[] {
const key = new Intl.DateTimeFormat('en-CA', {
timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
const label = new Intl.DateTimeFormat('en-US', {
timeZone,
weekday: 'short',
month: 'short',
day: 'numeric'
});
const days = new Map<string, ForecastDay>();
for (const entry of entries
.filter((e) => Number.isFinite(e.time))
.toSorted((a, b) => a.time - b.time)) {
const id = key.format(entry.time);
if (!days.has(id)) days.set(id, { key: id, label: label.format(entry.time), entries: [] });
days.get(id)!.entries.push(entry);
}
return [...days.values()].slice(0, 7);
}
/** Resolve noon on a forecast calendar date in the location's time zone, including DST. */
export function forecastDayNoon(key: string, timeZone: string): number {
const noon = Date.parse(`${key}T12:00:00Z`);
const format = new Intl.DateTimeFormat('en-US', {
timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hourCycle: 'h23'
});
let instant = noon;
for (let attempt = 0; attempt < 3; attempt++) {
const parts = Object.fromEntries(
format.formatToParts(instant).map(({ type, value }) => [type, value])
);
const wallTime = Date.UTC(
Number(parts.year),
Number(parts.month) - 1,
Number(parts.day),
Number(parts.hour),
Number(parts.minute),
Number(parts.second)
);
const correction = noon - wallTime;
instant += correction;
if (!correction) break;
}
return instant;
}
packages/core/src/weather.ts
import type { LocationInput, WeatherPeriod, CurrentWeather } from './types.js';
type NwsPoint = {
properties: {
forecast: string;
relativeLocation?: {
properties?: {
city?: string;
state?: string;
};
};
};
};
type NwsForecast = {
properties: {
periods: WeatherPeriod[];
};
};
const headers = {
Accept: 'application/geo+json',
'User-Agent': 'wxcn/0.1 (https://github.com/wxcn/wxcn)'
};
export async function fetchWeatherForecast(location: LocationInput): Promise<WeatherPeriod[]> {
const point = await fetch(
`https://api.weather.gov/points/${location.latitude.toFixed(4)},${location.longitude.toFixed(4)}`,
{ headers }
);
if (!point.ok) {
throw new Error(`NWS point lookup failed with ${point.status}`);
}
const pointData = (await point.json()) as NwsPoint;
const forecast = await fetch(pointData.properties.forecast, { headers });
if (!forecast.ok) {
throw new Error(`NWS forecast lookup failed with ${forecast.status}`);
}
const forecastData = (await forecast.json()) as NwsForecast;
return forecastData.properties.periods;
}
/** Deterministic Austin fixtures for previews; not live observations. */
export const sampleWeather: WeatherPeriod[] = [
['Today', 92, 'Mostly Sunny', true],
['Tonight', 74, 'Partly Cloudy', false],
['Monday', 94, 'Sunny', true],
['Monday night', 75, 'Mostly Clear', false],
['Tuesday', 89, 'Chance of Rain', true],
['Tuesday night', 72, 'Partly Cloudy', false],
['Wednesday', 90, 'Sunny', true]
].map(([name, temperature, shortForecast, isDaytime], index) => ({
name: name as string,
temperature: temperature as number,
shortForecast: shortForecast as string,
isDaytime: isDaytime as boolean,
startTime: `2026-09-${String(6 + Math.floor(index / 2)).padStart(2, '0')}T${index % 2 ? '19' : '07'}:00:00-05:00`,
temperatureUnit: 'F',
windSpeed: '5 to 10 mph',
windDirection: 'S',
detailedForecast: `${shortForecast}. South wind 5 to 10 mph.`
}));
export function convertWindSpeed(speed: string, unit: 'mph' | 'km/h' | 'm/s' | 'knots' = 'mph') {
const factors = { mph: 0.44704, 'km/h': 1 / 3.6, 'm/s': 1, knots: 0.514444 };
const source = speed.match(/mph|km\/h|m\/s|knots/);
if (!source) return speed;
return speed
.replace(/\d+(?:\.\d+)?/g, (n) =>
String(Math.round((Number(n) * factors[source[0] as keyof typeof factors]) / factors[unit]))
)
.replace(source[0], unit);
}
export const sampleCurrentWeather: CurrentWeather = {
...sampleWeather[0],
name: 'Now',
temperature: 86,
observedAt: '2026-09-06T16:00:00-05:00',
startTime: '2026-09-06T16:00:00-05:00',
highToday: 88
};
packages/core/src/weather-outlook.ts
import type { CurrentWeather, WeatherPeriod, WeatherUnit } from './types.js';
export function weatherTemperature(value: number, from: string, unit: WeatherUnit) {
return Math.round(
unit === 'celsius' && from === 'F'
? ((value - 32) * 5) / 9
: unit === 'fahrenheit' && from === 'C'
? (value * 9) / 5 + 32
: value
);
}
export function weatherOutlook(
current: CurrentWeather | null,
forecast: WeatherPeriod[],
unit: WeatherUnit,
timeZone = 'UTC',
at = Date.now()
) {
const day = (time: string | number) =>
new Intl.DateTimeFormat('en-CA', {
timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(new Date(time));
const today = day(at);
const valid = forecast.filter(
(p) =>
Number.isFinite(p.temperature) &&
Number.isFinite(Date.parse(p.startTime)) &&
(!p.endTime || Date.parse(p.endTime) > at)
);
const highPeriod = valid.find((p) => p.isDaytime && day(p.startTime) === today);
const lowPeriod = valid.find(
(p) =>
!p.isDaytime &&
(day(p.startTime) === today ||
(Date.parse(p.startTime) <= at && !!p.endTime && Date.parse(p.endTime) > at))
);
const observedHigh =
current?.highToday === undefined
? null
: weatherTemperature(current.highToday, current.temperatureUnit, unit);
const high = highPeriod
? Math.max(
weatherTemperature(highPeriod.temperature, highPeriod.temperatureUnit, unit),
observedHigh ?? -Infinity
)
: observedHigh;
const low = lowPeriod
? weatherTemperature(lowPeriod.temperature, lowPeriod.temperatureUnit, unit)
: null;
const temp = current
? weatherTemperature(current.temperature, current.temperatureUnit, unit)
: null;
const highReached =
high !== null &&
((observedHigh !== null && observedHigh >= high) || (temp !== null && temp >= high));
let trend: string | null = null;
if (temp !== null) {
if (current?.isDaytime && high !== null && !highReached && temp < high)
trend = `Going up to ${high}° today`;
else if (low !== null && temp > low)
trend = `Going down to ${low}° ${lowPeriod?.name.toLowerCase().includes('overnight') ? 'overnight' : 'tonight'}`;
}
return { high, low, trend, highReached };
}
/** Combine a day's forecast high with observations from that same local day. */
export function weatherDayHigh(
key: string,
periods: WeatherPeriod[],
current: CurrentWeather | null,
unit: WeatherUnit,
timeZone: string
) {
const highs = periods
.filter((p) => p.isDaytime && Number.isFinite(p.temperature))
.map((p) => weatherTemperature(p.temperature, p.temperatureUnit, unit));
if (
current &&
Number.isFinite(current.highToday) &&
Number.isFinite(Date.parse(current.observedAt))
) {
const observedDay = new Intl.DateTimeFormat('en-CA', {
timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(new Date(current.observedAt));
if (observedDay === key)
highs.push(weatherTemperature(current.highToday!, current.temperatureUnit, unit));
}
return highs.length ? Math.max(...highs) : null;
}
packages/core/src/sky.ts
import {
Body,
Equator,
Horizon,
Illumination,
MoonPhase,
Observer,
SearchHourAngle,
SearchRiseSet
} from 'astronomy-engine';
export type SkyPeriod = 'sunrise' | 'midday' | 'sunset' | 'night';
export type SkyBody = { azimuth: number; altitude: number; visible: boolean; x: number; y: number };
export type SkyState = {
at: number;
period: SkyPeriod;
isDaytime: boolean;
sun: SkyBody;
moon: SkyBody & {
illumination: number;
phase: number;
phaseName: string;
light: [number, number, number];
};
};
const rad = Math.PI / 180;
const cache = new Map<string, SkyState>();
const phaseNames = [
'New Moon',
'Waxing Crescent',
'First Quarter',
'Waxing Gibbous',
'Full Moon',
'Waning Gibbous',
'Last Quarter',
'Waning Crescent'
];
// Fixed 360-degree panorama: N at both edges, E at 25%, S at 50%, W at 75%.
// Altitude maps from the horizon at 12% to the zenith at 88% of card height.
// Discs are enlarged for readability; coordinates retain their astronomical values.
function project(azimuth: number, altitude: number): SkyBody {
return {
azimuth,
altitude,
visible: altitude >= -0.2666,
x: azimuth / 360,
y: 0.12 + (altitude / 90) * 0.76
};
}
function valid(latitude: number, longitude: number, at: number) {
return (
Number.isFinite(latitude) &&
Math.abs(latitude) <= 90 &&
Number.isFinite(longitude) &&
Math.abs(longitude) <= 180 &&
Number.isFinite(at) &&
Math.abs(at) <= 8640000000000000
);
}
export function getSkyState(latitude: number, longitude: number, at = Date.now()): SkyState | null {
if (!valid(latitude, longitude, at)) return null;
// Cards request positions once per minute; preserve an explicit event timestamp.
const key = `${latitude}:${longitude}:${at}`;
const cached = cache.get(key);
if (cached) return cached;
const date = new Date(at);
const observer = new Observer(latitude, longitude, 0);
function position(body: Body, instant = date) {
const eq = Equator(body, instant, observer, true, true);
return Horizon(instant, observer, eq.ra, eq.dec, 'normal');
}
const sunPosition = position(Body.Sun);
const moonPosition = position(Body.Moon);
const sun = project(sunPosition.azimuth, sunPosition.altitude);
// Apparent upper solar limb at the horizon (refraction is applied by Horizon).
const isDaytime = sun.altitude >= -0.2666;
const rising = position(Body.Sun, new Date(at + 60000)).altitude > sun.altitude;
const period: SkyPeriod =
sun.altitude < -6 ? 'night' : sun.altitude <= 6 ? (rising ? 'sunrise' : 'sunset') : 'midday';
const illumination = Illumination(Body.Moon, date).phase_fraction;
const phase = MoonPhase(date) / 360;
// Project the Sun onto the Moon's local horizon tangent plane. This gives the
// illuminated limb its observer-relative tilt, including hemisphere differences.
const sa = sun.azimuth * rad,
sh = sun.altitude * rad;
const ma = moonPosition.azimuth * rad,
mh = moonPosition.altitude * rad;
const sx = Math.cos(sh) * Math.sin(sa),
sy = Math.sin(sh),
sz = Math.cos(sh) * Math.cos(sa);
const right = sx * Math.cos(ma) - sz * Math.sin(ma);
const up =
-sx * Math.sin(mh) * Math.sin(ma) + sy * Math.cos(mh) - sz * Math.sin(mh) * Math.cos(ma);
const length = Math.hypot(right, up) || 1;
const z = 2 * illumination - 1;
const tangent = Math.sqrt(Math.max(0, 1 - z * z));
const state: SkyState = {
at,
period,
isDaytime,
sun,
moon: {
...project(moonPosition.azimuth, moonPosition.altitude),
illumination,
phase,
phaseName: phaseNames[Math.round(phase * 8) % 8],
light: [(right / length) * tangent, (up / length) * tangent, z]
}
};
if (cache.size >= 256) cache.delete(cache.keys().next().value!);
cache.set(key, state);
return state;
}
export function getSkyPreviewTime(
latitude: number,
longitude: number,
at: number,
period: SkyPeriod
): number | null {
if (!valid(latitude, longitude, at)) return null;
const observer = new Observer(latitude, longitude, 0);
const start = new Date(at - 12 * 3600000);
const event =
period === 'sunrise' || period === 'sunset'
? SearchRiseSet(Body.Sun, observer, period === 'sunrise' ? 1 : -1, start, 1)
: SearchHourAngle(Body.Sun, observer, period === 'midday' ? 0 : 12, start).time;
return event?.date.getTime() ?? null; // Polar day/night can have no rise or set.
}