@charset "UTF-8";
:root {
  color-scheme: light;
}

html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  background: #c2c2c2;
  font-family: -apple-system, "Segoe UI", Roboto, sans-serif;
  overflow-x: hidden;
}

#ebook-root {
  display: flex;
  height: 100vh;
  overflow: hidden;
}

.ebook-shell {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100vh;
  overflow: hidden;
}

.ebook-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(20, 20, 30, 0.045);
  border: 1px solid rgba(20, 20, 30, 0.12);
  color: #26262b;
  border-radius: 6px;
  width: 32px;
  height: 32px;
  cursor: pointer;
  font-size: 14px;
  line-height: 1;
  padding: 0;
}
.ebook-btn:hover {
  background: #d7d9db;
}

.icon {
  display: inline-block;
  width: 24px;
  height: 24px;
  background-color: currentColor;
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-position: center;
  -webkit-mask-size: contain;
  pointer-events: none;
}

.icon-move {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_714)'><path d='M11.2502 9.00007V4.43367L10.0021 5.55769C9.69426 5.83477 9.21965 5.80986 8.94255 5.50203C8.66547 5.19416 8.69038 4.71956 8.99821 4.44246L11.6726 2.12391C11.8606 1.96097 12.1397 1.96097 12.3277 2.12391L15.0021 4.44246C15.31 4.71956 15.3349 5.19416 15.0578 5.50203C14.7807 5.80986 14.3061 5.83477 13.9982 5.55769L12.7502 4.43367V9.00007C12.7502 9.41429 12.4144 9.75007 12.0002 9.75007C11.586 9.75007 11.2502 9.41429 11.2502 9.00007Z' fill='%23181D25'/><path d='M11.2502 15V19.5664L10.0021 18.4424C9.69426 18.1653 9.21965 18.1902 8.94255 18.498C8.66547 18.8059 8.69038 19.2805 8.99821 19.5576L11.6726 21.8762C11.8606 22.0391 12.1397 22.0391 12.3277 21.8762L15.0021 19.5576C15.31 19.2805 15.3349 18.8059 15.0578 18.498C14.7807 18.1902 14.3061 18.1653 13.9982 18.4424L12.7502 19.5664V15C12.7502 14.5858 12.4144 14.25 12.0002 14.25C11.586 14.25 11.2502 14.5858 11.2502 15Z' fill='%23181D25'/><path d='M15.0001 11.25H19.5665L18.4425 10.002C18.1654 9.69409 18.1903 9.21948 18.4981 8.94238C18.806 8.6653 19.2806 8.69022 19.5577 8.99805L21.8763 11.6725C22.0392 11.8604 22.0392 12.1396 21.8763 12.3275L19.5577 15.002C19.2806 15.3098 18.806 15.3347 18.4981 15.0576C18.1903 14.7805 18.1654 14.3059 18.4425 13.998L19.5665 12.75H15.0001C14.5859 12.75 14.2501 12.4142 14.2501 12C14.2501 11.5858 14.5859 11.25 15.0001 11.25Z' fill='%23181D25'/><path d='M9.00024 11.25L4.43383 11.25L5.55786 10.002C5.83494 9.69409 5.81003 9.21948 5.50219 8.94238C5.19433 8.66531 4.71972 8.69022 4.44262 8.99805L2.12408 11.6725C1.96114 11.8604 1.96114 12.1396 2.12408 12.3275L4.44262 15.002C4.71972 15.3098 5.19433 15.3347 5.50219 15.0576C5.81003 14.7805 5.83494 14.3059 5.55786 13.998L4.43383 12.75H9.00024C9.41445 12.75 9.75024 12.4142 9.75024 12C9.75024 11.5858 9.41445 11.25 9.00024 11.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_714'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_714)'><path d='M11.2502 9.00007V4.43367L10.0021 5.55769C9.69426 5.83477 9.21965 5.80986 8.94255 5.50203C8.66547 5.19416 8.69038 4.71956 8.99821 4.44246L11.6726 2.12391C11.8606 1.96097 12.1397 1.96097 12.3277 2.12391L15.0021 4.44246C15.31 4.71956 15.3349 5.19416 15.0578 5.50203C14.7807 5.80986 14.3061 5.83477 13.9982 5.55769L12.7502 4.43367V9.00007C12.7502 9.41429 12.4144 9.75007 12.0002 9.75007C11.586 9.75007 11.2502 9.41429 11.2502 9.00007Z' fill='%23181D25'/><path d='M11.2502 15V19.5664L10.0021 18.4424C9.69426 18.1653 9.21965 18.1902 8.94255 18.498C8.66547 18.8059 8.69038 19.2805 8.99821 19.5576L11.6726 21.8762C11.8606 22.0391 12.1397 22.0391 12.3277 21.8762L15.0021 19.5576C15.31 19.2805 15.3349 18.8059 15.0578 18.498C14.7807 18.1902 14.3061 18.1653 13.9982 18.4424L12.7502 19.5664V15C12.7502 14.5858 12.4144 14.25 12.0002 14.25C11.586 14.25 11.2502 14.5858 11.2502 15Z' fill='%23181D25'/><path d='M15.0001 11.25H19.5665L18.4425 10.002C18.1654 9.69409 18.1903 9.21948 18.4981 8.94238C18.806 8.6653 19.2806 8.69022 19.5577 8.99805L21.8763 11.6725C22.0392 11.8604 22.0392 12.1396 21.8763 12.3275L19.5577 15.002C19.2806 15.3098 18.806 15.3347 18.4981 15.0576C18.1903 14.7805 18.1654 14.3059 18.4425 13.998L19.5665 12.75H15.0001C14.5859 12.75 14.2501 12.4142 14.2501 12C14.2501 11.5858 14.5859 11.25 15.0001 11.25Z' fill='%23181D25'/><path d='M9.00024 11.25L4.43383 11.25L5.55786 10.002C5.83494 9.69409 5.81003 9.21948 5.50219 8.94238C5.19433 8.66531 4.71972 8.69022 4.44262 8.99805L2.12408 11.6725C1.96114 11.8604 1.96114 12.1396 2.12408 12.3275L4.44262 15.002C4.71972 15.3098 5.19433 15.3347 5.50219 15.0576C5.81003 14.7805 5.83494 14.3059 5.55786 13.998L4.43383 12.75H9.00024C9.41445 12.75 9.75024 12.4142 9.75024 12C9.75024 11.5858 9.41445 11.25 9.00024 11.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_714'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-capture {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_16_397)'><path d='M18.75 17.25H21.25C21.6642 17.25 22 17.5858 22 18C22 18.4142 21.6642 18.75 21.25 18.75H18.75V21.25C18.75 21.6642 18.4142 22 18 22C17.5858 22 17.25 21.6642 17.25 21.25V6.75H8.25V5.25H17.25C18.0784 5.25 18.75 5.92157 18.75 6.75V17.25ZM6 2C6.41421 2 6.75 2.33579 6.75 2.75V17.25H15.75V18.75H6.75C5.92157 18.75 5.25 18.0784 5.25 17.25V6.75H2.75C2.33579 6.75 2 6.41421 2 6C2 5.58579 2.33579 5.25 2.75 5.25H5.25V2.75C5.25 2.33579 5.58579 2 6 2Z' fill='%23181D25'/></g><defs><clipPath id='clip0_16_397'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_16_397)'><path d='M18.75 17.25H21.25C21.6642 17.25 22 17.5858 22 18C22 18.4142 21.6642 18.75 21.25 18.75H18.75V21.25C18.75 21.6642 18.4142 22 18 22C17.5858 22 17.25 21.6642 17.25 21.25V6.75H8.25V5.25H17.25C18.0784 5.25 18.75 5.92157 18.75 6.75V17.25ZM6 2C6.41421 2 6.75 2.33579 6.75 2.75V17.25H15.75V18.75H6.75C5.92157 18.75 5.25 18.0784 5.25 17.25V6.75H2.75C2.33579 6.75 2 6.41421 2 6C2 5.58579 2.33579 5.25 2.75 5.25H5.25V2.75C5.25 2.33579 5.58579 2 6 2Z' fill='%23181D25'/></g><defs><clipPath id='clip0_16_397'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-print {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_16_437)'><path d='M16.498 2.01367C17.1133 2.07627 17.6917 2.34898 18.1328 2.79004C18.6368 3.29405 18.9207 3.97765 18.9229 4.69043V5.07715H19.3096L19.5752 5.09082C20.1905 5.15344 20.7689 5.42608 21.21 5.86719C21.7139 6.37119 21.9979 7.05485 22 7.76758V15.4639C21.9978 16.1764 21.7137 16.8594 21.21 17.3633C20.7059 17.8673 20.0224 18.1522 19.3096 18.1543H18.9229V20.0615C18.9227 21.1317 18.0555 21.9996 16.9854 22H7.01465C5.94452 21.9996 5.07734 21.1317 5.07715 20.0615V18.1543H4.69043C3.97765 18.1522 3.29405 17.8673 2.79004 17.3633C2.28627 16.8594 2.00221 16.1764 2 15.4639V7.76758L2.01367 7.50195C2.07627 6.88671 2.34898 6.30829 2.79004 5.86719C3.29405 5.36317 3.97765 5.07928 4.69043 5.07715H5.07715V4.69043L5.09082 4.4248C5.15344 3.80953 5.42608 3.23114 5.86719 2.79004C6.37119 2.2861 7.05485 2.00213 7.76758 2H16.2324L16.498 2.01367ZM7.01465 12C6.79427 12.0004 6.61555 12.179 6.61523 12.3994V20.0615C6.61543 20.282 6.79419 20.4615 7.01465 20.4619H16.9854C17.2058 20.4615 17.3846 20.282 17.3848 20.0615V12.3994C17.3844 12.179 17.2057 12.0004 16.9854 12H7.01465ZM4.58008 6.62109C4.31583 6.64811 4.06739 6.76562 3.87793 6.95508C3.66145 7.17162 3.53908 7.4653 3.53809 7.77148V15.46L3.54492 15.5732C3.57192 15.8374 3.68862 16.086 3.87793 16.2754C4.09448 16.4919 4.38809 16.6142 4.69434 16.6152H5.07715V12.3994C5.07747 11.3293 5.9446 10.4623 7.01465 10.4619H16.9854C18.0554 10.4623 18.9225 11.3293 18.9229 12.3994V16.6152H19.3057C19.6119 16.6142 19.9055 16.4919 20.1221 16.2754C20.3379 16.0594 20.4603 15.7672 20.4619 15.4619V7.77148C20.4609 7.4653 20.3386 7.17162 20.1221 6.95508C19.9326 6.76562 19.6842 6.64811 19.4199 6.62109L19.3057 6.61523H4.69434L4.58008 6.62109ZM18.5381 7.38477C19.1752 7.38477 19.6922 7.90101 19.6924 8.53809C19.6924 9.17534 19.1753 9.69238 18.5381 9.69238C17.901 9.69218 17.3848 9.17521 17.3848 8.53809C17.385 7.90113 17.9011 7.38497 18.5381 7.38477ZM7.65723 3.54492C7.39302 3.57192 7.14453 3.68853 6.95508 3.87793C6.73853 4.09448 6.61623 4.38809 6.61523 4.69434V5.07715H17.3848V4.69434C17.3838 4.38809 17.2615 4.09448 17.0449 3.87793C16.8555 3.68853 16.607 3.57192 16.3428 3.54492L16.2285 3.53809H7.77148L7.65723 3.54492Z' fill='%23181D25'/></g><defs><clipPath id='clip0_16_437'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_16_437)'><path d='M16.498 2.01367C17.1133 2.07627 17.6917 2.34898 18.1328 2.79004C18.6368 3.29405 18.9207 3.97765 18.9229 4.69043V5.07715H19.3096L19.5752 5.09082C20.1905 5.15344 20.7689 5.42608 21.21 5.86719C21.7139 6.37119 21.9979 7.05485 22 7.76758V15.4639C21.9978 16.1764 21.7137 16.8594 21.21 17.3633C20.7059 17.8673 20.0224 18.1522 19.3096 18.1543H18.9229V20.0615C18.9227 21.1317 18.0555 21.9996 16.9854 22H7.01465C5.94452 21.9996 5.07734 21.1317 5.07715 20.0615V18.1543H4.69043C3.97765 18.1522 3.29405 17.8673 2.79004 17.3633C2.28627 16.8594 2.00221 16.1764 2 15.4639V7.76758L2.01367 7.50195C2.07627 6.88671 2.34898 6.30829 2.79004 5.86719C3.29405 5.36317 3.97765 5.07928 4.69043 5.07715H5.07715V4.69043L5.09082 4.4248C5.15344 3.80953 5.42608 3.23114 5.86719 2.79004C6.37119 2.2861 7.05485 2.00213 7.76758 2H16.2324L16.498 2.01367ZM7.01465 12C6.79427 12.0004 6.61555 12.179 6.61523 12.3994V20.0615C6.61543 20.282 6.79419 20.4615 7.01465 20.4619H16.9854C17.2058 20.4615 17.3846 20.282 17.3848 20.0615V12.3994C17.3844 12.179 17.2057 12.0004 16.9854 12H7.01465ZM4.58008 6.62109C4.31583 6.64811 4.06739 6.76562 3.87793 6.95508C3.66145 7.17162 3.53908 7.4653 3.53809 7.77148V15.46L3.54492 15.5732C3.57192 15.8374 3.68862 16.086 3.87793 16.2754C4.09448 16.4919 4.38809 16.6142 4.69434 16.6152H5.07715V12.3994C5.07747 11.3293 5.9446 10.4623 7.01465 10.4619H16.9854C18.0554 10.4623 18.9225 11.3293 18.9229 12.3994V16.6152H19.3057C19.6119 16.6142 19.9055 16.4919 20.1221 16.2754C20.3379 16.0594 20.4603 15.7672 20.4619 15.4619V7.77148C20.4609 7.4653 20.3386 7.17162 20.1221 6.95508C19.9326 6.76562 19.6842 6.64811 19.4199 6.62109L19.3057 6.61523H4.69434L4.58008 6.62109ZM18.5381 7.38477C19.1752 7.38477 19.6922 7.90101 19.6924 8.53809C19.6924 9.17534 19.1753 9.69238 18.5381 9.69238C17.901 9.69218 17.3848 9.17521 17.3848 8.53809C17.385 7.90113 17.9011 7.38497 18.5381 7.38477ZM7.65723 3.54492C7.39302 3.57192 7.14453 3.68853 6.95508 3.87793C6.73853 4.09448 6.61623 4.38809 6.61523 4.69434V5.07715H17.3848V4.69434C17.3838 4.38809 17.2615 4.09448 17.0449 3.87793C16.8555 3.68853 16.607 3.57192 16.3428 3.54492L16.2285 3.53809H7.77148L7.65723 3.54492Z' fill='%23181D25'/></g><defs><clipPath id='clip0_16_437'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-memo {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_222)'><path d='M20.4958 6.44793C20.4958 5.78932 20.4948 5.34002 20.4664 4.9927C20.4387 4.65422 20.3891 4.47901 20.3264 4.35617H20.3254C20.176 4.06278 19.9378 3.82481 19.6429 3.67458L19.6419 3.6736C19.5191 3.61101 19.3438 3.56123 19.0053 3.53357C18.6577 3.50517 18.2078 3.50419 17.5482 3.50419H6.45086C5.79131 3.50419 5.34141 3.50515 4.99368 3.53357C4.65516 3.56126 4.47985 3.61162 4.35617 3.67458C4.06198 3.82441 3.82441 4.06198 3.67458 4.35617C3.61162 4.47985 3.56126 4.65516 3.53357 4.99368C3.50515 5.34141 3.50419 5.79131 3.50419 6.45086V17.5482C3.50419 18.2077 3.50518 18.6576 3.53357 19.0053C3.56126 19.3442 3.61157 19.5201 3.67458 19.6438C3.82413 19.9373 4.06268 20.1759 4.35617 20.3254V20.3264C4.47901 20.3891 4.65422 20.4387 4.9927 20.4664C5.34002 20.4948 5.78932 20.4958 6.44793 20.4958H12.404V15.0059C12.404 14.6948 12.4028 14.4157 12.4216 14.1853C12.4411 13.9461 12.4857 13.6932 12.6116 13.4459C12.7945 13.0869 13.0869 12.7945 13.4459 12.6116C13.6932 12.4857 13.9461 12.4411 14.1853 12.4216C14.4157 12.4028 14.6948 12.404 15.0059 12.404H20.4958V6.44793ZM13.9081 20.393C13.999 20.3584 14.0865 20.3161 14.1706 20.2647C14.3104 20.1786 14.4424 20.0558 14.8629 19.634V19.6331L19.6331 14.8639C20.0552 14.4418 20.1797 14.3085 20.2667 14.1677C20.3171 14.0843 20.3579 13.9977 20.392 13.9081H15.0059C14.67 13.9081 14.4627 13.9082 14.3077 13.9209C14.2342 13.9269 14.1892 13.9352 14.1628 13.9414L14.1285 13.9522C14.0715 13.9813 14.0228 14.0234 13.9855 14.0746L13.9522 14.1285C13.9522 14.1285 13.9328 14.1615 13.9209 14.3077C13.9082 14.4627 13.9081 14.67 13.9081 15.0059V20.393ZM22 13.1639C21.9964 13.5045 21.9825 13.7811 21.9168 14.0638L21.9148 14.0717C21.8387 14.3842 21.7168 14.6792 21.5495 14.954L21.5466 14.9579C21.3469 15.2816 21.074 15.551 20.6966 15.9284L15.9265 20.6966C15.5514 21.0727 15.2823 21.3472 14.956 21.5476L14.955 21.5485C14.6805 21.7163 14.3854 21.8386 14.0727 21.9148L14.0678 21.9158C13.7806 21.9838 13.5009 21.9965 13.1639 22H6.44793C5.81417 22 5.29314 22.0003 4.87029 21.9657C4.49271 21.9348 4.1426 21.8734 3.81266 21.7317L3.67262 21.6661C3.09633 21.3724 2.62767 20.9037 2.33394 20.3274V20.3264C2.14515 19.9556 2.06958 19.5605 2.03428 19.1287C1.99969 18.7055 2 18.1831 2 17.5482V6.45086C2 5.81609 1.9997 5.29444 2.03428 4.87127C2.06959 4.43935 2.14501 4.04354 2.33394 3.67262C2.62795 3.09552 3.09552 2.62795 3.67262 2.33394C4.04354 2.14501 4.43935 2.06959 4.87127 2.03428C5.29444 1.9997 5.81609 2 6.45086 2H17.5482C18.1829 2 18.7047 1.99972 19.1277 2.03428C19.5596 2.06957 19.9556 2.14466 20.3264 2.33394L20.3254 2.33492C20.9018 2.62853 21.3716 3.09465 21.6661 3.67262L21.7317 3.81266C21.8734 4.1426 21.9348 4.49271 21.9657 4.87029C22.0003 5.29314 22 5.81417 22 6.44793V13.1639Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_222'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_222)'><path d='M20.4958 6.44793C20.4958 5.78932 20.4948 5.34002 20.4664 4.9927C20.4387 4.65422 20.3891 4.47901 20.3264 4.35617H20.3254C20.176 4.06278 19.9378 3.82481 19.6429 3.67458L19.6419 3.6736C19.5191 3.61101 19.3438 3.56123 19.0053 3.53357C18.6577 3.50517 18.2078 3.50419 17.5482 3.50419H6.45086C5.79131 3.50419 5.34141 3.50515 4.99368 3.53357C4.65516 3.56126 4.47985 3.61162 4.35617 3.67458C4.06198 3.82441 3.82441 4.06198 3.67458 4.35617C3.61162 4.47985 3.56126 4.65516 3.53357 4.99368C3.50515 5.34141 3.50419 5.79131 3.50419 6.45086V17.5482C3.50419 18.2077 3.50518 18.6576 3.53357 19.0053C3.56126 19.3442 3.61157 19.5201 3.67458 19.6438C3.82413 19.9373 4.06268 20.1759 4.35617 20.3254V20.3264C4.47901 20.3891 4.65422 20.4387 4.9927 20.4664C5.34002 20.4948 5.78932 20.4958 6.44793 20.4958H12.404V15.0059C12.404 14.6948 12.4028 14.4157 12.4216 14.1853C12.4411 13.9461 12.4857 13.6932 12.6116 13.4459C12.7945 13.0869 13.0869 12.7945 13.4459 12.6116C13.6932 12.4857 13.9461 12.4411 14.1853 12.4216C14.4157 12.4028 14.6948 12.404 15.0059 12.404H20.4958V6.44793ZM13.9081 20.393C13.999 20.3584 14.0865 20.3161 14.1706 20.2647C14.3104 20.1786 14.4424 20.0558 14.8629 19.634V19.6331L19.6331 14.8639C20.0552 14.4418 20.1797 14.3085 20.2667 14.1677C20.3171 14.0843 20.3579 13.9977 20.392 13.9081H15.0059C14.67 13.9081 14.4627 13.9082 14.3077 13.9209C14.2342 13.9269 14.1892 13.9352 14.1628 13.9414L14.1285 13.9522C14.0715 13.9813 14.0228 14.0234 13.9855 14.0746L13.9522 14.1285C13.9522 14.1285 13.9328 14.1615 13.9209 14.3077C13.9082 14.4627 13.9081 14.67 13.9081 15.0059V20.393ZM22 13.1639C21.9964 13.5045 21.9825 13.7811 21.9168 14.0638L21.9148 14.0717C21.8387 14.3842 21.7168 14.6792 21.5495 14.954L21.5466 14.9579C21.3469 15.2816 21.074 15.551 20.6966 15.9284L15.9265 20.6966C15.5514 21.0727 15.2823 21.3472 14.956 21.5476L14.955 21.5485C14.6805 21.7163 14.3854 21.8386 14.0727 21.9148L14.0678 21.9158C13.7806 21.9838 13.5009 21.9965 13.1639 22H6.44793C5.81417 22 5.29314 22.0003 4.87029 21.9657C4.49271 21.9348 4.1426 21.8734 3.81266 21.7317L3.67262 21.6661C3.09633 21.3724 2.62767 20.9037 2.33394 20.3274V20.3264C2.14515 19.9556 2.06958 19.5605 2.03428 19.1287C1.99969 18.7055 2 18.1831 2 17.5482V6.45086C2 5.81609 1.9997 5.29444 2.03428 4.87127C2.06959 4.43935 2.14501 4.04354 2.33394 3.67262C2.62795 3.09552 3.09552 2.62795 3.67262 2.33394C4.04354 2.14501 4.43935 2.06959 4.87127 2.03428C5.29444 1.9997 5.81609 2 6.45086 2H17.5482C18.1829 2 18.7047 1.99972 19.1277 2.03428C19.5596 2.06957 19.9556 2.14466 20.3264 2.33394L20.3254 2.33492C20.9018 2.62853 21.3716 3.09465 21.6661 3.67262L21.7317 3.81266C21.8734 4.1426 21.9348 4.49271 21.9657 4.87029C22.0003 5.29314 22 5.81417 22 6.44793V13.1639Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_222'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-pencil {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_110)'><path d='M16.166 2.5149C16.8531 1.82803 17.9672 1.82805 18.6543 2.5149L21.4864 5.34696C22.1735 6.03406 22.1733 7.14807 21.4864 7.83527L7.68849 21.6342C7.45317 21.8695 7.13356 22.0014 6.80079 22.0014H3.25488C2.56188 22.0014 2 21.4395 2 20.7465V17.2006C2.00011 16.868 2.132 16.5481 2.36719 16.3129L16.166 2.5149ZM3.5 17.3012V20.5014H6.7002L18.0694 9.1302L14.8701 5.93095L3.5 17.3012ZM17.5938 3.57546C17.4924 3.4744 17.3279 3.47437 17.2266 3.57546L15.9307 4.87039L19.1299 8.06964L20.4258 6.77471C20.527 6.67331 20.5271 6.50883 20.4258 6.40752L17.5938 3.57546Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_110'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_110)'><path d='M16.166 2.5149C16.8531 1.82803 17.9672 1.82805 18.6543 2.5149L21.4864 5.34696C22.1735 6.03406 22.1733 7.14807 21.4864 7.83527L7.68849 21.6342C7.45317 21.8695 7.13356 22.0014 6.80079 22.0014H3.25488C2.56188 22.0014 2 21.4395 2 20.7465V17.2006C2.00011 16.868 2.132 16.5481 2.36719 16.3129L16.166 2.5149ZM3.5 17.3012V20.5014H6.7002L18.0694 9.1302L14.8701 5.93095L3.5 17.3012ZM17.5938 3.57546C17.4924 3.4744 17.3279 3.47437 17.2266 3.57546L15.9307 4.87039L19.1299 8.06964L20.4258 6.77471C20.527 6.67331 20.5271 6.50883 20.4258 6.40752L17.5938 3.57546Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_110'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-highlighter {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_109)'><path d='M12.418 3.21943C12.7108 2.92659 13.1866 2.9268 13.4795 3.21943C13.7721 3.51226 13.7721 3.98713 13.4795 4.27998L9.33594 8.42353C9.23861 8.52101 9.23884 8.67942 9.33594 8.77705L16.5898 16.0319C16.6872 16.1292 16.8447 16.1297 16.9424 16.0329L20.7354 12.2585C21.0289 11.9667 21.5038 11.9681 21.7959 12.2614C22.0878 12.555 22.0865 13.0299 21.793 13.322L18.001 17.0954C17.412 17.6814 16.5116 17.7604 15.8369 17.3356L12.9023 20.2712C12.6679 20.5056 12.3501 20.6374 12.0186 20.6374H3.2666C2.57635 20.6373 2.0166 20.0777 2.0166 19.3874V16.5153C2.01669 16.184 2.1486 15.8659 2.38281 15.6315L8.22754 9.78388C7.59492 9.09743 7.60941 8.02922 8.27539 7.36298L12.418 3.21943ZM3.5166 16.6179V19.1374H11.915L14.7441 16.3073L9.28516 10.8474L3.5166 16.6179Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_109'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_109)'><path d='M12.418 3.21943C12.7108 2.92659 13.1866 2.9268 13.4795 3.21943C13.7721 3.51226 13.7721 3.98713 13.4795 4.27998L9.33594 8.42353C9.23861 8.52101 9.23884 8.67942 9.33594 8.77705L16.5898 16.0319C16.6872 16.1292 16.8447 16.1297 16.9424 16.0329L20.7354 12.2585C21.0289 11.9667 21.5038 11.9681 21.7959 12.2614C22.0878 12.555 22.0865 13.0299 21.793 13.322L18.001 17.0954C17.412 17.6814 16.5116 17.7604 15.8369 17.3356L12.9023 20.2712C12.6679 20.5056 12.3501 20.6374 12.0186 20.6374H3.2666C2.57635 20.6373 2.0166 20.0777 2.0166 19.3874V16.5153C2.01669 16.184 2.1486 15.8659 2.38281 15.6315L8.22754 9.78388C7.59492 9.09743 7.60941 8.02922 8.27539 7.36298L12.418 3.21943ZM3.5166 16.6179V19.1374H11.915L14.7441 16.3073L9.28516 10.8474L3.5166 16.6179Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_109'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-eraser {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_145)'><path d='M12.4258 3.51224C13.1092 2.82892 14.217 2.82893 14.9004 3.51224L21.5098 10.1216C22.1929 10.805 22.193 11.9129 21.5098 12.5962L14.0146 20.0913C13.6866 20.4194 13.2413 20.6039 12.7773 20.604H7.9414C7.47745 20.6039 7.03218 20.4194 6.7041 20.0913L2.51269 15.8999C1.82939 15.2165 1.82939 14.1087 2.51269 13.4253L12.4258 3.51224ZM3.57324 14.4859C3.47572 14.5835 3.47572 14.7418 3.57324 14.8394L7.76464 19.0308C7.81143 19.0776 7.87525 19.1039 7.9414 19.104H12.7773C12.8435 19.1039 12.9073 19.0776 12.9541 19.0308L12.9834 18.9995L6.02148 12.0376L3.57324 14.4859ZM13.8398 4.57279C13.7422 4.47526 13.5839 4.47526 13.4863 4.57279L7.08203 10.9761L14.0449 17.939L20.4492 11.5357C20.5467 11.4381 20.5466 11.2798 20.4492 11.1822L13.8398 4.57279Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_145'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_30_145)'><path d='M12.4258 3.51224C13.1092 2.82892 14.217 2.82893 14.9004 3.51224L21.5098 10.1216C22.1929 10.805 22.193 11.9129 21.5098 12.5962L14.0146 20.0913C13.6866 20.4194 13.2413 20.6039 12.7773 20.604H7.9414C7.47745 20.6039 7.03218 20.4194 6.7041 20.0913L2.51269 15.8999C1.82939 15.2165 1.82939 14.1087 2.51269 13.4253L12.4258 3.51224ZM3.57324 14.4859C3.47572 14.5835 3.47572 14.7418 3.57324 14.8394L7.76464 19.0308C7.81143 19.0776 7.87525 19.1039 7.9414 19.104H12.7773C12.8435 19.1039 12.9073 19.0776 12.9541 19.0308L12.9834 18.9995L6.02148 12.0376L3.57324 14.4859ZM13.8398 4.57279C13.7422 4.47526 13.5839 4.47526 13.4863 4.57279L7.08203 10.9761L14.0449 17.939L20.4492 11.5357C20.5467 11.4381 20.5466 11.2798 20.4492 11.1822L13.8398 4.57279Z' fill='%23181D25'/></g><defs><clipPath id='clip0_30_145'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-trash {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_660)'><path d='M14.5 2C15.1904 2 15.75 2.55964 15.75 3.25V4.75H21.25C21.6642 4.75 22 5.08579 22 5.5C22 5.91421 21.6642 6.25 21.25 6.25H19.25V19.75C19.25 20.9926 18.2426 22 17 22H7C5.75736 22 4.75 20.9926 4.75 19.75V6.25H2.75C2.33579 6.25 2 5.91421 2 5.5C2 5.08579 2.33579 4.75 2.75 4.75H8.25V3.25C8.25 2.55964 8.80964 2 9.5 2H14.5ZM6.25 19.75C6.25 20.1642 6.58579 20.5 7 20.5H17C17.4142 20.5 17.75 20.1642 17.75 19.75V6.25H6.25V19.75ZM10 9.25C10.4142 9.25 10.75 9.58579 10.75 10V16C10.75 16.4142 10.4142 16.75 10 16.75C9.58579 16.75 9.25 16.4142 9.25 16V10C9.25 9.58579 9.58579 9.25 10 9.25ZM14 9.25C14.4142 9.25 14.75 9.58579 14.75 10V16C14.75 16.4142 14.4142 16.75 14 16.75C13.5858 16.75 13.25 16.4142 13.25 16V10C13.25 9.58579 13.5858 9.25 14 9.25ZM9.75 3.5V4.75H14.25V3.5H9.75Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_660'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_660)'><path d='M14.5 2C15.1904 2 15.75 2.55964 15.75 3.25V4.75H21.25C21.6642 4.75 22 5.08579 22 5.5C22 5.91421 21.6642 6.25 21.25 6.25H19.25V19.75C19.25 20.9926 18.2426 22 17 22H7C5.75736 22 4.75 20.9926 4.75 19.75V6.25H2.75C2.33579 6.25 2 5.91421 2 5.5C2 5.08579 2.33579 4.75 2.75 4.75H8.25V3.25C8.25 2.55964 8.80964 2 9.5 2H14.5ZM6.25 19.75C6.25 20.1642 6.58579 20.5 7 20.5H17C17.4142 20.5 17.75 20.1642 17.75 19.75V6.25H6.25V19.75ZM10 9.25C10.4142 9.25 10.75 9.58579 10.75 10V16C10.75 16.4142 10.4142 16.75 10 16.75C9.58579 16.75 9.25 16.4142 9.25 16V10C9.25 9.58579 9.58579 9.25 10 9.25ZM14 9.25C14.4142 9.25 14.75 9.58579 14.75 10V16C14.75 16.4142 14.4142 16.75 14 16.75C13.5858 16.75 13.25 16.4142 13.25 16V10C13.25 9.58579 13.5858 9.25 14 9.25ZM9.75 3.5V4.75H14.25V3.5H9.75Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_660'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-minus {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_1005)'><path d='M21.25 11.25C21.6642 11.25 22 11.5858 22 12C22 12.4142 21.6642 12.75 21.25 12.75H2.75C2.33579 12.75 2 12.4142 2 12C2 11.5858 2.33579 11.25 2.75 11.25H21.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_1005'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_1005)'><path d='M21.25 11.25C21.6642 11.25 22 11.5858 22 12C22 12.4142 21.6642 12.75 21.25 12.75H2.75C2.33579 12.75 2 12.4142 2 12C2 11.5858 2.33579 11.25 2.75 11.25H21.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_1005'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-plus {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_1006)'><path d='M12.0049 2.00488C12.4191 2.00488 12.7549 2.34067 12.7549 2.75488V11.25H21.25C21.6642 11.25 22 11.5858 22 12C22 12.4142 21.6642 12.75 21.25 12.75H12.7549V21.2549C12.7549 21.6691 12.4191 22.0049 12.0049 22.0049C11.5907 22.0049 11.2549 21.6691 11.2549 21.2549V12.75H2.75C2.33579 12.75 2 12.4142 2 12C2 11.5858 2.33579 11.25 2.75 11.25H11.2549V2.75488C11.2549 2.34067 11.5907 2.00488 12.0049 2.00488Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_1006'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_21_1006)'><path d='M12.0049 2.00488C12.4191 2.00488 12.7549 2.34067 12.7549 2.75488V11.25H21.25C21.6642 11.25 22 11.5858 22 12C22 12.4142 21.6642 12.75 21.25 12.75H12.7549V21.2549C12.7549 21.6691 12.4191 22.0049 12.0049 22.0049C11.5907 22.0049 11.2549 21.6691 11.2549 21.2549V12.75H2.75C2.33579 12.75 2 12.4142 2 12C2 11.5858 2.33579 11.25 2.75 11.25H11.2549V2.75488C11.2549 2.34067 11.5907 2.00488 12.0049 2.00488Z' fill='%23181D25'/></g><defs><clipPath id='clip0_21_1006'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-search {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_374)'><g clip-path='url(%23clip1_9_374)'><path d='M15.0464 5.82325C12.4995 3.27635 8.37013 3.27635 5.82324 5.82325C3.27634 8.37015 3.27634 12.4995 5.82324 15.0464C8.37013 17.5933 12.4995 17.5933 15.0464 15.0464C17.5933 12.4995 17.5933 8.37014 15.0464 5.82325ZM16.1531 4.71647C19.1246 7.68791 19.2992 12.3956 16.6792 15.5724L21.4233 20.3165C21.7286 20.6222 21.7288 21.1178 21.4233 21.4233C21.1178 21.7288 20.6222 21.7286 20.3165 21.4233L15.5724 16.6792C12.3955 19.2992 7.6879 19.1246 4.71646 16.1532C1.55831 12.995 1.55831 7.87462 4.71646 4.71647C7.87461 1.55832 12.995 1.55832 16.1531 4.71647Z' fill='%23181D25'/></g></g><defs><clipPath id='clip0_9_374'><rect width='24' height='24' fill='white'/></clipPath><clipPath id='clip1_9_374'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_374)'><g clip-path='url(%23clip1_9_374)'><path d='M15.0464 5.82325C12.4995 3.27635 8.37013 3.27635 5.82324 5.82325C3.27634 8.37015 3.27634 12.4995 5.82324 15.0464C8.37013 17.5933 12.4995 17.5933 15.0464 15.0464C17.5933 12.4995 17.5933 8.37014 15.0464 5.82325ZM16.1531 4.71647C19.1246 7.68791 19.2992 12.3956 16.6792 15.5724L21.4233 20.3165C21.7286 20.6222 21.7288 21.1178 21.4233 21.4233C21.1178 21.7288 20.6222 21.7286 20.3165 21.4233L15.5724 16.6792C12.3955 19.2992 7.6879 19.1246 4.71646 16.1532C1.55831 12.995 1.55831 7.87462 4.71646 4.71647C7.87461 1.55832 12.995 1.55832 16.1531 4.71647Z' fill='%23181D25'/></g></g><defs><clipPath id='clip0_9_374'><rect width='24' height='24' fill='white'/></clipPath><clipPath id='clip1_9_374'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-chevron-front {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_394)'><path d='M6.75 2.00427C7.16421 2.00427 7.5 2.34005 7.5 2.75426V21.2503C7.49982 21.6643 7.1641 22.0003 6.75 22.0003C6.3359 22.0003 6.00018 21.6643 6 21.2503V2.75426C6 2.34005 6.33579 2.00427 6.75 2.00427ZM18.1338 2.22692C18.4227 1.93052 18.8976 1.92455 19.1943 2.21325C19.4904 2.50216 19.4965 2.97718 19.208 3.27379L10.7168 12.0003L19.208 20.7268C19.4963 21.0236 19.4906 21.4986 19.1943 21.7874C18.8977 22.076 18.4227 22.0698 18.1338 21.7737L9.26953 12.6624C8.91072 12.2936 8.91072 11.707 9.26953 11.3382L18.1338 2.22692Z' fill='%23181D25'/></g><defs><clipPath id='clip0_9_394'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_394)'><path d='M6.75 2.00427C7.16421 2.00427 7.5 2.34005 7.5 2.75426V21.2503C7.49982 21.6643 7.1641 22.0003 6.75 22.0003C6.3359 22.0003 6.00018 21.6643 6 21.2503V2.75426C6 2.34005 6.33579 2.00427 6.75 2.00427ZM18.1338 2.22692C18.4227 1.93052 18.8976 1.92455 19.1943 2.21325C19.4904 2.50216 19.4965 2.97718 19.208 3.27379L10.7168 12.0003L19.208 20.7268C19.4963 21.0236 19.4906 21.4986 19.1943 21.7874C18.8977 22.076 18.4227 22.0698 18.1338 21.7737L9.26953 12.6624C8.91072 12.2936 8.91072 11.707 9.26953 11.3382L18.1338 2.22692Z' fill='%23181D25'/></g><defs><clipPath id='clip0_9_394'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-chevron-left {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_7_14)'><path d='M15.1334 2.22658C15.4223 1.93013 15.8972 1.92419 16.1939 2.21291C16.4904 2.5018 16.4963 2.97672 16.2076 3.27345L7.71638 12L16.2076 20.7266C16.4963 21.0233 16.4904 21.4982 16.1939 21.7871C15.8972 22.0758 15.4223 22.0699 15.1334 21.7735L6.26911 12.6621C5.9103 12.2933 5.9103 11.7067 6.26911 11.3379L15.1334 2.22658Z' fill='%23181D25'/></g><defs><clipPath id='clip0_7_14'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_7_14)'><path d='M15.1334 2.22658C15.4223 1.93013 15.8972 1.92419 16.1939 2.21291C16.4904 2.5018 16.4963 2.97672 16.2076 3.27345L7.71638 12L16.2076 20.7266C16.4963 21.0233 16.4904 21.4982 16.1939 21.7871C15.8972 22.0758 15.4223 22.0699 15.1334 21.7735L6.26911 12.6621C5.9103 12.2933 5.9103 11.7067 6.26911 11.3379L15.1334 2.22658Z' fill='%23181D25'/></g><defs><clipPath id='clip0_7_14'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-chevron-right {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_7_15)'><path d='M8.86688 2.22633C8.57798 1.92988 8.10306 1.92395 7.80633 2.21266C7.50988 2.50156 7.50394 2.97648 7.79266 3.27321L16.2839 11.9998L7.79266 20.7263C7.50394 21.0231 7.50988 21.498 7.80633 21.7869C8.10306 22.0756 8.57798 22.0697 8.86688 21.7732L17.7311 12.6619C18.0899 12.2931 18.0899 11.7064 17.7311 11.3377L8.86688 2.22633Z' fill='%23181D25'/></g><defs><clipPath id='clip0_7_15'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_7_15)'><path d='M8.86688 2.22633C8.57798 1.92988 8.10306 1.92395 7.80633 2.21266C7.50988 2.50156 7.50394 2.97648 7.79266 3.27321L16.2839 11.9998L7.79266 20.7263C7.50394 21.0231 7.50988 21.498 7.80633 21.7869C8.10306 22.0756 8.57798 22.0697 8.86688 21.7732L17.7311 12.6619C18.0899 12.2931 18.0899 11.7064 17.7311 11.3377L8.86688 2.22633Z' fill='%23181D25'/></g><defs><clipPath id='clip0_7_15'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-chevron-last {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_391)'><path d='M5.86688 2.22658C5.57798 1.93013 5.10306 1.92419 4.80633 2.21291C4.50988 2.5018 4.50394 2.97672 4.79266 3.27345L13.2839 12L4.79266 20.7266C4.50394 21.0233 4.50988 21.4982 4.80633 21.7871C5.10306 22.0758 5.57798 22.0699 5.86688 21.7735L14.7311 12.6621C15.0899 12.2933 15.0899 11.7067 14.7311 11.3379L5.86688 2.22658Z' fill='%23181D25'/><path d='M18.0002 21.25V2.75391C18.0002 2.33969 17.6645 2.00391 17.2502 2.00391C16.836 2.00391 16.5002 2.33969 16.5002 2.75391V21.25C16.5002 21.6642 16.836 22 17.2502 22C17.6645 22 18.0002 21.6642 18.0002 21.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_9_391'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_9_391)'><path d='M5.86688 2.22658C5.57798 1.93013 5.10306 1.92419 4.80633 2.21291C4.50988 2.5018 4.50394 2.97672 4.79266 3.27345L13.2839 12L4.79266 20.7266C4.50394 21.0233 4.50988 21.4982 4.80633 21.7871C5.10306 22.0758 5.57798 22.0699 5.86688 21.7735L14.7311 12.6621C15.0899 12.2933 15.0899 11.7067 14.7311 11.3379L5.86688 2.22658Z' fill='%23181D25'/><path d='M18.0002 21.25V2.75391C18.0002 2.33969 17.6645 2.00391 17.2502 2.00391C16.836 2.00391 16.5002 2.33969 16.5002 2.75391V21.25C16.5002 21.6642 16.836 22 17.2502 22C17.6645 22 18.0002 21.6642 18.0002 21.25Z' fill='%23181D25'/></g><defs><clipPath id='clip0_9_391'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-dropper {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_81_432)'><path d='M16.2619 2.98005C17.5746 1.67259 19.7029 1.6734 21.0155 2.98103C22.328 4.2887 22.3279 6.40821 21.0155 7.71595L20.0722 8.65551L20.6753 9.25616C21.3608 9.93962 21.3608 11.0476 20.6753 11.7311L19.1437 13.2566C18.4576 13.9398 17.3451 13.9398 16.659 13.2566L16.4256 13.0242L9.09809 20.3238C8.55086 20.869 7.79841 21.1602 7.02524 21.1267L6.49183 21.1032L3.612 21.9471C2.60703 22.2415 1.70313 21.2518 2.09217 20.2828L3.10016 17.7708L2.98642 17.2024C2.80549 16.3008 3.08893 15.3689 3.74143 14.7187L10.9337 7.55186L10.7013 7.32039C10.0153 6.63682 10.0152 5.52898 10.7013 4.8455L12.2319 3.32091C12.918 2.63736 14.0304 2.63736 14.7166 3.32091L15.3186 3.91961L16.2619 2.98005ZM4.80629 15.7794C4.50973 16.075 4.38083 16.4986 4.46311 16.9084L4.59254 17.5511C4.64 17.7884 4.61695 18.0344 4.52684 18.2592L3.6826 20.3619L6.1055 19.6529C6.23798 19.6141 6.37642 19.5971 6.51438 19.6031L7.09094 19.6285C7.44229 19.6436 7.78455 19.5109 8.03323 19.2632L15.3598 11.9625L11.9985 8.61253L4.80629 15.7794ZM19.9506 4.04169C19.2261 3.32006 18.0513 3.31919 17.3267 4.04072L15.3186 6.04192L13.6517 4.38158C13.5537 4.28393 13.3948 4.28393 13.2967 4.38158L11.7661 5.90617C11.6681 6.00378 11.6682 6.16206 11.7661 6.25972L17.7239 12.196C17.8218 12.2932 17.9808 12.2931 18.0788 12.196L19.6104 10.6704C19.708 10.5729 19.7079 10.4144 19.6104 10.3168L17.9425 8.65551L19.9506 6.65528C20.6749 5.93345 20.675 4.76346 19.9506 4.04169Z' fill='%23181D25'/></g><defs><clipPath id='clip0_81_432'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_81_432)'><path d='M16.2619 2.98005C17.5746 1.67259 19.7029 1.6734 21.0155 2.98103C22.328 4.2887 22.3279 6.40821 21.0155 7.71595L20.0722 8.65551L20.6753 9.25616C21.3608 9.93962 21.3608 11.0476 20.6753 11.7311L19.1437 13.2566C18.4576 13.9398 17.3451 13.9398 16.659 13.2566L16.4256 13.0242L9.09809 20.3238C8.55086 20.869 7.79841 21.1602 7.02524 21.1267L6.49183 21.1032L3.612 21.9471C2.60703 22.2415 1.70313 21.2518 2.09217 20.2828L3.10016 17.7708L2.98642 17.2024C2.80549 16.3008 3.08893 15.3689 3.74143 14.7187L10.9337 7.55186L10.7013 7.32039C10.0153 6.63682 10.0152 5.52898 10.7013 4.8455L12.2319 3.32091C12.918 2.63736 14.0304 2.63736 14.7166 3.32091L15.3186 3.91961L16.2619 2.98005ZM4.80629 15.7794C4.50973 16.075 4.38083 16.4986 4.46311 16.9084L4.59254 17.5511C4.64 17.7884 4.61695 18.0344 4.52684 18.2592L3.6826 20.3619L6.1055 19.6529C6.23798 19.6141 6.37642 19.5971 6.51438 19.6031L7.09094 19.6285C7.44229 19.6436 7.78455 19.5109 8.03323 19.2632L15.3598 11.9625L11.9985 8.61253L4.80629 15.7794ZM19.9506 4.04169C19.2261 3.32006 18.0513 3.31919 17.3267 4.04072L15.3186 6.04192L13.6517 4.38158C13.5537 4.28393 13.3948 4.28393 13.2967 4.38158L11.7661 5.90617C11.6681 6.00378 11.6682 6.16206 11.7661 6.25972L17.7239 12.196C17.8218 12.2932 17.9808 12.2931 18.0788 12.196L19.6104 10.6704C19.708 10.5729 19.7079 10.4144 19.6104 10.3168L17.9425 8.65551L19.9506 6.65528C20.6749 5.93345 20.675 4.76346 19.9506 4.04169Z' fill='%23181D25'/></g><defs><clipPath id='clip0_81_432'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-x {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_36_787)'><path d='M20.7166 2.22009C21.01 1.92666 21.4857 1.92669 21.7791 2.22009C22.0726 2.51355 22.0726 2.98923 21.7791 3.28268L13.0624 11.9997L21.7801 20.7176C22.073 21.0111 22.0734 21.4869 21.7801 21.7802C21.4868 22.0735 21.011 22.0731 20.7175 21.7802L11.9999 13.0622L3.28221 21.7802C2.98871 22.073 2.5129 22.0734 2.21965 21.7802C1.92647 21.4869 1.92685 21.0111 2.21965 20.7176L10.9373 11.9997L2.22063 3.28268C1.92718 2.98923 1.92718 2.51355 2.22063 2.22009C2.51408 1.92664 2.98974 1.92664 3.28319 2.22009L11.9999 10.9371L20.7166 2.22009Z' fill='%23181D25'/></g><defs><clipPath id='clip0_36_787'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><g clip-path='url(%23clip0_36_787)'><path d='M20.7166 2.22009C21.01 1.92666 21.4857 1.92669 21.7791 2.22009C22.0726 2.51355 22.0726 2.98923 21.7791 3.28268L13.0624 11.9997L21.7801 20.7176C22.073 21.0111 22.0734 21.4869 21.7801 21.7802C21.4868 22.0735 21.011 22.0731 20.7175 21.7802L11.9999 13.0622L3.28221 21.7802C2.98871 22.073 2.5129 22.0734 2.21965 21.7802C1.92647 21.4869 1.92685 21.0111 2.21965 20.7176L10.9373 11.9997L2.22063 3.28268C1.92718 2.98923 1.92718 2.51355 2.22063 2.22009C2.51408 1.92664 2.98974 1.92664 3.28319 2.22009L11.9999 10.9371L20.7166 2.22009Z' fill='%23181D25'/></g><defs><clipPath id='clip0_36_787'><rect width='24' height='24' fill='white'/></clipPath></defs></svg>");
}

