refactor: reorganize components into domain subfolders and replace relative imports

Move components from flat src/lib/components/ into recipes/, faith/, and
cospend/ subdirectories. Replace ~144 relative imports across API routes
and lib files with $models, $utils, $types, and $lib aliases. Add $types
alias to svelte.config.js. Remove unused EditRecipe.svelte.
This commit is contained in:
2026-02-10 21:46:16 +01:00
parent b3c3f34e50
commit 8560077759
149 changed files with 286 additions and 611 deletions

View File

@@ -0,0 +1,83 @@
<script>
let { x = 0, y = 0, size = 40 } = $props();
</script>
<style>
.bg{
fill: white;
}
.fg{
stroke: var(--nord2);
fill: var(--nord2);
stroke-linejoin: round;
stroke-linecap: round;
}
@media (prefers-color-scheme: light) {
.bg{
fill: var(--nord3);
}
.fg{
stroke: white;
fill: white;
}
}
</style>
<svg {x} {y} width={size} height={size} viewBox="0 0 334 326" xmlns="http://www.w3.org/2000/svg">
<path class="bg" d="m168.72 17.281c-80.677 0-146.06 65.386-146.06 146.06 0 80.677 65.386 146.09 146.06 146.09 80.677 0 146.09-65.417 146.09-146.09 0-80.677-65.417-146.06-146.09-146.06zm2.9062 37.812c21.086 0.35166 41.858 7.6091 59.156 19.688 40.942 26.772 56.481 83.354 38.875 128.22-16.916 45.3-67.116 74.143-114.72 67.844-50.947-5.2807-92.379-52.101-94.563-102.72-4.0889-58.654 48.31-113.56 107.03-113 1.4077-0.03846 2.813-0.05469 4.2188-0.03125z"/>
<path class="bg" d="m166.45 51.969c-11.386 0.159-21.538 7.2129-24 12.25 3.2629 3.3685 6.337 8.536 7.375 19.5v159.78c-1.0775 10.727-4.1463 15.792-7.375 19.125 2.4156 4.9422 12.251 11.811 23.375 12.219v0.0312h4.8124c11.386-0.159 21.538-7.2129 24-12.25-3.2629-3.3685-6.337-8.536-7.375-19.5v-159.78c1.0775-10.727 4.1463-15.792 7.375-19.125-2.41-4.938-12.25-11.807-23.37-12.215v-0.03125h-4.8124z"/>
<path class="bg" d="m280 161.33c-0.159-11.386-7.2129-21.538-12.25-24-3.3685 3.2629-8.536 6.337-19.5 7.375h-159.78c-10.727-1.0775-15.792-4.1463-19.125-7.375-4.9422 2.4156-11.811 12.251-12.219 23.375h-0.0312v4.8124c0.159 11.386 7.2129 21.538 12.25 24 3.3685-3.2629 8.536-6.337 19.5-7.375h159.78c10.727 1.0775 15.792 4.1463 19.125 7.375 4.9422-2.4156 11.811-12.251 12.219-23.375h0.0312v-4.8124z"/>
<path class="bg" transform="matrix(.86578 0 0 .86578 78.719 48.374)" d="m69.839 72.529c0 14.565-11.807 26.373-26.373 26.373-14.565 0-26.373-11.807-26.373-26.373 0-14.565 11.807-26.373 26.373-26.373 14.565 0 26.373 11.807 26.373 26.373z"/>
<path class="bg" transform="matrix(.86578 0 0 .86578 182.94 48.396)" d="m69.839 72.529c0 14.565-11.807 26.373-26.373 26.373-14.565 0-26.373-11.807-26.373-26.373 0-14.565 11.807-26.373 26.373-26.373 14.565 0 26.373 11.807 26.373 26.373z"/>
<path class="bg" transform="matrix(.86578 0 0 .86578 78.848 152.7)" d="m69.839 72.529c0 14.565-11.807 26.373-26.373 26.373-14.565 0-26.373-11.807-26.373-26.373 0-14.565 11.807-26.373 26.373-26.373 14.565 0 26.373 11.807 26.373 26.373z"/>
<path class="bg" transform="matrix(.86578 0 0 .86578 183.14 152.6)" d="m69.839 72.529c0 14.565-11.807 26.373-26.373 26.373-14.565 0-26.373-11.807-26.373-26.373 0-14.565 11.807-26.373 26.373-26.373 14.565 0 26.373 11.807 26.373 26.373z"/>
<g class="fg" transform="matrix(.99979 .020664 -.020664 .99979 2.2515 -4.8909)" stroke="var(--nord2)">
<path d="m125.64 31.621-0.0722-0.2536 7.1008-2.0212c2.5247-0.71861 4.4393-0.95897 5.7437-0.72108 1.3044 0.23795 2.3382 0.70216 3.1013 1.3926 0.76311 0.69054 1.3404 1.7233 1.7318 3.0984 0.59992 2.1077 0.32369 3.8982-0.82869 5.3715-1.1524 1.4734-2.9805 2.542-5.4842 3.2059l-0.0674-0.23669c1.5779-0.44913 2.7221-1.2987 3.4324-2.5488 0.71031-1.25 0.84089-2.664 0.39175-4.242-0.34971-1.2285-0.89961-2.2508-1.6497-3.0669-0.75012-0.81603-1.6297-1.3485-2.6387-1.5974-1.009-0.24887-2.404-0.11987-4.1848 0.387l-1.7752 0.50529 6.0683 21.319c0.34327 1.206 0.68305 1.886 1.0193 2.0401 0.33626 0.15406 0.88198 0.12362 1.6372-0.09134l0.0674 0.23669-6.5767 1.872-0.0674-0.23669c1.1722-0.33365 1.6059-1.0359 1.3011-2.1066l-5.871-20.626c-0.25024-0.87912-0.52897-1.4303-0.8362-1.6536-0.30723-0.22322-0.82152-0.23218-1.5429-0.02688z"/>
<path d="m169.99 38.101-7.5573 0.14169-3.7357 9.8628c-0.2563 0.70806-0.38292 1.1441-0.37984 1.3081 0.007 0.38665 0.29793 0.57459 0.87205 0.56383l0.005 0.24605-3.8489 0.07216-0.005-0.24605c0.51554-0.0097 0.94669-0.14375 1.2935-0.40225 0.34678-0.2585 0.72118-0.91895 1.1232-1.9814l8.9409-23.867 0.43938-0.0082 9.6735 22.709c0.002 0.11717 0.24981 0.66634 0.74293 1.6475 0.49306 0.98116 1.2258 1.4626 2.1984 1.4444l0.005 0.24605-6.0458 0.11335-0.005-0.24605c0.55067-0.01032 0.82195-0.23224 0.81384-0.66576-0.006-0.29292-0.14904-0.75906-0.43059-1.3984-0.0478-0.04599-0.0902-0.12138-0.12731-0.22617-0.0257-0.11672-0.0443-0.17498-0.056-0.17476zm-7.3247-0.5835 6.9949-0.13115-3.6628-8.7571z"/>
<path d="m215.05 32.098-0.0754 0.25265c-0.67276-0.28643-1.3926-0.12832-2.1595 0.47432-0.0112-0.0033-0.0331 0.0085-0.0656 0.03545-0.0213 0.03035-0.0465 0.0534-0.0757 0.06913l-0.19006 0.14505c-0.0763 0.05063-0.11777 0.08716-0.12445 0.10961l-0.21872 0.11815-8.9764 7.0246 4.3093 13.156c0.45546 1.5057 0.85105 2.4952 1.1868 2.9684 0.33566 0.47322 0.71066 0.75333 1.125 0.84033l-0.0704 0.23581-6.1647-1.8404 0.0704-0.23581c0.51768 0.19124 0.83688 0.08474 0.95758-0.3195 0.0972-0.32565 0.0472-0.79308-0.15004-1.4023l-3.7548-11.449-9.4239 7.2945c-0.003 0.01123-0.19115 0.16919-0.56339 0.47387-0.41047 0.26882-0.6576 0.54359-0.7414 0.82431-0.10057 0.33687 0.13489 0.57227 0.70641 0.7062l-0.0704 0.23581-3.7056-1.1063 0.0704-0.23581c0.53899 0.16091 1.0726 0.09397 1.6009-0.20082l0.37685-0.2177 11.393-8.8529-4.2181-12.908c0.0469-0.15718-0.0793-0.51283-0.37858-1.0669-0.29932-0.55407-0.71956-0.88743-1.2607-1.0001l0.0754-0.25265 6.249 1.8656-0.0754 0.25265c-0.67376-0.20112-1.0659-0.11641-1.1766 0.25413-0.0805 0.26952-0.002 0.76385 0.23602 1.483l3.0954 9.4177 8.2667-6.4293c0.0145-0.0079 0.14851-0.13908 0.40187-0.39368 0.25331-0.25456 0.39171-0.42114 0.4152-0.49977 0.057-0.19088 0.034-0.32919-0.0688-0.41494-0.10284-0.08571-0.32269-0.17886-0.65953-0.27945l0.0754-0.25265z"/>
</g>
<g class="fg">
<path d="m235.06 72.827-0.26589-0.20212 6.4642-23.724c0.44911-1.6752 0.58908-2.7501 0.4199-3.2247-0.16922-0.47452-0.43107-0.84654-0.78557-1.116l0.15956-0.20991 4.758 3.6168-0.15956 0.20991c-0.39857-0.3471-0.73258-0.3434-1.002 0.01109-0.10639 0.13996-0.19187 0.3105-0.25644 0.51163l-5.6785 20.745 18.416-11.04c0.24704-0.15074 0.42022-0.29142 0.51954-0.42204 0.24109-0.31719 0.10378-0.64972-0.41192-0.99761l0.15957-0.20991 3.0927 2.3509-0.15957 0.20991c-0.21461-0.1631-0.46389-0.30476-0.74785-0.42496-0.28403-0.12019-0.71153-0.06612-1.2825 0.16221-0.57105 0.22835-0.87187 0.35297-0.90244 0.37386z"/>
<path d="m278.77 79.16 0.22305-0.14062 3.9185 6.2156c0.99367 1.5762 1.6777 2.7381 2.052 3.4857 0.37431 0.74758 0.59849 1.6141 0.67255 2.5995 0.074 0.98539-0.10481 1.8774-0.53644 2.6759-0.43168 0.79855-1.1332 1.5041-2.1047 2.1165-1.1103 0.69996-2.3795 1.0325-3.8075 0.99774-1.4281-0.0348-2.8734-0.44312-4.336-1.225l-1.4042 3.0464c-0.38231 0.71202-1.1219 2.4285-2.2186 5.1495-1.0968 2.721-1.6158 4.617-1.5569 5.6882 0.0588 1.0711 0.3226 1.9785 0.79134 2.722 0.46246 0.73355 1.2762 1.3981 2.4412 1.9935l-0.24115 0.27671c-1.7215-0.57713-3.1822-1.8174-4.3821-3.7207-0.79997-1.2689-1.1132-2.5953-0.93972-3.9791 0.17346-1.3839 1.233-4.2683 3.1785-8.6534 0.007-0.03233 0.0209-0.05474 0.0407-0.06724l2.0029-4.3381-1.2875-1.9104-1.1156-1.7695-8.3865 5.2872c-0.6741 0.42497-1.1011 0.81886-1.2811 1.1817-0.17994 0.3628-0.0543 0.8862 0.37693 1.5702l-0.20818 0.13124-3.5717-5.6654 0.20818-0.13124c0.47346 0.68508 0.89871 1.03 1.2757 1.0347 0.37702 0.0047 0.97693-0.25225 1.7997-0.77097l17.412-10.978c0.56503-0.35622 0.98655-0.72586 1.2646-1.1089 0.27798-0.38305 0.18445-0.9544-0.28059-1.7141zm2.2305 4.329-10.275 6.4778 1.4437 2.2899c1.1374 1.8042 2.4074 2.8737 3.8099 3.2086 1.4025 0.33488 2.7977 0.06485 4.1855-0.8101 1.3482-0.84996 2.3542-2.0833 3.0181-3.7002 0.66383-1.6168 0.31454-3.5058-1.0478-5.6668z"/>
<path d="m304.97 139.01-2.8793 1.9196-0.0812-0.19782c0.0114-0.003 0.27603-0.39661 0.7939-1.182 0.51781-0.78539 0.8634-1.6276 1.0368-2.5266 0.17331-0.89905 0.14258-1.8627-0.0922-2.8909-0.39397-1.7251-1.2005-2.9804-2.4196-3.7658-1.2191-0.78541-2.5256-1.019-3.9194-0.7007-0.92542 0.21132-1.6796 0.63296-2.2625 1.2649-0.58294 0.63196-0.99926 1.7698-1.249 3.4135-0.27608 2.7917-0.52511 4.7147-0.7471 5.7691-0.22203 1.0544-0.75747 2.1443-1.6063 3.2697-0.84889 1.1254-2.0959 1.876-3.741 2.2517-0.68549 0.15652-1.3578 0.22591-2.017 0.20816-0.65917-0.0178-1.3177-0.13787-1.9755-0.36027-0.65783-0.22243-1.2805-0.52799-1.8681-0.91668-0.58762-0.38872-1.0629-0.81208-1.426-1.2701-0.36304-0.45803-0.73392-1.2268-1.1126-2.3063-0.37873-1.0795-0.60853-1.7963-0.68941-2.1505l-1.5379-6.7348 7.3346-1.6749 0.0587 0.25706c-2.4282 0.57854-3.9944 1.5372-4.6984 2.876-0.70401 1.3388-0.78599 3.1906-0.24595 5.5555 0.49047 2.1478 1.3713 3.6626 2.6424 4.5443 1.2712 0.8817 2.6208 1.1595 4.0489 0.8334 0.86826-0.19828 1.5637-0.56143 2.0862-1.0894 0.5225-0.52802 0.93554-1.1933 1.2391-1.9959 0.30354-0.80258 0.56488-2.2506 0.78402-4.3441 0.23314-2.0847 0.51456-3.5764 0.84426-4.4751 0.32968-0.89869 0.94577-1.7275 1.8483-2.4866 0.90249-0.75903 1.885-1.2599 2.9475-1.5025 1.9536-0.44612 3.7463-0.14929 5.3781 0.89047s2.6968 2.6507 3.1952 4.8328c0.19303 0.84542 0.30463 1.7816 0.3348 2.8084 0.0301 1.0269 0.0297 1.604-0.001 1.7312-0.0124 0.0509-0.0134 0.0992-0.003 0.14492z"/>
<path d="m305.53 190.02-0.62918 4.9701-0.26159-0.0331c0.0724-0.75866-0.0212-1.3021-0.28088-1.6302-0.25969-0.32821-0.86619-0.55264-1.8195-0.6733l-23.386-2.9605 24.41-17.729-19.008-2.4064c-0.60455-0.0765-1.058-0.0867-1.3605-0.0305-0.30242 0.0562-0.51699 0.16489-0.6437 0.32604-0.12671 0.16113-0.28653 0.58386-0.47947 1.2682l-0.24415-0.0309 0.62477-4.9352 0.24414 0.0309c-0.11185 0.88357-0.0244 1.4528 0.26223 1.7076 0.28667 0.25481 1.0229 0.45728 2.2088 0.6074l17.387 2.201c1.523 0.1928 2.7938 0.1381 3.8125-0.16408 1.0186-0.3022 1.5902-1.225 1.7148-2.7685l0.26159 0.0331-0.61153 4.8306-22.945 16.656 18.136 2.296c0.97656 0.1236 1.5945 0.0246 1.8537-0.29688 0.25922-0.32158 0.42342-0.75557 0.49261-1.302z"/>
<path d="m289.19 232.48-3.433-0.43565 0.0682-0.20268c0.0103 0.005 0.46837-0.11886 1.3741-0.37304 0.90573-0.25423 1.7186-0.66421 2.4385-1.2299 0.71988-0.56577 1.3279-1.314 1.824-2.2447 0.83238-1.5615 1.0453-3.0383 0.63863-4.4303s-1.2408-2.4243-2.5024-3.0969c-0.83765-0.44653-1.6837-0.62197-2.5381-0.52631-0.85443 0.0956-1.9143 0.68265-3.1797 1.761-2.0373 1.9285-3.4852 3.2184-4.3436 3.8696-0.85845 0.65123-1.977 1.124-3.3556 1.4183-1.3786 0.29426-2.8125 0.0445-4.3016-0.7493-0.62047-0.33077-1.1739-0.71876-1.6603-1.164-0.48641-0.44522-0.90529-0.96731-1.2566-1.5663-0.35134-0.59898-0.62169-1.2378-0.81106-1.9164-0.18935-0.67863-0.27117-1.3099-0.24544-1.8937 0.0257-0.58389 0.24909-1.4077 0.67005-2.4714 0.42097-1.0637 0.7169-1.7559 0.88779-2.0765l3.2497-6.0961 6.639 3.5391-0.12403 0.23268c-2.2137-1.1535-4.025-1.4551-5.4339-0.90469-1.4089 0.55038-2.6839 1.8959-3.825 4.0365-1.0364 1.9441-1.3631 3.6656-0.98022 5.1646 0.38289 1.4989 1.2207 2.5929 2.5133 3.282 0.78593 0.41894 1.5492 0.60008 2.2899 0.54342 0.74068-0.0567 1.4886-0.28881 2.2436-0.69635 0.75509-0.40756 1.9011-1.3305 3.438-2.7687 1.5418-1.4224 2.7315-2.3652 3.5693-2.8282 0.83779-0.46308 1.8462-0.68576 3.0254-0.66807 1.1791 0.0177 2.2495 0.28285 3.2113 0.79553 1.7683 0.94264 2.9284 2.3412 3.4803 4.1958 0.55182 1.8545 0.30129 3.7694-0.75159 5.7446-0.40795 0.76523-0.93686 1.5457-1.5867 2.3413-0.6499 0.7956-1.0282 1.2313-1.1351 1.3072-0.0428 0.0303-0.0751 0.0662-0.0972 0.10756z"/>
<path d="m253.71 273.01-3.0849 2.6673-0.17245-0.19946c0.99118-0.94999 1.0384-1.9435 0.14161-2.9807-0.19161-0.22165-0.48263-0.50449-0.87307-0.84851l-14.878-13.069c-0.76791-0.63734-1.3195-0.9931-1.6548-1.0673-0.33522-0.0742-0.76579 0.0773-1.2917 0.45457l-0.16096-0.18616 4.4013-3.8055 0.16096 0.18616c-0.59151 0.48045-0.63435 1.0132-0.1285 1.5983 0.11499 0.13295 0.36769 0.37146 0.75811 0.71554l14.434 12.663-6.994-22.279 0.13297-0.11497 21.053 10.078-10.527-16.18c-0.15615-0.25228-0.35687-0.52025-0.60214-0.80391-0.44455-0.51416-0.96379-0.51447-1.5577-0.00093l-0.16096-0.18616 2.9918-2.5868 0.16096 0.18616c-0.4521 0.39089-0.69259 0.69953-0.72149 0.92591s0.0266 0.49211 0.16644 0.79721c0.13987 0.30509 0.32237 0.62367 0.54751 0.95573l11.448 17.755c1.1222 0.56333 1.9417 0.77653 2.4585 0.63959 0.51673-0.13698 0.94353-0.35109 1.2804-0.64232l0.17246 0.19945-3.6966 3.1962-20.742-10.067z"/>
<path d="m205.18 269.68 0.31132-0.12093 16.841 17.917c1.193 1.2589 2.036 1.9403 2.529 2.0443 0.49295 0.10393 0.94698 0.0753 1.3621-0.0859l0.0955 0.24578-5.571 2.164-0.0955-0.24578c0.50429-0.1582 0.67581-0.44484 0.51457-0.85991-0.0636-0.16387-0.16431-0.32592-0.30198-0.48614l-14.712-15.689-0.2212 21.471c-0.0007 0.2894 0.0286 0.51058 0.088 0.66354 0.14428 0.37137 0.49953 0.42824 1.0657 0.17061l0.0955 0.24578-3.6212 1.4066-0.0955-0.24578c0.25125-0.0976 0.50236-0.23603 0.75332-0.4152 0.25098-0.17924 0.42846-0.57191 0.53244-1.178 0.104-0.60616 0.15509-0.92773 0.15327-0.96471z"/>
</g>
<g class="fg">
<path d="m113.7 291.67 0.12516-3.4583 0.20799 0.0497c-0.005 0.0108 0.1605 0.45578 0.49511 1.335 0.33465 0.87919 0.81606 1.6518 1.4442 2.318 0.62822 0.66608 1.4281 1.2043 2.3996 1.6148 1.6301 0.68858 3.12 0.76779 4.4698 0.23762 1.3498-0.53021 2.3029-1.4538 2.8593-2.7708 0.3694-0.87442 0.46804-1.7328 0.29593-2.5751-0.17209-0.84236-0.85204-1.8452-2.0399-3.0085-2.1039-1.8556-3.5187-3.1816-4.2446-3.978-0.7258-0.7964-1.2972-1.8679-1.7143-3.2144-0.41705-1.3466-0.29725-2.7971 0.35942-4.3516 0.27363-0.6477 0.61027-1.2338 1.0099-1.7583 0.39968-0.52448 0.88198-0.98862 1.4469-1.3924 0.56495-0.40378 1.1768-0.73048 1.8357-0.98011 0.65885-0.24961 1.2802-0.38787 1.864-0.41475 0.58383-0.0269 1.4244 0.12148 2.5217 0.44508s1.8132 0.55609 2.1479 0.69745l6.3637 2.6883-2.9277 6.9304-0.24288-0.1026c0.94975-2.3085 1.0872-4.1396 0.41234-5.4932-0.67485-1.3537-2.1296-2.5025-4.3641-3.4465-2.0295-0.85733-3.7734-1.0279-5.2318-0.5118-1.4584 0.51614-2.4726 1.4489-3.0426 2.7983-0.34656 0.82043-0.45832 1.5969-0.33528 2.3295 0.12307 0.73258 0.4215 1.4566 0.89529 2.1719 0.47383 0.71537 1.4961 1.7737 3.0667 3.1751 1.5553 1.4076 2.6012 2.5078 3.1378 3.3005 0.53654 0.79274 0.84901 1.7771 0.93743 2.953 0.0884 1.1759-0.0794 2.2658-0.50351 3.2698-0.7798 1.8459-2.0684 3.1271-3.8658 3.8435-1.7974 0.71637-3.727 0.63906-5.7889-0.23193-0.79882-0.33748-1.6237-0.79406-2.4745-1.3697-0.85083-0.57572-1.3188-0.91336-1.404-1.0129-0.034-0.0398-0.0726-0.0689-0.11586-0.0871z"/>
<path d="m68.299 260.77-3.0403-2.718 0.17573-0.19658c1.0691 0.86139 2.0605 0.78098 2.9743-0.2412 0.19529-0.21842 0.43854-0.54326 0.72973-0.97453l11.056-16.429c0.53378-0.8432 0.81598-1.4358 0.8466-1.7778 0.03067-0.34197-0.17473-0.74959-0.61622-1.2229l0.16402-0.18347 4.3377 3.8778-0.16402 0.18347c-0.55224-0.52512-1.0861-0.49938-1.6016 0.0772-0.11713 0.13106-0.32133 0.41222-0.61258 0.84348l-10.71 15.937 21.201-9.7892 0.13105 0.11715-7.2989 22.17 14.699-12.513c0.23021-0.18718 0.47027-0.42055 0.7202-0.70012 0.453-0.50672 0.38682-1.0217-0.19854-1.545l0.16402-0.18347 2.9486 2.636-0.16402 0.18347c-0.44556-0.39832-0.78245-0.59732-1.0107-0.597-0.22821 0.00033-0.48466 0.0894-0.76934 0.26716-0.28467 0.17777-0.57725 0.39956-0.87775 0.66536l-16.14 13.63c-0.415 1.1851-0.52151 2.0252-0.31953 2.5202 0.20202 0.49494 0.46901 0.89081 0.80098 1.1876l-0.17573 0.19657-3.6432-3.2569 7.3287-21.86z"/>
<path d="m39.292 218.38c-1.4886-3.3138-1.6984-6.4762-0.62946-9.4873 1.069-3.011 3.1108-5.1937 6.1252-6.5479 3.8804-1.7431 7.6935-1.9915 11.439-0.74522 3.7459 1.2464 6.5241 3.8845 8.3344 7.9145 1.4694 3.271 1.6034 6.429 0.40185 9.4739-1.2015 3.0449-3.2988 5.2396-6.292 6.5842-2.0203 0.90759-4.3198 1.3368-6.8985 1.2876-2.5786-0.0492-4.9925-0.78268-7.2417-2.2004-2.2491-1.4177-3.9956-3.5108-5.2393-6.2795zm23.133-10.276c-0.7299-1.6248-1.8858-3.0326-3.4677-4.2233s-3.3413-1.897-5.2781-2.119c-1.9368-0.22191-3.7123 0.0297-5.3264 0.75478-2.2876 1.0277-4.0918 2.5736-5.4127 4.638-1.3208 2.0644-2.0722 4.3096-2.2541 6.7359-0.18187 2.4263 0.09934 4.4679 0.84363 6.1248 1.0517 2.341 2.888 4.0694 5.5089 5.1852 2.621 1.1158 5.241 1.0854 7.8599-0.0911 3.3459-1.503 5.7621-3.9888 7.2487-7.4572s1.5792-6.6511 0.27787-9.548z"/>
<path d="m54.305 176.72-0.24585 0.0109c-0.03577-0.8078-0.21116-1.325-0.52618-1.5515-0.31502-0.22652-0.8413-0.32345-1.5789-0.29079l-21.178 0.93782c-0.74924 0.0332-1.2866 0.15082-1.6119 0.35291-0.32534 0.20209-0.47899 0.77194-0.46096 1.7096l-0.26341 0.0117-0.30716-6.9366 0.26341-0.0117c0.02854 0.64391 0.13045 1.091 0.30573 1.3413 0.17533 0.25031 0.37602 0.41151 0.60206 0.48361 0.22609 0.0721 0.73132 0.0908 1.5157 0.056l18.158-0.80407c1.5571-0.0689 2.638-0.49218 3.2429-1.2697 0.60487-0.77752 0.86712-2.0736 0.78677-3.8882l-0.141-3.16c-0.06739-1.5219-0.4914-2.6205-1.272-3.2956-0.78063-0.67509-2.2088-1.0077-4.2847-0.99795l-0.01089-0.24585 6.2166-0.27528z"/>
<path d="m32.995 125.27 0.25545 0.0653c-0.11822 0.32055-0.16075 0.69977-0.12759 1.1376 0.03321 0.4379 0.17094 0.72712 0.41317 0.86767 0.24228 0.14058 0.85161 0.33569 1.828 0.58533l19.261 4.9248c1.0445 0.26708 1.694 0.38779 1.9486 0.36214 0.25452-0.0256 0.48962-0.14091 0.70531-0.34582 0.21568-0.20491 0.40336-0.61958 0.56302-1.244l0.23842 0.061-1.7113 6.6929-0.23842-0.061c0.21482-0.84016 0.18656-1.4038-0.08476-1.6909-0.27132-0.28709-0.98033-0.57724-2.127-0.87044l-19.074-4.8769c-1.1921-0.3048-2.0017-0.39084-2.4287-0.25812-0.42702 0.13273-0.71944 0.60227-0.87726 1.4086l-0.25545-0.0653z"/>
<path d="m71.729 102.86-0.18056 0.28098-24.16-4.5763c-1.7054-0.31583-2.788-0.37074-3.2477-0.16472-0.45973 0.20605-0.80997 0.49638-1.0507 0.871l-0.22182-0.14254 3.231-5.0279 0.22182 0.14254c-0.31464 0.42465-0.28466 0.75734 0.08995 0.99806 0.1479 0.09505 0.32464 0.16684 0.53023 0.21536l21.127 4.0277-12.455-17.49c-0.16972-0.23441-0.3236-0.39597-0.46163-0.4847-0.33518-0.21537-0.65588-0.05231-0.96208 0.48918l-0.22182-0.14254 2.1001-3.2682 0.22182 0.14254c-0.1457 0.22678-0.26729 0.48645-0.36477 0.77899-0.09746 0.29261-0.0099 0.71453 0.26268 1.2658 0.2726 0.5513 0.42051 0.84137 0.44374 0.8702z"/>
<path d="m76.563 57.963-0.15835-0.21082 5.383-4.0433c1.5742-1.1823 2.7385-1.9543 3.4929-2.3158 0.75443-0.36145 1.5705-0.58234 2.4482-0.66269 0.87768-0.08029 1.7895 0.07023 2.7355 0.45156 0.94598 0.38138 1.7533 1.0171 2.4219 1.9073 1.3161 1.7522 1.4922 3.7818 0.52818 6.0887 1.6798-0.86602 3.267-1.0945 4.7614-0.68544 1.4944 0.40911 2.766 1.3117 3.8146 2.7078 0.97826 1.3024 1.543 2.7323 1.6941 4.2896s-0.0607 2.8266-0.63536 3.8079c-0.5747 0.98128-1.6163 2.0385-3.1249 3.1716l-7.9973 6.0069-0.1478-0.19677c0.63716-0.47858 0.94798-0.91357 0.93246-1.305-0.01552-0.39139-0.42092-1.1165-1.2162-2.1753l-11.718-15.602c-0.56302-0.74958-0.96767-1.2444-1.214-1.4845-0.24625-0.24004-0.53578-0.33768-0.86857-0.29293-0.33277 0.04479-0.70998 0.22553-1.1316 0.54222zm4.02-2.6677 6.8303 9.0936 2.5158-1.8897c1.7053-1.2809 2.4708-2.618 2.2964-4.0112-0.17444-1.3932-0.6241-2.5724-1.349-3.5375-0.78121-1.04-1.6495-1.7472-2.6048-2.1216-0.95534-0.37429-1.9814-0.42805-3.078-0.16128-1.0967 0.26683-2.4508 1.0055-4.0625 2.216zm8.7739 8.3152-1.6163 1.214 4.9301 6.5637c0.68268 0.90889 1.1612 1.4728 1.4356 1.6917 0.27437 0.21895 0.64832 0.38509 1.1218 0.49842 0.47351 0.11334 1.0553 0.05374 1.7454-0.17879 0.69006-0.23252 1.5551-0.73939 2.5952-1.5206 1.6116-1.2105 2.4703-2.4381 2.5761-3.6827 0.10574-1.2446-0.39035-2.5978-1.4883-4.0595-1.1402-1.5179-2.3643-2.5331-3.6725-3.0454-1.3082-0.51233-2.4121-0.59181-3.3119-0.23845-0.89975 0.3534-2.3382 1.2726-4.3152 2.7576z"/>
</g>
<g class="fg">
<path d="m177.99 64.817 0.96679 2.7422h-0.24609c-2.5078-2.4961-5.461-3.7441-8.8594-3.7441-3.5274 0.000026-6.3779 1.0489-8.5518 3.1465-2.1738 2.0977-3.2608 4.6348-3.2607 7.6113-0.00001 1.8399 0.48339 3.9551 1.4502 6.3457 0.96679 2.3906 2.4932 4.3564 4.5791 5.8975 2.0859 1.541 4.6113 2.3115 7.5762 2.3115 1.9453 0 3.8525-0.31348 5.7217-0.94043 1.8691-0.62695 3.2607-1.4678 4.1748-2.5225l0.22851 0.07031-1.8105 2.7773c-2.9297 0.63281-4.8311 1.0078-5.7041 1.125-0.87307 0.11719-2.042 0.17578-3.5068 0.17578-5.4258 0-9.3076-1.2568-11.646-3.7705-2.3379-2.5137-3.5068-5.5225-3.5068-9.0264-0.00001-2.3672 0.60058-4.6435 1.8018-6.8291 1.2012-2.1855 2.9326-3.9082 5.1943-5.168 2.2617-1.2597 4.8457-1.8896 7.752-1.8896 1.4531 0.000026 2.7099 0.13186 3.7705 0.39551 1.0605 0.2637 1.9424 0.53616 2.6455 0.81738l1.1602 0.43945c0.0351 0.01174 0.0586 0.02346 0.0703 0.03516z"/>
<path d="m173.39 106.17 1.2305 3.2344-0.21094 0.0352c-0.00002-0.0117-0.32521-0.3574-0.97559-1.0371-0.6504-0.67966-1.3945-1.2041-2.2324-1.5732-0.8379-0.36911-1.7842-0.55369-2.8389-0.55371-1.7695 0.00002-3.1728 0.50686-4.21 1.5205-1.0371 1.0137-1.5557 2.2354-1.5557 3.665 0 0.94923 0.24316 1.7783 0.72949 2.4873s1.5029 1.3682 3.0498 1.9775c2.6601 0.89064 4.4795 1.5615 5.458 2.0127 0.97851 0.45118 1.9219 1.2158 2.8301 2.2939 0.90819 1.0781 1.3623 2.461 1.3623 4.1484-0.00002 0.70313-0.0821 1.374-0.2461 2.0127-0.16408 0.63868-0.42775 1.2539-0.79101 1.8457-0.3633 0.5918-0.79982 1.1309-1.3096 1.6172-0.50978 0.48633-1.0283 0.85547-1.5557 1.1074-0.52735 0.25195-1.3594 0.44238-2.4961 0.57129-1.1367 0.1289-1.8867 0.19335-2.25 0.19335h-6.9082v-7.5234h0.26367c0.0234 2.4961 0.60937 4.2363 1.7578 5.2207 1.1484 0.98438 2.9355 1.4766 5.3613 1.4766 2.2031 0 3.876-0.52148 5.0186-1.5644 1.1426-1.043 1.7139-2.2969 1.7139-3.7617-0.00001-0.89062-0.19923-1.6494-0.59766-2.2764-0.39845-0.62694-0.95509-1.1777-1.6699-1.6523-0.71485-0.4746-2.0684-1.0518-4.0605-1.7314-1.9805-0.69139-3.3721-1.2978-4.1748-1.8193-0.80274-0.52147-1.4736-1.3066-2.0127-2.3555-0.53907-1.0488-0.8086-2.1182-0.8086-3.208 0-2.0039 0.68848-3.6855 2.0654-5.0449 1.377-1.3594 3.1846-2.039 5.4228-2.0391 0.86718 0.00002 1.8047 0.0996 2.8125 0.29883 1.0078 0.19924 1.5703 0.32815 1.6875 0.38671 0.0469 0.0235 0.0937 0.0352 0.14063 0.0352z"/>
<path d="m173.39 148.48 1.2305 3.2344-0.21094 0.0352c-0.00002-0.0117-0.32521-0.3574-0.97559-1.0371-0.6504-0.67966-1.3945-1.2041-2.2324-1.5732-0.8379-0.36911-1.7842-0.55368-2.8389-0.55371-1.7695 0.00003-3.1728 0.50686-4.21 1.5205-1.0371 1.0137-1.5557 2.2354-1.5557 3.665 0 0.94924 0.24316 1.7783 0.72949 2.4873s1.5029 1.3682 3.0498 1.9775c2.6601 0.89064 4.4795 1.5615 5.458 2.0127 0.97851 0.45118 1.9219 1.2158 2.8301 2.2939 0.90819 1.0781 1.3623 2.461 1.3623 4.1484-0.00002 0.70313-0.0821 1.374-0.2461 2.0127-0.16408 0.63867-0.42775 1.2539-0.79101 1.8457-0.3633 0.5918-0.79982 1.1309-1.3096 1.6172-0.50978 0.48633-1.0283 0.85547-1.5557 1.1074-0.52735 0.25195-1.3594 0.44238-2.4961 0.57129-1.1367 0.1289-1.8867 0.19336-2.25 0.19336h-6.9082v-7.5234h0.26367c0.0234 2.4961 0.60937 4.2363 1.7578 5.2207 1.1484 0.98438 2.9355 1.4766 5.3613 1.4766 2.2031 0.00001 3.876-0.52148 5.0186-1.5644 1.1426-1.043 1.7139-2.2969 1.7139-3.7617-0.00001-0.89062-0.19923-1.6494-0.59766-2.2764-0.39845-0.62695-0.95509-1.1777-1.6699-1.6524-0.71485-0.4746-2.0684-1.0517-4.0605-1.7314-1.9805-0.6914-3.3721-1.2978-4.1748-1.8193-0.80274-0.52147-1.4736-1.3066-2.0127-2.3555-0.53907-1.0488-0.8086-2.1181-0.8086-3.208 0-2.0039 0.68848-3.6855 2.0654-5.0449 1.377-1.3594 3.1846-2.039 5.4228-2.0391 0.86718 0.00003 1.8047 0.0996 2.8125 0.29883 1.0078 0.19924 1.5703 0.32815 1.6875 0.38672 0.0469 0.0235 0.0937 0.0352 0.14063 0.0352z"/>
<path d="m177.34 190.47h4.0781v0.26367c-1.3711 0.0703-2.0567 0.79104-2.0566 2.1621-0.00003 0.29299 0.0351 0.69729 0.10547 1.2129l2.707 19.617c0.16403 0.98438 0.3486 1.6143 0.55371 1.8896 0.20505 0.27539 0.62985 0.44238 1.2744 0.50097v0.2461h-5.8184v-0.2461c0.76169 0.0234 1.1426-0.35156 1.1426-1.125-0.00002-0.17577-0.0352-0.52148-0.10546-1.0371l-2.6367-19.02-9.2812 21.428h-0.17578l-9.334-21.393-2.6191 19.125c-0.0469 0.29297-0.0703 0.62696-0.0703 1.002 0 0.67969 0.39257 1.0195 1.1777 1.0195v0.2461h-3.9551v-0.2461c0.59766 0.00001 0.98145-0.0762 1.1514-0.22851 0.16992-0.15234 0.30176-0.38965 0.39551-0.71191 0.0937-0.32227 0.16406-0.68262 0.21094-1.0811l2.9531-20.918c-0.48047-1.1601-0.96094-1.8574-1.4414-2.0918-0.48048-0.23434-0.94337-0.35153-1.3887-0.35156v-0.26367h4.8867l9.1055 21.182z"/>
<path d="m158.85 258.68v-0.24609c0.80859 0 1.333-0.15234 1.5732-0.45703 0.24023-0.30469 0.36035-0.82617 0.36035-1.5645v-21.199c0-0.74998-0.0937-1.292-0.28125-1.626-0.1875-0.33396-0.75-0.51267-1.6875-0.53613v-0.26368h6.9434v0.26368c-0.64454 0.00002-1.0957 0.0821-1.3535 0.24609-0.25782 0.16409-0.42774 0.35745-0.50977 0.58008-0.082 0.22268-0.12305 0.72659-0.12305 1.5117v18.176c0 1.5586 0.375 2.6572 1.125 3.2959 0.75 0.63867 2.0332 0.95801 3.8496 0.958h3.1641c1.5234 0.00001 2.6396-0.37499 3.3486-1.125 0.70897-0.74999 1.1045-2.1621 1.1865-4.2363h0.2461v6.2226z"/>
</g>
<rect class="bg" height="33.325" width="33.325" y="146.77" x="151.78"/>
<g class="fg">
<path d="m95.864 150.69h5.0098v0.26367c-0.76174 0.0235-1.2891 0.18459-1.582 0.4834-0.293 0.29885-0.43948 0.92873-0.43945 1.8896v23.572l-20.654-21.99v19.16c-0.000005 0.60938 0.04687 1.0606 0.14062 1.3535 0.09374 0.29297 0.22851 0.49219 0.4043 0.59765 0.17578 0.10547 0.61523 0.21094 1.3184 0.31641v0.24609h-4.9746v-0.24609c0.89062 0 1.4443-0.1582 1.6611-0.47461 0.21679-0.3164 0.32519-1.0723 0.3252-2.2676v-17.525c-0.000004-1.5351-0.21387-2.789-0.6416-3.7617-0.42774-0.97263-1.415-1.4238-2.9619-1.3535v-0.26367h4.8691l19.406 20.672v-18.281c-0.000025-0.98435-0.17581-1.5849-0.52734-1.8018-0.35159-0.21677-0.80276-0.32517-1.3535-0.32519z"/>
<path id="path3063" d="m116.49 150.96v-0.26367h11.883c3.0234 0.00002 5.4111 0.23733 7.1631 0.71191 1.7519 0.47463 3.2783 1.2217 4.5791 2.2412 1.3008 1.0196 2.332 2.3233 3.0938 3.9111 0.76169 1.5879 1.1425 3.3604 1.1426 5.3174-0.00003 1.8867-0.39553 3.7412-1.1865 5.5635-0.79104 1.8223-1.8662 3.3926-3.2256 4.7109-1.3594 1.3184-2.792 2.2207-4.2978 2.707-1.5059 0.48633-3.835 0.72949-6.9873 0.72949h-12.164v-0.24609h0.3164c0.63281 0 1.0488-0.25488 1.248-0.76465 0.19921-0.50976 0.29882-1.4326 0.29883-2.7686v-18.861c-0.00001-1.4062-0.12012-2.2558-0.36035-2.5488-0.24024-0.29294-0.74122-0.43943-1.5029-0.43945zm8.8242 0.28125h-3.9726v20.092c-0.00001 1.2656 0.21386 2.2061 0.6416 2.8213 0.42773 0.61524 1.1572 1.0606 2.1885 1.3359 1.0312 0.27539 2.4199 0.41309 4.166 0.41309 4.8516 0 8.2588-1.2451 10.222-3.7354 1.9629-2.4902 2.9443-5.206 2.9443-8.1475-0.00003-3.457-1.3448-6.4512-4.0342-8.9824-2.6895-2.5312-6.7412-3.7968-12.155-3.7969z"/>
<path d="m172.31 151.03 1.2305 3.2344-0.21094 0.0352c-0.00002-0.0117-0.32521-0.3574-0.97559-1.0371-0.6504-0.67966-1.3945-1.2041-2.2324-1.5732-0.8379-0.36912-1.7842-0.55369-2.8389-0.55371-1.7695 0.00002-3.1728 0.50686-4.21 1.5205-1.0371 1.0137-1.5557 2.2354-1.5557 3.665 0 0.94923 0.24316 1.7783 0.72949 2.4873s1.5029 1.3682 3.0498 1.9775c2.6601 0.89064 4.4795 1.5615 5.458 2.0127 0.97851 0.45119 1.9219 1.2158 2.8301 2.294 0.90819 1.0781 1.3623 2.461 1.3623 4.1484-0.00002 0.70313-0.082 1.374-0.2461 2.0127-0.16408 0.63868-0.42775 1.2539-0.79101 1.8457-0.3633 0.5918-0.79982 1.1309-1.3096 1.6172-0.50978 0.48633-1.0283 0.85547-1.5557 1.1074-0.52735 0.25196-1.3594 0.44239-2.4961 0.57129-1.1367 0.12891-1.8867 0.19336-2.25 0.19336h-6.9082v-7.5234h0.26367c0.0234 2.4961 0.60937 4.2363 1.7578 5.2207 1.1484 0.98438 2.9355 1.4766 5.3613 1.4766 2.2031 0 3.876-0.52148 5.0186-1.5644 1.1426-1.043 1.7139-2.2969 1.7139-3.7617-0.00001-0.89062-0.19923-1.6494-0.59766-2.2764-0.39845-0.62694-0.95509-1.1777-1.6699-1.6523-0.71485-0.4746-2.0684-1.0518-4.0605-1.7314-1.9805-0.69139-3.3721-1.2978-4.1748-1.8193-0.80274-0.52147-1.4736-1.3066-2.0127-2.3555-0.53907-1.0488-0.8086-2.1182-0.8086-3.208 0-2.0039 0.68848-3.6855 2.0654-5.0449 1.377-1.3594 3.1846-2.039 5.4228-2.0391 0.86718 0.00002 1.8047 0.0996 2.8125 0.29882 1.0078 0.19925 1.5703 0.32816 1.6875 0.38672 0.0469 0.0235 0.0937 0.0352 0.14063 0.0352z"/>
<path d="m213.81 150.69h4.0781v0.26367c-1.3711 0.0703-2.0567 0.79104-2.0566 2.1621-0.00002 0.29299 0.0351 0.69728 0.10547 1.2129l2.707 19.617c0.16404 0.98438 0.34861 1.6143 0.55371 1.8896 0.20505 0.27539 0.62986 0.44239 1.2744 0.50098v0.24609h-5.8184v-0.24609c0.76169 0.0234 1.1426-0.35156 1.1426-1.125-0.00003-0.17578-0.0352-0.52148-0.10547-1.0371l-2.6367-19.02-9.2812 21.428h-0.17578l-9.334-21.393-2.6191 19.125c-0.0469 0.29297-0.0703 0.62695-0.0703 1.002 0 0.67969 0.39258 1.0195 1.1777 1.0195v0.24609h-3.9551v-0.24609c0.59765 0 0.98144-0.0762 1.1514-0.22852 0.16992-0.15234 0.30176-0.38964 0.39551-0.71191 0.0937-0.32226 0.16406-0.68262 0.21094-1.081l2.9531-20.918c-0.48047-1.1601-0.96094-1.8574-1.4414-2.0918-0.48047-0.23435-0.94336-0.35154-1.3887-0.35156v-0.26367h4.8867l9.1055 21.182z"/>
<path d="m234.95 150.96v-0.26367h11.883c3.0234 0.00002 5.4111 0.23733 7.1631 0.71191 1.7519 0.47463 3.2783 1.2217 4.5791 2.2412 1.3008 1.0196 2.332 2.3233 3.0938 3.9111 0.76169 1.5879 1.1426 3.3604 1.1426 5.3174-0.00003 1.8867-0.39554 3.7412-1.1865 5.5635-0.79105 1.8223-1.8662 3.3926-3.2256 4.7109-1.3594 1.3184-2.792 2.2207-4.2978 2.707-1.5059 0.48633-3.835 0.72949-6.9873 0.72949h-12.164v-0.24609h0.31641c0.63281 0 1.0488-0.25488 1.248-0.76465 0.19922-0.50976 0.29883-1.4326 0.29883-2.7686v-18.861c0-1.4062-0.12012-2.2558-0.36035-2.5488-0.24024-0.29294-0.74121-0.43943-1.5029-0.43945zm8.8242 0.28125h-3.9727v20.092c0 1.2656 0.21386 2.2061 0.6416 2.8213 0.42773 0.61524 1.1572 1.0606 2.1885 1.3359 1.0312 0.27539 2.4199 0.41309 4.166 0.41309 4.8515 0 8.2588-1.2451 10.222-3.7354 1.9629-2.4902 2.9443-5.206 2.9443-8.1475-0.00002-3.457-1.3448-6.4512-4.0342-8.9824-2.6895-2.5312-6.7412-3.7968-12.155-3.7969z"/>
<g class="fg">
<path d="m124.76 99.299 0.9668 2.7422h-0.2461c-2.5078-2.4961-5.461-3.7441-8.8594-3.7441-3.5274 0.000025-6.3779 1.0489-8.5518 3.1465-2.1738 2.0977-3.2607 4.6348-3.2607 7.6113 0 1.8399 0.48339 3.9551 1.4502 6.3457 0.96679 2.3906 2.4932 4.3564 4.5791 5.8975 2.0859 1.541 4.6113 2.3115 7.5762 2.3115 1.9453 0 3.8525-0.31348 5.7217-0.94043 1.8691-0.62695 3.2607-1.4678 4.1748-2.5225l0.22852 0.0703-1.8106 2.7773c-2.9297 0.63282-4.8311 1.0078-5.7041 1.125-0.87307 0.11719-2.042 0.17578-3.5068 0.17578-5.4258 0-9.3076-1.2568-11.646-3.7705-2.3379-2.5137-3.5068-5.5225-3.5068-9.0264 0-2.3672 0.60058-4.6435 1.8018-6.8291 1.2012-2.1855 2.9326-3.9082 5.1943-5.168 2.2617-1.2597 4.8457-1.8896 7.752-1.8896 1.4531 0.000026 2.7099 0.13186 3.7705 0.39551 1.0605 0.2637 1.9424 0.53616 2.6455 0.81738l1.1602 0.43945c0.0351 0.01174 0.0586 0.02346 0.0703 0.03516z"/>
<path d="m226.63 97.821 1.2305 3.2344-0.21093 0.0352c-0.00002-0.0117-0.32521-0.3574-0.97559-1.0371-0.6504-0.67966-1.3945-1.2041-2.2324-1.5732-0.8379-0.36912-1.7842-0.55369-2.8389-0.55371-1.7695 0.000025-3.1729 0.50686-4.21 1.5205-1.0371 1.0137-1.5557 2.2354-1.5557 3.665-0.00001 0.94923 0.24316 1.7783 0.72949 2.4873 0.48632 0.709 1.5029 1.3682 3.0498 1.9775 2.6602 0.89064 4.4795 1.5615 5.458 2.0127 0.9785 0.45119 1.9219 1.2158 2.8301 2.294 0.90819 1.0781 1.3623 2.461 1.3623 4.1484-0.00001 0.70313-0.082 1.374-0.24609 2.0127-0.16408 0.63868-0.42775 1.2539-0.79102 1.8457-0.36329 0.5918-0.79981 1.1309-1.3096 1.6172-0.50977 0.48633-1.0283 0.85547-1.5557 1.1074-0.52736 0.25195-1.3594 0.44238-2.4961 0.57128-1.1367 0.12891-1.8867 0.19336-2.25 0.19336h-6.9082v-7.5234h0.26368c0.0234 2.4961 0.60937 4.2363 1.7578 5.2207 1.1484 0.98438 2.9355 1.4766 5.3613 1.4766 2.2031 0 3.876-0.52148 5.0186-1.5644 1.1426-1.043 1.7138-2.2969 1.7139-3.7617-0.00002-0.89062-0.19924-1.6494-0.59766-2.2764-0.39845-0.62694-0.95509-1.1777-1.6699-1.6523-0.71486-0.4746-2.0684-1.0518-4.0606-1.7314-1.9805-0.69139-3.3721-1.2978-4.1748-1.8193-0.80274-0.52147-1.4736-1.3066-2.0127-2.3555-0.53906-1.0488-0.80859-2.1182-0.80859-3.208 0-2.0039 0.68847-3.6855 2.0654-5.0449 1.377-1.3593 3.1846-2.039 5.4228-2.0391 0.86718 0.000026 1.8047 0.09963 2.8125 0.29883 1.0078 0.19924 1.5703 0.32815 1.6875 0.38672 0.0469 0.02346 0.0937 0.03518 0.14063 0.03516z" />
<path d="m212.54 202.63v-0.26367h6.7324c1.9687 0.00003 3.3633 0.0821 4.1836 0.24609 0.8203 0.16409 1.6055 0.47757 2.3555 0.94043 0.74999 0.46292 1.3887 1.1309 1.916 2.0039 0.52732 0.87307 0.791 1.8662 0.79101 2.9795-0.00001 2.1914-1.0781 3.9199-3.2344 5.1856 1.8633 0.31642 3.2695 1.0869 4.2188 2.3115 0.9492 1.2246 1.4238 2.71 1.4238 4.4561-0.00002 1.6289-0.40725 3.1113-1.2217 4.4473-0.81447 1.3359-1.7461 2.2236-2.7949 2.6631-1.0488 0.43945-2.5166 0.65918-4.4033 0.65918h-10.002v-0.24609c0.79687 0 1.3066-0.16114 1.5293-0.4834 0.22265-0.32227 0.33398-1.1455 0.33398-2.4697v-19.512c0-0.93747-0.0264-1.5762-0.0791-1.916-0.0527-0.33982-0.22559-0.59178-0.51855-0.75586-0.29297-0.16404-0.70313-0.24607-1.2305-0.2461zm4.8164 0.28125v11.373h3.1465c2.1328 0.00001 3.5478-0.60936 4.2451-1.8281 0.69725-1.2187 1.0459-2.4316 1.0459-3.6387-0.00001-1.3008-0.26954-2.3877-0.80859-3.2607-0.53908-0.87302-1.3272-1.5322-2.3643-1.9775-1.0371-0.44529-2.5635-0.66794-4.5791-0.66797zm2.0215 11.918h-2.0215v8.209c0 1.1367 0.0439 1.875 0.13184 2.2148 0.0879 0.33985 0.2871 0.69727 0.59766 1.0723 0.31054 0.375 0.81151 0.67675 1.5029 0.90527s1.6875 0.34277 2.9883 0.34277c2.0156 0 3.4394-0.46582 4.2715-1.3975 0.83202-0.93164 1.248-2.3115 1.248-4.1396-0.00002-1.8984-0.36916-3.4453-1.1074-4.6406-0.7383-1.1953-1.5733-1.9219-2.5049-2.1797-0.93165-0.2578-2.6338-0.3867-5.1064-0.38672z"/>
<path d="m108.68 203.42v-0.26367h7.3828c2.625 0.00002 4.5322 0.29299 5.7217 0.8789 1.1894 0.58597 2.0566 1.3155 2.6016 2.1885 0.5449 0.87307 0.81736 2.0244 0.81738 3.4541-0.00002 2.1914-0.75588 3.8379-2.2676 4.9394-1.5117 1.1016-3.5625 1.6289-6.1523 1.582v-0.2461c1.6406 0.00002 2.9736-0.50389 3.999-1.5117s1.5381-2.332 1.5381-3.9726c-0.00002-1.2773-0.24904-2.4111-0.74707-3.4014-0.49806-0.99021-1.1983-1.7431-2.1006-2.2588-0.90235-0.5156-2.2793-0.77341-4.1309-0.77344h-1.8457v22.166c-0.00001 1.2539 0.14062 2.001 0.42187 2.2412 0.28125 0.24023 0.81445 0.36035 1.5996 0.36035v0.2461h-6.8379v-0.2461c1.2188 0 1.8281-0.55664 1.8281-1.6699v-21.445c-0.00001-0.91404-0.11719-1.5205-0.35156-1.8193-0.23438-0.2988-0.72657-0.44822-1.4766-0.44824z"/>
<path d="m139.19 59.343c0 9.9799-8.0903 18.07-18.07 18.07-9.9799 0-18.07-8.0903-18.07-18.07 0-9.9799 8.0903-18.07 18.07-18.07 9.9799 0 18.07 8.0903 18.07 18.07z" transform="matrix(.15488 0 0 .15488 96.011 40.384)"/>
<path d="m139.19 59.343c0 9.9799-8.0903 18.07-18.07 18.07-9.9799 0-18.07-8.0903-18.07-18.07 0-9.9799 8.0903-18.07 18.07-18.07 9.9799 0 18.07 8.0903 18.07 18.07z" transform="matrix(.15488 0 0 .15488 203.55 40.283)"/>
<path d="m139.19 59.343c0 9.9799-8.0903 18.07-18.07 18.07-9.9799 0-18.07-8.0903-18.07-18.07 0-9.9799 8.0903-18.07 18.07-18.07 9.9799 0 18.07 8.0903 18.07 18.07z" transform="matrix(.17299 0 0 .17299 147.99 279.77)"/>
<path d="m139.19 59.343c0 9.9799-8.0903 18.07-18.07 18.07-9.9799 0-18.07-8.0903-18.07-18.07 0-9.9799 8.0903-18.07 18.07-18.07 9.9799 0 18.07 8.0903 18.07 18.07z" transform="matrix(.15488 0 0 .15488 131.66 277.84)"/>
<path d="m139.19 59.343c0 9.9799-8.0903 18.07-18.07 18.07-9.9799 0-18.07-8.0903-18.07-18.07 0-9.9799 8.0903-18.07 18.07-18.07 9.9799 0 18.07 8.0903 18.07 18.07z" transform="matrix(.15488 0 0 .15488 168.54 277.98)"/>
<path d="m61.398 206.07c0.38726-6.2993 0.78765-12.891-3.9191-17.556 2.2141 1.3159 3.7733 2.2888 5.016 5.4372 1.2085 3.0616 2.4354 10.148 0.93876 15.254-0.47418-1.2005-1.5449-2.5682-2.0357-3.1354z"/>
</g>
</g>
</svg>

