{"version":3,"sources":["../src/components/Misc/assets/styles/thorium-web.publicationGrid.module.css","../src/components/Misc/PublicationGrid.tsx","../src/components/Misc/assets/styles/thorium-web.loader.module.css","../src/components/Misc/StatefulLoader.tsx","../src/components/Misc/assets/styles/thorium-web.error.module.css","../src/components/Misc/ErrorDisplay.tsx"],"names":["wrapper","card","cover","image","info","title","author","rendition","loader","jsx","message","jsxs"],"mappings":";;;;;;;;AAAA,IAAA,mCAAA,GAAA;AAAA,EAAC,OAAA,EAAAA,qCAAAA;AAAA,EAWA,IAAA,EAAAC,kCAAAA;AAAA,EAgBA,KAAA,EAAAC,mCAAAA;AAAA,EAQA,KAAA,EAAAC,mCAAAA;AAAA,EAMA,IAAA,EAAAC,kCAAAA;AAAA,EAOA,KAAA,EAAAC,mCAAAA;AAAA,EAOA,MAAA,EAAAC,oCAAAA;AAAA,EAMA,SAAA,EAAAC;AAAA,CAAA;AClDM,IAAM,eAAe,CAAC;AAAA,EAC3B,GAAA;AAAA,EACA,GAAA,GAAM;AACR,CAAA,qBAIE,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAY,mCAAA,CAAsB,KAAA;AAAA,IAClC,OAAA,EAAQ;AAAA;AACV;AAkBK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,YAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,GAAA,GAAM,QAAA;AAAA,EACN,WAAA,GAAc,CAAC,WAAA,qBACb,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAM,WAAA,CAAY,KAAA;AAAA,MAClB,GAAA,EAAI;AAAA;AAAA;AAGV,CAAA,KAA4B;AAC1B,EAAA,MAAM,oBAAA,GAAuB,CAAC,WAAA,KAA6B;AACzD,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAW,CAAA;AAErC,IAAA,IAAI,CAAC,cAAA,CAA0D,KAAK,CAAA,EAAG;AACrE,MAAA,uBACE,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAM,WAAA,CAAY,KAAA;AAAA,UAClB,GAAA,EAAI;AAAA;AAAA,OACN;AAAA,IAEJ;AAEA,IAAA,OAAO,aAAa,KAAA,EAAO;AAAA,MACzB,SAAA,EAAW,UAAA;AAAA,QACT,mCAAA,CAAsB,KAAA;AAAA,QACtB,MAAM,KAAA,CAAM;AAAA;AACd,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAY,mCAAA,CAAsB,OAAA;AAAA,MAClC,KAAA,EAAQ,YAAA;AAAA,MACR,WAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA,EAAa,CAAC,WAAA,EAAa,KAAA,qBACzB,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,MAAO,WAAA,CAAY,GAAA;AAAA,UAEnB,WAAY,mCAAA,CAAsB,IAAA;AAAA,UAElC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YAAO,SAAA,EAAY,mCAAA,CAAsB,KAAA,EACtC,QAAA,EAAA,oBAAA,CAAqB,WAAW,CAAA,EACpC,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAY,mCAAA,CAAsB,IAAA,EACrC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAY,mCAAA,CAAsB,KAAA,EAClC,sBAAY,KAAA,EAChB,CAAA;AAAA,kCACC,GAAA,EAAA,EAAE,SAAA,EAAY,mCAAA,CAAsB,MAAA,EACjC,sBAAY,MAAA,EAChB,CAAA;AAAA,cACE,WAAA,CAAY,6BACZ,GAAA,CAAC,GAAA,EAAA,EAAE,WAAY,mCAAA,CAAsB,SAAA,EACjC,sBAAY,SAAA,EAChB;AAAA,aAAA,EAEJ;AAAA;AAAA,SAAA;AAAA,QAlBM;AAAA;AAmBR;AAAA,GAEJ;AAEJ;;;ACxGA,IAAA,0BAAA,GAAA;AAAA,EAAC,OAAA,EAAAP,4BAAAA;AAAA,EAMA,MAAA,EAAAQ,2BAgBY,CAAA;ACdN,IAAM,cAAA,GAAiB,CAAC,EAAE,SAAA,EAAW,UAAS,KAAmD;AACtG,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,uBACEC,GAAAA,CAAA,QAAA,EAAA,EACA,QAAA,kBAAAA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,MAAA,kBAASA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAY,0BAAA,CAAmB,MAAA,EAAW,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAG,CAAA;AAAA,MACjF,WAAY,0BAAA,CAAmB,OAAA;AAAA,MAE7B;AAAA;AAAA,GACJ,EACA,CAAA;AAEJ;;;ACtBA,IAAA,yBAAA,GAAA;AAAA,EAAC,OAAA,EAAAT,2BAAAA;AAAA,EAWA,KAAA,EAAAK,yBAAAA;AAAA,EAOA,OAAA,EAAAK;AAAA,CAAA;ACPM,IAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,KAAA,CAAM,UAAA,EAAW,EAAG,OAAO,EAAE,4BAA4B,CAAA;AAC7D,IAAA,IAAI,KAAA,CAAM,cAAA,EAAe,EAAG,OAAO,EAAE,gCAAgC,CAAA;AACrE,IAAA,IAAI,KAAA,CAAM,SAAA,EAAU,EAAG,OAAO,EAAE,2BAA2B,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,aAAA,EAAc,EAAG,OAAO,EAAE,+BAA+B,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,aAAA,EAAc,EAAG,OAAO,EAAE,+BAA+B,CAAA;AACnE,IAAA,OAAO,EAAE,2BAA2B,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAY,0BAAY,OAAA,EAC3B,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,QAAG,SAAA,EAAY,yBAAA,CAAY,OAAU,QAAA,EAAA,KAAA,IAAS,CAAA,CAAE,yBAAyB,CAAA,EAAG,CAAA;AAAA,oBAC7EA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAY,yBAAA,CAAY,OAAA,EAAY,0BAAe,EAAG,CAAA;AAAA,IACvD;AAAA,GAAA,EACJ,CAAA;AAEJ","file":"chunk-E74VFBKW.mjs","sourcesContent":[".wrapper {\n  --th-color-text: #333;\n  --th-color-text-secondary: #666;\n  --th-color-background: #fff;\n  --th-color-primary: #e0e0e0;\n  --th-color-secondary: #fafafa;\n\n  padding: 1rem;\n  width: 100%;\n}\n\n.card {\n  display: flex;\n  text-decoration: none;\n  color: inherit;\n  border: 1px solid var(--th-color-primary);\n  border-radius: 8px;\n  overflow: hidden;\n  transition: transform 0.2s ease, box-shadow 0.2s ease;\n  background: white;\n}\n\n.card:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n}\n\n.cover {\n  width: 120px;\n  height: 180px;\n  flex-shrink: 0;\n  margin: 0;\n  background-color: var(--th-color-secondary);\n}\n\n.image {\n  width: 120px;\n  height: 180px;\n  object-fit: contain;\n}\n\n.info {\n  padding: 1rem;\n  display: flex;\n  flex-direction: column;\n  flex-grow: 1;\n}\n\n.title {\n  margin: 0 0 0.5rem;\n  font-weight: 600;\n  font-size: 1.25rem;\n  color: var(--th-color-text);\n}\n\n.author {\n  margin: 0 0 0.75rem;\n  color: var(--th-color-text-secondary);\n  font-size: 1rem;\n}\n\n.rendition {\n  background: var(--th-color-primary);\n  color: var(--th-color-text);\n  padding: 0.25rem 0.75rem;\n  margin: 0;\n  border-radius: 20px;\n  font-size: 0.875rem;\n  font-weight: 500;\n  margin-top: auto;\n  align-self: flex-start;\n}","\"use client\";\n\nimport React, { cloneElement, isValidElement } from \"react\";\n\nimport publicationGridStyles from \"./assets/styles/thorium-web.publicationGrid.module.css\";\n\nimport { ThGrid } from \"@/core/Components\";\nimport { Link } from \"react-aria-components\";\n\nimport classNames from \"classnames\";\n\nexport const DefaultImage = ({\n  src,\n  alt = \"\"\n}: {\n  src: string;\n  alt?: string;\n}) => (\n  <img\n    src={ src }\n    alt={ alt }\n    className={ publicationGridStyles.image }\n    loading=\"lazy\"\n  />\n);\n\nexport interface Publication {\n  title: string;\n  author: string;\n  cover: string;\n  url: string;\n  rendition?: string;\n}\n\nexport interface PublicationGridProps {\n  publications: Publication[];\n  columnWidth?: number;\n  gap?: string;\n  renderCover?: (publication: Publication) => React.ReactElement<React.ImgHTMLAttributes<HTMLImageElement>>;\n}\n\nexport const PublicationGrid = ({ \n  publications,\n  columnWidth = 400,\n  gap = \"1.5rem\",\n  renderCover = (publication) => (\n    <DefaultImage\n      src={ publication.cover }\n      alt=\"\"\n    />\n  ),\n}: PublicationGridProps) => {\n  const renderCoverWithClass = (publication: Publication) => {\n    const cover = renderCover(publication);\n    \n    if (!isValidElement<React.ImgHTMLAttributes<HTMLImageElement>>(cover)) {\n      return (\n        <DefaultImage\n          src={ publication.cover }\n          alt=\"\"\n        />\n      );\n    }\n\n    return cloneElement(cover, {\n      className: classNames(\n        publicationGridStyles.image,\n        cover.props.className\n      )\n    });\n  };\n\n  return (\n    <ThGrid\n      className={ publicationGridStyles.wrapper }\n      items={ publications }\n      columnWidth={ columnWidth }\n      gap={ gap }\n      renderItem={ (publication, index) => (\n        <Link\n          href={ publication.url }\n          key={ index }\n          className={ publicationGridStyles.card }\n        >\n          <figure className={ publicationGridStyles.cover }>\n            { renderCoverWithClass(publication) }\n          </figure>\n          <div className={ publicationGridStyles.info }>\n            <h2 className={ publicationGridStyles.title }>\n              { publication.title }\n            </h2>\n            <p className={ publicationGridStyles.author }>\n              { publication.author }\n            </p>\n            { publication.rendition && (\n              <p className={ publicationGridStyles.rendition }>\n                { publication.rendition }\n              </p>\n            ) }\n          </div>\n        </Link>\n      ) }\n    />\n  );\n};",".wrapper {\n  width: 100%;\n  height: 100dvh;\n  height: 100vh;\n}\n\n.loader {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 100%;\n  height: 100%;\n  color: var(--th-theme-text, CanvasText);\n  background-color: var(--th-theme-background, Canvas);\n  font-weight: bold;\n}\n\n.loader::after {\n  content: \"...\";\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: bottom;\n  animation: ellipsis-dot 1s infinite 300ms;\n  animation-fill-mode: forwards;\n  width: 3ch;\n}\n\n@keyframes ellipsis-dot {\n  25% {\n    content: \"\";\n  }\n  50% {\n    content: \".\";\n  }\n  75% {\n    content: \"..\";\n  }\n  100% {\n    content: \"...\";\n  }\n}","import { ReactNode } from \"react\";\n\nimport readerLoaderStyles from \"./assets/styles/thorium-web.loader.module.css\";\n\nimport { ThLoader } from \"@/core/Components/Reader/ThLoader\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport const StatefulLoader = ({ isLoading, children }: { isLoading: boolean, children: ReactNode }) => {\n  const { t } = useI18n();\n\n  return (\n    <>\n    <ThLoader \n      isLoading={ isLoading } \n      loader={ <div className={ readerLoaderStyles.loader }>{ t(\"reader.app.loading\") }</div> } \n      className={ readerLoaderStyles.wrapper } \n    >\n      { children }\n    </ThLoader>\n    </>\n  )\n}",".wrapper {\n  --th-color-text: #333;\n  --th-color-text-secondary: #666;\n  --th-color-background: #fff;\n\n  padding: 2rem;\n  text-align: center;\n  max-width: 600px;\n  margin: 0 auto;\n}\n\n.title {\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--th-color-text);\n  margin: 0 0 1rem 0;\n}\n\n.message {\n  font-size: 1.125rem;\n  color: var(--th-color-text-secondary);\n  line-height: 1.6;\n  margin: 0 0 1.5rem 0;\n}","import { ReactNode } from \"react\";\nimport { ProcessedError } from \"@/helpers/errorHandler\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport errorStyles from \"./assets/styles/thorium-web.error.module.css\";\n\ninterface ErrorDisplayProps {\n  error: ProcessedError;\n  title?: string;\n  children?: ReactNode;\n}\n\nexport const ErrorDisplay = ({ \n  error, \n  title,\n  children\n}: ErrorDisplayProps) => {\n  const { t } = useI18n();\n  \n  const getUserMessage = () => {\n    if (error.isNotFound()) return t(\"reader.app.errors.notFound\");\n    if (error.isAccessDenied()) return t(\"reader.app.errors.accessDenied\");\n    if (error.isNetwork()) return t(\"reader.app.errors.network\");\n    if (error.isServerError()) return t(\"reader.app.errors.serverError\");\n    if (error.isClientError()) return t(\"reader.app.errors.clientError\");\n    return t(\"reader.app.errors.generic\");\n  };\n\n  return (\n    <div className={ errorStyles.wrapper }>\n      <h1 className={ errorStyles.title }>{ title || t(\"reader.app.errors.title\") }</h1>\n      <p className={ errorStyles.message }>{ getUserMessage() }</p>\n      { children }\n    </div>\n  );\n};\n"]}