.icon-bookmark {
  mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M19.25 4.75C19.25 4.0596 18.6904 3.5 18 3.5H17.25V9.0654C17.25 10.0638 16.1373 10.6593 15.3066 10.1055L13.5 8.9004L11.6934 10.1055C10.8627 10.6593 9.75 10.0638 9.75 9.0654V3.5H6C5.3096 3.5 4.75 4.0596 4.75 4.75V17.25H18C18.6904 17.25 19.25 16.6904 19.25 16V4.75ZM11.25 8.5977L13.5 7.0986L15.75 8.5977V3.5H11.25V8.5977ZM20.75 16C20.75 17.5188 19.5188 18.75 18 18.75H4.75V20.25C4.75 20.3881 4.8619 20.5 5 20.5H19C19.4142 20.5 19.75 20.8358 19.75 21.25C19.75 21.6642 19.4142 22 19 22H5C4.0335 22 3.25 21.2165 3.25 20.25V4.75C3.25 3.2312 4.4812 2 6 2H18C19.5188 2 20.75 3.2312 20.75 4.75V16Z' fill='%23181D25'/></svg>");
  -webkit-mask-image: url("data:image/svg+xml,<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M19.25 4.75C19.25 4.0596 18.6904 3.5 18 3.5H17.25V9.0654C17.25 10.0638 16.1373 10.6593 15.3066 10.1055L13.5 8.9004L11.6934 10.1055C10.8627 10.6593 9.75 10.0638 9.75 9.0654V3.5H6C5.3096 3.5 4.75 4.0596 4.75 4.75V17.25H18C18.6904 17.25 19.25 16.6904 19.25 16V4.75ZM11.25 8.5977L13.5 7.0986L15.75 8.5977V3.5H11.25V8.5977ZM20.75 16C20.75 17.5188 19.5188 18.75 18 18.75H4.75V20.25C4.75 20.3881 4.8619 20.5 5 20.5H19C19.4142 20.5 19.75 20.8358 19.75 21.25C19.75 21.6642 19.4142 22 19 22H5C4.0335 22 3.25 21.2165 3.25 20.25V4.75C3.25 3.2312 4.4812 2 6 2H18C19.5188 2 20.75 3.2312 20.75 4.75V16Z' fill='%23181D25'/></svg>");
}