View File

@@ -0,0 +1,266 @@
<script lang="ts">
import type { VerseData } from '$lib/data/mysteryDescriptions';
let {
reference = '',
title = '',
verseData = null,
onClose
}: {
reference?: string,
title?: string,
verseData?: VerseData | null,
onClose: () => void
} = $props();
let book: string = $state(verseData?.book || '');
let chapter: number = $state(verseData?.chapter || 0);
let verses: Array<{ verse: number; text: string }> = $state(verseData?.verses || []);
let loading = $state(false);
let error = $state(verseData ? '' : 'Keine Versdaten verfügbar');
function handleBackdropClick(event: MouseEvent) {
if (event.target === event.currentTarget) {
onClose();
}
}
function handleKeydown(event: KeyboardEvent) {
if (event.key === 'Escape') {
onClose();
}
}
</script>
<svelte:window onkeydown={handleKeydown} />
<div class="modal-backdrop" onclick={handleBackdropClick} role="presentation">
<div class="modal-content">
<div class="modal-header">
<div class="header-content">
{#if title}
<h3 class="modal-title">
{#if title.includes(':')}
{title.split(':')[0]}:<br>{title.split(':')[1]}
{:else}
{title}
{/if}
</h3>
{/if}
<p class="modal-reference">{reference}</p>
</div>
<button class="close-button" onclick={onClose} aria-label="Schließen">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
</div>
<div class="modal-body">
{#if loading}
<p class="loading">Lädt...</p>
{:else if error}
<p class="error">{error}</p>
{:else if verses.length > 0}
<div class="verses">
{#each verses as verse}
<p class="verse">
<span class="verse-number">{verse.verse}</span>
<span class="verse-text">{verse.text}</span>
</p>
{/each}
</div>
{:else}
<p class="error">Keine Verse gefunden</p>
{/if}
</div>
</div>
</div>
<style>
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
backdrop-filter: blur(10px);
background: rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
padding: 1rem;
animation: show-backdrop 200ms ease forwards;
}
@keyframes show-backdrop {
from {
backdrop-filter: blur(0px);
background: rgba(0, 0, 0, 0);
}
to {
backdrop-filter: blur(10px);
background: rgba(0, 0, 0, 0.3);
}
}
@media(prefers-color-scheme: light) {
.modal-backdrop {
background: rgba(255, 255, 255, 0.3);
}
@keyframes show-backdrop {
from {
backdrop-filter: blur(0px);
background: rgba(255, 255, 255, 0);
}
to {
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.3);
}
}
}
.modal-content {
background: var(--nord0);
border-radius: 12px;
max-width: 600px;
width: 100%;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
position: relative;
}
@media(prefers-color-scheme: light) {
.modal-content {
background: var(--nord6);
}
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 1.5rem;
border-bottom: 1px solid var(--nord3);
}
@media(prefers-color-scheme: light) {
.modal-header {
border-bottom: 1px solid var(--nord4);
}
}
.header-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.modal-title {
margin: 0;
color: var(--nord10);
font-size: 1.3rem;
font-weight: 700;
}
.modal-reference {
margin: 0;
color: var(--nord8);
font-size: 1rem;
font-weight: 600;
}
.close-button {
position: absolute;
top: -1rem;
right: -1rem;
background-color: var(--nord11);
border: none;
cursor: pointer;
padding: 1rem;
border-radius: 1000px;
color: white;
transition: 200ms;
box-shadow: 0 0 1em 0.2em rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
z-index: 1001;
}
.close-button svg {
width: 2rem;
height: 2rem;
}
.close-button:hover {
background-color: var(--nord0);
transform: scale(1.2, 1.2);
box-shadow: 0 0 1em 0.4em rgba(0, 0, 0, 0.3);
}
.close-button:active {
transition: 50ms;
scale: 0.8 0.8;
}
.modal-body {
padding: 1rem;
overflow-y: auto;
}
.loading,
.error {
text-align: center;
color: var(--nord4);
font-style: italic;
}
@media(prefers-color-scheme: light) {
.loading,
.error {
color: var(--nord2);
}
}
.error {
color: var(--nord11);
}
.verses {
display: flex;
flex-direction: column;
gap: 0;
}
.verse {
display: flex;
gap: 0.75rem;
line-height: 1.6;
color: var(--nord4);
}
@media(prefers-color-scheme: light) {
.verse {
color: var(--nord0);
}
}
.verse-number {
color: var(--nord10);
font-weight: 700;
min-width: 2rem;
font-size: 0.9rem;
}
.verse-text {
flex: 1;
font-size: 1.1rem;
}
</style>

View File

@@ -0,0 +1,275 @@
<!-- FireEffect.svelte -->
<script lang="ts">
interface Props {
holy?: boolean;
burst?: boolean;
}
let { holy = false, burst = false }: Props = $props();
const burstParticles = [
{ x: 10, y: 0, size: 8, delay: 0, dur: 1.6 },
{ x: 25, y: 5, size: 10, delay: 0.05, dur: 1.8 },
{ x: 40, y: 10, size: 12, delay: 0.02, dur: 2.0 },
{ x: 55, y: 3, size: 7, delay: 0.1, dur: 1.7 },
{ x: 70, y: 8, size: 9, delay: 0.08, dur: 1.9 },
{ x: 85, y: 2, size: 11, delay: 0.12, dur: 1.6 },
{ x: 15, y: 15, size: 6, delay: 0.15, dur: 1.5 },
{ x: 35, y: 20, size: 10, delay: 0.18, dur: 1.8 },
{ x: 50, y: 12, size: 8, delay: 0.07, dur: 2.0 },
{ x: 65, y: 18, size: 7, delay: 0.22, dur: 1.7 },
{ x: 80, y: 25, size: 9, delay: 0.1, dur: 1.9 },
{ x: 20, y: 30, size: 11, delay: 0.25, dur: 1.6 },
{ x: 45, y: 22, size: 6, delay: 0.03, dur: 1.8 },
{ x: 60, y: 28, size: 10, delay: 0.2, dur: 2.0 },
{ x: 75, y: 15, size: 8, delay: 0.14, dur: 1.5 },
{ x: 30, y: 35, size: 12, delay: 0.28, dur: 1.7 },
{ x: 5, y: 10, size: 7, delay: 0.06, dur: 1.9 },
{ x: 90, y: 20, size: 9, delay: 0.16, dur: 1.6 },
{ x: 48, y: 32, size: 8, delay: 0.3, dur: 2.0 },
{ x: 22, y: 8, size: 10, delay: 0.11, dur: 1.8 },
{ x: 68, y: 35, size: 6, delay: 0.23, dur: 1.5 },
{ x: 38, y: 5, size: 11, delay: 0.04, dur: 1.7 },
{ x: 82, y: 30, size: 7, delay: 0.26, dur: 1.9 },
{ x: 52, y: 18, size: 9, delay: 0.09, dur: 1.6 },
];
</script>
{#if burst}
<div class="burst-particles" class:holy-fire={holy}>
{#each burstParticles as p}
<div
class="bp"
style:left="{p.x}%"
style:bottom="{p.y}%"
style:width="{p.size}px"
style:height="{p.size}px"
style:animation-delay="{p.delay}s"
style:animation-duration="{p.dur}s"
></div>
{/each}
</div>
{:else}
<div class="fire" class:holy-fire={holy}>
<div class="fire-left">
<div class="main-fire"></div>
<div class="particle-fire"></div>
</div>
<div class="fire-center">
<div class="main-fire"></div>
<div class="particle-fire"></div>
</div>
<div class="fire-right">
<div class="main-fire"></div>
<div class="particle-fire"></div>
</div>
<div class="fire-bottom">
<div class="main-fire"></div>
</div>
</div>
{/if}
<style>
/* =====================
PURE CSS FIRE (SCALED + RISING)
===================== */
.fire {
position: absolute;
bottom: -10px;
left: 50%;
transform: translateX(-50%) scale(0.55);
width: 100px;
height: 100px;
pointer-events: none;
z-index: 4;
}
/* ---------- animations ---------- */
@keyframes scaleUpDown {
0%,100% { transform: scaleY(1) scaleX(1); }
50%,90% { transform: scaleY(1.1); }
75% { transform: scaleY(0.95); }
80% { transform: scaleX(0.95); }
}
@keyframes shake {
0%,100% { transform: skewX(0) scale(1); }
50% { transform: skewX(5deg) scale(0.9); }
}
@keyframes particleUp {
0% { opacity: 0; }
20% { opacity: 1; }
80% { opacity: 1; }
100% {
opacity: 0;
top: -100%;
transform: scale(0.5);
}
}
@keyframes glow {
0%,100% { background-color: #ef5a00; }
50% { background-color: #ff7800; }
}
/* ---------- fire structure ---------- */
.fire-center,
.fire-left,
.fire-right {
position: absolute;
width: 100%;
height: 100%;
}
.fire-center {
animation: scaleUpDown 3s ease-out infinite;
}
.fire-left {
animation: shake 3s ease-out infinite;
}
.fire-right {
animation: shake 2s ease-out infinite;
}
.main-fire {
position: absolute;
width: 100%;
height: 100%;
background-image: radial-gradient(
farthest-corner at 10px 0,
color-mix(in srgb, var(--nord11) 70%, transparent),
color-mix(in srgb, var(--nord12) 70%, transparent) 60%,
color-mix(in srgb, var(--nord13) 85%, transparent) 95%
);
filter: drop-shadow(0 0 6px var(--nord12));
transform: scaleX(0.8) rotate(45deg);
border-radius: 0 40% 60% 40%;
}
.fire-left .main-fire {
top: 15%;
left: -20%;
width: 80%;
height: 80%;
}
.fire-right .main-fire {
top: 15%;
right: -25%;
width: 80%;
height: 80%;
}
.particle-fire {
position: absolute;
width: 10px;
height: 10px;
background-color: var(--nord13);
filter: drop-shadow(0 0 4px var(--nord12));
border-radius: 50%;
animation: particleUp 2.5s ease-out infinite;
}
.fire-center .particle-fire {
top: 60%;
left: 45%;
}
.fire-left .particle-fire {
top: 20%;
left: 20%;
animation-duration: 3s;
}
.fire-right .particle-fire {
top: 45%;
left: 50%;
width: 15px;
height: 15px;
}
.fire-bottom .main-fire {
position: absolute;
top: 30%;
left: 20%;
width: 75%;
height: 75%;
background-color: #ff7800;
transform: scaleX(0.8) rotate(45deg);
border-radius: 0 40% 100% 40%;
filter: blur(10px);
animation: glow 2s ease-out infinite;
}
/* =====================
HOLY (BLUE-WHITE) FIRE
===================== */
.holy-fire .main-fire {
background-image: radial-gradient(
farthest-corner at 10px 0,
#9fd4ff 0%,
#eaf6ff 95%
);
filter: drop-shadow(0 0 12px rgba(180,220,255,.9));
}
.holy-fire .particle-fire {
background-color: #eaf6ff;
filter: drop-shadow(0 0 12px rgba(180,220,255,.9));
}
.holy-fire .fire-bottom .main-fire {
background-color: #d6ecff;
}
/* =====================
BURST particles only
===================== */
.burst-particles {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60px;
height: 80px;
pointer-events: none;
z-index: 6;
}
.burst-particles .bp {
position: absolute;
background-color: var(--nord13);
filter: drop-shadow(0 0 4px var(--nord12));
border-radius: 50%;
opacity: 0;
animation: burstParticleUp 2s ease-out forwards;
}
.burst-particles.holy-fire .bp {
background-color: #eaf6ff;
filter: drop-shadow(0 0 12px rgba(180,220,255,.9));
}
@keyframes burstParticleUp {
0% {
transform: translateY(0) scale(1);
opacity: 0;
}
10% {
opacity: 1;
}
60% {
opacity: 0.8;
}
100% {
transform: translateY(-80px) scale(0.3);
opacity: 0;
}
}
</style>

View File

@@ -0,0 +1,51 @@
<script>
import { onMount } from 'svelte';
import { getLanguageContext } from '$lib/contexts/languageContext.js';
import Toggle from '$lib/components/Toggle.svelte';
export let initialLatin = undefined;
export let hasUrlLatin = false;
export let href = undefined;
// Get the language context (must be created by parent page)
const { showLatin, lang } = getLanguageContext();
// Local state for the checkbox
let showBilingual = initialLatin !== undefined ? initialLatin : true;
// Flag to prevent saving before we've loaded from localStorage
let hasLoadedFromStorage = false;
// Sync checkbox with context
$: $showLatin = showBilingual;
// Save to localStorage whenever it changes (but only after initial load)
$: if (typeof localStorage !== 'undefined' && hasLoadedFromStorage) {
localStorage.setItem('rosary_showBilingual', showBilingual.toString());
}
// Dynamic label based on URL language
$: label = $lang === 'en'
? 'Show Latin and English'
: 'Lateinisch und Deutsch anzeigen';
onMount(() => {
// Only load from localStorage if no URL param was set
if (!hasUrlLatin) {
const saved = localStorage.getItem('rosary_showBilingual');
if (saved !== null) {
showBilingual = saved === 'true';
}
}
// Now allow saving
hasLoadedFromStorage = true;
});
</script>
<Toggle
bind:checked={showBilingual}
{label}
{href}
accentColor="var(--nord14)"
/>

View File

@@ -0,0 +1,46 @@
<script lang="ts">
let { type }: { type: 'joyful' | 'sorrowful' | 'glorious' | 'luminous' } = $props();
</script>
{#if type === 'joyful'}
<svg viewBox="-10 0 2058 2048">
<path d="M1935 90q0 32 -38 91q-21 29 -56 90q-20 55 -63 164q-35 86 -95 143q-22 -21 -43 -45q51 -49 85 -139q49 -130 61 -152q-126 48 -152 63q-76 46 -95 128q-27 -18 -58 -25q28 -104 97 -149q31 -20 138 -52q90 -28 137 -74l29 -39q22 -30 32 -30q21 0 21 26zM1714 653 q-90 30 -113 43q-65 36 -65 90q0 19 20 119q23 116 23 247q0 169 -103 299q-111 141 -275 141q-254 0 -283 87q-16 104 -31 207q-27 162 -76 162q-21 0 -41 -20q-16 -19 -32 -37q-10 3 -33 22q-18 15 -39 15q-28 0 -50 -44.5t-30 -44.5q-10 0 -35.5 11.5t-41.5 11.5 q-47 0 -58.5 -45.5t-21.5 -45.5t-29.5 2.5t-29.5 2.5q-46 0 -46 -30q0 -16 14 -44.5t14 -44.5q0 -8 -46.5 -25.5t-46.5 -48.5q0 -34 35.5 -52t99.5 -31q91 -19 103 -22q113 -32 171 -93q37 -39 105 -165q34 -64 43 -82q26 -53 31 -85q-129 -67 -224 -76q-33 0 -96 -11 q-36 -13 -36 -41q0 -7 2 -19.5t2 -19.5q0 -20 -67.5 -42t-67.5 -64q0 -11 8.5 -30t8.5 -30q0 -15 -79 -39t-79 -63q0 -16 9 -45t9 -45q0 -20 -29 -43q-23 -17 -46 -33q-49 -44 -49 -215q0 -8 1 -15q91 53 194 68l282 16q202 12 304 59q143 65 143 210q0 15 -2 44t-2 44 q0 122 78 122q73 0 108 -133q16 -70 32 -139q21 -81 57 -119q46 -51 130 -51q71 0 122 61q90 107 154 149zM1597 636q-25 -22 -77 -91q-30 -40 -75 -40q-91 0 -131 115q-30 106 -59 213q-44 115 -144 115q-146 0 -146 -180q0 -16 2.5 -46.5t2.5 -46.5q0 -62 -19 -87 q-70 -92 -303 -115q-173 -9 -347 -18q-55 -6 -116 -30v34q0 27 57.5 73.5t57.5 91.5q0 16 -10.5 45t-10.5 44q1 1 7 1q3 0 7 1q146 36 146 105q0 13 -8.5 32.5t-8.5 27.5h10q5 0 9 1q61 15 86 36q32 28 28 85q173 15 372 107q-7 77 -80 215q-67 128 -127 195 q-67 74 -169 104q-96 24 -193 47q-10 3 -29 13q86 18 86 70q0 19 -19 62q15 -5 33 -5q42 0 59 26q8 11 22 61l-1 3q10 0 34.5 -11.5t42.5 -11.5q55 0 88 84q38 -32 64 -32q37 0 66 41q25 -53 33 -151q10 -112 23 -154q43 -136 337 -136q116 0 215 -108q105 -114 105 -277 q0 -23 -12 -112l-28 -207q-4 -30 -4 -42q0 -97 124 -147zM1506 605q0 38 -38 38q-39 0 -39 -38t39 -38q38 0 38 38z" />
<path d="m 1724.44,1054.6641 c -31.1769,-18 -37.7653,-42.5884 -19.7653,-73.76528 5.3333,-9.2376 12.354,-16.7312 21.0621,-22.4808 6.2201,-4.1068 44.7886,-7.2427 115.7055,-9.4077 70.9168,-2.1649 110.128,-1.0807 117.6336,3.2526 30.0222,17.3334 35.5333,42.45448 16.5333,75.36348 -7.3333,12.7017 -16.1754,20.6833 -26.5263,23.9448 -24.5645,1.2137 -56.7805,3.0135 -96.648,5.3994 -72.6282,5.7957 -115.2931,5.0269 -127.9949,-2.3065 z" />
<path d="m 386.57764,1262.0569 c 53.44793,-14.3214 85.17574,-2.8075 95.18337,34.5417 9.83517,36.7052 -12.29319,62.3047 -66.38503,76.7986 l -82.1037,21.9996 c -54.09184,14.4939 -86.05533,3.3882 -95.89047,-33.317 -10.00766,-37.3491 12.67841,-63.4432 68.05807,-78.2821 z"/>
<path d="m 1115.7599,372.22724 c 14.3213,53.44793 2.8073,85.17581 -34.5418,95.18323 -36.705,9.83527 -62.3047,-12.29323 -76.7986,-66.38485 l -21.99962,-82.10394 c -14.4939,-54.09162 -3.3882,-86.05531 33.31712,-95.89019 37.349,-10.00765 63.4431,12.67818 78.2821,68.05802 z" />
<path d="m 1184.6228,1956.284 c -4.807,-8.0003 -6.8298,-42.7561 -6.0684,-104.2674 0.7614,-61.5113 2.7093,-100.0139 5.8437,-115.508 3.1343,-15.4941 11.8445,-27.5329 26.1306,-36.117 30.2866,-18.198 54.7006,-11.868 73.242,18.99 5.4937,9.1432 8.145,43.3269 7.9537,102.5512 -0.081,52.9359 -1.4296,89.5231 -4.0464,109.7617 -2.276,16.9226 -11.1284,30.0192 -26.5575,39.29 -33.1439,19.9148 -58.643,15.0146 -76.4977,-14.7005 z" />
<path d="m 1773.3127,1737.6952 c -9.0153,-2.4157 -34.6139,-26.0118 -76.7955,-70.7882 -42.1816,-44.7764 -67.5266,-73.826 -76.035,-87.1489 -8.5084,-13.3228 -10.6057,-28.0334 -6.2922,-44.1323 9.145,-34.1293 31.1041,-46.5353 65.8774,-37.2179 10.3033,2.7609 35.9565,25.5088 76.9595,68.2441 36.7142,38.1352 61.1596,65.3907 73.3362,81.7668 10.1182,13.7541 12.8479,29.3245 8.1892,46.7113 -10.0077,37.3492 -31.7542,51.5375 -65.2396,42.5651 z" />
</svg>
{:else if type === 'sorrowful'}
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<svg viewBox="0 0 512 512"><path d="M255.094 24.875c-16.73 9.388-34.47 42.043-41.688 59.47-14.608-2.407-28.87-3.664-42.562-3.75-11.446-.074-22.49.68-33.03 2.218-16.34-8.284-34.766-29.065-42.626-50-9.324 15.704-9.558 42.313-5.782 64.593-19.443 9.72-35.107 23.633-45.53 41.688-7.262 12.577-11.5 26.34-12.97 40.875 13.294-25.904 35-46.957 65.656-54.345-34.99 31.783-59.85 87.186-51.5 129.406-1.2 22.87-9.48 37.647-24.75 44.595 16.335 4.59 35.497 3.343 49.438-1.28 24.94 34.82 60.818 67.882 105.063 94.342-6.952 17.613-16.677 49.21-16.47 66.032 10.846-13.178 37.433-40.585 61.72-42.783 23.656 10.27 47.35 17.698 70.312 22.313 12.423 17.25 12.895 38.867 7.375 53.594 16.402-9.2 33.82-33.187 39.938-48 47.1 1.423 88.046-10.534 114.718-35.563 17.536 5.52 30.744 15.707 39.813 30.5.243-19.578-8.05-44.353-18-60.31 13.42-28.268 12.786-61.81.5-96.158l.405.47c9.976-11.804 18.304-33.19 18.063-52.907-8.535 10.373-20.727 15.14-36.75 14.188-13.56-22.597-31.81-44.812-54.032-65.375 10.56-19.27 30.402-36.43 44.156-47.97-18.985-5.337-67.794 5.2-80.78 17.782l5.906 8.5c5.637 11.99 9.503 24.423 11.093 37.063-26.323-37.275-70.72-74.72-114.905-95.625-15.894-25.424-19.322-56.118-12.78-73.563zm-82.875 97.063c1.13-.015 2.258-.008 3.405 0 31.56.2 68.888 8.842 107 25.656-8.8 20.095-14.74 44.482-10 61.344 13.33-18.637 37.313-34.22 55.406-37.5 55.904 34.315 96.215 78.718 111.658 118.718l.093.22c16.088 37.88 13.36 85.186-26.56 117.312 4.79-11.41 7.986-23.828 9.5-36.438-14.078 10.012-33.524 15.304-56.314 15.97-1.954-17.242-9.117-52.874-22.28-65.72 1.565 16.122-8.11 46.272-26.22 61.063-31.916-6.495-66.794-19.67-101.03-39.438-9.538-5.506-18.65-11.307-27.314-17.344-3.444-23.614 7.842-53.562 20.563-64.03-18.967-.234-46.71 22.156-59.313 32.75-40.974-38.47-64.14-81.11-61.25-115 16.275-1.708 36.144.927 51.72 8-3.92-15.382-18.553-31.733-34.407-44.344 14.757-13.826 37.7-20.852 65.344-21.22z"/></svg>
</svg>
{:else if type === 'glorious'}
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 2060 2048">
<path d="M1968 505l-119 632q101 61 101 163q0 149 -228 212q-171 47 -356 47h-682q-47 0 -111 -8q-210 -26 -293 -55q-180 -62 -180 -196q0 -124 101 -163l-119 -632h37q87 0 170 43q-18 85 -18 103q0 116 75 130q31 -47 77 -129l40 147q49 -37 95 -37t100 37q9 -38 31 -113 q34 29 68 57q47 38 75 38q34 0 60 -27.5t26 -61.5q0 -26 -31 -74l-46 -72q46 -13 91 -26q55 -15 93 -15t93 15q45 13 91 26l-46 72q-31 51 -31 74q0 34 26 61.5t60 27.5q26 0 75 -38q34 -28 68 -57l31 113q66 -37 97 -37q56 0 95 37q14 -48 43 -145q39 66 77 127 q75 -14 75 -130q0 17 -18 -103q89 -43 207 -43zM1889 557h-29q-10 0 -17 7q0 94 -9 130q-14 63 -67 110q-33 29 -63 29q-28 0 -59 -41q-31 115 -31 169q57 -36 77 -36q75 0 75 119q0 78 -32 126h-183q-54 -79 -54 -198v-5q64 -28 64 -80q0 -30 -20 -52.5t-50 -22.5 q-33 0 -55 22.5t-22 55.5q0 53 46 74q-10 44 -21 86.5t-45.5 81t-39.5 38.5h-271q-21 -52 -21 -81q0 -65 47 -114.5t112 -49.5q29 0 106 36q7 -33 7 -82q0 -26 -7 -89q-42 43 -106 43q-65 0 -112 -49.5t-47 -114.5q0 -40 33 -105q-26 -7 -70 -7q-48 0 -70 7q33 63 33 105 q0 65 -47 114.5t-112 49.5q-60 0 -106 -43q-7 63 -7 87q0 53 7 84q70 -36 106 -36q65 0 112 49.5t47 114.5q0 32 -21 81h-271q-16 0 -57 -58q-21 -30 -32 -72q-8 -38 -17 -76q46 -14 46 -74q0 -78 -77 -78q-30 0 -50 22t-20 53q0 48 64 80v4q0 125 -54 199h-183 q-32 -54 -32 -124q0 -121 75 -121q19 0 77 36v-20q0 -27 -31 -151q-27 43 -59 43q-19 0 -51 -19q-40 -24 -67 -87q-24 -57 -24 -109q0 -10 1 -29t1 -28q-18 -1 -23 -1q-13 0 -22 1l46 241q64 17 64 101q0 51 -30 51q-3 0 -6 -1q19 83 39 212l-2 4q-102 20 -102 110 q0 141 342 175q132 13 150 13h726q-9 0 55 -5q437 -34 437 -183q0 -88 -105 -111l40 -215q-2 0 -5 1q-31 0 -31 -51q0 -32 16 -62q19 -34 48 -39zM1518 888q0 34 -30 34q-34 0 -34 -34t32 -34t32 34zM1099 880q0 30 -22 51t-52 21q-29 0 -51.5 -21.5t-22.5 -50.5 q0 -31 22 -54.5t52 -23.5q31 0 52.5 23.5t21.5 54.5zM596 888q0 34 -34 34q-30 0 -30 -34t32 -34t32 34z" />
</svg>
{:else if type === 'luminous'}
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 2156 2048">
<path d="M1668 383q0 14 -48.5 92.5t-64.5 96t-41 17.5q-53 0 -53 -54q0 -16 46 -92q41 -68 60 -92q16 -20 43 -20q58 0 58 52zM688 535q0 54 -54 54q-16 0 -30 -7q-10 -5 -66 -95.5t-56 -103.5q0 -52 57 -52q22 0 34 11q20 31 53 81q62 90 62 112zM2064 842q0 59 -56 100 q-231 162 -468 342l190 586q1 4 -5 28q-22 84 -110 84q-23 0 -45 -11q-18 -9 -203 -146l-291 -213q-125 89 -328 238q-51 39 -156 114q-28 18 -63 18q-46 0 -78.5 -32t-34.5 -78l194 -589q-76 -58 -197 -144q-81 -57 -163 -114q-126 -91 -147 -118t-21 -65q0 -36 29.5 -75.5 t64.5 -39.5h604q33 -94 126 -375q19 -62 61 -184q29 -73 108 -73t110 83q4 11 58 177l123 372h607q34 0 64 41q27 38 27 74zM1129 1958q0 83 -58 83q-57 0 -57 -84v-85q0 -84 57 -84q58 0 58 86v84zM1943 849h-659l-211 -636l-207 629h-663l541 397l-206 621l537 -386 l536 389l-209 -629zM1671 934l-370 267l150 436l-378 -271l-371 271q8 -34 15 -68q10 -41 28 -62q46 -53 144 -120q80 -53 159 -106l296 210l-112 -344l299 -213h140z" />
</svg>
{/if}
<style>
svg {
width: 80px;
height: 80px;
fill: var(--nord4);
transition: fill 0.3s ease;
}
@media(prefers-color-scheme: light) {
svg {
fill: var(--nord0);
}
}
:global(.mystery-button.selected) svg,
:global(.mystery-button:hover) svg {
fill: var(--nord10);
}
</style>

View File

@@ -0,0 +1,119 @@
<script>
/**
* @param {ReturnType<import('$lib/js/pip.svelte').createPip>} pip - a createPip() instance
* @param {string} src - image source
* @param {string} [alt] - image alt text
* @param {boolean} [visible] - whether the PiP should be shown
* @param {(e: Event) => void} [onload] - callback when image loads
*/
let { pip, src, alt = '', visible = false, onload, el = $bindable(null) } = $props();
</script>
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div
class="pip-container"
class:visible
class:enlarged={pip.enlarged}
class:fullscreen={pip.fullscreen}
bind:this={el}
onpointerdown={pip.onpointerdown}
onpointermove={pip.onpointermove}
onpointerup={pip.onpointerup}
>
{#if src}
<img {src} {alt} {onload}>
{/if}
{#if pip.showControls}
<button
class="pip-fullscreen-btn"
aria-label="Fullscreen"
onpointerdown={(e) => e.stopPropagation()}
onclick={(e) => { e.stopPropagation(); pip.toggleFullscreen(); }}
>
<svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<polyline points="8 3 3 3 3 8"/>
<polyline points="16 3 21 3 21 8"/>
<polyline points="8 21 3 21 3 16"/>
<polyline points="16 21 21 21 21 16"/>
</svg>
</button>
{/if}
</div>
<style>
.pip-container {
position: fixed;
top: 0;
left: 0;
z-index: 10000;
opacity: 0;
touch-action: none;
cursor: grab;
user-select: none;
transition: opacity 0.25s ease;
pointer-events: none;
}
.pip-container:active {
cursor: grabbing;
}
.pip-container img {
height: 25vh;
width: auto;
object-fit: contain;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
pointer-events: none;
transition: height 0.25s ease;
}
.pip-container.enlarged img {
height: 37.5vh;
}
.pip-container.fullscreen {
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.95);
display: flex;
align-items: center;
justify-content: center;
cursor: default;
}
.pip-container.fullscreen img {
border-radius: 0;
box-shadow: none;
}
.pip-fullscreen-btn {
all: unset;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: transparent;
filter: drop-shadow(0 0 1px black);
width: 48px;
height: 48px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
padding: 0;
z-index: 1;
pointer-events: auto;
outline: none;
transition: transform 0.15s ease;
}
.pip-fullscreen-btn:hover,
.pip-fullscreen-btn:active {
transform: translate(-50%, -50%) scale(1.2);
}
.pip-container.fullscreen .pip-fullscreen-btn {
top: auto;
left: auto;
bottom: 10vw;
right: 10vw;
transform: none;
}
.pip-container.fullscreen .pip-fullscreen-btn:hover,
.pip-container.fullscreen .pip-fullscreen-btn:active {
transform: scale(0.85);
}
</style>

View File

@@ -0,0 +1,173 @@
<script>
import { onMount } from 'svelte';
import { createPip } from '$lib/js/pip.svelte';
import PipImage from '$lib/components/faith/PipImage.svelte';
/**
* @param {'layout' | 'overlay'} mode
* - 'layout': flex row on desktop (image sticky right, content left). Use as page-level wrapper.
* - 'overlay': image floats over the page (fixed position, IntersectionObserver show/hide). Use when nested inside existing layouts.
*/
let { src, alt = '', mode = 'layout', children } = $props();
let pipEl = $state(null);
let contentEl = $state(null);
let inView = $state(false);
const pip = createPip({ fullscreenEnabled: true });
function isMobile() {
return !window.matchMedia('(min-width: 1024px)').matches;
}
// PiP drag behavior only on mobile for both modes
function isPipActive() {
return isMobile();
}
function updateVisibility() {
if (!pipEl) return;
if (isPipActive()) {
// Mobile PiP mode
if (inView) {
pip.show(pipEl);
} else {
pip.hide();
}
} else {
// Desktop (both modes): CSS handles everything
pipEl.style.opacity = '';
pipEl.style.transform = '';
}
}
$effect(() => {
inView;
updateVisibility();
});
function onResize() {
if (!pipEl) return;
if (isPipActive() && inView) {
pip.reposition();
} else {
updateVisibility();
}
}
onMount(() => {
updateVisibility();
window.addEventListener('resize', onResize);
let observer;
if (contentEl) {
observer = new IntersectionObserver(
(entries) => {
for (const entry of entries) {
inView = entry.isIntersecting;
}
},
{ threshold: 0 }
);
observer.observe(contentEl);
}
return () => {
window.removeEventListener('resize', onResize);
observer?.disconnect();
};
});
</script>
<div class="sticky-image-layout" class:overlay={mode === 'overlay'}>
<div class="image-wrap-desktop">
<img {src} {alt}>
</div>
<PipImage {pip} {src} {alt} visible={inView} bind:el={pipEl} />
<div class="content-scroll" bind:this={contentEl}>
{@render children()}
</div>
</div>
<style>
.sticky-image-layout {
display: flex;
flex-direction: column;
align-items: center;
margin: auto;
padding: 0 1em;
}
.sticky-image-layout.overlay {
display: contents;
}
.image-wrap-desktop {
display: none;
}
.content-scroll {
width: 100%;
max-width: 700px;
}
.overlay .content-scroll {
max-width: none;
}
@media (min-width: 1024px) {
.sticky-image-layout.overlay {
display: grid;
grid-template-columns: 1fr auto;
gap: 2rem;
width: calc(100% + 25vw + 2rem);
}
.image-wrap-desktop {
display: block;
position: sticky;
top: 4rem;
align-self: start;
order: 1;
}
.overlay .image-wrap-desktop img {
height: auto;
max-height: calc(100vh - 5rem);
width: auto;
max-width: 25vw;
}
.sticky-image-layout:not(.overlay) {
flex-direction: row;
align-items: flex-start;
gap: 2em;
}
.sticky-image-layout:not(.overlay) .content-scroll {
flex: 0 1 700px;
}
.sticky-image-layout:not(.overlay) .image-wrap-desktop {
display: block;
position: sticky;
top: 4rem;
flex: 1;
order: 1;
}
.sticky-image-layout:not(.overlay) .image-wrap-desktop img {
max-height: calc(100vh - 4rem);
height: auto;
width: 100%;
object-fit: contain;
}
}
@media (prefers-color-scheme: light) {
.sticky-image-layout:not(.overlay) .image-wrap-desktop {
background-color: var(--nord5);
}
}
@media (prefers-color-scheme: light) and (min-width: 1024px) {
.sticky-image-layout:not(.overlay) .image-wrap-desktop {
background-color: transparent;
}
}
@media (min-width: 1400px) {
.sticky-image-layout:not(.overlay)::before {
content: '';
flex: 1;
order: -1;
}
}
</style>

View File

@@ -0,0 +1,224 @@
<script lang="ts">
import FireEffect from './FireEffect.svelte';
interface Props {
value?: number;
burst?: boolean;
}
let { value = 0, burst = false }: Props = $props();
// Latch burst so the FireEffect stays mounted for the full animation
let showBurst = $state(false);
let burstTimer: ReturnType<typeof setTimeout> | undefined;
$effect(() => {
if (burst) {
clearTimeout(burstTimer);
showBurst = true;
burstTimer = setTimeout(() => showBurst = false, 2000);
}
});
const phase = $derived(
value >= 365 ? 6 :
value >= 180 ? 5 :
value >= 90 ? 4 :
value >= 30 ? 3 :
value >= 14 ? 2 :
value >= 7 ? 1 : 0
);
</script>
<div class="aura phase-{phase}" class:holy-fire={phase>=4}>
{#if phase >= 6}
<div class="wing left">
<svg viewBox="0 0 91.871681 77.881462" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-52.477632,-104.97065)">
<path d="m 85.574148,126.32647 c 18.072102,-19.56175 30.274102,-22.98334 39.785082,-20.76506 9.511,2.21826 19.51366,9.15611 18.96878,29.09808 -0.54488,19.94196 -8.19899,32.59335 -9.5936,33.90688 -1.39462,1.31353 -3.57898,1.31075 -6.51179,2.71347 -2.55794,1.22341 -2.94677,4.76843 -7.73616,6.52744 -5.5551,2.04023 -9.62876,-2.264 -13.20665,-3.0632 -5.81575,-1.2991 -6.82149,3.71895 -12.602091,4.60267 -8.390895,1.28278 -9.861661,-5.68162 -14.831326,-3.50879 -4.969644,2.1728 -12.234764,11.49793 -22.596805,4.55731 -17.23226,-11.54237 20.720254,-45.6491 28.32456,-54.0688 z"/>
</g>
</svg>
</div>
<div class="wing right">
<svg viewBox="0 0 91.871681 77.881462" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-52.477632,-104.97065)">
<path d="m 85.574148,126.32647 c 18.072102,-19.56175 30.274102,-22.98334 39.785082,-20.76506 9.511,2.21826 19.51366,9.15611 18.96878,29.09808 -0.54488,19.94196 -8.19899,32.59335 -9.5936,33.90688 -1.39462,1.31353 -3.57898,1.31075 -6.51179,2.71347 -2.55794,1.22341 -2.94677,4.76843 -7.73616,6.52744 -5.5551,2.04023 -9.62876,-2.264 -13.20665,-3.0632 -5.81575,-1.2991 -6.82149,3.71895 -12.602091,4.60267 -8.390895,1.28278 -9.861661,-5.68162 -14.831326,-3.50879 -4.969644,2.1728 -12.234764,11.49793 -22.596805,4.55731 -17.23226,-11.54237 20.720254,-45.6491 28.32456,-54.0688 z"/>
</g>
</svg>
</div>
{/if}
{#if phase >= 5}
<div class="halo" ></div>
{/if}
{#if phase >= 2}
<FireEffect holy={phase>=4} />
{/if}
{#if showBurst}
<FireEffect holy={phase>=4} burst />
{/if}
<span class="number">{value}</span>
</div>
<style>
/* =====================
BASE LAYOUT
===================== */
.aura {
position: relative;
width: 88px;
display: grid;
place-items: center;
}
.aura.phase-3,
.aura.phase-4,
.aura.phase-5,
.aura.phase-6
{
height: 88px;
}
.number {
position: relative;
z-index: 5;
font-size: 2.5rem;
font-weight: 700;
color: var(--nord13);
--shadow-outline: 0 0 1px rgba(255,255,255,0.9), 0 0 3px rgba(0,0,0,0.4);
}
/* =====================
PHASE 1 GLOW
===================== */
.phase-1 .number {
text-shadow:
0 0 8px rgba(255,215,100,.5),
0 0 16px rgba(255,215,100,.35);
animation: glow-pulse 2.5s ease-in-out infinite;
}
@keyframes glow-pulse {
0%,100% { text-shadow: 0 0 8px rgba(255,215,100,.4); }
50% { text-shadow: 0 0 16px rgba(255,215,100,.8); }
}
/* =====================
PHASE 3 HALO
===================== */
.halo {
position: absolute;
top: -6px;
width: 70px;
height: 20px;
border-radius: 50%;
border: 4px solid rgba(255,235,180,.9);
box-shadow:
0 0 12px rgba(255,235,180,.8),
0 0 20px rgba(255,235,180,.5);
animation: halo-float 3s ease-in-out infinite;
z-index: 3;
}
@keyframes halo-float {
0%,100% { transform: translateY(0); }
50% { transform: translateY(-4px); }
}
/* =====================
PHASE 4 WINGS
===================== */
.wing {
position: absolute;
top: 20%;
width: 36px;
height: 64px;
z-index: 0;
pointer-events: none;
transform-origin: top center;
filter: drop-shadow(0 0 3px white);
}
.wing svg {
width: 100%;
height: 100%;
fill: white;
}
.wing.left {
left: -18px;
transform: rotate(-10deg);
animation: wing-slow-fly-left 4s ease-in-out infinite alternate;
}
.wing.right {
right: -18px;
transform: scaleX(-1) rotate(-10deg);
animation: wing-slow-fly-right 4s ease-in-out infinite alternate;
}
/* slow back-and-forth rotation for a gentle flight */
@keyframes wing-slow-fly-left {
0% { transform: rotate(10deg); }
50% { transform: rotate(0deg); }
100% { transform: rotate(10deg); }
}
@keyframes wing-slow-fly-right {
0% { transform: scaleX(-1) rotate(10deg); }
50% { transform: scaleX(-1) rotate(0deg); }
100% { transform: scaleX(-1) rotate(10deg); }
}
/* =====================
EMBER TEXT SHADOW
===================== */
.phase-2 .number,
.phase-3 .number,
.phase-4 .number {
animation: ember-pulse 1.4s infinite alternate;
}
@keyframes ember-pulse {
0% {
text-shadow:
var(--shadow-outline),
0 0 6px rgba(255,140,0,.6),
0 0 12px rgba(255,90,0,.4),
0 0 20px rgba(255,50,0,.2);
}
100% {
text-shadow:
var(--shadow-outline),
0 0 10px rgba(255,180,0,.9),
0 0 18px rgba(255,120,0,.6),
0 0 28px rgba(255,70,0,.35);
}
}
.holy-fire .number {
animation: holy-ember 1.8s infinite alternate;
color: #eaf6ff;
--shadow-outline: 0 0 5px rgba(0,0,0,0.7);
}
@keyframes holy-ember {
0% {
text-shadow:
var(--shadow-outline),
0 0 6px rgba(180,220,255,.6),
0 0 14px rgba(120,180,255,.45),
0 0 24px rgba(80,140,255,.3);
}
100% {
text-shadow:
var(--shadow-outline),
0 0 12px rgba(220,245,255,.95),
0 0 22px rgba(160,210,255,.7),
0 0 36px rgba(100,160,255,.45);
}
}
</style>

View File

@@ -0,0 +1,127 @@
<script lang="ts">
import { browser } from '$app/environment';
import { getRosaryStreak } from '$lib/stores/rosaryStreak.svelte';
import StreakAura from '$lib/components/faith/StreakAura.svelte';
import { tick, onMount } from 'svelte';
let burst = $state(false);
let streak = $state<ReturnType<typeof getRosaryStreak> | null>(null);
interface Props {
streakData?: { length: number; lastPrayed: string | null } | null;
lang?: 'de' | 'en';
}
let { streakData = null, lang = 'de' }: Props = $props();
const isEnglish = $derived(lang === 'en');
// Derive display values: use store when available, fall back to server data for SSR
let displayLength = $derived(streak?.length ?? streakData?.length ?? 0);
let prayedToday = $derived(streak?.prayedToday ?? (streakData?.lastPrayed === new Date().toISOString().split('T')[0]));
// Labels need to come after displayLength since they depend on it
const labels = $derived({
days: isEnglish ? (displayLength === 1 ? 'Day' : 'Days') : (displayLength === 1 ? 'Tag' : 'Tage'),
prayed: isEnglish ? 'Prayed' : 'Gebetet',
prayedToday: isEnglish ? 'Prayed today' : 'Heute gebetet',
ariaLabel: isEnglish ? 'Mark prayer as prayed' : 'Gebet als gebetet markieren'
});
// Initialize store on mount (client-side only)
onMount(() => {
streak = getRosaryStreak();
streak.initWithServerData(streakData, streakData !== null);
});
async function pray() {
burst = true;
await tick();
setTimeout(() => burst = false, 700);
streak?.recordPrayer();
}
</script>
<div class="streak-container">
<div class="streak-display">
<StreakAura value={displayLength} {burst} />
<span class="streak-label">{labels.days}</span>
</div>
<button
class="streak-button"
onclick={pray}
disabled={prayedToday}
aria-label={labels.ariaLabel}
>
{#if prayedToday}
{labels.prayedToday}
{:else}
{labels.prayed}
{/if}
</button>
</div>
<style>
.streak-container {
display: flex;
align-items: center;
gap: 1.5rem;
padding: 1rem 1.5rem;
background: var(--nord1);
border-radius: 12px;
width: fit-content;
}
@media (prefers-color-scheme: light) {
.streak-container {
background: var(--nord5);
}
}
.streak-display {
display: flex;
flex-direction: column;
align-items: center;
}
.streak-label {
font-size: 0.85rem;
color: var(--nord4);
text-transform: uppercase;
letter-spacing: 0.05em;
}
@media (prefers-color-scheme: light) {
.streak-label {
color: var(--nord3);
}
}
.streak-button {
padding: 0.75rem 1.5rem;
border: none;
border-radius: 8px;
background: var(--nord10);
color: white;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.streak-button:hover:not(:disabled) {
background: var(--nord9);
transform: translateY(-2px);
}
.streak-button:disabled {
background: var(--nord3);
cursor: default;
opacity: 0.7;
}
@media (prefers-color-scheme: light) {
.streak-button:disabled {
background: var(--nord4);
}
}
</style>

View File

@@ -0,0 +1,64 @@
<script>
import Prayer from './Prayer.svelte';
import Paternoster from './Paternoster.svelte';
import AveMaria from './AveMaria.svelte';
import GloriaPatri from './GloriaPatri.svelte';
export let verbose = false;
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<div class="monolingual">
<p>
<v lang=de>
Seele Christi, heilige mich.
<i></i>
Leib Christi erlöse mich.
<i></i>
Blut Christi, tränke mich.
<i></i>
Wasser der Seite Christi, wasche mich.
<i></i>
Leiden Christi, stärke mich.
<i></i>
O gütiger Jesus, erhöre mich.
<i></i>
Verbirg in Deine Wunden mich.
<i></i>
Von Dir lass nimmer scheiden mich.
<i></i>
In meiner Todesstunde rufe mich,
<i></i>
Und heisse zur Dir kommen mich,
<i></i>
Damit ich möge loben Dich
<i></i>
Mit Deinen Heiligen ewiglich. Amen.
</v>
</p>
</div>
<h3> Vollkommener Ablass</h3>
<h4> Paternoster </h4>
{#if verbose }
<Paternoster />
{/if}
<h4> Ave Maria </h4>
{#if verbose }
<AveMaria />
{/if}
<h4> Gloria Patri </h4>
{#if verbose }
<GloriaPatri />
{/if}
<p>
{#if showLatin}
<v lang=la >En ego, o bone et dulcíssime Jesu, ante contspéctum tuum génibusme provólvo ac máximo ánimi ardóre te oro atque obtéstor, ut meum in in cor vívidos fídei, spei et caritátis sensus, atque veram peccatórum meórum pœniténtiam, éaque emendándi firmíssimam voluntátem velis imprímere; dum magno ánimi afféctu et dolóre tua quinque vúlnera mecum ipse consídero ac mente contémplor, illud præ óculis habens, quod jam in ore ponébat tuo David Prophéta de te, o bone Jesu: Fodérunt manus meas et pedes meos; dinumeravérunt ómnio ossa mea (Ps. 21, 17-18)</v>
{/if}
<v lang=de>
Siehe, o gütiger und milder Jesus, ich werfe mich vor Deinen Augen auf die Knie. Inbrünstig bitte und beschwöre ich Dich: Präge meinem Herzen lebendige Gefühle des Glaubens, der Hoffung und der Liebe ein sowie wahre Reue über meine Sünden und den ganz festen Willen, mich zu bessern. Voll Liebe und Schwerz schaue ich Deine fünf Wunden und betrachte sie in meinem Geiste. Dabei halte ich mir vor Augen, was im Hinblick auf Dich, o guter Jesus, schon der Prophet David Dir in den Mund legte: «Sie haben Meine Hände und Meine Füsse durchbohrt; alle meine Gebeine haben sie gezählt.» (Ps. 21, 17-18)
</v>
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,38 @@
<script lang="ts">
import Prayer from './Prayer.svelte';
let { mystery = "", mysteryLatin = "", mysteryEnglish = "" } = $props<{ mystery?: string, mysteryLatin?: string, mysteryEnglish?: string }>();
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Ave <i><sup></sup></i>María, grátia plena. Dóminus tecum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gegrüsset seist du <i><sup></sup></i>Maria, voll der Gnade; der Herr ist mit dir;</v>{/if}
{#if urlLang === 'en'}<v lang="en">Hail <i><sup></sup></i>Mary, full of grace. The Lord is with thee.</v>{/if}
{#if showLatin}<v lang="la">benedícta tu in muliéribus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">du bist gebenedeit unter den Frauen,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Blessed art thou amongst women,</v>{/if}
{#if showLatin}<v lang="la">et benedíctus fructus ventris tui, {#if !mysteryLatin}<i><sup></sup></i>Jesus.{/if}</v>{/if}
{#if urlLang === 'de'}<v lang="de">und gebenedeit ist die Frucht deines Leibes, {#if !mystery}<i><sup></sup></i>Jesus.{/if}</v>{/if}
{#if urlLang === 'en'}<v lang="en">and blessed is the fruit of thy womb, {#if !mysteryEnglish}<i><sup></sup></i>Jesus.{/if}</v>{/if}
{#if showLatin && mysteryLatin}
<v lang="la" class="mystery-text"><i><sup></sup></i>{mysteryLatin}</v>
{/if}
{#if urlLang === 'de' && mystery}
<v lang="de" class="mystery-text"><i><sup></sup></i>{mystery}</v>
{/if}
{#if urlLang === 'en' && mysteryEnglish}
<v lang="en" class="mystery-text"><i><sup></sup></i>{mysteryEnglish}</v>
{/if}
</p>
<p>
{#if showLatin}<v lang="la">Sancta <i><sup></sup></i>María, mater Dei, ora pro nobis peccatóribus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Heilige <i><sup></sup></i>Maria, Mutter Gottes, bitte für uns Sünder</v>{/if}
{#if urlLang === 'en'}<v lang="en">Holy <i><sup></sup></i>Mary, Mother of God, pray for us sinners,</v>{/if}
{#if showLatin}<v lang="la">nunc, et in hora mortis nostræ. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">jetzt und in der Stunde unseres Todes. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">now and at the hour of our death. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,32 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer hasLatin={false}>
{#snippet children(showLatin, urlLang)}
<p>
{#if urlLang === 'de'}<v lang="de">Mein Herr und mein Gott,</v>{/if}
{#if urlLang === 'en'}<v lang="en">My Lord and my God,</v>{/if}
{#if urlLang === 'de'}<v lang="de">nimm alles von mir,</v>{/if}
{#if urlLang === 'en'}<v lang="en">take from me everything</v>{/if}
{#if urlLang === 'de'}<v lang="de">was mich hindert zu Dir.</v>{/if}
{#if urlLang === 'en'}<v lang="en">that distances me from Thee.</v>{/if}
</p>
<p>
{#if urlLang === 'de'}<v lang="de">Mein Herr und mein Gott,</v>{/if}
{#if urlLang === 'en'}<v lang="en">My Lord and my God,</v>{/if}
{#if urlLang === 'de'}<v lang="de">gib alles mir,</v>{/if}
{#if urlLang === 'en'}<v lang="en">give me everything</v>{/if}
{#if urlLang === 'de'}<v lang="de">was mich führet zu Dir.</v>{/if}
{#if urlLang === 'en'}<v lang="en">that brings me closer to Thee.</v>{/if}
</p>
<p>
{#if urlLang === 'de'}<v lang="de">Mein Herr und mein Gott,</v>{/if}
{#if urlLang === 'en'}<v lang="en">My Lord and my God,</v>{/if}
{#if urlLang === 'de'}<v lang="de">nimm mich mir</v>{/if}
{#if urlLang === 'en'}<v lang="en">detach me from myself</v>{/if}
{#if urlLang === 'de'}<v lang="de">und gib mich ganz zu eigen Dir.</v>{/if}
{#if urlLang === 'en'}<v lang="en">to give my all to Thee.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,55 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Confíteor Deo omnipoténti,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich bekenne Gott, dem Allmächtigen,</v>{/if}
{#if urlLang === 'en'}<v lang="en">I confess to almighty God,</v>{/if}
{#if showLatin}<v lang="la">beátæ Maríæ semper Vírgini</v>{/if}
{#if urlLang === 'de'}<v lang="de">der seligen, allzeit reinen Jungfrau Maria,</v>{/if}
{#if urlLang === 'en'}<v lang="en">to blessed Mary ever Virgin,</v>{/if}
{#if showLatin}<v lang="la">beáto Michaéli Archángelo,</v>{/if}
{#if urlLang === 'de'}<v lang="de">dem hl. Erzengel Michael,</v>{/if}
{#if urlLang === 'en'}<v lang="en">to blessed Michael the Archangel,</v>{/if}
{#if showLatin}<v lang="la">beáto Ioánni Baptístæ,</v>{/if}
{#if urlLang === 'de'}<v lang="de">dem hl. Johannes dem Täufer,</v>{/if}
{#if urlLang === 'en'}<v lang="en">to blessed John the Baptist,</v>{/if}
{#if showLatin}<v lang="la">sanctis Apóstolis Petro et Paulo,</v>{/if}
{#if urlLang === 'de'}<v lang="de">den hll. Aposteln Petrus und Paulus,</v>{/if}
{#if urlLang === 'en'}<v lang="en">to the holy Apostles Peter and Paul,</v>{/if}
{#if showLatin}<v lang="la">ómnibus Sanctis, et tibi pater:</v>{/if}
{#if urlLang === 'de'}<v lang="de">allen Heiligen und dir, Vater,</v>{/if}
{#if urlLang === 'en'}<v lang="en">to all the Saints, and to you, Father,</v>{/if}
{#if showLatin}<v lang="la">quia paccávi nimis</v>{/if}
{#if urlLang === 'de'}<v lang="de">dass ich viel gesündigt habe</v>{/if}
{#if urlLang === 'en'}<v lang="en">that I have sinned exceedingly</v>{/if}
{#if showLatin}<v lang="la">cogitatióne, verbe et ópere:</v>{/if}
{#if urlLang === 'de'}<v lang="de">in Gedanken, Worten und Werken,</v>{/if}
{#if urlLang === 'en'}<v lang="en">in thought, word, and deed:</v>{/if}
{#if showLatin}<v lang="la">mea culpa, mea culpa, mea máxima cupla.</v>{/if}
{#if urlLang === 'de'}<v lang="de">durch meine Schuld, durch meine Schuld, durch meine übergrosse Schuld.</v>{/if}
{#if urlLang === 'en'}<v lang="en">through my fault, through my fault, through my most grievous fault.</v>{/if}
{#if showLatin}<v lang="la">Ideo precor beátam Maríam semper Vírginem,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Darum bitte ich die selige, allzeit reine Jungfrau Maria,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Therefore I beseech the blessed Mary ever Virgin,</v>{/if}
{#if showLatin}<v lang="la">beátum Michaélem Archángelum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">den hl. Erzengel Michael,</v>{/if}
{#if urlLang === 'en'}<v lang="en">blessed Michael the Archangel,</v>{/if}
{#if showLatin}<v lang="la">beátum Ioánnem Baptístam,</v>{/if}
{#if urlLang === 'de'}<v lang="de">dem hl. Johannes den Täufer,</v>{/if}
{#if urlLang === 'en'}<v lang="en">blessed John the Baptist,</v>{/if}
{#if showLatin}<v lang="la">sanctos Apóstolos Petrum et Paulum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">die hll. Apostel Petrus und Paulus,</v>{/if}
{#if urlLang === 'en'}<v lang="en">the holy Apostles Peter and Paul,</v>{/if}
{#if showLatin}<v lang="la">omnes Sanctos, et te pater,</v>{/if}
{#if urlLang === 'de'}<v lang="de">alle Heiligen und dich, Vater,</v>{/if}
{#if urlLang === 'en'}<v lang="en">all the Saints, and you, Father,</v>{/if}
{#if showLatin}<v lang="la">Oráre pro me ad Dóminum Deum nostrum.</v>{/if}
{#if urlLang === 'de'}<v lang="de">für mich zu beten bei Gott unserem Herrn.</v>{/if}
{#if urlLang === 'en'}<v lang="en">to pray for me to the Lord our God.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,130 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Credo in unum <i><sup></sup></i> Deum, Patrem omnipoténtem,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich glaub an den einen <i><sup></sup></i> Gott. Den allmächtigen Vater,</v>{/if}
{#if urlLang === 'en'}<v lang="en">I believe in one <i><sup></sup></i> God, the Father almighty,</v>{/if}
{#if showLatin}<v lang="la">factórem cæli et terræ,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Schöpfer des Himmels und der Erde,</v>{/if}
{#if urlLang === 'en'}<v lang="en">maker of heaven and earth,</v>{/if}
{#if showLatin}<v lang="la">visibílium ómnium et invisibílium.</v>{/if}
{#if urlLang === 'de'}<v lang="de">aller sichtbaren und unsichtbaren Dinge.</v>{/if}
{#if urlLang === 'en'}<v lang="en">of all things visible and invisible.</v>{/if}
{#if showLatin}<v lang="la">Et in unum Dóminum <i><sup></sup></i> Jesum Christum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Und an den einen Herrn <i><sup></sup></i> Jesus Christus,</v>{/if}
{#if urlLang === 'en'}<v lang="en">And in one Lord <i><sup></sup></i> Jesus Christ,</v>{/if}
{#if showLatin}<v lang="la">Fílium Dei unigénitum.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gottes eingeborenen Sohn.</v>{/if}
{#if urlLang === 'en'}<v lang="en">the Only Begotten Son of God,</v>{/if}
{#if showLatin}<v lang="la">Et ex Patre natum ante ómnia sǽcula.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er ist aus dem Vater geboren vor aller Zeit.</v>{/if}
{#if urlLang === 'en'}<v lang="en">born of the Father before all ages.</v>{/if}
{#if showLatin}<v lang="la">Deum de Deo,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gott von Gott,</v>{/if}
{#if urlLang === 'en'}<v lang="en">God from God,</v>{/if}
{#if showLatin}<v lang="la">lumen de lúmine,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Licht vom Lichte,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Light from Light,</v>{/if}
{#if showLatin}<v lang="la">Deum verum de Deo vero.</v>{/if}
{#if urlLang === 'de'}<v lang="de">wahrer Gott vom wahren Gott;</v>{/if}
{#if urlLang === 'en'}<v lang="en">true God from true God,</v>{/if}
{#if showLatin}<v lang="la">Génitum, non factum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gezeugt, nicht geschaffen,</v>{/if}
{#if urlLang === 'en'}<v lang="en">begotten, not made,</v>{/if}
{#if showLatin}<v lang="la">consubstantiálem Patri:</v>{/if}
{#if urlLang === 'de'}<v lang="de">eines Wesens mit dem Vater;</v>{/if}
{#if urlLang === 'en'}<v lang="en">consubstantial with the Father;</v>{/if}
{#if showLatin}<v lang="la">per quem ómnia facta sunt.</v>{/if}
{#if urlLang === 'de'}<v lang="de">durch Ihn ist alles geschaffen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">through Him all things were made.</v>{/if}
{#if showLatin}<v lang="la">Qui propter nos hómines</v>{/if}
{#if urlLang === 'de'}<v lang="de">Für uns Menschen</v>{/if}
{#if urlLang === 'en'}<v lang="en">For us men</v>{/if}
{#if showLatin}<v lang="la">et propter nostram salútem</v>{/if}
{#if urlLang === 'de'}<v lang="de">und um unsres Heiles willen</v>{/if}
{#if urlLang === 'en'}<v lang="en">and for our salvation</v>{/if}
{#if showLatin}<v lang="la">descéndit de cælis.</v>{/if}
{#if urlLang === 'de'}<v lang="de">ist Er vom Himmel herabgestiegen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">He came down from heaven.</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Et incarnátus est de Spíritu Sancto</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er hat Fleisch angenommen durch den Hl. Geist</v>{/if}
{#if urlLang === 'en'}<v lang="en">And by the Holy Spirit was incarnate</v>{/if}
{#if showLatin}<v lang="la">ex <i><sup></sup></i> María Vírgine:</v>{/if}
{#if urlLang === 'de'}<v lang="de">aus <i><sup></sup></i> Maria, der Jungfrau</v>{/if}
{#if urlLang === 'en'}<v lang="en">of the Virgin <i><sup></sup></i> Mary,</v>{/if}
{#if showLatin}<v lang="la">Et homo factus est.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und ist Mensch geworden.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and became man.</v>{/if}
{#if showLatin}<v lang="la">Crucifíxus étiam pro nobis:</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gekreuzigt wurde Er sogar für uns;</v>{/if}
{#if urlLang === 'en'}<v lang="en">For our sake He was crucified</v>{/if}
{#if showLatin}<v lang="la">sub Póntio Piláto passus, et sepúltus est.</v>{/if}
{#if urlLang === 'de'}<v lang="de">unter Pontius Pilatus hat Er den Tod erlitten</v>{/if}
{#if urlLang === 'de'}<v lang="de">und ist begraben worden</v>{/if}
{#if urlLang === 'en'}<v lang="en">under Pontius Pilate, He suffered death and was buried.</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Et resurréxit tértia die,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er ist auferstanden am dritten Tage,</v>{/if}
{#if urlLang === 'en'}<v lang="en">And rose again on the third day</v>{/if}
{#if showLatin}<v lang="la">secúndum Scriptúras.</v>{/if}
{#if urlLang === 'de'}<v lang="de">gemäss der Schrift;</v>{/if}
{#if urlLang === 'en'}<v lang="en">in accordance with the Scriptures.</v>{/if}
{#if showLatin}<v lang="la">Et ascéndit in cáelum:</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er ist aufgefahren in den Himmel</v>{/if}
{#if urlLang === 'en'}<v lang="en">He ascended into heaven</v>{/if}
{#if showLatin}<v lang="la">sedet ad déxteram Patris.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und sitzet zur Rechten des Vaters.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and is seated at the right hand of the Father.</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Et íterum ventúrus est cum glória</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er wird wiederkommen in Herrlichkeit,</v>{/if}
{#if urlLang === 'en'}<v lang="en">He will come again in glory</v>{/if}
{#if showLatin}<v lang="la">judicáre vivos et mórtuos:</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gericht zu halten über Lebende und Tote:</v>{/if}
{#if urlLang === 'en'}<v lang="en">to judge the living and the dead</v>{/if}
{#if showLatin}<v lang="la">cujus regni non erit finis.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und Seines Reiches wird kein Endes sein.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and His kingdom will have no end.</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Et in Spíritum Sanctum,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich glaube an den Heiligen Geist,</v>{/if}
{#if urlLang === 'en'}<v lang="en">I believe in the Holy Spirit,</v>{/if}
{#if showLatin}<v lang="la">Dóminum et vivificántem:</v>{/if}
{#if urlLang === 'de'}<v lang="de">den Herrn und Lebensspender,</v>{/if}
{#if urlLang === 'en'}<v lang="en">the Lord, the giver of life,</v>{/if}
{#if showLatin}<v lang="la">qui ex Patre Filióque procédit.</v>{/if}
{#if urlLang === 'de'}<v lang="de">der vom Vater und vom Sohne ausgeht.</v>{/if}
{#if urlLang === 'en'}<v lang="en">who proceeds from the Father and the Son,</v>{/if}
{#if showLatin}<v lang="la">Qui cum Patre et Fílio simul <i><sup></sup></i> adorátur et conglorificátur:</v>{/if}
{#if urlLang === 'de'}<v lang="de">zugleich <i><sup></sup></i> angebetet und verherrlicht;</v>{/if}
{#if urlLang === 'en'}<v lang="en">who with the Father and the Son is <i><sup></sup></i> adored and glorified,</v>{/if}
{#if showLatin}<v lang="la">qui locútus est per Prophétas.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Er hat gesprochen durch die Propheten.</v>{/if}
{#if urlLang === 'en'}<v lang="en">who has spoken through the prophets.</v>{/if}
{#if showLatin}<v lang="la">Et unam sanctam cathólicam et apostólicam Ecclésiam.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich glaube an die eine, heilige, katholische und apostolische Kirche.</v>{/if}
{#if urlLang === 'en'}<v lang="en">I believe in one, holy, catholic and apostolic Church.</v>{/if}
{#if showLatin}<v lang="la">Confíteor unum baptísma</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich bekenne die eine Taufe</v>{/if}
{#if urlLang === 'en'}<v lang="en">I confess one Baptism</v>{/if}
{#if showLatin}<v lang="la">in remissiónem peccatórum.</v>{/if}
{#if urlLang === 'de'}<v lang="de">zur Vergebung der Sünden.</v>{/if}
{#if urlLang === 'en'}<v lang="en">for the forgiveness of sins</v>{/if}
{#if showLatin}<v lang="la">Et exspécto resurrectiónem mortuórum.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ich erwarte die Auferstehung der Toten.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and I look forward to the resurrection of the dead</v>{/if}
{#if showLatin}<v lang="la"><i></i> Et vitam ventúri sǽculi. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i></i> Und das Leben der zukünftigen Welt. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i></i> and the life of the world to come. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,25 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la"><i><sup></sup></i>Jésú, indúlge peccáta nostra,</v>{/if}
{#if urlLang === 'de'}<v lang="de">O mein <i><sup></sup></i>Jesus, verzeih' uns unsere Sünden,</v>{/if}
{#if urlLang === 'en'}<v lang="en">O my <i><sup></sup></i>Jesus, forgive us our sins,</v>{/if}
{#if showLatin}<v lang="la">præsérva nos ab igne inférni,</v>{/if}
{#if urlLang === 'de'}<v lang="de">bewahre uns vor den Feuern der Hölle</v>{/if}
{#if urlLang === 'en'}<v lang="en">save us from the fires of hell,</v>{/if}
{#if showLatin}<v lang="la">duc omnes ad cæli glóriam, </v>{/if}
{#if urlLang === 'de'}<v lang="de">und führe alle Seelen in den Himmel,</v>{/if}
{#if urlLang === 'en'}<v lang="en">and lead all souls to heaven,</v>{/if}
{#if showLatin}<v lang="la">præcípe tua</v>{/if}
{#if urlLang === 'de'}<v lang="de">besonders jene,</v>{/if}
{#if urlLang === 'en'}<v lang="en">especially those</v>{/if}
{#if showLatin}<v lang="la">misericórdia máxime egéntes. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">die Deiner Barmherzigkeit am meisten bedürfen. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">who are in most need of Thy mercy. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,85 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Glória in excélsis <i><sup></sup></i> Deo.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Ehre sei <i><sup></sup></i> Gott in der Höhe.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Glory to <i><sup></sup></i> God in the highest.</v>{/if}
{#if showLatin}<v lang="la">Et in terra pax homínibus</v>{/if}
{#if urlLang === 'de'}<v lang="de">Und auf Erden Friede den Mesnchen,</v>{/if}
{#if urlLang === 'en'}<v lang="en">And on earth peace to men</v>{/if}
{#if showLatin}<v lang="la">bonæ voluntátis.</v>{/if}
{#if urlLang === 'de'}<v lang="de">die guten Willens sind.</v>{/if}
{#if urlLang === 'en'}<v lang="en">of good will.</v>{/if}
{#if showLatin}<v lang="la">Laudámus te.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Wir loben Dich.</v>{/if}
{#if urlLang === 'en'}<v lang="en">We praise Thee.</v>{/if}
{#if showLatin}<v lang="la">Benedícimus te.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Wir preisen Dich.</v>{/if}
{#if urlLang === 'en'}<v lang="en">We bless Thee.</v>{/if}
{#if showLatin}<v lang="la"><i><sup></sup></i> Adorámus te.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i><sup></sup></i> Wir beten Dich an.</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i><sup></sup></i> We adore Thee.</v>{/if}
{#if showLatin}<v lang="la">Glorificámus te.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Wir verherrlichen Dich.</v>{/if}
{#if urlLang === 'en'}<v lang="en">We glorify Thee.</v>{/if}
{#if showLatin}<v lang="la"><i><sup></sup></i> Grátias ágimus tibi</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i><sup></sup></i> Wir sagen Dir Dank</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i><sup></sup></i> We give Thee thanks</v>{/if}
{#if showLatin}<v lang="la">propter magnam glóriam tuam.</v>{/if}
{#if urlLang === 'de'}<v lang="de">ob Deiner grossen Herrlichkeit.</v>{/if}
{#if urlLang === 'en'}<v lang="en">for Thy great glory.</v>{/if}
{#if showLatin}<v lang="la">Dómine Deus, Rex cæléstis,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Herr und Gott, König des Himmels,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Lord God, heavenly King,</v>{/if}
{#if showLatin}<v lang="la">Deus Pater omnípotens.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gott allmächtiger Vater!</v>{/if}
{#if urlLang === 'en'}<v lang="en">God the Father almighty.</v>{/if}
{#if showLatin}<v lang="la">Dómine Fili unigénite, <i><sup></sup></i> Jesu Christe.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Herr <i><sup></sup></i> Jesus Christus, eingeborener Sohn!</v>{/if}
{#if urlLang === 'en'}<v lang="en">Lord <i><sup></sup></i> Jesus Christ, the only-begotten Son.</v>{/if}
{#if showLatin}<v lang="la">Dómine Deus, Agnus Dei,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Herr und Gott, Lamm Gottes,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Lord God, Lamb of God,</v>{/if}
{#if showLatin}<v lang="la">Fílius Patris.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Sohn des Vaters!</v>{/if}
{#if urlLang === 'en'}<v lang="en">Son of the Father.</v>{/if}
{#if showLatin}<v lang="la">Qui tollis peccáta mundi,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Du nimmst hinweg die Sünden der Welt:</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thou who takest away the sins of the world,</v>{/if}
{#if showLatin}<v lang="la">miserére nobis.</v>{/if}
{#if urlLang === 'de'}<v lang="de">erbarme Dich unser.</v>{/if}
{#if urlLang === 'en'}<v lang="en">have mercy on us.</v>{/if}
{#if showLatin}<v lang="la">Qui tollis peccáta mundi,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Du nimmst hinwerg die Sünden der Welt.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thou who takest away the sins of the world,</v>{/if}
{#if showLatin}<v lang="la"><i><sup></sup></i> súscipe depreciatiónem nostram.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i><sup></sup></i> nimm unser Flehen gnädig auf.</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i><sup></sup></i> receive our prayer.</v>{/if}
{#if showLatin}<v lang="la">Qui sedes ad déxteram Patris,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Du sitzt zur Rechten des Vaters:</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thou who sittest at the right hand of the Father,</v>{/if}
{#if showLatin}<v lang="la">miserére nobis.</v>{/if}
{#if urlLang === 'de'}<v lang="de">erbarme Dich unser.</v>{/if}
{#if urlLang === 'en'}<v lang="en">have mercy on us.</v>{/if}
{#if showLatin}<v lang="la">Quóniam tu solus Sanctus.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Denn Du allein bist der Heilige.</v>{/if}
{#if urlLang === 'en'}<v lang="en">For Thou alone art holy.</v>{/if}
{#if showLatin}<v lang="la">Tu solus Altíssimus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Du allein der Höchste,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thou alone art the Most High,</v>{/if}
{#if showLatin}<v lang="la"><i><sup></sup></i> Jesu Christe.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i><sup></sup></i> Jesus Christus,</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i><sup></sup></i> Jesus Christ.</v>{/if}
{#if showLatin}<v lang="la">Cum Sancto Spíritu</v>{/if}
{#if urlLang === 'de'}<v lang="de">Mit dem Hl. Geiste,</v>{/if}
{#if urlLang === 'en'}<v lang="en">With the Holy Spirit,</v>{/if}
{#if showLatin}<v lang="la"><i></i> in glória Dei Patris. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i></i> in der Herrlichkeit Gottes des Vaters. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i></i> in the glory of God the Father. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,19 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la"><i><sup></sup></i>Glória Patri, et Fílio, et Spirítui Sancto.</v>{/if}
{#if urlLang === 'de'}<v lang="de"><i><sup></sup></i>Ehre sei dem Vater und dem Sohne und dem Hl. Geiste.</v>{/if}
{#if urlLang === 'en'}<v lang="en"><i><sup></sup></i>Glory be to the Father, and to the Son, and to the Holy Spirit.</v>{/if}
{#if showLatin}<v lang="la">Sicut erat in princípio, et nunc, et semper:</v>{/if}
{#if urlLang === 'de'}<v lang="de">Wie es war am Anfang, so auch jetzt und allezeit</v>{/if}
{#if urlLang === 'en'}<v lang="en">As it was in the beginning, is now, and ever shall be,</v>{/if}
{#if showLatin}<v lang="la">et in sǽcula sæculórum. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und in Ewigkeit. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">world without end. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,22 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer hasLatin={false}>
{#snippet children(showLatin, urlLang)}
<p>
{#if urlLang === 'de'}<v lang="de">Jungfräulicher Vater <i><sup></sup></i>Jesu,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Virgin Father of <i><sup></sup></i>Jesus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Reinster Bräutigam <i><sup></sup></i>Mariä,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Most pure Spouse of <i><sup></sup></i>Mary,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Sankt Joseph, bitte Tag für Tag bei Jesus, dem Sohn Gottes.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Saint Joseph, pray each day to Jesus, the Son of God.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Seine Kraft und Gnade soll uns stärken,</v>{/if}
{#if urlLang === 'en'}<v lang="en">May His power and grace strengthen us,</v>{/if}
{#if urlLang === 'de'}<v lang="de">dass wir siegreich streiten im Leben</v>{/if}
{#if urlLang === 'en'}<v lang="en">that we may fight victoriously in life</v>{/if}
{#if urlLang === 'de'}<v lang="de">und die Krone von Ihm erhalten im Sterben.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and receive the crown from Him at death.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,13 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">In nómine <i></i> Patris, et Fílii, et Spíritus Sancti. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Im Namen des <i></i> Vaters und des Sohnes und des Heiligen Geistes. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">In the name of the <i></i> Father, and of the Son, and of the Holy Spirit. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,40 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Sáncte Míchael Archángele,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Heiliger Erzengel Michael,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Saint Michael the Archangel,</v>{/if}
{#if showLatin}<v lang="la">defénde nos in proélio,</v>{/if}
{#if urlLang === 'de'}<v lang="de">verteidige uns im Kampfe!</v>{/if}
{#if urlLang === 'en'}<v lang="en">defend us in battle.</v>{/if}
{#if showLatin}<v lang="la">cóntra nequítam et insídias</v>{/if}
{#if urlLang === 'de'}<v lang="de">Gegen die Bosheit und Nachstellungen</v>{/if}
{#if urlLang === 'en'}<v lang="en">Be our protection against the wickedness</v>{/if}
{#if showLatin}<v lang="la">diáboli ésto præsídium.</v>{/if}
{#if urlLang === 'de'}<v lang="de">des Teufels sei unser Schutz. </v>{/if}
{#if urlLang === 'en'}<v lang="en">and snares of the devil.</v>{/if}
{#if showLatin}<v lang="la">Ímperet ílli Déus, súpplices deprecámur:</v>{/if}
{#if urlLang === 'de'}<v lang="de">»Gott gebiete ihm!«, so bitten wir flehentlich.</v>{/if}
{#if urlLang === 'en'}<v lang="en">May God rebuke him, we humbly pray;</v>{/if}
{#if showLatin}<v lang="la">tuque, Prínceps milítæ cæléstis,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Du aber, Fürst der himmlischen Heerscharen,</v>{/if}
{#if urlLang === 'en'}<v lang="en">and do thou, O Prince of the heavenly host,</v>{/if}
{#if showLatin}<v lang="la">Sátanam aliósque spíritus malígnos,</v>{/if}
{#if urlLang === 'de'}<v lang="de">stosse den Satan und die anderen bösen Geister,</v>{/if}
{#if urlLang === 'en'}<v lang="en">by the power of God, thrust into hell Satan</v>{/if}
{#if showLatin}<v lang="la">qui ad perditiónem animárum</v>{/if}
{#if showLatin}<v lang="la">pervagántur in múndo,</v>{/if}
{#if urlLang === 'de'}<v lang="de">die in der Welt umhergehen,</v>{/if}
{#if urlLang === 'de'}<v lang="de">um die Seelen zu verderben,</v>{/if}
{#if urlLang === 'en'}<v lang="en">and all the evil spirits</v>{/if}
{#if urlLang === 'en'}<v lang="en">who prowl about the world seeking the ruin of souls.</v>{/if}
{#if showLatin}<v lang="la">divína virtúte, in inférnum detrúde. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">durch die Kraft Gottes in die Hölle. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,37 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Pater noster, qui es in cælis</v>{/if}
{#if urlLang === 'de'}<v lang="de">Vater unser, der Du bist im Himmel,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Our Father, Who art in heaven,</v>{/if}
{#if showLatin}<v lang="la">Sanctificétur nomen tuum</v>{/if}
{#if urlLang === 'de'}<v lang="de">geheiligt werde Dein Name;</v>{/if}
{#if urlLang === 'en'}<v lang="en">hallowed be Thy name;</v>{/if}
{#if showLatin}<v lang="la">Advéniat regnum tuum</v>{/if}
{#if urlLang === 'de'}<v lang="de">zu uns komme Dein Reich;</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thy kingdom come;</v>{/if}
{#if showLatin}<v lang="la">Fiat volúntas tua, sicut in cælo, et in terra.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Dein Wille geschehe, wie im Himmel, also auch auf Erden!</v>{/if}
{#if urlLang === 'en'}<v lang="en">Thy will be done on earth as it is in heaven.</v>{/if}
{#if showLatin}<v lang="la">Panem nostrum quotidiánum da nobis hódie.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Unser tägliches Brot gib uns heute;</v>{/if}
{#if urlLang === 'en'}<v lang="en">Give us this day our daily bread;</v>{/if}
{#if showLatin}<v lang="la">Et dimítte nobis debíta nostra,</v>{/if}
{#if urlLang === 'de'}<v lang="de">und vergib uns unsere Schulden,</v>{/if}
{#if urlLang === 'en'}<v lang="en">and forgive us our trespasses,</v>{/if}
{#if showLatin}<v lang="la">sicut et nos dimíttimus debitóribus nostris.</v>{/if}
{#if urlLang === 'de'}<v lang="de">wie auch wir vergeben unsern Schuldigern;</v>{/if}
{#if urlLang === 'en'}<v lang="en">as we forgive those who trespass against us;</v>{/if}
{#if showLatin}<v lang="la">Et ne nos indúcas in tentatiónem.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und führe uns nicht in Versuchung.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and lead us not into temptation,</v>{/if}
{#if showLatin}<v lang="la">Sed líbera nos a malo. Amen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Sondern erlöse uns von dem Übel. Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">but deliver us from evil. Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,161 @@
<script lang="ts">
import type { Snippet } from 'svelte';
import { getLanguageContext } from '$lib/contexts/languageContext.js';
let { latinPrimary = true, hasLatin = true, children } = $props<{ latinPrimary?: boolean, hasLatin?: boolean, children?: Snippet<[boolean, string]> }>();
// Get context if available (graceful fallback for standalone usage)
let showLatinStore;
let langStore;
try {
const context = getLanguageContext();
showLatinStore = context.showLatin;
langStore = context.lang;
} catch {
showLatinStore = null;
langStore = null;
}
let showLatin = $derived(showLatinStore ? $showLatinStore : true);
let urlLang = $derived(langStore ? $langStore : 'de');
</script>
<style>
/* === LAYOUT === */
.prayer-wrapper :global(p) {
display: flex;
flex-direction: column;
}
.prayer-wrapper.vernacular-primary :global(p) {
flex-direction: column-reverse;
}
.prayer-wrapper :global(v) {
display: block;
margin: 0;
}
/* === LANGUAGE VISIBILITY === */
.prayer-wrapper.lang-de :global(v:lang(en)),
.prayer-wrapper.lang-en :global(v:lang(de)),
.prayer-wrapper.monolingual :global(v:lang(la)) {
display: none;
}
/* === BASE COLORS (dark mode) === */
.prayer-wrapper :global(v:lang(la)) { color: var(--nord6); }
.prayer-wrapper :global(v:lang(de)),
.prayer-wrapper :global(v:lang(en)) { color: grey; }
/* No-Latin prayers: vernacular gets primary color */
.prayer-wrapper.no-latin :global(v:lang(de)),
.prayer-wrapper.no-latin :global(v:lang(en)) {
color: var(--nord6);
}
/* Vernacular primary overrides */
.prayer-wrapper.vernacular-primary :global(v:lang(de)),
.prayer-wrapper.vernacular-primary :global(v:lang(en)) {
color: var(--nord6);
}
.prayer-wrapper.vernacular-primary :global(v:lang(la)) {
color: grey;
}
/* Monolingual spacing */
.prayer-wrapper.monolingual :global(v:not(:lang(la))) {
color: var(--nord6);
margin-bottom: 0.5em;
}
/* === LIGHT MODE === */
@media (prefers-color-scheme: light) {
.prayer-wrapper :global(v:lang(la)),
.prayer-wrapper.vernacular-primary :global(v:lang(de)),
.prayer-wrapper.vernacular-primary :global(v:lang(en)),
.prayer-wrapper.monolingual :global(v:not(:lang(la))),
.prayer-wrapper.no-latin :global(v:lang(de)),
.prayer-wrapper.no-latin :global(v:lang(en)) {
color: black;
}
}
/* === INLINE / RUBRIC TEXT === */
/* Base: all vernacular inline text is grey */
.prayer-wrapper :global(v[lang=de] > i),
.prayer-wrapper :global(v[lang=en] > i) {
color: grey;
}
/* Monolingual override */
.prayer-wrapper.monolingual :global(v[lang=de] > i),
.prayer-wrapper.monolingual :global(v[lang=en] > i) {
color: var(--red);
}
/* Latin (always emphasized) */
.prayer-wrapper :global(v[lang=la] > i) {
color: var(--nord11);
font-weight: 900;
}
/* === MYSTERY TEXT (shared base) === */
.prayer-wrapper :global(v.mystery-text) {
font-weight: 700;
}
/* Latin mystery — always primary */
.prayer-wrapper :global(v.mystery-text:lang(la)),
.prayer-wrapper :global(v.mystery-text:lang(la) > i) {
color: var(--nord11) !important;
font-size: 1.1em;
}
/* Vernacular mystery — bilingual only */
.prayer-wrapper:not(.monolingual)
:global(v.mystery-text:lang(de)),
.prayer-wrapper:not(.monolingual)
:global(v.mystery-text:lang(en)),
.prayer-wrapper:not(.monolingual)
:global(v.mystery-text:lang(de) > i),
.prayer-wrapper:not(.monolingual)
:global(v.mystery-text:lang(en) > i) {
color: var(--nord12) !important;
font-size: 0.95em;
}
/* Vernacular-primary emphasis */
.prayer-wrapper.monolingual
:global(v.mystery-text:lang(de)),
.prayer-wrapper.monolingual
:global(v.mystery-text:lang(en)),
.prayer-wrapper.monolingual
:global(v.mystery-text:lang(de) > i),
.prayer-wrapper.monolingual
:global(v.mystery-text:lang(en) > i) {
color: var(--nord11) !important;
font-size: 1.1em;
}
.prayer-wrapper.vernacular-primary
:global(v.mystery-text:lang(la)) {
color: var(--nord12) !important;
font-size: 0.95em;
}
/* Monolingual: hide Latin mystery */
.prayer-wrapper.monolingual
:global(v.mystery-text:lang(la)) {
display: none;
}
</style>
<div
class="prayer-wrapper"
class:vernacular-primary={!latinPrimary}
class:monolingual={!showLatin}
class:no-latin={!hasLatin}
class:lang-de={urlLang === 'de'}
class:lang-en={urlLang === 'en'}
>
{@render children?.(showLatin, urlLang)}
</div>

View File

@@ -0,0 +1,42 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Orémus:</v>{/if}
{#if urlLang === 'de'}<v lang="de">Lasset uns beten:</v>{/if}
{#if urlLang === 'en'}<v lang="en">Let us pray:</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Déus, cújus Unigénitus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">O Gott, dessen eingeborner Sohn</v>{/if}
{#if urlLang === 'en'}<v lang="en">O God, whose only begotten Son,</v>{/if}
{#if showLatin}<v lang="la">pér vítam, mórtem ét resurrectiónem súam</v>{/if}
{#if urlLang === 'de'}<v lang="de">durch sein Leben, seinen Tod und seine Auferstehung</v>{/if}
{#if urlLang === 'en'}<v lang="en">by His life, death, and resurrection,</v>{/if}
{#if showLatin}<v lang="la">nóbis salútis ætérnæ præmia comparávit:</v>{/if}
{#if urlLang === 'de'}<v lang="de">uns die Belohnung des ewigen Lebens verdient hat,</v>{/if}
{#if urlLang === 'en'}<v lang="en">has purchased for us the rewards of eternal life:</v>{/if}
{#if showLatin}<v lang="la">concéde, quæsumus;</v>{/if}
{#if urlLang === 'de'}<v lang="de">verleihe uns, wir bitten dich,</v>{/if}
{#if urlLang === 'en'}<v lang="en">grant, we beseech Thee,</v>{/if}
{#if showLatin}<v lang="la">út, hæc mystéria sanctíssimo beátæ Maríæ Vírginis Rosário recoléntes;</v>{/if}
{#if urlLang === 'de'}<v lang="de">dass wir, indem wir die Geheimisse des heiligen Rosenkranzes der allerseligsten Jungfrau ehren,</v>{/if}
{#if urlLang === 'en'}<v lang="en">that by meditating on these mysteries of the most holy Rosary of the Blessed Virgin Mary,</v>{/if}
{#if showLatin}<v lang="la">ét imitémur quód cóntinent,</v>{/if}
{#if urlLang === 'de'}<v lang="de">was sie enthalten nachahmen</v>{/if}
{#if urlLang === 'en'}<v lang="en">we may imitate what they contain</v>{/if}
{#if showLatin}<v lang="la">ét quód promíttunt, assequámur.</v>{/if}
{#if urlLang === 'de'}<v lang="de">und dadurch erlangen, was uns in denselben verheissen ist.</v>{/if}
{#if urlLang === 'en'}<v lang="en">and obtain what they promise.</v>{/if}
{#if showLatin}<v lang="la">Pér eúmdem Chrístum Dóminum nóstrum.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Durch unsern Herrn <i><sup></sup></i>Jesus Christus.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Through the same Christ our Lord.</v>{/if}
{#if showLatin}<v lang="la">Ámen.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Amen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">Amen.</v>{/if}
</p>
{/snippet}
</Prayer>

View File

@@ -0,0 +1,46 @@
<script>
import Prayer from './Prayer.svelte';
</script>
<Prayer>
{#snippet children(showLatin, urlLang)}
<p>
{#if showLatin}<v lang="la">Salve, Regína,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Sei gegrüsst, o Königin,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Hail, Holy Queen,</v>{/if}
{#if showLatin}<v lang="la">máter misericórdiae;</v>{/if}
{#if urlLang === 'de'}<v lang="de">Mutter der Barmherzigkeit,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Mother of Mercy,</v>{/if}
{#if showLatin}<v lang="la">Víta, dulcédo et spes nóstra, sálve.</v>{/if}
{#if urlLang === 'de'}<v lang="de">unser Leben, unsre Wonne</v>{/if}
{#if urlLang === 'de'}<v lang="de">und unsere Hoffnung, sei gegrüsst!</v>{/if}
{#if urlLang === 'en'}<v lang="en">our life, our sweetness and our hope.</v>{/if}
</p>
<p>
{#if showLatin}<v lang="la">Ad te clamámus, éxsules fílii Hévae.</v>{/if}
{#if urlLang === 'de'}<v lang="de">Zu dir rufen wir verbannte Kinder Evas;</v>{/if}
{#if urlLang === 'en'}<v lang="en">To thee do we cry, poor banished children of Eve.</v>{/if}
{#if showLatin}<v lang="la">Ad te suspirámus,</v>{/if}
{#if urlLang === 'de'}<v lang="de">zu dir seufzen wir</v>{/if}
{#if urlLang === 'en'}<v lang="en">To thee do we send up our sighs,</v>{/if}
{#if showLatin}<v lang="la">geméntes et fléntes in hac lacrimárum válle.</v>{/if}
{#if urlLang === 'de'}<v lang="de">trauernd und weinend in diesem Tal der Tränen.</v>{/if}
{#if urlLang === 'en'}<v lang="en">mourning and weeping in this valley of tears.</v>{/if}
{#if showLatin}<v lang="la">Eia ergo, Advocáta nóstra,</v>{/if}
{#if urlLang === 'de'}<v lang="de">Wohlan denn, unsre Fürsprecherin,</v>{/if}
{#if urlLang === 'en'}<v lang="en">Turn then, most gracious advocate,</v>{/if}
{#if showLatin}<v lang="la">íllos túos misericórdes óculos ad nos convérte.</v>{/if}
{#if urlLang === 'de'}<v lang="de">deine barmherzigen Augen wende zu uns</v>{/if}
{#if urlLang === 'en'}<v lang="en">thine eyes of mercy toward us.</v>{/if}
{#if showLatin}<v lang="la">Et <i><sup></sup></i>Jésum, benedíctum frúctum véntris túi,</v>{/if}
{#if urlLang === 'de'}<v lang="de">und nach diesem Elend zeige uns <i><sup></sup></i>Jesus,</v>{/if}
{#if urlLang === 'en'}<v lang="en">And after this our exile show unto us</v>{/if}
{#if showLatin}<v lang="la">nóbis post hoc exsílíum osténde.</v>{/if}
{#if urlLang === 'de'}<v lang="de">die gebenedeite Frucht deines Leibes.</v>{/if}
{#if urlLang === 'en'}<v lang="en">the blessed fruit of thy womb, <i><sup></sup></i>Jesus.</v>{/if}
{#if showLatin}<v lang="la">O clémens, o pía, o dúlcis Vírgo <i><sup></sup></i>María.</v>{/if}
{#if urlLang === 'de'}<v lang="de">O gütige, o milde, o süsse Jungfrau <i><sup></sup></i>Maria.</v>{/if}
{#if urlLang === 'en'}<v lang="en">O clement, O loving, O sweet Virgin <i><sup></sup></i>Mary.</v>{/if}
</p>
{/snippet}
</Prayer>