@ottotheagent/mcp-card-assets 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg viewBox="-13.89 178.66 527.78 142.68" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M 68.327 274.277 L 118.823 274.277 L 118.823 199.412 L 68.327 274.277 Z" fill="#F57D14" style=""/>
4
+ <path d="M 5.658 198.206 L 5.658 274.277 L 118.823 198.206 L 5.658 198.206 Z" fill="#ED451E" style=""/>
5
+ <path d="M 161.434 229.459 C 163.726 229.459 167.435 229.326 169.614 228.278 C 172.912 226.469 173.965 223.637 173.965 219.338 C 173.965 214.714 171.176 211.976 168.835 210.879 C 167.048 209.974 164.737 209.593 161.133 209.593 L 150.577 209.593 L 150.577 229.459 L 161.434 229.459 Z M 163.495 262.873 C 166.777 262.873 169.332 262.483 171.33 261.68 C 175.426 259.844 177.871 256.494 177.959 251.604 C 177.959 246.935 175.335 243.36 171.324 241.642 C 168.43 240.436 166.059 240.351 162.49 240.351 L 150.577 240.351 L 150.577 262.873 L 163.495 262.873 Z M 137.873 274.277 L 137.873 198.206 L 164.269 198.206 C 174.543 198.206 186.953 203.617 186.953 217.918 C 186.953 226.46 182.953 231.946 179.354 233.988 C 189.033 237.705 190.927 246.903 190.927 252.322 C 190.927 264.479 180.903 274.277 164.956 274.277 L 137.873 274.277 Z M 248.783 246.132 L 248.783 216.943 L 236.285 216.943 L 236.285 246.132 C 236.285 256.51 230.975 263.21 222.658 263.21 C 214.362 263.21 209.054 256.51 209.054 246.132 L 209.054 216.943 L 196.534 216.943 L 196.534 246.132 C 196.534 263.552 208.146 274.69 222.658 274.69 C 237.195 274.69 248.783 263.552 248.783 246.132 Z M 283.514 227.236 C 274.523 227.236 267.492 235.178 267.492 245.337 C 267.492 255.197 274.655 263.196 283.514 263.196 C 292.298 263.196 299.724 255.027 299.724 245.337 C 299.724 235.356 292.446 227.236 283.514 227.236 Z M 283.514 274.69 C 267.527 274.69 254.967 261.922 254.967 245.23 C 254.967 228.48 267.527 215.654 283.514 215.654 C 289.345 215.654 295.226 217.768 299.724 221.836 L 299.724 198.206 L 312.208 198.206 L 312.208 273.52 L 300.033 273.52 L 300.033 268.246 C 295.563 272.484 289.576 274.69 283.514 274.69 Z M 347.672 263.18 C 338.68 263.18 331.648 255.17 331.648 245.016 C 331.648 235.15 338.817 227.148 347.672 227.148 C 356.454 227.148 363.878 235.317 363.878 245.016 C 363.878 254.989 356.6 263.18 347.672 263.18 Z M 364.188 216.943 L 364.188 222.102 C 359.72 217.864 353.733 215.654 347.672 215.654 C 331.682 215.654 319.146 228.42 319.146 245.123 C 319.146 261.867 331.682 274.693 347.672 274.693 C 353.5 274.693 359.382 272.574 363.878 268.509 C 363.878 268.509 366.405 290.105 347.365 290.105 C 339.335 290.105 333.669 284.337 331.123 279.992 C 331.128 279.992 321.139 287.007 321.139 287.007 C 326.045 296.174 336.435 301.794 347.365 301.794 C 354.717 301.794 361.948 299.708 367.088 295.201 C 373.124 289.872 376.436 282.462 376.436 272.473 L 376.436 216.943 L 364.188 216.943 Z M 396.234 239.895 C 396.686 236.51 400.789 227.066 410.996 227.066 C 420.891 227.066 425.227 236.219 425.617 239.895 L 396.234 239.895 Z M 430.667 223.665 C 425.456 218.198 418.375 215.657 410.979 215.657 C 395.173 215.657 382.999 228.788 382.999 245.282 C 382.999 261.938 394.906 274.69 411.278 274.69 C 419.893 274.69 428.607 270.22 433.948 263.391 L 424.2 256.557 C 420.993 260.965 415.546 263.278 411.278 263.278 C 404.597 263.278 397.801 258.508 396.131 250.304 L 438.016 250.304 C 438.016 250.304 441.84 235.392 430.667 223.665 Z M 466.599 263.265 C 460.25 263.265 457.298 260.168 457.298 253.498 L 457.298 227.987 L 469.503 227.987 L 469.503 216.943 L 457.298 216.943 L 457.298 201.139 L 444.811 201.139 L 444.811 253.498 C 444.811 266.752 452.405 274.69 464.637 274.69 C 467.186 274.69 469.708 274.32 469.708 274.32 L 469.708 263.109 C 468.14 263.243 467.252 263.265 466.599 263.265 Z M 486.068 208.535 C 486.986 208.535 488.044 208.288 488.044 207.189 C 488.044 206.202 487.096 205.953 486.24 205.953 L 484.755 205.953 L 484.755 208.535 L 486.068 208.535 Z M 483.132 204.574 L 486.315 204.574 C 488.011 204.574 489.678 205.281 489.678 207.225 C 489.678 208.535 488.864 209.385 487.589 209.667 L 490.027 213.628 L 488.044 213.628 L 485.928 209.843 L 484.755 209.843 L 484.755 213.628 L 483.132 213.628 L 483.132 204.574 Z M 486.279 215.931 C 490.027 215.931 493.066 212.85 493.066 209.136 C 493.066 205.388 490.027 202.346 486.279 202.346 C 482.532 202.346 479.484 205.388 479.484 209.136 C 479.484 212.85 482.532 215.931 486.279 215.931 Z M 486.279 201.106 C 490.734 201.106 494.343 204.681 494.343 209.136 C 494.343 213.593 490.734 217.096 486.279 217.096 C 481.821 217.096 478.212 213.593 478.212 209.136 C 478.212 204.681 481.821 201.106 486.279 201.106 Z" fill="#202D59" style=""/>
6
+ </svg>
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="6.8 31.62 86.4 36.76"><defs><style>.cls-1{fill:none;}.cls-2{fill:#fff300;fill-rule:evenodd;}.cls-3{fill:#272425;}</style></defs><g id="Hertz"><circle class="cls-1" cx="50" cy="50" r="50"/><path class="cls-2" d="M10,65.18l6.66-30.36H90L83.34,65.18Z"/><path class="cls-3" d="M60.86,55c-.52-.56-.22-1.66.06-2.93l.9-4.25h3.7l.66-3.15H62.49l.66-3.16h-3.5L57.38,52.41a5.88,5.88,0,0,0,.23,4.27c.65,1.27,2.88,2.49,5.69,1.72l.63-2.94c-1.94.23-2.69,0-3.07-.43"/><path class="cls-3" d="M31.33,41.54l-1.68,7.84H23.53l1.65-7.84h-3.5L18.12,58.38h3.52l1.22-5.85H29l-1.25,5.85h3.48l3.56-16.84Z"/><path class="cls-3" d="M51.43,45.88a7.3,7.3,0,0,0-2.36,4.49l-1.7,8h3.5l1.4-6.64a6.46,6.46,0,0,1,1.16-3.14c.79-.81,2-.86,3.35-.75l.66-3.15a6.67,6.67,0,0,0-6,1.18"/><path class="cls-3" d="M78.66,44.7H67.77l-.66,3.15h6.31l-7.9,7.48-.65,3.05H75.76l.67-3.16H70.07l8-7.52Z"/><path class="cls-3" d="M46.94,52.56s1.16-3.83-.52-6.13c-1.41-2-4-2-4.53-2a7,7,0,0,0-4.36,1.61C34,48.88,32.19,58.63,39.85,58.63a9.85,9.85,0,0,0,5.74-1.8l-1.38-2.36c-1.16.9-7,2.85-6.4-1.91Zm-4.79-5.31a2.07,2.07,0,0,1,2,2.43H38.56A3.56,3.56,0,0,1,42.15,47.25Z"/><path class="cls-3" d="M79.58,55a2.36,2.36,0,0,0-2.21,1.83l0,.39a1.37,1.37,0,0,0,1.46,1.41A2.36,2.36,0,0,0,81,56.81l0-.37A1.38,1.38,0,0,0,79.58,55Zm1.16,1.77a2.12,2.12,0,0,1-1.95,1.63,1.1,1.1,0,0,1-1.2-1.18l0-.33a2.14,2.14,0,0,1,1.93-1.63,1.16,1.16,0,0,1,1.23,1.18Z"/><path class="cls-3" d="M79.43,56h-.77l-.36,1.74h.38l.11-.56h.3l.26.56h.45l-.3-.62a.75.75,0,0,0,.49-.54C80.08,56.16,79.84,56,79.43,56Zm-.17.86h-.38l.1-.52h.39c.17,0,.26.09.24.26A.34.34,0,0,1,79.26,56.81Z"/></g></svg>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg viewBox="6.28 163.07 487.45 173.85" xmlns="http://www.w3.org/2000/svg">
3
+ <g transform="matrix(0.7652489542961121, 0, 0, 0.7652489542961121, 24.330493927001957, 181.12759399414062)" style="">
4
+ <path
5
+ fill="#d4002a"
6
+ fill-rule="nonzero"
7
+ id="path14"
8
+ d="m572.37628,17.82001l0,-4.6875l2.67877,0c1.54993,0 3.2912,0.4425 3.2912,2.24374c0,1.99002 -1.92755,2.44376 -3.65631,2.44376l-2.31366,0zm-2.96381,9.26501l2.96381,0l0,-6.875l2.16248,0l3.8075,6.875l3.58881,0l-4.43262,-7.20251c2.32251,-0.51624 3.80261,-2.0625 3.80261,-4.44376c0,-3.53 -3.0376,-4.82248 -6.18878,-4.82248l-5.7038,0l0,16.46875zm-6.61877,-8.16751c0,-6.82251 5.52008,-12.33749 12.29132,-12.33749c6.85004,0 12.39624,5.51498 12.39624,12.33749c0,6.74625 -5.5462,12.35001 -12.39624,12.35001c-6.77124,0 -12.29132,-5.60376 -12.29132,-12.35001zm-2.3175,0c0,8.10999 6.55127,14.45374 14.60883,14.45374c8.15125,0 14.70868,-6.34375 14.70868,-14.45374c0,-8.10251 -6.55743,-14.57751 -14.70868,-14.57751c-8.05756,0 -14.60883,6.47501 -14.60883,14.57751zm-213.01743,156.72501l41.6087,0l0,-171.30252l-41.6087,0l0,171.30252zm-16.57376,-171.30252l-45.71875,0l-39.67627,123.79001l-40.39124,-123.79001l-46.45001,0l64.83374,171.30252l41.375,0l66.0275,-171.30252l0.00003,0zm-146.99249,171.30252l-70.06125,-171.30252l-41.21126,0l-72.62001,171.30252l45.7675,0l12.56001,-33.62375l66.32123,0l13.29877,33.62375l45.94501,0zm-70.63251,-66.76501l-43.05125,0l21.75374,-58.79749l21.29752,58.79749zm404.90125,-61.78998c-10.88498,-9.76251 -20.83878,-12.98502 -31.48251,-12.98502c-10.64374,0 -23.95752,3.64252 -23.95752,17.19125c0,11.35501 10.17255,15.20499 26.39001,20.31c23.2225,7.5025 53.21872,17.1925 53.21872,51.30374c0,39.42874 -31.6962,57.0925 -65.56119,57.0925c-24.4425,0 -49.13,-8.94501 -64.11877,-24.67749l25.36749,-26.0325c10.10504,10.87875 25.1925,16.59875 38.75128,16.59875c12.56873,0 23.70624,-4.85876 23.70624,-18.63251c0,-13.06625 -13.07751,-17.43625 -35.57123,-24.72375c-21.75629,-7.00751 -43.77881,-17.87 -43.77881,-48.81873c0,-37.99002 34.35126,-53.71378 66.27252,-53.71378c19.36749,0 41.14127,7.26877 56.13876,21.03375l-25.375,26.05377"
9
+ />
10
+ </g>
11
+ </svg>
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="6.79 37.84 86.41 24.33"><defs><style>.cls-1{fill:none;}.cls-2{fill:#8bd40c;}.cls-3{fill:#008442;}</style></defs><g id="National"><circle class="cls-1" cx="50" cy="50" r="50"/><path class="cls-2" d="M13.05,58.8c-.61,0-2.25.51-2.9-.91a1.81,1.81,0,0,1,.47-2.12,2.81,2.81,0,0,1,3-.26l-.61,3.29"/><path class="cls-2" d="M27.94,41.45c.61.06,2.25-.5,2.91.91a1.81,1.81,0,0,1-.48,2.12,2.78,2.78,0,0,1-3,.26l.6-3.29"/><path class="cls-2" d="M11.38,51.06s2.31-2.44,8.88,2.8c5.07,4,8,2,8,2l-.51,2.49s-2.35,2.52-8.84-2.57c-5.37-4.21-8-2.26-8-2.26s.49-2.54.5-2.43"/><path class="cls-2" d="M12.35,46.32s2.3-2.44,8.87,2.8c5.07,4.05,8,2,8,2l-.51,2.49S26.37,56.1,19.88,51c-5.36-4.21-8-2.27-8-2.27s.5-2.53.51-2.42"/><path class="cls-2" d="M13.29,41.61s2.31-2.44,8.88,2.8c5.07,4,8,2,8,2l-.51,2.49s-2.35,2.53-8.84-2.56c-5.37-4.21-8-2.27-8-2.27s.49-2.53.5-2.42"/><path class="cls-3" d="M87.43,56.79H84.92l2.54-11.73H90L87.43,56.79"/><path class="cls-3" d="M60,45.06c-.1.41-.45,2-.53,2.41-.46,0-1.82,0-2.55,0,.13-.51.43-2,.51-2.4.58,0,1.81,0,2.57,0"/><path class="cls-3" d="M35.27,49.66l-1.56,7.13c-.55,0-2.1,0-2.71,0l2.55-11.73h2.83l2.71,7.08,1.56-7.08c.89,0,1.82,0,2.74,0L40.84,56.8H38.13l-2.86-7.13"/><path class="cls-3" d="M55.5,45.68c-.11.47-.37,1.82-.49,2.36h1.33c-.11.59-.26,1.33-.37,1.75H54.64l-1,4.82c0,.12,0,.27.18.27s.85,0,1.13,0l-.41,1.88-2.6,0a1.2,1.2,0,0,1-1-.69,3.06,3.06,0,0,1,0-1.56L52,49.8c-.34,0-.68,0-1,0,.11-.48.3-1.52.38-1.77h1c.14-.81.39-1.9.49-2.36H55.5"/><path class="cls-3" d="M76.27,48.6c.72,1,.06,2.29-.06,3.35l-1.08,4.83H72.59c.3-2,.87-4.1,1.26-6.18a.61.61,0,0,0-.36-.71,1.88,1.88,0,0,0-1.85.4l-.23.49-1.29,6c-.55,0-1.73,0-2.6,0,.13-.52,1.81-8.36,1.89-8.75.3,0,1.82,0,2.42,0,0,.23,0,.53,0,.92.78-1.18,2.19-1.24,3.47-1a1.8,1.8,0,0,1,1,.66"/><path class="cls-3" d="M59.39,48.05c-.57,2.92-1.25,5.85-1.88,8.74H54.94c.57-2.89,1.29-5.86,1.89-8.75.49,0,1.9,0,2.56,0"/><path class="cls-3" d="M67.71,49.55a2.64,2.64,0,0,0-2.36-1.62c-2.12-.22-4.35.21-5.46,2.23-.87,1.61-1.55,3.72-.69,5.55a2.53,2.53,0,0,0,1.85,1.15c1.85.19,3.93.2,5.28-1.45A7,7,0,0,0,67.71,49.55ZM65,52.65c-.21.93-.6,2.23-1.73,2.36-.63,0-1.44.12-1.76-.57a6,6,0,0,1,.66-3.75,2.15,2.15,0,0,1,2.45-.81l.35.19C65.5,50.79,65.2,51.87,65,52.65Z"/><path class="cls-3" d="M50.48,49.18a1.76,1.76,0,0,0-.84-.9,7.35,7.35,0,0,0-4.68,0,3,3,0,0,0-1.82,2.51h2.32a1.72,1.72,0,0,1,.6-.9,1.88,1.88,0,0,1,1.88.13c.21.4,0,1.26-.21,1.21-1.46.4-3.19.15-4.47,1a3.39,3.39,0,0,0-1.32,3.13,1.52,1.52,0,0,0,.86,1.15,4.57,4.57,0,0,0,2.24.31,3.07,3.07,0,0,0,2.15-1,1.8,1.8,0,0,0,.09.28c.38.93,1.55.59,2.32.59.1-.39.31-1.41.39-1.82l-.38-.16.83-3.88A3.53,3.53,0,0,0,50.48,49.18Zm-4,5.55a1.66,1.66,0,0,1-1.73.07.9.9,0,0,1-.06-.91c.51-1,1.88-.61,2.72-1l.06,0A2.09,2.09,0,0,1,46.44,54.73Z"/><path class="cls-3" d="M85,49.18a1.74,1.74,0,0,0-.83-.9,7.38,7.38,0,0,0-4.69,0,3,3,0,0,0-1.82,2.51H80a1.72,1.72,0,0,1,.6-.9,1.88,1.88,0,0,1,1.88.13c.21.4,0,1.26-.22,1.21-1.46.4-3.19.15-4.47,1a3.39,3.39,0,0,0-1.32,3.13,1.52,1.52,0,0,0,.86,1.15,4.59,4.59,0,0,0,2.24.31,3,3,0,0,0,2.15-1c0,.08.06.19.09.28.39.93,1.55.59,2.33.59.09-.39.31-1.41.39-1.82l-.39-.16L85,50.86A3.53,3.53,0,0,0,85,49.18Zm-4,5.55a1.66,1.66,0,0,1-1.73.07.9.9,0,0,1-.06-.91c.51-1,1.88-.61,2.72-1l.05,0A2.08,2.08,0,0,1,81,54.73Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="10.77 36.42 78.33 32.22"><defs><style>.cls-1{fill:none;}.cls-2{fill:#e11835;fill-rule:evenodd;}</style></defs><g id="DS:_Discount_" data-name="DS: &apos;Discount&apos;"><circle class="cls-1" cx="50" cy="50" r="50"/><path class="cls-2" d="M24.55,39.35h2.86a.59.59,0,0,1,.42.58V54c0,1.06.42.72,1,.86.24.12.28.43.3.67,0,.75,0,1.5,0,2.25,0,.43-.15.79-.64.79a4.55,4.55,0,0,1-2.44-.66,4.42,4.42,0,0,1-.94-.84,7,7,0,0,1-9.36-10.39A6.92,6.92,0,0,1,20,44.55a7,7,0,0,1,4.15.76c0-1.72,0-3.45,0-5.17,0-.32.09-.72.44-.79Zm-4.29,8.92a3.28,3.28,0,1,0,3.65,4.36,3.3,3.3,0,0,0-3.65-4.36Z"/><path class="cls-2" d="M46.39,39.35h2.85a.62.62,0,0,1,.43.68c0,6,0,11.94,0,17.91a.54.54,0,0,1-.5.57H46.48a.54.54,0,0,1-.53-.58c0-6,0-11.94,0-17.9a.61.61,0,0,1,.44-.69Z"/><path class="cls-2" d="M52.65,39.35H55.5a.56.56,0,0,1,.41.43,6.56,6.56,0,0,1,0,.89V57.89a.58.58,0,0,1-.52.63c-.83,0-1.65,0-2.48,0a1,1,0,0,1-.42-.05.55.55,0,0,1-.31-.52V40a.62.62,0,0,1,.44-.68Z"/><path class="cls-2" d="M68.85,44.08h2.36c.46,0,.67.22.68.68V54a.83.83,0,0,0,.26.7c.23.16.53,0,.78.12s.28.45.29.71c0,.76,0,1.54,0,2.31a.65.65,0,0,1-.54.67A4.21,4.21,0,0,1,69.21,57a7,7,0,0,1-8.9-10.83c2.14-1.86,5.8-2.55,7.86-.2V44.71c0-.46.27-.63.68-.63Zm-4.54,4.19a3.29,3.29,0,1,0,3.8,2.63,3.31,3.31,0,0,0-3.8-2.63Z"/><path class="cls-2" d="M75.27,44.81a.72.72,0,0,1,.67-.73h2.37a.71.71,0,0,1,.68.84v1.7a3,3,0,0,1,2-2,7,7,0,0,1,3.24.17c.46.12.47.43.32.81l-.84,2.15c-.25.66-.78.5-1.3.48A3.31,3.31,0,0,0,79.37,50,3.44,3.44,0,0,0,79,51.59v6.25c0,.48-.23.68-.68.68-.85,0-1.69,0-2.53,0a.57.57,0,0,1-.51-.58c0-4.38,0-8.75,0-13.13Z"/><path class="cls-2" d="M40.54,45.46a7,7,0,1,1-9.31,2,7,7,0,0,1,9.31-2Zm-4.11,2.81a3.29,3.29,0,1,0,3.77,2.5,3.31,3.31,0,0,0-3.77-2.5Z"/><path class="cls-2" d="M84.09,54.16a2.35,2.35,0,0,1,2.07,2.78A2.38,2.38,0,0,1,85,58.59a2.42,2.42,0,0,1-2.79-.44,2.36,2.36,0,0,1,1.93-4Z"/><path d="M52.48,62.83v2.52a.32.32,0,1,1-.64,0V64.06H50.27v1.29a.32.32,0,1,1-.64,0V62.83a1.43,1.43,0,1,1,2.85,0Zm-2.21,0v.59h1.57v-.59a.79.79,0,1,0-1.57,0Z"/><path d="M76.29,62.83v2.52a.33.33,0,1,1-.65,0V64.06H74.08v1.29a.33.33,0,1,1-.65,0V62.83a1.43,1.43,0,1,1,2.86,0Zm-2.21,0v.59h1.56v-.59a.77.77,0,0,0-.78-.86.76.76,0,0,0-.78.86Z"/><path d="M61.61,63.76a1.36,1.36,0,0,1,.49,1v.59a.32.32,0,0,1-.32.33.33.33,0,0,1-.32-.33v-.59a.78.78,0,0,0-.78-.7h-.77v1.29a.32.32,0,1,1-.64,0V62.48a1.06,1.06,0,0,1,1.15-1.16h.34a1.39,1.39,0,0,1,.85,2.44Zm-1.7-1.28v.94h.79a.68.68,0,0,0,.75-.78.66.66,0,0,0-.69-.67h-.34c-.37,0-.51.15-.51.51Z"/><path d="M55.92,63.76a1.37,1.37,0,0,1,.5,1v.59a.33.33,0,0,1-.32.33.32.32,0,0,1-.32-.33v-.59a.79.79,0,0,0-.79-.7h-.76v1.29a.33.33,0,1,1-.65,0V62.48a1.06,1.06,0,0,1,1.15-1.16h.34a1.32,1.32,0,0,1,1.34,1.3,1.36,1.36,0,0,1-.49,1.14Zm-1.69-1.28v.94H55a.68.68,0,0,0,.74-.78.66.66,0,0,0-.69-.67h-.34c-.37,0-.5.15-.5.51Z"/><path d="M69.14,62.83v2.52a.32.32,0,1,1-.64,0V62.83a.79.79,0,1,0-1.57,0v2.52a.32.32,0,1,1-.64,0V62.83a1.43,1.43,0,1,1,2.85,0Z"/><path d="M63.7,62.4v.77h1.37a.32.32,0,0,1,0,.64H63.7v.76c0,.27.08.43.38.43h1a.33.33,0,0,1,0,.65h-1a1,1,0,0,1-1-1.08V62.4a1,1,0,0,1,1-1.08h1a.33.33,0,0,1,0,.65h-1c-.3,0-.38.16-.38.43Z"/><path d="M70.25,62a.33.33,0,0,1,0-.65h2.12a.33.33,0,0,1,0,.65h-.74v3.4a.32.32,0,0,1-.64,0V62Z"/><path d="M78,64.49c0,.28,0,.51.37.51h.87a.33.33,0,0,1,0,.65H78.5a1,1,0,0,1-1.1-1.16V61.64a.32.32,0,1,1,.64,0v2.85Z"/><path d="M46.39,62.05a2.22,2.22,0,0,1,1.45-.73h.68a.33.33,0,0,1,0,.65h-.68a1.5,1.5,0,0,0-1,.51,1.58,1.58,0,0,0,0,2,1.5,1.5,0,0,0,1,.51h.68a.33.33,0,0,1,0,.65h-.68a2.22,2.22,0,0,1-1.45-.73,2.2,2.2,0,0,1,0-2.87Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="6.8 35.8 86.4 28.43"><defs><style>.cls-1{fill:none;}.cls-2{fill:#929497;}.cls-3{fill:#348eca;}</style></defs><g id="ThriftyCarRental"><circle class="cls-1" cx="50" cy="50" r="50"/><path class="cls-2" d="M52.31,59.18a.86.86,0,0,0-.93.88.87.87,0,0,0,.93.89.84.84,0,0,0,.89-.89A.86.86,0,0,0,52.31,59.18Zm0,1.57a.61.61,0,0,1-.64-.69.63.63,0,0,1,.64-.68.67.67,0,0,1,.63.68A.63.63,0,0,1,52.33,60.75Z"/><path class="cls-2" d="M52.71,59.86c0-.2-.15-.3-.4-.3h-.4v1h.25v-.39h.1l.2.41h.25l-.25-.46C52.61,60.11,52.71,60.06,52.71,59.86Zm-.4.1h-.15v-.25h.15a.16.16,0,0,1,.15.15C52.46,60,52.41,60,52.31,60Z"/><path class="cls-3" d="M45.87,42.92,47.19,39h-5V39l-1.32,3.94Z"/><path class="cls-3" d="M12.52,47.85h5.11l1.23-3.59h2.22L22.85,39H12.32l-1.79,5.23h3.21Z"/><path class="cls-3" d="M12.32,48.4h0L10,55.29h5.12l2.37-6.89Z"/><path class="cls-3" d="M20.2,48.4l-2.37,6.89H22.9l2.32-6.89Z"/><path class="cls-3" d="M20.4,47.85H30.9l.88-2.66c.45-1.43-.5-2.37-2-2.37-1.08,0-2.22.3-3.45,2.42L28.43,39H23.35l-3,8.82Z"/><path class="cls-3" d="M25.76,48.4l-2.31,6.89h4.88L30.7,48.4Z"/><path class="cls-3" d="M38.68,47.85l1.66-5.08c-2.27,0-2.85.94-3.78,2.22l.53-1.57H32.9l-1.52,4.44Z"/><path class="cls-3" d="M31.23,48.4l-2.37,6.89h5L36.2,48.4Z"/><path class="cls-3" d="M44.18,47.85l1.54-4.43h-5l-1.53,4.43Z"/><path class="cls-3" d="M41.68,55.29,44,48.4H39l-2.35,6.89Z"/><path class="cls-3" d="M51.48,47.85,53,43.41H50.54c-.1,0-.45.1-.45-.15s.1-.35.45-.35H53.7L55,39H50c-1.82,0-2.56,1.13-3.11,2.55l-2.12,6.26h6.75Z"/><path class="cls-3" d="M49.61,48.4H44.53l-2.32,6.89h5Z"/><path class="cls-3" d="M55.87,55.29l2.3-6.89H53l-2.32,6.89Z"/><path class="cls-3" d="M62.36,47.85l-.28-4.43H59.61L61.09,39H56.4l-1.52,4.39H53.5L52,47.85Z"/><path class="cls-3" d="M58.17,48.4l.35,5.27L53.75,60.9h5.12l8.46-12.5Z"/><path class="cls-3" d="M65.31,43.42l-3,4.43h5.37l3-4.43Z"/><path class="cls-2" d="M61.58,59.13A14,14,0,0,1,62.41,57a3,3,0,0,1,2.32-1.72c1.08,0,1.44.69,1.08,1.77h-.68c.15-.63.1-1.18-.58-1.18-.45,0-1,.3-1.49,1.28a7.94,7.94,0,0,0-.45,1.19c-.1.3-.2.63-.3.93-.25.93.2,1.19.68,1.19.79,0,1.24-.79,1.52-1.57h.64A2.56,2.56,0,0,1,62.73,61c-.95,0-1.41-.71-1.15-1.84Z"/><path class="cls-2" d="M70.15,57l.15-.35h-.73L68.13,60.9h.74l.93-2.7a1,1,0,0,1,.3-.54,1.27,1.27,0,0,1,1.09-.35l.25-.63a1,1,0,0,0-.53,0,1.76,1.76,0,0,0-.74.4s0-.07,0-.12Z"/><path class="cls-2" d="M68.64,57.79a2,2,0,0,0,0-.53.71.71,0,0,0-.1-.3c-.1-.1-.15-.15-.25-.15a1.91,1.91,0,0,0-1.57-.05,1.53,1.53,0,0,0-.89,1.08h.64a.91.91,0,0,1,.63-.68c.3,0,.68,0,.83.3,0,.1-.15.43-.2.64s-.3.25-.41.31a7.72,7.72,0,0,0-1.52.4A1.73,1.73,0,0,0,65,60.38a.63.63,0,0,0,.54.59,1.79,1.79,0,0,0,.73,0,1.3,1.3,0,0,0,.79-.45c0-.05.1.15.1.2s.15.2.3.25A1,1,0,0,0,68,61l.15-.45c-.1,0-.2,0-.25,0s-.1-.2-.1-.31C68.05,59.41,68.34,58.58,68.64,57.79Zm-1.36,1.77a1.5,1.5,0,0,1-.2.4,1.43,1.43,0,0,1-1.13.51.25.25,0,0,1-.25-.21.76.76,0,0,1,.2-.83,2.09,2.09,0,0,1,1.23-.5,4.6,4.6,0,0,0,.45-.15A4.33,4.33,0,0,1,67.28,59.56Z"/><path class="cls-2" d="M83.69,61l.2-.58c-.2,0-.73.1-.58-.36l.93-2.8h.69l.2-.53h-.69l.35-1.09h-.68l-.4,1.09h-.6l-.2.53h.58L82.61,60a1.87,1.87,0,0,0-.15.54.79.79,0,0,0,.25.4,3.18,3.18,0,0,0,1,0Z"/><path class="cls-2" d="M80.2,58l-.93,2.91h-.74L80,56.66h.68l-.1.35c0,.05,0,.05,0,.05a1.52,1.52,0,0,1,.89-.45,1,1,0,0,1,1.08.4.9.9,0,0,1,0,.63L81.49,60.9h-.74l1.14-3.26a.41.41,0,0,0-.35-.5A1.27,1.27,0,0,0,80.2,58Z"/><path class="cls-2" d="M78.13,56.54A2.18,2.18,0,0,0,76.31,58a4.83,4.83,0,0,0-.5,1.52c-.2.9.2,1.43,1,1.43a2,2,0,0,0,1.87-1.52H78c-.2.59-.58,1-1.08,1s-.5-.4-.4-.94c0-.23.15-.43.2-.68l2.22,0s.2-.73.2-.83C79.37,57.18,79,56.54,78.13,56.54Zm.35,1.56a.55.55,0,0,1-.1.2H77v-.2A1.45,1.45,0,0,1,78,57.16C78.43,57.11,78.63,57.56,78.48,58.1Z"/><path class="cls-2" d="M76.45,55.71a1.13,1.13,0,0,0-.59-.35,14.41,14.41,0,0,0-2.22,0l-1.92,5.61h.74l.83-2.52c1,0,1.14,0,1.44.13a.5.5,0,0,1,.2.53c-.15.79-.3.94-.4,1.57,0-.05,0,.3,0,.3h.83c0-.1-.2-.25-.15-.4a14.86,14.86,0,0,0,.45-1.77.76.76,0,0,0-.45-.63,2,2,0,0,0,1.09-.94A1.71,1.71,0,0,0,76.45,55.71Zm-.69,1a1.32,1.32,0,0,1-.68,1c-.24.15-.54.1-1.57.1l.63-1.91h1.09S76,55.88,75.76,56.71Z"/><path class="cls-2" d="M87.8,57.79a2.23,2.23,0,0,0,.1-.53.84.84,0,0,0-.15-.3c0-.1-.1-.15-.2-.15A1.92,1.92,0,0,0,86,56.76a1.53,1.53,0,0,0-.89,1.08h.64a.85.85,0,0,1,.58-.68c.34,0,.74,0,.84.3,0,.1-.1.43-.15.64s-.3.25-.42.31a6.9,6.9,0,0,0-1.52.4,1.66,1.66,0,0,0-.89,1.57.63.63,0,0,0,.54.59,1.79,1.79,0,0,0,.73,0c.29,0,.44-.25.79-.45,0,0,.15.3.1.2a.41.41,0,0,0,.25.25c.18.05.43.1.58,0s.15-.4.15-.4-.2,0-.3,0-.1-.2-.05-.31C87.26,59.41,87.5,58.58,87.8,57.79Zm-1.31,1.77a1.75,1.75,0,0,1-.25.4,1.32,1.32,0,0,1-1.08.51.31.31,0,0,1-.3-.21.89.89,0,0,1,.25-.83,2.09,2.09,0,0,1,1.23-.5s.31-.1.41-.15Z"/><path class="cls-2" d="M87.4,60.9l1.87-5.61H90L88.08,60.9Z"/></g></svg>
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "@ottotheagent/mcp-card-assets",
3
- "version": "0.3.0",
4
- "description": "Renderer, styles and airline logos for the Otto flight card that Claude draws in its widget sandbox.",
3
+ "version": "0.5.0",
4
+ "description": "Renderers, styles, logos and photo placeholders for the Otto flight, hotel, room and car cards that Claude draws in its widget sandbox.",
5
5
  "license": "UNLICENSED",
6
6
  "files": [
7
- "flight-card.js",
8
- "flight-card.css",
7
+ "*-card.js",
8
+ "*-card.css",
9
9
  "marks/*.png",
10
+ "marks/cars/*.svg",
11
+ "placeholders/*.svg",
10
12
  "README.md"
11
13
  ],
12
14
  "scripts": {
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 304 170" role="img" aria-label="Car photo unavailable"><g fill="none" stroke="#a3a3a3" stroke-opacity="0.8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M110 104h-6v-14l10-4 14-16h40l18 16 14 4v14h-6"/><path d="M128 104h38"/><circle cx="119" cy="104" r="9"/><circle cx="175" cy="104" r="9"/><path d="M132 70l-6 16h56l-14-16z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 304 170" role="img" aria-label="Hotel photo unavailable"><g fill="none" stroke="#a3a3a3" stroke-opacity="0.8" stroke-width="2.5" stroke-linejoin="round"><path d="M126 120V52h52v68M118 120h68"/><path d="M136 62h8M160 62h8M136 76h8M160 76h8M136 90h8M160 90h8"/><path d="M146 120v-16h12v16"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 304 190" role="img" aria-label="Room photo unavailable"><!--Bed icon: Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><g transform="translate(124 67) scale(0.0875)" fill="#a3a3a3" fill-opacity="0.7"><path d="M64 96C81.7 96 96 110.3 96 128L96 352L320 352L320 224C320 206.3 334.3 192 352 192L512 192C565 192 608 235 608 288L608 512C608 529.7 593.7 544 576 544C558.3 544 544 529.7 544 512L544 448L96 448L96 512C96 529.7 81.7 544 64 544C46.3 544 32 529.7 32 512L32 128C32 110.3 46.3 96 64 96zM144 256C144 220.7 172.7 192 208 192C243.3 192 272 220.7 272 256C272 291.3 243.3 320 208 320C172.7 320 144 291.3 144 256z"/></g></svg>
package/room-card.css ADDED
@@ -0,0 +1 @@
1
+ :root{--otto-card-bg:#ffffff;--otto-card-border:#d4d4d4;--otto-btn-border:#525252;--otto-accent:#08c0cc;--otto-divider:#e5e5e5;--otto-strip-bg:#f5f5f5;--otto-fare-bg:#262624;--otto-on-fare:#ffffff;--otto-chip-bg:#ccfbf1;--otto-chip-text:#0a0a0a;--otto-text-primary:#0a0a0a;--otto-text-body:#0a0a0a;--otto-text-secondary:#737373;--otto-link-hover:#0369a1;--otto-banner-bg:#171717;--otto-on-banner:#ffffff;--otto-caution-bg:#fdf0dd;--otto-caution-text:#96590b;--otto-positive-text:#1c7a3e;--otto-photo-bg:#f5f5f5;--otto-font:Inter,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";--otto-line:1.5;--otto-text-xs:10px;--otto-text-sm:11px;--otto-text-md:12px;--otto-text-base:13px;--otto-text-lg:14px;--otto-text-xl:18px;--otto-text-2xl:19px;--otto-weight-regular:400;--otto-weight-medium:500;--otto-weight-semibold:600;--otto-space-1:2px;--otto-space-2:6px;--otto-space-3:8px;--otto-space-4:10px;--otto-space-5:12px;--otto-space-6:14px;--otto-space-7:16px;--otto-space-8:18px;--otto-radius-card:12px;--otto-radius-fare:10px;--otto-radius-md:8px;--otto-radius-pill:999px;--otto-card-width:304px;--otto-icon-size:14px;--otto-photo-height:170px;--otto-mark-size:24px;--otto-chip-height:24px;--otto-tap-min:44px;}@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--otto-card-bg:#262624;--otto-card-border:#3d3d3a;--otto-btn-border:#a3a3a3;--otto-divider:#3d3d3a;--otto-strip-bg:#1c1c1b;--otto-fare-bg:#3d3d3a;--otto-text-primary:#ffffff;--otto-text-body:#f5f5f5;--otto-text-secondary:#a3a3a3;--otto-link-hover:#38bdf8;--otto-banner-bg:#3d3d3a;--otto-chip-bg:#0d3d3a;--otto-chip-text:#ccfbf1;--otto-caution-bg:#3b2a12;--otto-caution-text:#f5b65b;--otto-positive-text:#5fd08a;--otto-photo-bg:#1c1c1b;}}:root[data-theme="dark"]{--otto-card-bg:#262624;--otto-card-border:#3d3d3a;--otto-btn-border:#a3a3a3;--otto-divider:#3d3d3a;--otto-strip-bg:#1c1c1b;--otto-fare-bg:#3d3d3a;--otto-text-primary:#ffffff;--otto-text-body:#f5f5f5;--otto-text-secondary:#a3a3a3;--otto-link-hover:#38bdf8;--otto-banner-bg:#3d3d3a;--otto-chip-bg:#0d3d3a;--otto-chip-text:#ccfbf1;--otto-caution-bg:#3b2a12;--otto-caution-text:#f5b65b;--otto-positive-text:#5fd08a;--otto-photo-bg:#1c1c1b;}html,body{margin:0;background:transparent;font-family:var(--otto-font);line-height:var(--otto-line);color:var(--otto-text-primary);}#root{min-height:120px;padding:0;}button{font:inherit;}.icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--otto-icon-size);height:var(--otto-icon-size);line-height:1;}.icon svg{width:100%;height:100%;fill:currentColor;}.head{margin-bottom:var(--otto-space-5);}.title{font-size:var(--otto-text-lg);line-height:22px;font-weight:var(--otto-weight-semibold);}.subtitle,.empty{font-size:var(--otto-text-base);color:var(--otto-text-secondary);}.row{display:flex;gap:var(--otto-space-5);overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:var(--otto-space-2);}.opt{flex:0 0 var(--otto-card-width);width:var(--otto-card-width);min-width:0;overflow-wrap:anywhere;box-sizing:border-box;scroll-snap-align:start;display:flex;flex-direction:column;padding:var(--otto-space-7);background:var(--otto-card-bg);border:1px solid var(--otto-card-border);border-radius:var(--otto-radius-card);}.opt.chosen{border-color:var(--otto-accent);}@media (hover:hover){.opt:hover{border-color:var(--otto-accent);}}.chip{display:inline-flex;align-items:center;height:var(--otto-chip-height);padding:0 var(--otto-space-4);box-sizing:border-box;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;border-radius:var(--otto-radius-pill);font-size:var(--otto-text-sm);font-weight:var(--otto-weight-semibold);background:var(--otto-chip-bg);color:var(--otto-chip-text);}.chip.caution{background:var(--otto-caution-bg);color:var(--otto-caution-text);}.btn{flex-shrink:0;min-height:41px;padding:9px var(--otto-space-7);box-sizing:border-box;white-space:nowrap;cursor:pointer;border-radius:var(--otto-radius-md);font-size:var(--otto-text-lg);font-weight:var(--otto-weight-medium);display:inline-flex;align-items:center;justify-content:center;gap:var(--otto-space-2);background:transparent;color:var(--otto-text-primary);border:1px solid var(--otto-btn-border);}.btn:disabled{cursor:default;opacity:0.45;}.why{margin-top:var(--otto-space-7);font-size:var(--otto-text-base);color:var(--otto-text-body);}.whyHead{font-weight:var(--otto-weight-semibold);}.whyLine{display:flex;gap:var(--otto-space-3);}.tick{--otto-icon-size:12px;height:19.5px;font-size:var(--otto-text-md);}.tick.note{color:var(--otto-text-secondary);}@media (max-width:480px){.opt{flex-basis:min(var(--otto-card-width),82vw);width:min(var(--otto-card-width),82vw);}.btn{min-height:var(--otto-tap-min);}}#root.busy .opt{cursor:default;}#root.busy .opt:not(.chosen):hover{border-color:var(--otto-card-border);}.btn.chosen:disabled{opacity:1;}#root{min-height:140px;}.opt{gap:var(--otto-space-4);padding:0 0 var(--otto-space-7);overflow:hidden;}.opt>:not(.photo){margin-inline:var(--otto-space-7);}.photo{position:relative;aspect-ratio:16 / 10;overflow:hidden;background:var(--otto-photo-bg);}.photo img{position:relative;width:100%;height:100%;object-fit:cover;display:block;}.name{font-size:var(--otto-text-lg);font-weight:var(--otto-weight-semibold);line-height:1.25;}.facts{display:flex;flex-direction:column;gap:var(--otto-space-2);padding:var(--otto-space-4) 0;border-top:1px solid var(--otto-divider);border-bottom:1px solid var(--otto-divider);}.fact{display:flex;align-items:center;gap:var(--otto-space-3);font-size:var(--otto-text-base);color:var(--otto-text-body);}.fact.caution{color:var(--otto-caution-text);}.fact.positive{color:var(--otto-positive-text);}.glyph{font-size:var(--otto-text-md);}.info{cursor:help;opacity:0.65;--otto-icon-size:12px;}.fare{display:flex;align-items:center;gap:var(--otto-space-5);}.fare .btn{flex:0 0 45%;}.fare>div{min-width:0;}.amount{font-size:17px;font-weight:var(--otto-weight-semibold);}.per,.total{font-size:var(--otto-text-sm);font-weight:var(--otto-weight-regular);color:var(--otto-text-secondary);}.total{display:block;}.btn.chosen{background:var(--otto-text-primary);color:var(--otto-card-bg);border-color:var(--otto-text-primary);}
package/room-card.js ADDED
@@ -0,0 +1,228 @@
1
+ (function () {
2
+ "use strict";
3
+ /* Shared core for the hotel, room and car renderers. The build wraps it with one card's
4
+ * source in a single script, and inlines that card's CSS and only the icons it uses.
5
+ *
6
+ * A card source calls mount(root, card, spec):
7
+ * spec.option(item, ui) builds one option's .opt element; ui.chosen says whether it is
8
+ * the current pick and ui.pick(label) makes its Select button.
9
+ * spec.message(item) is the text Select sends through the host's sendPrompt().
10
+ * spec.empty is the line shown when the card has no items.
11
+ */
12
+ const CSS = ":root{--otto-card-bg:#ffffff;--otto-card-border:#d4d4d4;--otto-btn-border:#525252;--otto-accent:#08c0cc;--otto-divider:#e5e5e5;--otto-strip-bg:#f5f5f5;--otto-fare-bg:#262624;--otto-on-fare:#ffffff;--otto-chip-bg:#ccfbf1;--otto-chip-text:#0a0a0a;--otto-text-primary:#0a0a0a;--otto-text-body:#0a0a0a;--otto-text-secondary:#737373;--otto-link-hover:#0369a1;--otto-banner-bg:#171717;--otto-on-banner:#ffffff;--otto-caution-bg:#fdf0dd;--otto-caution-text:#96590b;--otto-positive-text:#1c7a3e;--otto-photo-bg:#f5f5f5;--otto-font:Inter,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\";--otto-line:1.5;--otto-text-xs:10px;--otto-text-sm:11px;--otto-text-md:12px;--otto-text-base:13px;--otto-text-lg:14px;--otto-text-xl:18px;--otto-text-2xl:19px;--otto-weight-regular:400;--otto-weight-medium:500;--otto-weight-semibold:600;--otto-space-1:2px;--otto-space-2:6px;--otto-space-3:8px;--otto-space-4:10px;--otto-space-5:12px;--otto-space-6:14px;--otto-space-7:16px;--otto-space-8:18px;--otto-radius-card:12px;--otto-radius-fare:10px;--otto-radius-md:8px;--otto-radius-pill:999px;--otto-card-width:304px;--otto-icon-size:14px;--otto-photo-height:170px;--otto-mark-size:24px;--otto-chip-height:24px;--otto-tap-min:44px;}@media (prefers-color-scheme:dark){:root:not([data-theme=\"light\"]){--otto-card-bg:#262624;--otto-card-border:#3d3d3a;--otto-btn-border:#a3a3a3;--otto-divider:#3d3d3a;--otto-strip-bg:#1c1c1b;--otto-fare-bg:#3d3d3a;--otto-text-primary:#ffffff;--otto-text-body:#f5f5f5;--otto-text-secondary:#a3a3a3;--otto-link-hover:#38bdf8;--otto-banner-bg:#3d3d3a;--otto-chip-bg:#0d3d3a;--otto-chip-text:#ccfbf1;--otto-caution-bg:#3b2a12;--otto-caution-text:#f5b65b;--otto-positive-text:#5fd08a;--otto-photo-bg:#1c1c1b;}}:root[data-theme=\"dark\"]{--otto-card-bg:#262624;--otto-card-border:#3d3d3a;--otto-btn-border:#a3a3a3;--otto-divider:#3d3d3a;--otto-strip-bg:#1c1c1b;--otto-fare-bg:#3d3d3a;--otto-text-primary:#ffffff;--otto-text-body:#f5f5f5;--otto-text-secondary:#a3a3a3;--otto-link-hover:#38bdf8;--otto-banner-bg:#3d3d3a;--otto-chip-bg:#0d3d3a;--otto-chip-text:#ccfbf1;--otto-caution-bg:#3b2a12;--otto-caution-text:#f5b65b;--otto-positive-text:#5fd08a;--otto-photo-bg:#1c1c1b;}html,body{margin:0;background:transparent;font-family:var(--otto-font);line-height:var(--otto-line);color:var(--otto-text-primary);}#root{min-height:120px;padding:0;}button{font:inherit;}.icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--otto-icon-size);height:var(--otto-icon-size);line-height:1;}.icon svg{width:100%;height:100%;fill:currentColor;}.head{margin-bottom:var(--otto-space-5);}.title{font-size:var(--otto-text-lg);line-height:22px;font-weight:var(--otto-weight-semibold);}.subtitle,.empty{font-size:var(--otto-text-base);color:var(--otto-text-secondary);}.row{display:flex;gap:var(--otto-space-5);overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:var(--otto-space-2);}.opt{flex:0 0 var(--otto-card-width);width:var(--otto-card-width);min-width:0;overflow-wrap:anywhere;box-sizing:border-box;scroll-snap-align:start;display:flex;flex-direction:column;padding:var(--otto-space-7);background:var(--otto-card-bg);border:1px solid var(--otto-card-border);border-radius:var(--otto-radius-card);}.opt.chosen{border-color:var(--otto-accent);}@media (hover:hover){.opt:hover{border-color:var(--otto-accent);}}.chip{display:inline-flex;align-items:center;height:var(--otto-chip-height);padding:0 var(--otto-space-4);box-sizing:border-box;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;border-radius:var(--otto-radius-pill);font-size:var(--otto-text-sm);font-weight:var(--otto-weight-semibold);background:var(--otto-chip-bg);color:var(--otto-chip-text);}.chip.caution{background:var(--otto-caution-bg);color:var(--otto-caution-text);}.btn{flex-shrink:0;min-height:41px;padding:9px var(--otto-space-7);box-sizing:border-box;white-space:nowrap;cursor:pointer;border-radius:var(--otto-radius-md);font-size:var(--otto-text-lg);font-weight:var(--otto-weight-medium);display:inline-flex;align-items:center;justify-content:center;gap:var(--otto-space-2);background:transparent;color:var(--otto-text-primary);border:1px solid var(--otto-btn-border);}.btn:disabled{cursor:default;opacity:0.45;}.why{margin-top:var(--otto-space-7);font-size:var(--otto-text-base);color:var(--otto-text-body);}.whyHead{font-weight:var(--otto-weight-semibold);}.whyLine{display:flex;gap:var(--otto-space-3);}.tick{--otto-icon-size:12px;height:19.5px;font-size:var(--otto-text-md);}.tick.note{color:var(--otto-text-secondary);}@media (max-width:480px){.opt{flex-basis:min(var(--otto-card-width),82vw);width:min(var(--otto-card-width),82vw);}.btn{min-height:var(--otto-tap-min);}}#root.busy .opt{cursor:default;}#root.busy .opt:not(.chosen):hover{border-color:var(--otto-card-border);}.btn.chosen:disabled{opacity:1;}#root{min-height:140px;}.opt{gap:var(--otto-space-4);padding:0 0 var(--otto-space-7);overflow:hidden;}.opt>:not(.photo){margin-inline:var(--otto-space-7);}.photo{position:relative;aspect-ratio:16 / 10;overflow:hidden;background:var(--otto-photo-bg);}.photo img{position:relative;width:100%;height:100%;object-fit:cover;display:block;}.name{font-size:var(--otto-text-lg);font-weight:var(--otto-weight-semibold);line-height:1.25;}.facts{display:flex;flex-direction:column;gap:var(--otto-space-2);padding:var(--otto-space-4) 0;border-top:1px solid var(--otto-divider);border-bottom:1px solid var(--otto-divider);}.fact{display:flex;align-items:center;gap:var(--otto-space-3);font-size:var(--otto-text-base);color:var(--otto-text-body);}.fact.caution{color:var(--otto-caution-text);}.fact.positive{color:var(--otto-positive-text);}.glyph{font-size:var(--otto-text-md);}.info{cursor:help;opacity:0.65;--otto-icon-size:12px;}.fare{display:flex;align-items:center;gap:var(--otto-space-5);}.fare .btn{flex:0 0 45%;}.fare>div{min-width:0;}.amount{font-size:17px;font-weight:var(--otto-weight-semibold);}.per,.total{font-size:var(--otto-text-sm);font-weight:var(--otto-weight-regular);color:var(--otto-text-secondary);}.total{display:block;}.btn.chosen{background:var(--otto-text-primary);color:var(--otto-card-bg);border-color:var(--otto-text-primary);}";
13
+ const ICONS = {"hotels/arrow-rotate-left-regular-full":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M88 64C101.3 64 112 74.7 112 88L112 166.1L139.1 139C239.1 39 401.2 39 501.1 139C601 239 601.1 401.1 501.1 501C401.1 600.9 239 601 139.1 501C124.2 486.1 111.5 469.8 101 452.5C94.1 441.2 97.8 426.4 109.1 419.5C120.4 412.6 135.2 416.3 142.1 427.6C150.6 441.6 160.9 454.9 173.1 467C254.3 548.2 386 548.2 467.3 467C548.6 385.8 548.5 254.1 467.3 172.8C386.1 91.5 254.4 91.6 173.1 172.8L146 199.9L224.2 199.9C237.5 199.9 248.2 210.6 248.2 223.9C248.2 237.2 237.5 247.9 224.2 247.9L88 248C74.7 248 64 237.3 64 224L64 88C64 74.7 74.7 64 88 64z\"/></svg>","hotels/check-regular-full":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M534 132.5C544.8 140.2 547.2 155.2 539.5 166L275.5 534C271.4 539.7 265 543.4 258 543.9C251 544.4 244 542 239 537L103 401C93.6 391.6 93.6 376.4 103 367.1C112.4 357.8 127.6 357.7 136.9 367.1L253 483L500.5 138C508.2 127.2 523.2 124.8 534 132.5z\"/></svg>","hotels/circle-info-regular-full":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M320 112C434.9 112 528 205.1 528 320C528 434.9 434.9 528 320 528C205.1 528 112 434.9 112 320C112 205.1 205.1 112 320 112zM320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM280 400C266.7 400 256 410.7 256 424C256 437.3 266.7 448 280 448L360 448C373.3 448 384 437.3 384 424C384 410.7 373.3 400 360 400L352 400L352 312C352 298.7 341.3 288 328 288L280 288C266.7 288 256 298.7 256 312C256 325.3 266.7 336 280 336L304 336L304 400L280 400zM320 256C337.7 256 352 241.7 352 224C352 206.3 337.7 192 320 192C302.3 192 288 206.3 288 224C288 241.7 302.3 256 320 256z\"/></svg>","hotels/wallet-regular-full":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M152 96C103.4 96 64 135.4 64 184L64 424C64 472.6 103.4 512 152 512L488 512C536.6 512 576 472.6 576 424L576 280C576 231.4 536.6 192 488 192L184 192C170.7 192 160 202.7 160 216C160 229.3 170.7 240 184 240L488 240C510.1 240 528 257.9 528 280L528 424C528 446.1 510.1 464 488 464L152 464C129.9 464 112 446.1 112 424L112 184C112 161.9 129.9 144 152 144L520 144C533.3 144 544 133.3 544 120C544 106.7 533.3 96 520 96L152 96zM448 384C465.7 384 480 369.7 480 352C480 334.3 465.7 320 448 320C430.3 320 416 334.3 416 352C416 369.7 430.3 384 448 384z\"/></svg>"};
14
+ const SYMBOLS = { USD: "$", EUR: "€", GBP: "£", JPY: "¥", CNY: "¥", AUD: "A$", CAD: "C$" };
15
+ // The widget cannot see when the host's reply ends, so the lock lifts on a timer.
16
+ const BUSY_MS = 60000;
17
+ const CHECK_ICON = "hotels/check-regular-full";
18
+ const INFO_ICON = "hotels/circle-info-regular-full";
19
+ // Placeholders ship beside this script, so they always match its package version.
20
+ const ASSET_BASE = ((document.currentScript && document.currentScript.src) || "").replace(/[^/]*$/, "");
21
+
22
+ function injectCss(id) {
23
+ if (!CSS || document.getElementById(id)) return;
24
+ const style = document.createElement("style");
25
+ style.id = id;
26
+ style.textContent = CSS;
27
+ document.head.appendChild(style);
28
+ }
29
+
30
+ function el(tag, className, text) {
31
+ const node = document.createElement(tag);
32
+ if (className) node.className = className;
33
+ if (text !== undefined && text !== null && text !== "") node.textContent = String(text);
34
+ return node;
35
+ }
36
+
37
+ function icon(names, fallback, className = "icon") {
38
+ const node = el("span", className);
39
+ node.setAttribute("aria-hidden", "true");
40
+ const markup = [names].flat().map((name) => ICONS[name]).find(Boolean);
41
+ if (markup) node.innerHTML = markup;
42
+ else node.textContent = fallback ?? "";
43
+ return node;
44
+ }
45
+
46
+ function formatMoney(value, currency) {
47
+ if (value === null || value === undefined) return "";
48
+ const symbol = SYMBOLS[currency];
49
+ const amount = Math.round(value).toLocaleString();
50
+ return symbol ? `${symbol}${amount}` : `${currency} ${amount}`;
51
+ }
52
+
53
+ // Supplier text flattened to one short line, quotes out, before it becomes the traveler's message.
54
+ function oneLine(value, max = 60) {
55
+ return String(value ?? "")
56
+ .replace(/["“”‘’`]/g, "'")
57
+ .replace(/[\s\u0000-\u001f]+/g, " ")
58
+ .trim()
59
+ .slice(0, max);
60
+ }
61
+
62
+ // The photo plate's stand-in: hotel, room or car. Supplier photos cannot load in host sandboxes.
63
+ function placeholder(kind) {
64
+ const img = el("img");
65
+ img.src = `${ASSET_BASE}placeholders/${kind}.svg`;
66
+ img.alt = "";
67
+ img.addEventListener("error", () => img.remove());
68
+ return img;
69
+ }
70
+
71
+ // The caller's reasons as ticked "Insights" lines, then caveats under the info mark.
72
+ function renderInsights(reasons, notes) {
73
+ if (!reasons?.length && !notes?.length) return null;
74
+ const why = el("div", "why");
75
+ why.append(el("div", "whyHead", "Insights"));
76
+ for (const [texts, className, names, glyph] of [
77
+ [reasons, "icon tick", CHECK_ICON, "✓"],
78
+ [notes, "icon tick note", INFO_ICON, "ⓘ"],
79
+ ]) {
80
+ for (const text of texts ?? []) {
81
+ const line = el("div", "whyLine");
82
+ line.append(icon(names, glyph, className), el("span", null, text));
83
+ why.append(line);
84
+ }
85
+ }
86
+ return why;
87
+ }
88
+
89
+ function mount(root, card, spec) {
90
+ let chosen = null;
91
+ let busy = false;
92
+ let timer = null;
93
+
94
+ function draw() {
95
+ const scroll = root.querySelector(".row")?.scrollLeft || 0;
96
+ root.replaceChildren();
97
+ if (!card || !card.items || !card.items.length) {
98
+ root.append(el("p", "empty", spec.empty));
99
+ return;
100
+ }
101
+ const head = el("div", "head");
102
+ head.append(el("div", "title", card.title), el("div", "subtitle", card.subtitle));
103
+ const row = el("div", "row");
104
+ for (const item of card.items) {
105
+ const ui = {
106
+ chosen: chosen === item.id,
107
+ pick(label) {
108
+ const button = el("button", "btn" + (chosen === item.id ? " chosen" : ""));
109
+ button.dataset.select = item.id;
110
+ if (chosen === item.id) button.append(icon(CHECK_ICON, "✓"), document.createTextNode("Selected"));
111
+ else button.textContent = label;
112
+ return button;
113
+ },
114
+ };
115
+ row.append(spec.option(item, ui));
116
+ }
117
+ root.append(head, row);
118
+ row.scrollLeft = scroll;
119
+ root.classList.toggle("busy", busy);
120
+ root.querySelectorAll("button").forEach((b) => (b.disabled = busy));
121
+ }
122
+
123
+ function unlock() {
124
+ clearTimeout(timer);
125
+ busy = false;
126
+ draw();
127
+ }
128
+
129
+ // One pick at a time: the new pick replaces the old mark, then the card locks so a
130
+ // second click cannot send a second message.
131
+ root.addEventListener("click", (event) => {
132
+ if (busy) return;
133
+ const button = event.target.closest("[data-select]");
134
+ const item = button && card.items.find((i) => i.id === button.dataset.select);
135
+ if (!item) return;
136
+ chosen = item.id;
137
+ busy = true;
138
+ draw();
139
+ timer = setTimeout(unlock, BUSY_MS);
140
+ try {
141
+ const sent = window.sendPrompt(spec.message(item));
142
+ if (sent && typeof sent.catch === "function") sent.catch(unlock);
143
+ } catch (error) {
144
+ unlock();
145
+ }
146
+ });
147
+
148
+ draw();
149
+ }
150
+
151
+ /* Otto room card: OttoRoomCard.render(root, card), card from render_hotel_rooms.
152
+ * Select sends "Book room …" as the traveler's message. */
153
+
154
+ // Fact icon → [icon name, text fallback].
155
+ const FACT_ICONS = {
156
+ refund: ["hotels/arrow-rotate-left-regular-full", "⊘"],
157
+ payment: ["hotels/wallet-regular-full", "▭"],
158
+ policy: ["hotels/circle-info-regular-full", "⚑"],
159
+ };
160
+
161
+ function render(root, card) {
162
+ injectCss("otto-room-card-css");
163
+ const money = (value, item) => formatMoney(value, item?.currency || card.currency);
164
+
165
+ // The pick as a traveler would say it: room, hotel, rate, and its refund terms.
166
+ function describe(item) {
167
+ const price = money(item.nightly_rate, item);
168
+ const refund = (item.facts || []).find((fact) => fact.icon === "refund");
169
+ return [oneLine(item.name), oneLine(card.title), price ? `${price}/night` : "", refund ? oneLine(refund.text) : ""]
170
+ .filter(Boolean)
171
+ .join(", ");
172
+ }
173
+
174
+ function fact(entry) {
175
+ const line = el("div", `fact ${entry.tone}`);
176
+ const [name, glyph] = FACT_ICONS[entry.icon] || [null, "·"];
177
+ line.append(icon(name, glyph, "icon glyph"), el("span", null, entry.text));
178
+ // The supplier's own wording; `title` is the only tooltip the sandbox offers.
179
+ if (entry.detail) {
180
+ const info = icon("hotels/circle-info-regular-full", "ⓘ", "icon info");
181
+ info.removeAttribute("aria-hidden");
182
+ info.title = entry.detail;
183
+ line.append(info);
184
+ }
185
+ return line;
186
+ }
187
+
188
+ function option(item, ui) {
189
+ const box = el("div", "opt" + (ui.chosen ? " chosen" : ""));
190
+ const photo = el("div", "photo");
191
+ photo.append(placeholder("room"));
192
+
193
+ const facts = el("div", "facts");
194
+ for (const entry of item.facts || []) facts.append(fact(entry));
195
+
196
+ const fare = el("div", "fare");
197
+ const price = el("div");
198
+ if (item.nightly_rate !== null && item.nightly_rate !== undefined) {
199
+ const amount = el("div", "amount", money(item.nightly_rate, item));
200
+ amount.append(el("span", "per", "/night"));
201
+ price.append(amount);
202
+ }
203
+ if (item.total_rate !== null && item.total_rate !== undefined) {
204
+ price.append(el("span", "total", `${money(item.total_rate, item)} ${card.price_label}`));
205
+ }
206
+ fare.append(ui.pick("Select"), price);
207
+
208
+ box.append(photo, el("div", "name", item.name));
209
+ if (facts.childElementCount) box.append(facts);
210
+ box.append(fare);
211
+ const insights = renderInsights(item.reasons);
212
+ if (insights) {
213
+ insights.style.marginTop = "0";
214
+ box.append(insights);
215
+ }
216
+ return box;
217
+ }
218
+
219
+ mount(root, card, {
220
+ empty: "No room options to show.",
221
+ option,
222
+ message: (item) => `Book room ${describe(item)}`,
223
+ });
224
+ }
225
+
226
+ window.OttoRoomCard = { render };
227
+
228
+ })();