.ebook-btn.is-active {
  background: rgba(217, 122, 52, 0.16);
  border-color: rgba(217, 122, 52, 0.55);
  color: #b85f23;
}

/* 키보드 단축키 힌트 배지 -- annotation-toolbar.js의
   addShortcutHint/onGlobalKeyDown-Up 참고. Ctrl을 누르고 있을 때만
   보인다(.ebook-anno-toolbar.is-ctrl-held). 이 바가 뷰어 하단에 있어서
   버튼 아래쪽에 붙이면 화면 밖으로 나가므로 버튼 위에 띄운다.
   position:relative는 이 배지(position:absolute)가 페이지의 아무
   조상이 아니라 딱 이 버튼 기준으로 붙게 하기 위한 것. */
.ebook-btn-has-hint {
  position: relative;
}

.ebook-btn-shortcut-hint {
  display: none;
  position: absolute;
  bottom: calc(100% + 6px);
  left: 50%;
  transform: translateX(-50%);
  background: rgba(20, 20, 30, 0.85);
  color: #fff;
  font-size: 11px;
  font-weight: 400;
  line-height: 1.4;
  padding: 2px 6px;
  border-radius: 4px;
  white-space: nowrap;
  z-index: 20;
  pointer-events: none;
}

.ebook-anno-toolbar.is-ctrl-held .ebook-btn-shortcut-hint {
  display: block;
}

/* 뷰어의 유일한 툴바 -- 도구(왼쪽) / 페이지 이동+목차(가운데) / 검색
   (오른쪽) 세 덩어리를 담는다. 원래는 펜/지우개/형광펜/캡처 등 주석
   도구만 메인 툴바 바로 아래(top:53px)에 붙어 있었는데, 뷰어 하단으로
   옮기면서 메인 툴바가 담던 페이지 이동/검색까지 다 이리로 옮겨왔다 --
   지금은 상단 툴바 자체가 없다. Figma "Underbar" 디자인(반투명 흰 배경,
   위쪽 테두리만, 16px 40px 패딩) 적용. 3열 grid인 이유: 세 덩어리
   너비가 다 가변적인데, 가운데(페이지 이동)는 항상 정중앙에 있어야
   하고 좌우는 서로 겹치면 안 된다 -- flex justify-content로는 가운데
   블록을 양쪽과 무관하게 화면 정중앙에 고정할 방법이 없다. 버튼
   자체(.ebook-btn)는 다른 곳에서도 쓰는 공용 클래스라, 여기서 손대는
   시각 스타일은 전부 .ebook-anno-toolbar 아래로 스코프했다.

   직속 자식은 실제로 leftGroup(페이지 이동)과 rightGroup(도구+검색을
   묶은 .ebook-anno-toolbar-right) 둘뿐이다(ebook-viewer.js에서 조립).
   여기(기본 스킨)에서는 .ebook-anno-toolbar-right를 display:contents로
   투명하게 만들어 그 안의 도구 묶음/검색이 각자 원래 열(좌/우)에 그대로
   있는 것처럼 보이게 한다 -- 도구+검색을 한 덩어리로 오른쪽에 붙이는
   상단형 스킨(viewer-skin-top.scss)과 DOM은 공유하되 배치만 다르게
   가져가기 위한 것. 그래서 아래 세 열 배치는 grid 자동 배치가 아니라
   전부 명시적 grid-column이다. */
.ebook-anno-toolbar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 9;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  padding: 13px 40px;
  background: rgba(255, 255, 255, 0.5);
  border-top: 1px solid #c5cbd3;
}

.ebook-anno-toolbar-right {
  display: contents;
}

/* 도구 버튼들을 담는 첫 번째 grid 열(좌측). */
.ebook-anno-toolbar-tools {
  grid-column: 1;
  display: flex;
  align-items: center;
  gap: 12px;
}

/* 페이지 이동/목차 -- 두 번째 grid 열(가운데, auto 크기라 항상 내용물
   너비만큼만 차지하고 트랙 자체가 정중앙에 놓인다). */
.ebook-anno-toolbar-page {
  grid-column: 2;
  display: flex;
  align-items: center;
  gap: 8px;
}

.ebook-anno-toolbar .ebook-btn {
  background: none;
  border: none;
  border-radius: 6px;
  /* 활성 도구는 진한 배경(검정)으로 채운다 -- 아이콘이 이제 .icon(currentColor
     mask) 방식이라, color를 흰색으로 바꾸면 아이콘 색도 자동으로 따라온다.
     (예전엔 PNG라 filter: brightness(0) invert(1)로 우회해야 했는데, is-active가
     붙는 버튼이 전부 .icon 방식으로 바뀌면서 더 이상 필요 없어졌다.) */
}
.ebook-anno-toolbar .ebook-btn:hover {
  background: #d7d9db;
}
.ebook-anno-toolbar .ebook-btn.is-active {
  background: #181d25;
  border-color: transparent;
  color: #fff;
}

/* Vertical rule between button groups in the annotation toolbar -- see
   annotation-toolbar.js's divider(). Height matches .ebook-btn's own
   rendered height so it doesn't stick out above/below the row. */
.ebook-anno-toolbar-divider {
  align-self: stretch;
  width: 1.5px;
  margin: 2px 2px;
  background: #c5cbd3;
}

/* Figma "Ic-Color"(66:574) -- 테두리 없이 선택된 색만 그대로 보여주는
   단순한 컬러 영역. <input type="color">의 브라우저 기본 스타일(내부
   swatch 자체의 테두리/여백)까지 지워야 순수한 색상 블록으로 보여서,
   바깥 테두리뿐 아니라 -webkit-color-swatch(-wrapper)까지 같이 없앴다. */
/* 이제 <input type="color">가 아니라 viewer.colorPicker(color-picker.js)를
   여는 평범한 <button>이라, 네이티브 색상 input의 내부 swatch를 벗기던
   ::-webkit-color-swatch* 오버라이드는 더 이상 필요 없다 -- 배경색
   자체가 이 버튼의 style.backgroundColor(annotation-toolbar.js가 매
   변경마다 갱신)라 border/radius만 지정하면 그대로 단순한 컬러 영역이
   된다. background(전체)가 아니라 background-color만 인라인으로
   덮어써서 인라인 색상만 바뀌고 이 규칙 자체는 그대로 유지된다. 체크무늬
   (.ebook-color-picker-alpha와 같은 conic-gradient 트릭)는 여기 넣지
   않는다 -- background-image는 항상 background-color보다 위 레이어라,
   완전 불투명한 색을 골라도 체크무늬의 회색 칸이 그 위에 그대로
   덮여 보이는(격자무늬가 비치는) 문제가 있었다. 불투명도 자체를
   확인하는 건 색상 피커 안의 .ebook-color-picker-alpha만으로 충분하다. */
.ebook-anno-color {
  width: 24px;
  height: 24px;
  padding: 0;
  border: none;
  border-radius: 6px;
  cursor: pointer;
}

/* Figma "Size"(41:1847) 슬라이더 -- 트랙은 흰 배경 + 그레이(#C5CBD3)
   테두리의 8px 높이 알약이고, 그 안에 현재 값까지만 채워지는 검정
   바(진행 표시)와 검정 원형 핸들이 얹힌다. 네이티브 <input type="range">는
   브라우저마다 진행 바를 그리는 방식이 갈려서(파이어폭스는
   ::-moz-range-progress로 되지만 크롬/엣지는 그런 pseudo-element가 없다)
   --fill(0~100%로 표시된 현재 값의 비율, annotation-toolbar.js가
   input마다 갱신)을 그라디언트 정지점으로 써서 웹킷 계열에서도 채워진
   구간을 그린다. 트랙/핸들 모두 appearance를 지워야 브라우저 기본
   스타일(각지고 얇은 회색 바) 대신 이 디자인이 적용된다. */
.ebook-anno-width {
  -webkit-appearance: none;
  appearance: none;
  width: 80px;
  height: 12px;
  background: transparent;
  cursor: pointer;
  /* 트랙(8px)보다 핸들(12px)이 더 커서, 핸들을 트랙 중앙에 맞추려면
     그 차이의 절반만큼 위로 끌어올려야 한다 -- 파이어폭스는 이런 보정
     없이 알아서 트랙 중앙에 맞춰주지만, 웹킷 계열은 margin-top을 직접
     계산해줘야 한다. */
}
.ebook-anno-width::-webkit-slider-runnable-track {
  height: 8px;
  border-radius: 6px;
  border: 1px solid #c5cbd3;
  box-sizing: border-box;
  background: linear-gradient(#181d25, #181d25) 0/var(--fill, 0%) 100% no-repeat, #fff;
}
.ebook-anno-width::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 12px;
  height: 12px;
  margin-top: -2px;
  border: none;
  border-radius: 50%;
  background: #181d25;
  cursor: pointer;
}
.ebook-anno-width::-moz-range-track {
  height: 8px;
  border-radius: 6px;
  border: 1px solid #c5cbd3;
  box-sizing: border-box;
  background: #fff;
}
.ebook-anno-width::-moz-range-progress {
  height: 8px;
  border-radius: 6px;
  background: #181d25;
}
.ebook-anno-width::-moz-range-thumb {
  width: 12px;
  height: 12px;
  border: none;
  border-radius: 50%;
  background: #181d25;
  cursor: pointer;
}

/* Figma의 "100%" 알약 배지 그대로 -- 배경 없는 텍스트에서 흰 배경 +
   테두리 있는 pill로 바꿨다. */
.ebook-zoom-label {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 60px;
  height: 32px;
  border: 1px solid #c5cbd3;
  border-radius: 999px;
  background: #fff;
  text-align: center;
  font-size: 14px;
  font-variant-numeric: tabular-nums;
  color: #181d25;
}

/* Figma의 확대/축소 버튼(Ic-Minus/Ic-Plus, "Size=S,Type=Fill")은 다른 32x32
   도구 버튼들과 달리 24x24에 radius 4, 항상 채워진 검정 배경이다 -- 아이콘이
   .icon(currentColor mask) 방식이라 color:#fff만 주면 배경/아이콘 색이
   같이 흰색 대비로 맞춰진다. */
.ebook-anno-toolbar .ebook-zoom-out,
.ebook-anno-toolbar .ebook-zoom-in {
  width: 24px;
  height: 24px;
  background: #181d25;
  border-radius: 4px;
  color: #fff;
  padding: 4px;
}
.ebook-anno-toolbar .ebook-zoom-out .icon,
.ebook-anno-toolbar .ebook-zoom-in .icon {
  width: 15px;
  height: 15px;
  margin-left: 1px;
}
.ebook-anno-toolbar .ebook-zoom-out:hover,
.ebook-anno-toolbar .ebook-zoom-in:hover {
  background: #3c485d;
}

/* Figma의 "1 / 150" pill -- .ebook-zoom-label과 같은 톤(흰 배경 +
   테두리 + 완전히 둥근 모서리)으로 맞췄다. margin-left이 있었는데(예전
   메인 툴바에서 이전/다음 버튼 옆 여백용), 이제 .ebook-anno-toolbar-page의
   flex gap이 그 역할을 대신해서 뺐다 -- 남겨두면 이 앞뒤로만 간격이
   두 배가 된다. */
.ebook-page-group {
  display: inline-flex;
  max-width: 80px;
  align-items: center;
  justify-content: center;
  gap: 2px;
  height: 32px;
  padding: 0 16px;
  border: 1px solid #c5cbd3;
  border-radius: 999px;
  background: #fff;
  color: #181d25;
  font-size: 14px;
}

.ebook-page-input {
  display: inline-block;
  min-width: 0;
  text-align: center;
  background: none;
  border: none;
  color: inherit;
  padding: 0;
  font: inherit;
}

.ebook-page-total {
  opacity: 1;
}

/* 하단 주석 도구 모음의 세 번째(우측) grid 열 -- Figma "Underbar"의
   Search Bar. 원래 메인 툴바 우측에 있던 걸 그대로 옮겨왔다
   (ebook-viewer.js). justify-self:end로 열의 오른쪽 끝(카드 padding
   40px 안쪽)에 붙인다 -- 열 자체는 1fr라 내용물보다 넓다. */
.ebook-search-group {
  grid-column: 3;
  display: flex;
  align-items: center;
  gap: 8px;
  justify-self: end;
}

.ebook-search-input {
  background: #fff;
  border: 1.5px solid #c5cbd3;
  color: #181d25;
  border-radius: 999px;
  padding: 4px 12px;
  min-width: 180px;
  height: 32px;
  box-sizing: border-box;
  font-size: 14px;
}
.ebook-search-input::placeholder {
  color: #C5CBD3;
}

.ebook-search-status {
  font-size: 12px;
  color: #6f7c90;
  white-space: nowrap;
}

.ebook-stage {
  position: relative;
  flex: 1;
  min-height: 0;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 32px 16px;
  /* 상단 .ebook-toolbar는 이제 마운트되지 않아 위쪽은 기본 32px로 충분.
     아래만 하단 .ebook-anno-toolbar가 가리는 만큼 더 필요하다 -- 65px
     (패딩 16px*2 + 32px 버튼 + 테두리 1px) + 14px 여유. 실제 렌더링
     높이를 재서 넣은 값이라, 그 바 높이가 바뀌면 같이 맞춰야 한다. */
  padding-bottom: 79px;
  background: #c2c2c2;
  /* St.PageFlip's page-turn transform (and its corner-hover preview) can
     visually extend a page past its own box for an instant; with
     overflow:auto that momentary bounding-box overshoot registers as
     scrollable content and pops a scrollbar. hidden clips the harmless
     overshoot instead of exposing it as scroll. */
  overflow: hidden;
  /* Armed by the annotation toolbar's "영역 캡처" button -- see
     region-capture.js. Crosshair signals "click and drag to select a
     region" even before the first drag starts, same convention as image
     editors' own marquee-select tools. */
}
.ebook-stage.is-region-capturing {
  cursor: crosshair;
  /* While armed, every other clickable thing sitting on top of the stage --
     memo icons, the nav arrows, the minimap, the TOC tab stack -- each stops
     propagation on their own mousedown/click (so normal reading/page-turning
     doesn't misfire when using them), which without this also silently ate a
     region-select drag started anywhere on top of them: the drag never even
     reached region-capture.js's own stage-level pointerdown listener, so
     nothing happened at all -- read as "the cursor doesn't turn into the
     crosshair / dragging does nothing here", most noticeably over a memo
     icon since those sit directly on top of the actual page content someone
     would want to select through. pointer-events:none here makes the
     browser skip hit-testing these entirely while armed, so the drag (and
     the crosshair cursor itself, which these would otherwise override with
     their own cursor:pointer/grab) both fall through to the stage
     underneath exactly like empty space does. Restored the instant the mode
     turns back off (this class comes off too), so none of them lose their
     normal clickability outside of this one mode. */
  /* Same shadowing problem as the group above, but for the CURSOR rather
     than pointer-events: while zoomed in past fit size, .ebook-book.is-
     zoomed .page (below) sets its own cursor:grab/grabbing for drag-to-pan
     -- more specific than .ebook-stage.is-region-capturing's crosshair
     above, so hovering the actual page content while armed still showed the
     pan hand instead of the crosshair, even though EbookViewer#_wireDragToPan
     now also skips starting a pan while this mode is armed (see that
     file's own comment). Matched here at the same specificity/order so the
     crosshair correctly wins over the page too, not just the stage's own
     empty margin around it. */
  /* Same as the group above, but !important: AnnotationLayer#_renderHighlights
     sets each icon's pointer-events via inline style (el.style.pointerEvents),
     which otherwise wins over a plain class rule regardless of selector
     specificity -- a non-!important version of this rule here would get
     silently overridden by that inline 'auto' every time. */
}
.ebook-stage.is-region-capturing .ebook-nav-arrow,
.ebook-stage.is-region-capturing .ebook-minimap,
.ebook-stage.is-region-capturing .ebook-toc-tabs {
  pointer-events: none;
}
.ebook-stage.is-region-capturing .ebook-book.is-zoomed .page {
  cursor: crosshair;
}
.ebook-stage.is-region-capturing .ebook-anno-highlight {
  pointer-events: none !important;
}

/* The in-progress drag rectangle itself, appended straight to .ebook-stage
   (not a per-page layer -- a capture region can freely span across both
   halves of a spread). Same dashed-marquee look as
   .ebook-anno-selection-box below, kept as its own class since this one's
   positioned relative to the stage instead of a single page. */
.ebook-region-capture-box {
  position: absolute;
  border: 1.5px dashed #2b6cb0;
  background: rgba(43, 108, 176, 0.12);
  pointer-events: none;
}

/* Clips to exactly the visible content: the full two-page spread box, or
   (via JS) just its right half when only the front/back cover is showing.
   Clipping here -- instead of trying to reposition the book itself --
   hides the empty half's shadow/artwork regardless of how St.PageFlip
   happens to size or position its internals, and keeps the visible page
   dead-centered in the stage since flex centers this element itself. */
.ebook-viewport {
  overflow: hidden;
  /* .ebook-stage is a flex container; without this, a flex item's default
     flex-shrink:1 fights the width/height we set from JS whenever they
     exceed the stage's own box (i.e. zoomed in past fit) -- the browser
     silently shrinks the viewport back down to fit, which crops it from
     one side instead of the intended symmetric overflow, and desyncs it
     from the (correctly full-size) wrapper inside it. */
  flex-shrink: 0;
  /* Was 0.9s originally (matching St.PageFlip's default flippingTime,
     1000ms), sped up in steps since -- the 3D page-turn animation itself
     is unrelated and still runs at its own pace. ease-in-out is what
     makes this read as the page unfolding open / folding shut rather than
     a linear resize; Height is cropped the same way width is (see
     _updateAloneLayout's per-page containRect crop for the front/back
     cover), so it eases too. */
  transition: width 0.38s ease-in-out, height 0.38s ease-in-out;
  /* .ebook-viewport's own width transition (above) has the same "desyncs
     from a mount" problem as .ebook-book-wrapper's -- without this, zooming
     left the *clipping box* still gliding toward its new width over that
     same span while the content inside had already snapped to full size, so
     the already-resized page sat visibly cropped by a not-yet-caught-up
     viewport for a good chunk of a second (read as empty space where
     content should be). Same is-remounting class, same one-frame lifetime
     as above. */
}
.ebook-viewport.is-remounting {
  transition: none;
}

.ebook-book-wrapper {
  /* position:relative so `top` (below) can shift this element without
     using margin-top, which is reserved for panY (the Enlarge reading
     mode's scroll offset -- see panBy) and must stay untransitioned for
     that to feel instant/responsive, unlike the crop-driven shifts here. */
  position: relative;
  /* width/height/margin-left/top are set in JS (zoom + cover cropping)
     rather than via CSS transform: scale()/translate(), because
     St.PageFlip measures this element's actual box size to compute its own
     drag/flip coordinates -- a CSS transform changes the pixels on screen
     without changing that measured size, which desyncs the library's drag
     math from the visual size. */
  transition: margin-left 0.38s ease-in-out, top 0.38s ease-in-out;
  /* _mountPageFlip (any zoom change) tears down and rebuilds the whole book
     -- the actual page content only reappears on the library's next render
     tick regardless, so easing the wrapper's box on its own during that same
     instant just desyncs from the content: the box drifts open/shut over
     ~0.15-0.38s while the image inside has already snapped straight to its
     final size, reading as a stray "resize" after the fact. Applied for
     exactly one frame around a mount so it also preempts the margin-left
     transition above, then removed so the *next* margin change -- the
     alone-cover clip nudging in/out mid-flip, via _updateAloneLayout running
     outside of a mount -- still eases in step with that crop transition
     as intended. */
}
.ebook-book-wrapper.is-remounting {
  transition: none;
}

.ebook-book {
  box-shadow: 0 20px 50px rgba(20, 20, 30, 0.18);
  /* The "Enlarge" reading mode itself is entered/left only via the toolbar's
     zoom buttons (see EbookViewer#zoomIn/zoomOut) -- but once zoomed in, the
     page becomes draggable to adjust position (EbookViewer#_wireDragToPan):
     open-hand cursor while just zoomed, closed-hand while actively dragging. */
}
.ebook-book.is-zoomed .page {
  cursor: grab;
  touch-action: none;
}
.ebook-book.is-panning .page {
  cursor: grabbing;
}

/* St.PageFlip needs one uniform page-box size for the whole book, but this
   catalog mixes two native shapes: landscape interior spreads (sized to
   exactly fill the box) and portrait front/back covers (narrower than the
   box). object-fit:contain letterboxes the minority shape instead of
   stretch-distorting it to fill; the .page background shows through the
   letterbox margin, matching the page images' own white print margins. */
.page {
  background: #fff;
}

.ebook-page-canvas {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* Belt-and-suspenders alongside the img.draggable = false set where this
     is created (ebook-viewer.js) -- WebKit/Blink's own drag-suppression
     property, in case anything ever draws one of these via a path that
     skips that JS property (e.g. cloning). See that comment for what goes
     wrong (region-capture.js's marquee drag getting hijacked) without it. */
  -webkit-user-drag: none;
}

/* Root for per-page pen/highlight overlays. Positioned relative to the
   stage; individual .ebook-anno-layer elements are repositioned every
   frame (EbookViewer's layout watcher calls AnnotationLayer.sync()) to
   track whichever `.page` elements St.PageFlip currently has visible.
   pointer-events toggles between 'none' (page-flip drag/click passes
   through to the book) and 'auto' (a pen/eraser/highlight tool is active)
   on this root and inherits down to every layer. */
.ebook-anno-root {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.ebook-anno-layer {
  position: absolute;
  touch-action: none;
}

.ebook-anno-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

/* Marker (형광펜) strokes paint here, stacked below .ebook-anno-canvas --
   see AnnotationLayer#_createLayer. multiply blends the translucent
   marker color against the actual page image beneath it, so text stays
   readable through the highlight and overlapping strokes darken like a
   real highlighter, instead of sitting as a flat tinted block on top. */
.ebook-anno-marker-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  mix-blend-mode: multiply;
}

.ebook-anno-highlights {
  position: absolute;
  inset: 0;
}

/* Figma "Action-Ic/roll=01" 마커 -- 18px 검정(#181D25) 원 안에 흰색 12px
   memo 아이콘. 예전엔 사각형/테두리였다가 아이콘 하나로 단순화됐던 걸
   (아래 옛 설명 참고) 이번에 그 아이콘 자체를 Figma의 원형 배지로 바꿨다.
   See AnnotationLayer#_renderHighlights. */
.ebook-anno-highlight {
  position: absolute;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: #181d25;
  color: #fff;
  cursor: pointer;
  user-select: none;
  transition: transform 0.1s ease-out;
  /* While actively being dragged (see AnnotationLayer#_renderHighlights),
     the icon is reparented out of its page-specific layer into the shared
     .ebook-anno-root so it can cross the seam between two page-halves of a
     spread -- this just keeps it visibly on top of everything else (other
     pages' canvases/icons) while it's floating free between layers. */
}
.ebook-anno-highlight:hover {
  transform: translate(-50%, -50%) scale(1.15);
}
.ebook-anno-highlight.is-dragging {
  z-index: 20;
  opacity: 0.85;
}

.ebook-anno-highlight-icon {
  width: 12px;
  height: 12px;
}

/* Paint-program-style eraser cursor -- see AnnotationLayer's constructor
   and _updateEraserCursor. Fixed to the viewport (not a page layer) so it
   tracks the pointer smoothly even across the page-boundary handoff added
   for cross-page erasing. Sized to the actual erase radius in real screen
   pixels, so what's drawn here always matches what actually gets erased. */
.ebook-anno-eraser-cursor {
  position: fixed;
  z-index: 1000;
  border-radius: 50%;
  border: 1.5px solid rgba(20, 20, 30, 0.65);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.65);
  background: rgba(255, 255, 255, 0.12);
  pointer-events: none;
}

/* Pen/marker/highlight tools' cursor -- that tool's own toolbar icon
   follows the pointer (see AnnotationLayer's constructor,
   TOOL_CURSOR_ICONS, and _updateToolCursor) so it's obvious which tool is
   armed and exactly where it'll act. .icon(currentColor mask) 방식이라
   className에 어떤 icon-이름이 붙든 이 규칙(위치/크기)은 공용으로 하나만
   쓴다 -- 실제 아이콘 모양은 .icon-이름 쪽 mask-image가 정한다. color를
   명시해서 body 상속에 기대지 않고 항상 이 진한 색으로 나오게 했다.
   Same fixed-to-viewport reasoning as .ebook-anno-eraser-cursor above. */
.ebook-anno-tool-cursor {
  position: fixed;
  z-index: 1000;
  transform: translate(-50%, -50%);
  width: 22px;
  height: 22px;
  color: #181d25;
  pointer-events: none;
  /* Pen/highlighter icons are drawn diagonally, tip near the icon's own
     bottom-left -- centered like the memo icon (the default above) put the
     ACTUAL drawn point at the icon's visual middle instead of its point,
     reading as "drawing from the middle of the pencil, not the lead."
     Shifts the anchor toward that tip instead of the icon's center, so the
     pointer position lines up with where the pencil/pen visually touches.
     See AnnotationLayer#_updateToolCursor for the data-tool attribute this
     keys off. */
}
.ebook-anno-tool-cursor[data-tool=pen], .ebook-anno-tool-cursor[data-tool=marker] {
  transform: translate(-15%, -85%);
}

/* 메모함(전체 하이라이트+메모 목록) -- 예전엔 화면 우측에서 슬라이드되는
   풀-height 사이드 드로어였는데, Figma "Memo"(41:2028) 디자인은 하단
   도구 모음 위에 뜨는 독립된 플로팅 카드다. capture-menu.js 등 다른
   플로팅 메뉴들과 달리 트리거 버튼에 앵커링하지 않고, 화면 좌측 40px /
   도구 모음 위 20px라는 고정된 위치에 뜬다(요청 사양). 85px = 도구 모음
   자체 높이(65px, .ebook-stage의 padding-bottom 계산과 같은 값) + 20px
   여백. 카드 높이는 내용에 맞춰 hug하되(고정 height 없음) max-height로
   화면 위쪽/도구 모음과 겹치지 않게만 캡을 씌우고, 넘치면
   .ebook-anno-drawer-list 안에서만 스크롤된다. */
.ebook-anno-drawer {
  position: fixed;
  left: 40px;
  bottom: 85px;
  z-index: 150;
  width: 380px;
  max-width: calc(100vw - 80px);
  max-height: calc(100vh - 125px);
  display: none;
  flex-direction: column;
  background: #ffffff;
  border-radius: 16px;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08);
  overflow: hidden;
}
.ebook-anno-drawer.is-open {
  display: flex;
}

.ebook-anno-drawer-header {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  height: 48px;
  padding: 12px 16px;
  box-sizing: border-box;
  background: #181d25;
  color: #fff;
  font-size: 18px;
  font-weight: 500;
  letter-spacing: -0.03em;
  /* search-results-window.js의 헤더와 같은 이유(그 파일의 _wireDrag) --
     annotation-drawer.js 자신은 드래그 손잡이가 없어서 viewer.html이
     이 헤더를 그대로 손잡이로 써서 드래그를 붙인다(요청 사양: 모든
     스킨의 플로팅 팝업 드래그). */
  cursor: grab;
}
.ebook-anno-drawer-header:active {
  cursor: grabbing;
}

.ebook-anno-drawer-close {
  flex: none;
  display: flex;
  background: none;
  border: none;
  padding: 0;
  color: inherit;
  cursor: pointer;
  opacity: 0.85;
}
.ebook-anno-drawer-close .icon {
  width: 20px;
  height: 20px;
}
.ebook-anno-drawer-close:hover {
  opacity: 1;
}

.ebook-anno-drawer-list {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  /* 아래쪽 여백은 다른 세 방향(12px)보다 훨씬 큰 68px -- 카드 맨 아래에
     겹쳐 뜨는 .ebook-anno-drawer-footer(약 60px 높이)에 마지막 항목이
     가려지지 않도록 스크롤 여유를 미리 확보해둔 것. */
  padding: 12px 16px 68px;
}

/* Figma "Cell" -- 페이지 번호 그룹 헤더(Body/L-Semi). 페이지로 이동하는
   버튼이라 hover는 배경 없이 밑줄로만 표시한다. */
.ebook-anno-drawer-page-header {
  display: block;
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  padding: 8px 0;
  cursor: pointer;
  font-size: 18px;
  font-weight: 600;
  letter-spacing: -0.03em;
  color: #181d25;
}
.ebook-anno-drawer-page-header:hover::after {
  content: "";
  display: inline-block;
  width: 4px;
  height: 4px;
  margin-left: 6px;
  vertical-align: middle;
  border-radius: 50%;
  background: #181d25;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

.ebook-anno-drawer-item {
  padding-bottom: 8px;
}

/* Figma "Memo-Cell" -- 기본 상태는 배경 없음, hover에서만 옅은 회색
   (#F0F2F4)이 채워진다(컴포넌트의 State=Default/State=Hover 차이 그대로). */
.ebook-anno-drawer-item-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px;
  border-radius: 4px;
  cursor: pointer;
  color: #3c485d;
}
.ebook-anno-drawer-item-row:hover {
  background: #f0f2f4;
}

.ebook-anno-drawer-swatch {
  flex: none;
  width: 12px;
  height: 12px;
  border-radius: 3px;
}

.ebook-anno-drawer-preview {
  flex: 1;
  min-width: 0;
  font-size: 14px;
  line-height: 1.4;
  letter-spacing: -0.02em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Deletes just this one row's highlight+memo -- see annotation-drawer.js's
   own comment on why this replaced the old expand-in-place editor. Figma의
   Ic-Trashcan을 그대로 쓰므로(admin/뷰어 공용 .icon-trash) 새 아이콘을
   따로 만들지 않고 재사용했다. */
.ebook-anno-drawer-delete {
  flex: none;
  display: flex;
  background: transparent;
  border: none;
  padding: 0;
  color: #3c485d;
  cursor: pointer;
  opacity: 0.55;
}
.ebook-anno-drawer-delete:hover {
  opacity: 1;
}

.ebook-anno-drawer-empty {
  padding: 24px 12px;
  text-align: center;
  color: #8a8a92;
  font-size: 13px;
}

/* Figma "Handle"(#41:2049) -- 스크롤되는 리스트 맨 아래에 겹쳐 뜨는
   반투명 바. .ebook-anno-drawer 자체가 fixed라 이 absolute의 위치 기준이
   되므로, 리스트를 아무리 스크롤해도 이 바는 항상 카드 맨 아래에 고정.
   backdrop-filter로 그 밑을 지나가는 내용이 살짝 비쳐 보이게 흐려진다.
   카드 자체가 overflow:hidden + border-radius:16px라 이 바의 아래쪽
   모서리도 별도 처리 없이 같이 둥글게 잘린다. */
.ebook-anno-drawer-footer {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  justify-content: flex-end;
  padding: 8px 16px;
  background: rgba(255, 255, 255, 0.5);
  backdrop-filter: blur(2.5px);
  -webkit-backdrop-filter: blur(2.5px);
  box-shadow: 0 -4px 4px rgba(24, 29, 37, 0.08);
}

/* Whole-document delete -- see annotation-drawer.js's own comment on why
   it's a separate control from the toolbar's page-scoped 삭제. */
.ebook-anno-drawer-clear-all {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 44px;
  padding: 0 16px;
  background: #181d25;
  border: none;
  border-radius: 8px;
  color: #fff;
  font-size: 16px;
  font-weight: 500;
  letter-spacing: -0.025em;
  cursor: pointer;
}
.ebook-anno-drawer-clear-all:hover {
  background: #3c485d;
}

/* Small floating memo editor -- see memo-popup.js. Opened by clicking a
   highlight's on-page icon (.ebook-anno-highlight) or right after
   creating one; unlike .ebook-anno-drawer (the full document-wide list),
   this is a single focused card that opens right next to whatever icon
   was clicked. memo-popup.js 자신은 이동 손잡이가 없어서(그 파일 자신의
   주석: 하이라이트 아이콘을 드래그해야 팝업이 따라 움직임) 요청
   사양대로 직접 드래그할 수 있게 하려고 viewer.html이 .ebook-memo-
   popup-handle을 카드 맨 위에 덧붙인다(_setPosition()이 이미 책 영역
   안으로 클램프해주므로 그 로직은 그대로 재사용). Hidden by default;
   .is-open (toggled in show()/hide()) switches it to a flex column so
   handle/textarea/actions stack top-to-bottom. */
.ebook-memo-popup {
  position: fixed;
  z-index: 200;
  display: none;
  flex-direction: column;
  width: min(328px, 92vw);
  background: #ffffff;
  border: 1px solid #c5cbd3;
  border-radius: 8px;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08);
  overflow: hidden;
  /*저장/삭제 버튼(.ebook-memo-popup-actions)은 평소엔 접혀 있다가 카드에
     hover하면 펼쳐진다 -- 텍스트 영역이 카드 대부분을 차지하니 사실상
     "텍스트 영역에 hover하면"과 거의 같다. 카드 전체의 :hover를 쓰는 건
     의도적: 일단 펼쳐지고 나면 버튼들도 카드 레이아웃의 일부가 되니
     포인터가 텍스트 영역을 벗어나 버튼 쪽으로 이동해도(저장/삭제를
     누르려면 당연히 그래야 한다) "벗어났다"고 판정돼 도로 접히는 일이
     없다 -- 더 좁은 hover 타깃이었다면 버튼에 닿기도 전에 깜빡이며
     닫혔을 것. */
}
.ebook-memo-popup.is-open {
  display: flex;
}
.ebook-memo-popup:hover .ebook-memo-popup-actions {
  padding: 0 8px 8px;
  max-height: 40px;
  opacity: 1;
}

/* 드래그 손잡이 -- search-results-window.js의 헤더 전체(_wireDrag)와
   같은 역할이지만, 이 카드엔 원래 헤더가 없어서(제목도 없음) 잡을 곳만
   있는 얇은 바 하나로 최소화했다. 가운데 작은 알약(::after)이 "여기를
   잡고 끌 수 있다"는 흔한 드래그 핸들 관용구. 항상 보이는 채로 둔다 --
   .ebook-memo-popup-actions처럼 hover에 숨겨두면 카드를 옮기려고
   마우스를 올리는 그 순간 손잡이 자체가 안 보이는 모순이 생긴다. */
.ebook-memo-popup-handle {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 16px;
  background: #f0f2f4;
  cursor: grab;
  touch-action: none;
}
.ebook-memo-popup-handle:active {
  cursor: grabbing;
}
.ebook-memo-popup-handle::after {
  content: "";
  width: 32px;
  height: 4px;
  border-radius: 2px;
  background: #c5cbd3;
}

/* Figma "Input-Field"(105:1384) -- 카드 자체가 곧 입력창이라 별도
   테두리/여백 없이 카드의 padding(12px 16px)까지 그대로 텍스트 영역에
   준다(예전엔 카드 안에 테두리 있는 작은 상자를 한 번 더 넣어 이중
   테두리처럼 보였다). 접혔다 펼쳐지는 header/actions와 달리 이건 항상
   보이는 카드의 본체라 overflow:hidden인 부모가 알아서 모서리를
   둥글게 잘라준다. */
.ebook-memo-popup-textarea {
  min-height: 96px;
  margin: 0;
  padding: 12px 16px;
  border: none;
  font: inherit;
  font-size: 14px;
  line-height: 1.4;
  letter-spacing: -0.02em;
  color: #181d25;
  resize: vertical;
  outline: none;
}
.ebook-memo-popup-textarea::placeholder {
  color: #aaaaaa;
}

/* .ebook-memo-popup의 &:hover에서 펼쳐진다 -- padding까지 같이
   transition하는 건(max-height/opacity뿐 아니라) 이 요소 자체에 직접
   준 값이라서다(버튼 자식들만이 아니라). 좌우는 고정해서 열고 닫힐 때
   버튼이 옆으로 밀리지 않게 하고, 이 행 자체의 세로 공간을 더하는
   아래쪽 padding만 max-height와 함께 접힌다. */
.ebook-memo-popup-actions {
  display: flex;
  justify-content: flex-end;
  gap: 6px;
  padding: 0 8px 0;
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: max-height 0.15s ease, opacity 0.15s ease, padding 0.15s ease;
}
.ebook-memo-popup-actions button {
  border: 1px solid rgba(20, 20, 30, 0.15);
  border-radius: 4px;
  background: #ffffff;
  padding: 4px 10px;
  font-size: 12px;
  cursor: pointer;
}
.ebook-memo-popup-actions button:hover {
  background: rgba(20, 20, 30, 0.06);
}

/* 목차 드롭다운, .ebook-anno-toolbar의 "목차" 버튼에 앵커링(see
   toc-panel.js). stage가 아니라 document.body에 붙고, 열 때마다 버튼의
   실제 rect로 공간이 남는 쪽(위/아래)을 계산한 fixed 포지션(see
   dom-utils.js#anchorFloating) -- 툴바가 화면 상단에 있는 스킨
   (viewer-skin-top.scss)에서도 버튼 아래로 알아서 열린다.
   .ebook-action-menu(capture-menu.js의 📷 메뉴 "전체 캡처"/"부분 캡처";
   print-menu.js의 🖨️ 메뉴 "전체 인쇄"/"부분 인쇄")도 정확히 같은
   앵커드-드롭다운 패턴이라 이 클래스를 같이 쓴다 -- 너비만 다르다(모드
   라벨이 목차 항목보다 훨씬 짧고, 목차 패널의 max-height/스크롤도
   필요 없다). */
/* .ebook-action-menu(capture-menu.js의 📷 메뉴 "전체 캡처"/"부분 캡처";
   print-menu.js의 🖨️ 메뉴 "전체 인쇄"/"부분 인쇄")는 그대로 버튼에
   앵커링되는 작은 드롭다운. 목차 드롭다운도 원래 이 클래스를 같이
   썼지만, 아래처럼 화면 중앙 플로팅 팝업(북마크)으로 완전히 다시
   그려서 더 이상 공유하지 않는다. */
.ebook-action-menu {
  position: fixed;
  z-index: 20;
  flex-direction: column;
  background: #ffffff;
  border: 1px solid rgba(20, 20, 30, 0.12);
  border-radius: 8px;
  box-shadow: 0 12px 28px rgba(20, 20, 30, 0.18);
  padding: 6px;
  width: 87px;
}

.ebook-action-menu-item {
  display: block;
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  border-radius: 4px;
  padding: 8px 10px;
  cursor: pointer;
  color: #26262b;
  font: inherit;
  font-size: 13px;
}
.ebook-action-menu-item:hover {
  background: #F0F2F4;
}

/* 북마크 팝업(Figma "Bookmark" 298:4436) -- 목차 버튼(아이콘만 책갈피
   모양, 실제 title/데이터는 항상 "목차")을 누르면 작은 앵커드 드롭다운
   대신 화면 중앙에 500px 폭 카드로 뜬다(요청 사양: "북마크가 사이드바로
   열리는 경우를 제외하고는 플로팅 팝업으로" -- 사이드바로 여는
   SIDE/FLOATING만 예외, 그쪽 스타일시트 참고). toc-panel.js의 open()은
   원래 dom-utils.js#anchorFloating으로 버튼 옆 좌표를 계산하지만, 화면
   중앙 고정 위치라 필요 없어져서 viewer.html이 open()/close()를 다시
   정의해 그 호출 자체를 뺐다(같은 이유로 .is-open 클래스만 토글하도록
   바뀐다 -- 원래는 인라인 style.display를 직접 건드림). !important는
   혹시 모를 인라인 좌표 잔재에 대비한 방어용.

   항목/헤더/페이지네이션은 viewer.html의 공용 스크립트가
   tocPanel.refresh()를 완전히 새로 정의해서 그린다 -- 원래 목차 항목
   (라벨 한 줄)에 실제 페이지 썸네일(viewer.pageCanvases)과 본문 문단
   (toc-detect.js가 넘겨주는 entry.text)을 붙이고, 4개씩 끊어 페이지
   전환하는 실제 페이지네이션까지 새로 구현했다(Figma가 스크롤 목록이
   아니라 진짜 페이지 번호 버튼 그룹을 보여줌).

   주의: 이 파일(viewer.scss)은 BOTTOM 스킨의 "원본" 소스지만, BOTTOM은
   실제로는 이 파일이 컴파일된 viewer.css가 아니라 번들 자체의
   /dist/viewer.css를 서빙한다(ViewerController#cssPathFor 참고) --
   그래서 viewer.html도 이 팝업 스크립트를 BOTTOM에는 켜지 않는다(TOP/
   ICON만). 이 CSS는 나중에 빌드 파이프라인이 통합돼 BOTTOM도 로컬
   컴파일 CSS를 쓰게 될 때를 대비해 다른 스킨과 나란히 맞춰둔 것뿐이다. */
.ebook-toc-panel {
  position: fixed !important;
  /* left/top은 !important를 안 준다 -- 드래그(viewer.html의
     wireFloatingDrag)가 이 두 값을 인라인 스타일로 직접 계산해서
     옮기는데, !important였다면 인라인 스타일이 아무리 바뀌어도 계속
     50%로 튕겨 돌아가 버렸을 것(실제로 겪은 버그: transform만 지워지고
     좌표는 화면 정중앙 좌표(뷰포트 절반)로 튐). */
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 500px;
  max-width: calc(100vw - 80px);
  max-height: calc(100vh - 80px);
  z-index: 20;
  display: none;
  flex-direction: column;
  background: #ffffff;
  border-radius: 16px;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08);
  overflow: hidden;
}
.ebook-toc-panel.is-open {
  display: flex;
}

.ebook-toc-panel-header {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 48px;
  padding: 12px 16px;
  background: #181d25;
  color: #fff;
  font-size: 18px;
  font-weight: 500;
  letter-spacing: -0.03em;
  box-sizing: border-box;
}

.ebook-toc-panel-close {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  padding: 0;
  background: none;
  border: none;
  color: inherit;
  cursor: pointer;
  opacity: 0.85;
}
.ebook-toc-panel-close .icon {
  width: 20px;
  height: 20px;
}
.ebook-toc-panel-close:hover {
  opacity: 1;
}

.ebook-toc-panel-body {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  padding: 24px 16px;
  overflow-y: auto;
  box-sizing: border-box;
}

.ebook-bookmark-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: 100%;
}

/* Figma "Cell" -- 이 팝업만 항목마다 테두리가 있다(사이드바 버전의
   북마크 목록은 테두리 없이 hover로만 구분). */
.ebook-bookmark-item {
  display: flex;
  flex: none;
  align-items: center;
  gap: 12px;
  width: 100%;
  height: 72px;
  padding: 12px 16px;
  background: none;
  border: 1px solid #c5cbd3;
  border-radius: 8px;
  text-align: left;
  font: inherit;
  cursor: pointer;
  box-sizing: border-box;
}
.ebook-bookmark-item:hover {
  background: #f0f2f4;
}

.ebook-bookmark-item-thumb {
  flex: none;
  display: flex;
  width: 36px;
  height: 48px;
  border: 0.5px solid #c5cbd3;
  border-radius: 2px;
  overflow: hidden;
}
.ebook-bookmark-item-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.ebook-bookmark-item-text {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1;
  min-width: 0;
}

.ebook-bookmark-item-page {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: -0.015em;
  line-height: 1.2em;
  color: #3c485d;
}

.ebook-bookmark-item-desc {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 12px;
  font-weight: 400;
  letter-spacing: -0.015em;
  line-height: 1.2em;
  color: #3c485d;
}

/* Figma "Pagenation" -- 처음/이전 | 페이지 번호(최대 5개) | 다음/끝
   세 묶음을 12px 간격으로, 각 묶음 안에서는 4px 간격으로 배치한다.
   1페이지뿐이면 viewer.html이 통째로 숨긴다. */
.ebook-bookmark-pagination {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
}

.ebook-bookmark-pagination-group {
  display: flex;
  align-items: center;
  gap: 4px;
}

.ebook-bookmark-nav-btn {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  background: none;
  border: none;
  border-radius: 4px;
  color: #181d25;
  cursor: pointer;
}
.ebook-bookmark-nav-btn .icon {
  width: 24px;
  height: 24px;
}
.ebook-bookmark-nav-btn:hover {
  background: #f0f2f4;
}
.ebook-bookmark-nav-btn:disabled {
  color: #c5cbd3;
  cursor: default;
}
.ebook-bookmark-nav-btn:disabled:hover {
  background: none;
}

.ebook-bookmark-page-btn {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  background: #f0f2f4;
  border: none;
  border-radius: 4px;
  color: #c5cbd3;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: -0.02em;
  cursor: pointer;
}
.ebook-bookmark-page-btn.is-active {
  background: #181d25;
  color: #ffffff;
  cursor: default;
}

/* 메모 버튼(highlightBtn) 서브메뉴 -- 메모하기/메모함 열기 (memo-menu.js).
   Figma "Select-Text-Element"(41:1662) 기준 -- .ebook-action-menu와
   비슷한 앵커드 드롭다운이지만 이 메뉴만의 별도 디자인(흰 배경 +
   #C5CBD3 테두리, 더 옅은 그림자, 4px 안쪽 여백)이 따로 지정돼 있어서
   그 클래스를 재사용하지 않고 새로 만들었다. width는 고정하지 않고
   내용물(가장 긴 라벨 "메모함 열기")에 맞춰 hug된다. */
.ebook-memo-menu {
  position: fixed;
  z-index: 20;
  flex-direction: column;
  gap: 4px;
  background: #ffffff;
  border: 1px solid #c5cbd3;
  border-radius: 6px;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08);
  padding: 4px;
}

.ebook-memo-menu-item {
  display: flex;
  align-items: center;
  height: 32px;
  padding: 6px 8px;
  border-radius: 4px;
  background: transparent;
  color: #181d25;
  font-size: 14px;
  letter-spacing: -0.02em;
  text-align: left;
  white-space: nowrap;
  cursor: pointer;
}
.ebook-memo-menu-item:hover {
  background: #f0f2f4;
}

/* 펜/하이라이트 색상 스와치(.ebook-anno-color) 서브메뉴 -- 네이티브
   <input type="color">(OS 자체 피커) 대신 만든 커스텀 컬러 피커
   (color-picker.js). Figma "Frame 4"(81:1049)의 채도/명도 정사각형(흰색
   -> 선택된 색조 -> 검정 그라디언트) + 흰 원형 핸들 디자인을 그대로
   적용했다. Figma 쪽엔 hue(색조 자체)를 바꾸는 컨트롤이 없어서 -- 그
   사각형 하나만으로는 한 가지 색조의 채도/명도만 조절 가능하고 색조
   자체는 못 바꾼다 -- 같은 톤의 hue 슬라이더를 새로 만들어 짝을
   지었다(요청 사양). .ebook-memo-menu와 같은 톤(흰 배경, #C5CBD3
   테두리)이되, 메뉴가 아니라 색상 선택 UI라 자기만의 그림자/여백을
   따로 준다. */
.ebook-color-picker {
  position: fixed;
  z-index: 20;
  flex-direction: column;
  gap: 12px;
  width: 218px;
  padding: 16px;
  background: #ffffff;
  border: 1px solid #c5cbd3;
  border-radius: 12px;
  box-shadow: 0 12px 28px rgba(20, 20, 30, 0.18);
}

/* 채도(가로)/명도(세로, 위가 밝음)를 고르는 정사각형 -- 두 겹의
   linear-gradient를 겹쳐 표준 HSV 피커 사각형을 만든다: 위 레이어는
   아래쪽 불투명 검정 -> 위쪽 투명(세로), 아래 레이어는 흰색 ->
   --hue(가로). 겹치면 좌상단 흰색/우상단 순수 색조/아래로 갈수록
   검정에 가까워지는 모양이 된다. --hue는 아래 hue 슬라이더가 드래그마다
   갱신(color-picker.js#_render). */
.ebook-color-picker-sv {
  position: relative;
  width: 218px;
  height: 218px;
  border-radius: 6px;
  background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%), linear-gradient(to right, #fff 0%, hsl(var(--hue, 0), 100%, 50%) 100%);
  cursor: crosshair;
  touch-action: none;
}

/* Figma "Ellipse 44 (Stroke)" -- 흰 배경 + Drop Shadow. 어떤 색 위에
   있어도 핸들 자체는 항상 또렷이 보이도록, 그림자 말고 옅은 테두리도
   하나 더 얹었다(순백색 배경 근처에서 그림자만으로는 경계가 거의 안
   보여서). */
.ebook-color-picker-sv-handle {
  position: absolute;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08), 0 0 0 1px rgba(20, 20, 30, 0.15);
  transform: translate(-50%, -50%);
  pointer-events: none;
}

/* hue/alpha 슬라이더를 스포이드 버튼과 나란히 묶는 줄 -- 버튼이
   align-items:stretch(기본값)로 이 줄의 높이(= 슬라이더 두 개 + 그
   사이 gap)만큼 자동으로 늘어나서, 버튼 자체에 높이를 따로 지정할
   필요가 없다. */
.ebook-color-picker-slider-row {
  display: flex;
  gap: 8px;
}

.ebook-color-picker-sliders {
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1;
  min-width: 0;
}

/* Figma 디자인엔 없는, 이번 작업에서 새로 추가한 hue 슬라이더 -- 펜
   두께 슬라이더(.ebook-anno-width)와 같은 8px 높이 알약 트랙 톤으로
   맞췄다. 너비는 고정값이 아니라 100%(왼쪽에 스포이드 버튼이 붙으면서
   .ebook-color-picker-sliders가 실제로 차지하는 너비를 그대로 따라간다).
   무지개 자체가 이미 선명한 그라디언트라 --fill 같은 채워진-구간
   표시는 필요 없다. */
.ebook-color-picker-hue {
  position: relative;
  width: 100%;
  height: 8px;
  border-radius: 4px;
  background: linear-gradient(to right, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  cursor: pointer;
  touch-action: none;
}

.ebook-color-picker-hue-handle {
  position: absolute;
  top: 50%;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08), 0 0 0 1px rgba(20, 20, 30, 0.15);
  transform: translate(-50%, -50%);
  pointer-events: none;
}

/* 불투명도 슬라이더 -- 마찬가지로 Figma 디자인엔 없는, 이번 작업에서
   새로 추가한 것. 체크무늬(conic-gradient, 8px 타일 -- 투명을 나타내는
   흔한 방식) 위에 현재 색의 완전투명 -> 불투명 가로 그라디언트를
   겹친다. --rgb는 사각형/hue가 바뀔 때마다 같이 갱신(color-picker.js#
   _render) -- 그래야 이 바가 항상 "지금 고른 색"의 투명도를 보여주지,
   엉뚱한 색의 투명도를 보여주지 않는다. */
.ebook-color-picker-alpha {
  position: relative;
  width: 100%;
  height: 8px;
  border-radius: 4px;
  background: linear-gradient(to right, transparent, rgba(var(--rgb, 24, 29, 37), 1)), conic-gradient(#ccc 90deg, transparent 90deg 180deg, #ccc 180deg 270deg, transparent 270deg) 0/8px 8px;
  cursor: pointer;
  touch-action: none;
}

.ebook-color-picker-alpha-handle {
  position: absolute;
  top: 50%;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08), 0 0 0 1px rgba(20, 20, 30, 0.15);
  transform: translate(-50%, -50%);
  pointer-events: none;
}

.ebook-color-picker-fields {
  display: flex;
  align-items: center;
  gap: 6px;
}
.ebook-color-picker-fields input {
  background: #F0F2F4;
  border: none;
  border-radius: 4px;
  color: #6F7C90;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.16;
  /* R/G/B, 불투명도 입력칸이 type="number"라 브라우저가 기본으로
     위아래 화살표(스피너)를 그려주는데, 이 좁은 칸에서는 화살표가
     숫자와 겹치거나 입력칸을 필요 이상으로 넓혀 보이게 만든다 --
     숫자는 옆 슬라이더를 드래그하거나 직접 타이핑해서 바꾸지 화살표
     클릭으로 1씩 조절할 일이 없어서 그냥 지운다. */
}
.ebook-color-picker-fields input[type=number] {
  -moz-appearance: textfield;
  appearance: textfield;
}
.ebook-color-picker-fields input[type=number]::-webkit-outer-spin-button, .ebook-color-picker-fields input[type=number]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

.ebook-color-picker-format {
  flex: none;
  height: 28px;
  padding: 0 4px;
  border: 1px solid #c5cbd3;
  border-radius: 4px;
  background: #fff;
  color: #181d25;
  font-size: 12px;
}

.ebook-color-picker-hex-field {
  flex: 1;
  min-width: 0;
}

.ebook-color-picker-hex-input {
  height: 28px;
  padding: 0 6px;
  text-align: center;
  text-transform: uppercase;
  min-width: 0;
  width: 100%;
  box-sizing: border-box;
}

.ebook-color-picker-rgb-field {
  display: flex;
  flex: 1;
  min-width: 0;
  gap: 4px;
}
.ebook-color-picker-rgb-field[hidden] {
  display: none;
}

.ebook-color-picker-rgb-input {
  flex: 1;
  width: 0;
  height: 28px;
  padding: 0 4px;
  border: 1px solid #c5cbd3;
  border-radius: 4px;
  background: #fff;
  color: #181d25;
  font-size: 12px;
  text-align: center;
}

.ebook-color-picker-alpha-field {
  flex: none;
  display: flex;
  align-items: center;
  gap: 2px;
  color: #6f7c90;
  font-size: 12px;
}

.ebook-color-picker-alpha-input {
  width: 24px;
  height: 28px;
  padding: 0 4px;
  border: 1px solid #c5cbd3;
  border-radius: 4px;
  background: #fff;
  color: #181d25;
  font-size: 12px;
  text-align: center;
}

.ebook-color-picker-eyedropper {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 4px;
  width: 24px;
  padding: 0;
  background: none;
  color: #181d25;
  cursor: pointer;
  /* 버튼 자체가 24px 높이(hue+gap+alpha)로 꽤 좁아져서, .icon 기본
     크기(18px)로는 위아래 여백이 거의 안 남는다 -- 이 버튼 안에서만
     더 작게 줄인다. */
}
.ebook-color-picker-eyedropper:hover {
  background: #f0f2f4;
}
.ebook-color-picker-eyedropper .icon {
  width: 14px;
  height: 14px;
}

/* Ephemeral search-match highlight -- see search-highlighter.js. Kept
   separate from .ebook-anno-highlight (user-created, persisted, clickable
   for a memo) since this one is transient and purely visual. */
.ebook-search-root {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.ebook-search-layer {
  position: absolute;
}

.ebook-search-highlight {
  position: absolute;
  /* Deep orange, normal blend (not multiply -- that only darkens what's
     underneath, so it barely tinted small/dense text at all). Alpha kept
     lower than a typical opaque overlay so the text underneath stays
     legible through the color instead of getting buried under it. */
  background: rgba(255, 87, 34, 0.4);
  border-radius: 2px;
}

/* 검색 결과 플로팅 창 -- Figma "Search"(54:279) 디자인 그대로, 메모함
   (.ebook-anno-drawer)과 같은 톤(검정 헤더 + 흰 리스트, 카드 전체
   16px 라운드, 옅은 Drop Shadow)으로 다시 칠했다. 예전엔 어두운 회색
   타이틀바 + 진한 그림자로 "진짜 OS 창"처럼 보이게 했는데, 메모함/검색
   둘 다 같은 Figma 컴포넌트 세트(Memo-Cell 등)를 공유하는 걸 보면 이
   앱에서는 이 톤이 표준 플로팅 패널 스타일이라 그쪽으로 맞췄다.
   search-results-window.js를 통해 document.body에 붙고, 열린 채로
   본문 위를 떠다니며 드래그로 옮길 수 있는 것 등 동작 자체는 그대로. */
.ebook-search-window {
  position: fixed;
  z-index: 150;
  display: none;
  flex-direction: column;
  width: min(380px, 92vw);
  max-height: min(70vh, 560px);
  background: #ffffff;
  border-radius: 16px;
  box-shadow: 0 4px 4px rgba(24, 29, 37, 0.08);
  overflow: hidden;
}
.ebook-search-window.is-open {
  display: flex;
}

.ebook-search-window-header {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  height: 48px;
  padding: 12px 16px;
  background: #181d25;
  color: #fff;
  font-size: 18px;
  font-weight: 500;
  letter-spacing: -0.03em;
  cursor: grab;
  box-sizing: border-box;
}
.ebook-search-window-header:active {
  cursor: grabbing;
}

.ebook-search-window-close {
  flex: none;
  display: flex;
  background: none;
  border: none;
  padding: 0;
  color: inherit;
  cursor: pointer;
  opacity: 0.85;
}
.ebook-search-window-close .icon {
  width: 20px;
  height: 20px;
}
.ebook-search-window-close:hover {
  opacity: 1;
}

/* Figma의 텍스트는 두 톤이 섞인 한 문장이다: 따옴표까지 포함한 검색어
   자체는 진하게(SemiBold, #181D25), 그 뒤 "~에 대한 검색결과 N개"는
   옅은 회색(Regular, #6F7C90)으로. 그래서 기본값을 회색/보통 굵기로
   깔아두고, .ebook-search-window-summary-query(검색어만 감싸는 span)
   에서만 진하게 뒤집는다. */
.ebook-search-window-summary {
  flex: none;
  padding: 12px 16px 0;
  font-size: 18px;
  font-weight: 400;
  letter-spacing: -0.03em;
  line-height: 1.46em;
  color: #6f7c90;
}

.ebook-search-window-summary-query {
  font-weight: 600;
  color: #181d25;
}

.ebook-search-window-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 12px 16px;
  /* box-sizing이 기본값(content-box)이면 padding이 max-height 위에
     더해져서 실제 박스가 그만큼 더 커진다 -- border-box로 바꿔서
     아래 346px 계산(패딩 포함)이 실제 렌더링 높이와 정확히 맞도록
     한다. */
  box-sizing: border-box;
  /* 항목(44px) + 사이 gap(8px) 기준으로 6.5개까지만 한 번에 보이고
     그 아래는 스크롤되도록 캡을 씌운다(요청 사양) -- 살짝 잘린 7번째
     행이 "스크롤하면 더 있다"는 힌트도 겸한다(Figma의 Scroller
     인디케이터와 같은 목적). 12(위쪽 padding) + 6*44 + 6*8 + 22(44의
     절반) = 346px. flex:1이 이보다 넉넉한 공간에서도 여기서 더 안
     늘어나게 막고, 화면이 이보다 좁으면 min-height:0 덕분에 그만큼
     더 줄어든다. */
  max-height: 346px;
}

/* Figma "Memo-Cell" -- 메모함 목록의 항목과 같은 컴포넌트. 기본 상태는
   배경 없음, hover에서만 옅은 회색(#F0F2F4)이 채워진다. */
.ebook-search-window-item {
  display: flex;
  /* flex: none가 없으면 .ebook-search-window-list(같은 flex-direction:
     column 컨테이너)가 max-height로 눌려 있을 때, 넘치는 항목들을
     스크롤로 내보내는 대신 flex-shrink 기본값(1) 때문에 항목 자체의
     높이가 44px보다 작게 짜부라든다 -- "6.5개까지만 보이고 스크롤"이
     아니라 "다 우겨넣고 다닥다닥 붙는" 것처럼 보이던 버그가 이거다. */
  flex: none;
  align-items: center;
  gap: 8px;
  width: 100%;
  height: 44px;
  padding: 8px 12px;
  border-radius: 4px;
  background: transparent;
  border: none;
  text-align: left;
  color: inherit;
  font: inherit;
  cursor: pointer;
}
.ebook-search-window-item:hover {
  background: #f0f2f4;
}

.ebook-search-window-item-page {
  flex: none;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: -0.02em;
  color: #181d25;
}

.ebook-search-window-item-snippet {
  flex: 1;
  min-width: 0;
  font-size: 14px;
  line-height: 1.4;
  letter-spacing: -0.02em;
  color: #3c485d;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ebook-search-window-item-snippet mark {
  background: rgba(255, 207, 74, 0.5);
  color: inherit;
  border-radius: 2px;
}

.ebook-search-window-empty {
  padding: 24px 12px;
  text-align: center;
  color: #8a8a92;
  font-size: 13px;
}

/* Side page-turn arrows overlaid on the stage (daelimbath-style) -- see
   nav-arrows.js. Positioned against .ebook-stage itself (position:relative
   above) rather than the viewport/book, so they stay put at the stage's
   edges regardless of the book's current size/zoom/pan. Deliberately just
   a bare glyph (no circle background) to match the reference catalogs'
   minimal arrow style now that the surrounding chrome is light. */
.ebook-nav-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 5;
  width: 100px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  color: rgba(20, 20, 30, 0.5);
  cursor: pointer;
}
.ebook-nav-arrow .icon {
  width: 64px;
  height: 64px;
}
.ebook-nav-arrow:hover {
  color: rgba(20, 20, 30, 0.85);
}

.ebook-nav-arrow-left {
  left: 16px;
}

.ebook-nav-arrow-right {
  right: 16px;
}

/* Persistent bookmark-tab style TOC stuck to the book's right edge -- see
   toc-tabs.js. Positioned against .ebook-stage itself (like the nav arrows
   and minimap), so it stays put regardless of the book's current
   page/zoom/pan, and is visible on every page, not just one. Deliberately
   kept as the one dark warm-brown accent in an otherwise light UI -- the
   reference catalogs do the same, a solid "ribbon tab" look against their
   all-white page. */
.ebook-toc-tabs {
  position: absolute;
  /* left/top are set from JS every frame -- see toc-tabs.js#sync -- to
     track the book's actual visible right edge through zoom/cover-crop. */
  z-index: 6;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
  /* Faded (not display:none/flex-toggled -- see toc-tabs.js#sync) on the
     front/back cover, where a bookmark tab doesn't make sense. Starts
     with .is-hidden already applied (see createTocTabs) so there's
     nothing to fade FROM on the very first paint. */
  transition: opacity 0.25s ease-in-out;
}
.ebook-toc-tabs.is-hidden {
  opacity: 0;
  pointer-events: none;
}

.ebook-toc-tab {
  background: #8c7e75;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-right: none;
  color: #f5f0ea;
  border-radius: 0 6px 6px 0;
  padding: 8px 14px 8px 10px;
  cursor: pointer;
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
  box-shadow: 0 4px 10px rgba(20, 20, 30, 0.15);
  transition: transform 0.15s ease, background 0.15s ease;
}
.ebook-toc-tab:hover {
  transform: translateX(-6px);
  background: #7a6d64;
}

/* Left-side minimap navigator for the "Enlarge" zoomed reading mode (see
   minimap.js) -- a page thumbnail with a draggable rectangle showing the
   current viewport position. Positioned against .ebook-stage itself so it
   stays put regardless of the book's own size/pan, matching the
   daelimbath reference. Only shown once zoomed in past the stage's fit
   size (minimap.js toggles display). */
.ebook-minimap {
  position: absolute;
  left: 11px;
  /* 상단 .ebook-toolbar가 없어져서 이제 위에 걸리는 게 없다 -- .ebook-stage의
     기본 padding-top(32px)과 나란한 여백. */
  top: 32px;
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  width: 140px;
  /* Slides the WHOLE minimap -- thumbnail AND the toggle tab together, as
     one rigid unit -- out to the left when collapsed (see .is-collapsed
     below), rather than just the thumbnail retracting out from under a
     tab that stayed put. .ebook-minimap-toggle sits past this element's
     own right edge (see its own right:-22px), so translating this by more
     than its own width (see .is-collapsed's calc() below -- the extra
     16px accounts for this element's own left:16px offset, so the
     thumbnail's trailing edge clears x=0 completely instead of leaving a
     16px-wide sliver still on screen) carries the tab left along with the
     thumbnail until it lands right where the thumbnail's un-collapsed
     LEFT edge used to be -- reading as "the whole thing tucked itself
     behind the tab", with only the tab left sticking out at the edge, not
     a tab that never moved in the first place. */
  transition: transform 0.25s ease-in-out;
}
.ebook-minimap.is-collapsed {
  transform: translateX(calc(-100% - 16px));
  /* Already fully off-screen once the parent's own translate lands it
     there, but belt-and-suspenders against catching a stray click/drag
     mid-transition. */
}
.ebook-minimap.is-collapsed .ebook-minimap-thumb {
  pointer-events: none;
}

.ebook-minimap-thumb {
  position: relative;
  display: flex;
  align-items: stretch;
  border: 1px solid rgba(20, 20, 30, 0.15);
  background: #fff;
  box-shadow: 0 8px 20px rgba(20, 20, 30, 0.2);
  /* Belt-and-suspenders alongside the [0,1] clamp in Minimap#sync: even if
     that math is ever off by a hair, the indicator rect gets cropped
     clean at the thumbnail's own edge instead of visibly bleeding past
     it. */
  overflow: hidden;
}

/* Bookmark-tab collapse handle -- see Minimap's constructor/_toggleCollapsed.
   Anchored to .ebook-minimap's own box (position:absolute there already
   makes it a positioning context), stuck to the thumbnail's right edge
   regardless of whether the thumbnail itself is currently slid away.
   Same warm-brown tab look as .ebook-toc-tab, for the same "bookmark
   sticking out of the edge" read. */
.ebook-minimap-toggle {
  position: absolute;
  top: 50%;
  right: -22px;
  transform: translateY(-50%);
  width: 22px;
  height: 40px;
  padding: 0;
  background: #8c7e75;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-left: none;
  border-radius: 0 6px 6px 0;
  color: #f5f0ea;
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  z-index: 6;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s ease;
}
.ebook-minimap-toggle:hover {
  background: #7a6d64;
}

/* Two of these sit side by side for a real two-page spread; thumbImgRight
   is display:none (see Minimap#sync) for an alone page (front/back
   cover), in which case thumbImgLeft alone stretches to the full width
   via flex:1 below, same as the single-image layout this replaced. */
.ebook-minimap-thumb-img {
  display: block;
  flex: 1 1 0%;
  min-width: 0;
}

.ebook-minimap-rect {
  position: absolute;
  /* left/top/width/height are all set from JS every frame -- see
     Minimap#sync -- to track the actually-visible portion of the page in
     both axes. */
  border: 2px solid #4d9fff;
  background: rgba(77, 159, 255, 0.18);
  box-sizing: border-box;
  /* Draggable to adjust pan position -- see Minimap#_wireDrag -- unlike
     most overlays in this codebase, this one *should* catch pointer
     events. */
  touch-action: none;
  cursor: grab;
}
.ebook-minimap-rect.is-dragging {
  cursor: grabbing;
}

@media (max-width: 640px) {
  .ebook-search-input {
    min-width: 100px;
  }
}
.ebook-anno-toolbar {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.ebook-anno-toolbar::-webkit-scrollbar {
  display: none;
}

@media (max-width: 1024px) {
  .ebook-anno-toolbar {
    padding-left: 12px;
    padding-right: 12px;
  }
}
/* 번들(/dist/viewer.css)엔 있었는데 이 파일엔 없었던 페이지 로딩
   스피너. BOTTOM이 이 저장소가 컴파일한 CSS를 쓰도록 바뀌면서
   (ViewerController#cssPathFor) 그대로 옮겨왔다 -- 없으면 로딩 중에
   꾸며지지 않은 채로 뜬다. */
.ebook-loading {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 20;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  padding: 22px 26px;
  border-radius: 10px;
  background: rgba(0, 0, 0, 0.55);
  pointer-events: none;
}
.ebook-loading[hidden] {
  display: none;
}

.ebook-loading-track {
  width: 240px;
  height: 6px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.25);
  overflow: hidden;
}

.ebook-loading-fill {
  width: 0;
  height: 100%;
  border-radius: 999px;
  background: #fff;
  transition: width 0.2s ease;
}

.ebook-loading.is-indeterminate .ebook-loading-fill {
  width: 40%;
  transition: none;
  animation: ebook-loading-sweep 1.1s ease-in-out infinite;
}

@keyframes ebook-loading-sweep {
  0% {
    margin-left: -40%;
  }
  to {
    margin-left: 100%;
  }
}
.ebook-loading-label {
  font-size: 13px;
  color: #fff;
  letter-spacing: 0.02em;
}

/* ── 원본 PDF 의 하이퍼링크 ──────────────────────────────────────────────
   루트는 이벤트를 받지 않고(pointer-events:none) 실제 링크만 받는다. 루트가
   받으면 페이지 전체를 덮어 페이지 넘김 드래그와 메모·형광펜이 죽는다. */
.ebook-link-root {
  position: absolute;
  inset: 0;
  pointer-events: none;
  /* 주석 레이어보다 아래. 형광펜을 긋다가 링크가 열리면 곤란하고,
     링크는 아무것도 그리지 않는 상태에서만 눌리면 된다. */
  z-index: 1;
}

.ebook-link-layer {
  position: absolute;
}

.ebook-link {
  position: absolute;
  display: block;
  pointer-events: auto;
  /* 평소에는 보이지 않는다. 원본 디자인 위에 상시 테두리를 그리면 카탈로그가
     달라 보인다 -- 커서를 올렸을 때만 여기가 눌린다는 것을 알려 준다. */
  border: 1.5px solid transparent;
  border-radius: 2px;
  background: transparent;
  transition: background-color 0.12s ease, border-color 0.12s ease;
  cursor: pointer;
}
.ebook-link:hover, .ebook-link:focus-visible {
  border-color: rgba(47, 111, 237, 0.85);
  background: rgba(47, 111, 237, 0.14);
}

/* 모바일 세로 모드 안내 레이어(요청 사양: "뷰어가 모바일 모드면 가로로
   돌려주세요 레이어 팝업") -- viewer.html이 스킨과 무관하게 항상 같은
   마크업(.ebook-rotate-overlay)을 내보내므로 CSS도 다섯 스킨 전부
   동일하게 둔다. 평소엔 항상 숨겨져 있다가, 아래 미디어 쿼리(모바일
   폭 + 세로 방향)에서만 뷰어 전체를 덮는 레이어로 뜬다 -- JS 판단 없이
   순수 CSS라 가로로 돌리거나 화면을 넓히면 즉시 사라진다. */
.ebook-rotate-overlay {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 9999;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 24px;
  background: rgba(24, 29, 37, 0.95);
  color: #fff;
  text-align: center;
}

.ebook-rotate-overlay-icon {
  width: 64px;
  height: 64px;
  animation: ebook-rotate-overlay-hint 1.6s ease-in-out infinite;
}

@keyframes ebook-rotate-overlay-hint {
  0%, 100% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(-90deg);
  }
}
.ebook-rotate-overlay-text {
  margin: 0;
  font-size: 16px;
  font-weight: 500;
  letter-spacing: -0.02em;
}

@media (max-width: 480px) and (orientation: portrait) {
  .ebook-rotate-overlay {
    display: flex;
  }
}

/*# sourceMappingURL=viewer.css.map */
