bitsnap-react 1.11.1 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +10 -4
  2. package/dist/CartProvider-XNFSUOCB.js +2 -0
  3. package/dist/CartProvider-XNFSUOCB.js.map +1 -0
  4. package/dist/CartProvider-YMJ7RFO4.mjs +2 -0
  5. package/dist/analytics.js +1 -1
  6. package/dist/analytics.mjs +1 -1
  7. package/dist/catalog.js +1 -1
  8. package/dist/catalog.mjs +1 -1
  9. package/dist/{chunk-ETGHIHWR.mjs → chunk-3QG7H2AI.mjs} +2 -2
  10. package/dist/chunk-4BW6J7FP.js +4 -0
  11. package/dist/{chunk-FBTYZHXM.js.map → chunk-4BW6J7FP.js.map} +1 -1
  12. package/dist/{chunk-HWQNT6XU.mjs → chunk-5R3WR22A.mjs} +2 -2
  13. package/dist/{chunk-UFIOJGJZ.js → chunk-6IACFTJR.js} +2 -2
  14. package/dist/{chunk-UFIOJGJZ.js.map → chunk-6IACFTJR.js.map} +1 -1
  15. package/dist/{chunk-WGJTXDIS.js → chunk-DF2IK2GN.js} +2 -2
  16. package/dist/{chunk-WGJTXDIS.js.map → chunk-DF2IK2GN.js.map} +1 -1
  17. package/dist/{chunk-3IVLQILF.js → chunk-DGUIG334.js} +2 -2
  18. package/dist/{chunk-3IVLQILF.js.map → chunk-DGUIG334.js.map} +1 -1
  19. package/dist/{chunk-JUDR4EZA.mjs → chunk-E5DCEFI2.mjs} +2 -2
  20. package/dist/chunk-ERL4Z7M7.js +2 -0
  21. package/dist/{chunk-Q25D7OAO.js.map → chunk-ERL4Z7M7.js.map} +1 -1
  22. package/dist/{chunk-IJLHU2MA.mjs → chunk-FF2ICGFQ.mjs} +2 -2
  23. package/dist/{chunk-IJLHU2MA.mjs.map → chunk-FF2ICGFQ.mjs.map} +1 -1
  24. package/dist/{chunk-VPBFEAFQ.js → chunk-ICFYSZTV.js} +2 -2
  25. package/dist/{chunk-VPBFEAFQ.js.map → chunk-ICFYSZTV.js.map} +1 -1
  26. package/dist/{chunk-UCL4Y7L3.js → chunk-MLSKHOA3.js} +2 -2
  27. package/dist/{chunk-UCL4Y7L3.js.map → chunk-MLSKHOA3.js.map} +1 -1
  28. package/dist/chunk-P4Q5KXKS.mjs +2 -0
  29. package/dist/{chunk-G2UOTVS5.mjs.map → chunk-P4Q5KXKS.mjs.map} +1 -1
  30. package/dist/chunk-PNTO3L2C.mjs +4 -0
  31. package/dist/chunk-PNTO3L2C.mjs.map +1 -0
  32. package/dist/chunk-QSIKRVZL.mjs +2 -0
  33. package/dist/chunk-QSIKRVZL.mjs.map +1 -0
  34. package/dist/{chunk-DWRBPP32.mjs → chunk-UCESDAEC.mjs} +2 -2
  35. package/dist/chunk-XTIY6PXH.js +2 -0
  36. package/dist/{chunk-YBGAYEJQ.js.map → chunk-XTIY6PXH.js.map} +1 -1
  37. package/dist/course.js +1 -1
  38. package/dist/course.mjs +1 -1
  39. package/dist/embed/analytics.js +1 -1
  40. package/dist/index.css +1 -1
  41. package/dist/index.css.map +1 -1
  42. package/dist/index.d.mts +49 -1
  43. package/dist/index.d.ts +49 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.mjs +1 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/methods-DDGOXLP6.mjs +2 -0
  49. package/dist/methods-RQPDIUUN.js +2 -0
  50. package/dist/{methods-ZBX4BTDE.js.map → methods-RQPDIUUN.js.map} +1 -1
  51. package/dist/returns.js +1 -1
  52. package/dist/returns.mjs +1 -1
  53. package/package.json +51 -26
  54. package/dist/CartProvider-QY2DMNCC.js +0 -2
  55. package/dist/CartProvider-QY2DMNCC.js.map +0 -1
  56. package/dist/CartProvider-XMHPQRWC.mjs +0 -2
  57. package/dist/chunk-2PK36NGB.mjs +0 -4
  58. package/dist/chunk-2PK36NGB.mjs.map +0 -1
  59. package/dist/chunk-2X32DDUM.mjs +0 -2
  60. package/dist/chunk-2X32DDUM.mjs.map +0 -1
  61. package/dist/chunk-FBTYZHXM.js +0 -4
  62. package/dist/chunk-G2UOTVS5.mjs +0 -2
  63. package/dist/chunk-Q25D7OAO.js +0 -2
  64. package/dist/chunk-YBGAYEJQ.js +0 -2
  65. package/dist/methods-ALO22YWQ.mjs +0 -2
  66. package/dist/methods-ZBX4BTDE.js +0 -2
  67. /package/dist/{CartProvider-XMHPQRWC.mjs.map → CartProvider-YMJ7RFO4.mjs.map} +0 -0
  68. /package/dist/{chunk-ETGHIHWR.mjs.map → chunk-3QG7H2AI.mjs.map} +0 -0
  69. /package/dist/{chunk-HWQNT6XU.mjs.map → chunk-5R3WR22A.mjs.map} +0 -0
  70. /package/dist/{chunk-JUDR4EZA.mjs.map → chunk-E5DCEFI2.mjs.map} +0 -0
  71. /package/dist/{chunk-DWRBPP32.mjs.map → chunk-UCESDAEC.mjs.map} +0 -0
  72. /package/dist/{methods-ALO22YWQ.mjs.map → methods-DDGOXLP6.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/emems/web/bitsnap/bitsnap/bitsnap-react/dist/chunk-YBGAYEJQ.js","../src/components/products/appearance.ts","../src/components/products/format.ts"],"names":["PRODUCT_LIST_SLOT_NAMES","PRODUCT_LIST_TOKEN_VARIABLES","PRODUCT_LIST_THEME_PRESETS","PRODUCT_LIST_SHADCN_VARIABLES","resolveProductListAppearance","appearance","resolved","resolveAppearanceCore","getProductListSlotAppearance","slot","getSlotAppearance","createFormatter","locale","currency","formatProductPrice","amount","DEFAULT_LOCALE","value","formatter"],"mappings":"AAAA,y/BAAgD,sDAAqF,sDAAiF,IC2DzMA,EAAAA,CAA0B,CACrC,MAAA,CACA,MAAA,CACA,MAAA,CACA,UAAA,CACA,OAAA,CACA,kBAAA,CACA,MAAA,CACA,MAAA,CACA,aAAA,CACA,OAAA,CACA,cAAA,CACA,OAAA,CACA,SAAA,CACA,iBAAA,CACA,cAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CACA,eAAA,CACA,YAAA,CACA,OAAA,CACA,aAAA,CACA,UACF,CAAA,CA8BaC,EAAAA,CAA+B,CAC1C,UAAA,CAAY,gCAAA,CACZ,QAAA,CAAU,8BAAA,CACV,UAAA,CAAY,+BAAA,CACZ,OAAA,CAAS,4BAAA,CACT,UAAA,CAAY,+BAAA,CACZ,eAAA,CAAiB,qCAAA,CACjB,MAAA,CAAQ,2BAAA,CACR,gBAAA,CAAkB,sCAAA,CAClB,gBAAA,CAAkB,sCAAA,CAClB,qBAAA,CAAuB,4CAAA,CACvB,YAAA,CAAc,kCAAA,CACd,SAAA,CAAW,+BAAA,CACX,KAAA,CAAO,0BAAA,CACP,eAAA,CAAiB,qCAAA,CACjB,eAAA,CAAiB,qCAAA,CACjB,MAAA,CAAQ,2BACV,CAAA,CASaC,EAAAA,CAGT,CACF,KAAA,CAAO,CACL,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,SAAA,CACR,gBAAA,CAAkB,SAAA,CAClB,gBAAA,CAAkB,SAAA,CAClB,qBAAA,CAAuB,SAAA,CACvB,YAAA,CAAc,SAAA,CACd,SAAA,CAAW,SAAA,CACX,KAAA,CAAO,SAAA,CACP,eAAA,CAAiB,SAAA,CACjB,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,KACV,CAAA,CACA,IAAA,CAAM,CACJ,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,SAAA,CACR,gBAAA,CAAkB,SAAA,CAClB,gBAAA,CAAkB,SAAA,CAClB,qBAAA,CAAuB,SAAA,CACvB,YAAA,CAAc,SAAA,CACd,SAAA,CAAW,SAAA,CACX,KAAA,CAAO,SAAA,CACP,eAAA,CAAiB,SAAA,CACjB,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,KACV,CACF,CAAA,CAGMC,EAAAA,CACJ,CAAC,CAAA,CAEI,SAASC,EAAAA,CACdC,CAAAA,CAC+B,CAC/B,IAAMC,CAAAA,CAAWC,gCAAAA,CAIfF,CAAY,CACZ,YAAA,CAAc,OAAA,CACd,OAAA,CAASH,EAAAA,CACT,SAAA,CAAWD,EAAAA,CACX,eAAA,CAAiBE,EACnB,CAAC,CAAA,CAED,MAAO,CACL,KAAA,CAAOG,CAAAA,CAAS,KAAA,CAChB,MAAA,CAAQA,CAAAA,CAAS,MAAA,CACjB,QAAA,CAAUA,CAAAA,CAAS,QAAA,CACnB,iBAAA,CAAmBA,CAAAA,CAAS,KAAA,CAC5B,aAAA,CAAeA,CAAAA,CAAS,aAC1B,CACF,CAGO,SAASE,CAAAA,CACdF,CAAAA,CACAG,CAAAA,CACuC,CACvC,OAAOC,gCAAAA,CAAkBJ,CAAS,QAAA,CAAUG,CAAI,CAClD,CChNA,SAASE,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CAC+B,CAC/B,GAAI,CACF,OAAO,IAAI,IAAA,CAAK,YAAA,CAAaD,CAAAA,CAAQ,CACnC,KAAA,CAAO,UAAA,CACP,QAAA,CAAAC,CAAAA,CACA,eAAA,CAAiB,QACnB,CAAC,CACH,CAAA,UAAQ,CAEN,MACF,CACF,CAOO,SAASC,CAAAA,CACdC,CAAAA,CACAF,CAAAA,CACAD,CAAAA,CAAiBI,kBAAAA,CACT,CACR,IAAMC,CAAAA,CAAQF,CAAAA,CAAS,GAAA,CACjBG,CAAAA,kBACJP,EAAAA,CAAgBC,CAAAA,CAAQC,CAAQ,CAAA,SAChCF,EAAAA,CAAgBK,kBAAAA,CAAgBH,CAAQ,GAAA,CAE1C,OAAOK,CAAAA,EAAa,IAAA,CAChBA,CAAAA,CAAU,MAAA,CAAOD,CAAK,CAAA,CACtB,CAAA,EAAA","file":"/home/emems/web/bitsnap/bitsnap/bitsnap-react/dist/chunk-YBGAYEJQ.js","sourcesContent":[null,"import type { CSSProperties } from \"react\";\nimport {\n getSlotAppearance,\n resolveAppearanceCore,\n type AppearanceElements,\n type ShadcnVariableMapping,\n type SlotAppearance,\n} from \"@/src/lib/appearance-core\";\n\n/**\n * Product list appearance API.\n *\n * It mirrors `CheckoutAppearance` and `ReturnsAppearance` (theme, tokens,\n * elements) so a shop can reuse one brand object for all of them. The resolver\n * is pure: it turns the caller input into a theme name, the tokens in effect,\n * the slot overrides and the inline style for the theme boundary.\n */\n\nexport type ProductListTheme = \"light\" | \"dark\";\n\nexport type ProductListAppearanceTokens = {\n /** Font family of the list. The library never loads fonts. */\n fontFamily?: string;\n /** Base font size. */\n fontSize?: string;\n /** List background. */\n background?: string;\n /** Raised surfaces: cards, image placeholders, skeletons. */\n surface?: string;\n /** Main text color. */\n foreground?: string;\n /** Secondary text: descriptions, the struck-through price. */\n mutedForeground?: string;\n /** Borders of cards and buttons. */\n border?: string;\n /** \"Add to cart\" button background. */\n buttonBackground?: string;\n /** \"Add to cart\" button text. */\n buttonForeground?: string;\n /** \"Add to cart\" button background on hover. */\n buttonHoverBackground?: string;\n /** Hover surface of cards and secondary buttons. */\n hoverSurface?: string;\n /** Focus ring color. */\n focusRing?: string;\n /** Error and unavailable state color. */\n error?: string;\n /** Badge background (subscription, unavailable). */\n badgeBackground?: string;\n /** Badge text. */\n badgeForeground?: string;\n /** Corner radius of cards, images and buttons. */\n radius?: string;\n};\n\n/**\n * Stable slot names. They are exposed as `data-bitsnap-products-slot`\n * attributes so they can also be targeted from plain CSS.\n */\nexport const PRODUCT_LIST_SLOT_NAMES = [\n \"root\",\n \"grid\",\n \"card\",\n \"cardLink\",\n \"image\",\n \"imagePlaceholder\",\n \"body\",\n \"name\",\n \"description\",\n \"price\",\n \"comparePrice\",\n \"badge\",\n \"actions\",\n \"addToCartButton\",\n \"selectButton\",\n \"message\",\n \"pagination\",\n \"paginationButton\",\n \"pageIndicator\",\n \"emptyState\",\n \"error\",\n \"retryButton\",\n \"skeleton\",\n] as const;\n\nexport type ProductListSlotName = (typeof PRODUCT_LIST_SLOT_NAMES)[number];\n\nexport type ProductListSlotAppearance = SlotAppearance;\n\nexport type ProductListAppearanceElements =\n AppearanceElements<ProductListSlotName>;\n\nexport type ProductListAppearance = {\n /** `\"light\"` or `\"dark\"`. Omitted means `\"light\"`. */\n theme?: ProductListTheme;\n /** Partial overrides applied over the theme preset. */\n tokens?: ProductListAppearanceTokens;\n /** Per element `className`/`style` overrides. */\n elements?: ProductListAppearanceElements;\n};\n\nexport type ResolvedProductListAppearance = {\n theme: ProductListTheme;\n /** Tokens that are in effect (the theme preset plus caller overrides). */\n tokens: ProductListAppearanceTokens;\n elements: ProductListAppearanceElements;\n /** Theme marker class for the theme boundary. */\n boundaryClassName: string;\n /** Inline custom properties applied to the list root. */\n boundaryStyle: CSSProperties;\n};\n\n/** CSS custom property used for each token. */\nexport const PRODUCT_LIST_TOKEN_VARIABLES = {\n fontFamily: \"--bitsnap-products-font-family\",\n fontSize: \"--bitsnap-products-font-size\",\n background: \"--bitsnap-products-background\",\n surface: \"--bitsnap-products-surface\",\n foreground: \"--bitsnap-products-foreground\",\n mutedForeground: \"--bitsnap-products-muted-foreground\",\n border: \"--bitsnap-products-border\",\n buttonBackground: \"--bitsnap-products-button-background\",\n buttonForeground: \"--bitsnap-products-button-foreground\",\n buttonHoverBackground: \"--bitsnap-products-button-hover-background\",\n hoverSurface: \"--bitsnap-products-hover-surface\",\n focusRing: \"--bitsnap-products-focus-ring\",\n error: \"--bitsnap-products-error\",\n badgeBackground: \"--bitsnap-products-badge-background\",\n badgeForeground: \"--bitsnap-products-badge-foreground\",\n radius: \"--bitsnap-products-radius\",\n} as const;\n\nexport type ProductListTokenName = keyof typeof PRODUCT_LIST_TOKEN_VARIABLES;\n\n/**\n * Complete palettes. They carry colors and radius only, so typography is never\n * reset implicitly. `products.css` falls back to the light values, which keeps\n * the list usable even when the boundary style is missing.\n */\nexport const PRODUCT_LIST_THEME_PRESETS: Record<\n ProductListTheme,\n ProductListAppearanceTokens\n> = {\n light: {\n background: \"#ffffff\",\n surface: \"#f9fafb\",\n foreground: \"#18181b\",\n mutedForeground: \"#71717a\",\n border: \"#e4e4e7\",\n buttonBackground: \"#18181b\",\n buttonForeground: \"#fafafa\",\n buttonHoverBackground: \"#000000\",\n hoverSurface: \"#f4f4f5\",\n focusRing: \"#71717a\",\n error: \"#dc2626\",\n badgeBackground: \"#f4f4f5\",\n badgeForeground: \"#3f3f46\",\n radius: \"8px\",\n },\n dark: {\n background: \"#18181b\",\n surface: \"#27272a\",\n foreground: \"#fafafa\",\n mutedForeground: \"#a1a1aa\",\n border: \"#3f3f46\",\n buttonBackground: \"#fafafa\",\n buttonForeground: \"#18181b\",\n buttonHoverBackground: \"#e4e4e7\",\n hoverSurface: \"#3f3f46\",\n focusRing: \"#a1a1aa\",\n error: \"#f87171\",\n badgeBackground: \"#3f3f46\",\n badgeForeground: \"#e4e4e7\",\n radius: \"8px\",\n },\n};\n\n/** The list renders its own elements, so no shared primitive needs remapping. */\nconst PRODUCT_LIST_SHADCN_VARIABLES: ShadcnVariableMapping<ProductListTokenName> =\n [];\n\nexport function resolveProductListAppearance(\n appearance?: ProductListAppearance,\n): ResolvedProductListAppearance {\n const resolved = resolveAppearanceCore<\n ProductListTokenName,\n ProductListTheme,\n ProductListSlotName\n >(appearance, {\n defaultTheme: \"light\",\n presets: PRODUCT_LIST_THEME_PRESETS,\n variables: PRODUCT_LIST_TOKEN_VARIABLES,\n shadcnVariables: PRODUCT_LIST_SHADCN_VARIABLES,\n });\n\n return {\n theme: resolved.theme,\n tokens: resolved.tokens,\n elements: resolved.elements,\n boundaryClassName: resolved.theme,\n boundaryStyle: resolved.boundaryStyle,\n };\n}\n\n/** Caller overrides for a single slot, if any were provided. */\nexport function getProductListSlotAppearance(\n resolved: ResolvedProductListAppearance,\n slot: ProductListSlotName,\n): ProductListSlotAppearance | undefined {\n return getSlotAppearance(resolved.elements, slot);\n}\n","import { DEFAULT_LOCALE } from \"../checkout/locale\";\n\nfunction createFormatter(\n locale: string,\n currency: string,\n): Intl.NumberFormat | undefined {\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n currencyDisplay: \"symbol\",\n });\n } catch {\n // RangeError: invalid locale or currency code.\n return undefined;\n }\n}\n\n/**\n * Formats a price in minor units (grosze, cents) for the locale, the same way\n * the cart does (`amount / 100`). An unknown locale falls back to Polish and an\n * invalid currency code to a plain number followed by the code.\n */\nexport function formatProductPrice(\n amount: number,\n currency: string,\n locale: string = DEFAULT_LOCALE,\n): string {\n const value = amount / 100;\n const formatter =\n createFormatter(locale, currency) ??\n createFormatter(DEFAULT_LOCALE, currency);\n\n return formatter != null\n ? formatter.format(value)\n : `${value.toFixed(2)} ${currency}`;\n}\n"]}
1
+ {"version":3,"sources":["/home/emems/web/bitsnap/bitsnap/bitsnap-react/dist/chunk-XTIY6PXH.js","../src/components/products/appearance.ts","../src/components/products/format.ts"],"names":["PRODUCT_LIST_SLOT_NAMES","PRODUCT_LIST_TOKEN_VARIABLES","PRODUCT_LIST_THEME_PRESETS","PRODUCT_LIST_SHADCN_VARIABLES","resolveProductListAppearance","appearance","resolved","resolveAppearanceCore","getProductListSlotAppearance","slot","getSlotAppearance","createFormatter","locale","currency","formatProductPrice","amount","DEFAULT_LOCALE","value","formatter"],"mappings":"AAAA,y/BAAgD,sDAAsF,sDAAiF,IC2D1MA,EAAAA,CAA0B,CACrC,MAAA,CACA,MAAA,CACA,MAAA,CACA,UAAA,CACA,OAAA,CACA,kBAAA,CACA,MAAA,CACA,MAAA,CACA,aAAA,CACA,OAAA,CACA,cAAA,CACA,OAAA,CACA,SAAA,CACA,iBAAA,CACA,cAAA,CACA,SAAA,CACA,YAAA,CACA,kBAAA,CACA,eAAA,CACA,YAAA,CACA,OAAA,CACA,aAAA,CACA,UACF,CAAA,CA8BaC,EAAAA,CAA+B,CAC1C,UAAA,CAAY,gCAAA,CACZ,QAAA,CAAU,8BAAA,CACV,UAAA,CAAY,+BAAA,CACZ,OAAA,CAAS,4BAAA,CACT,UAAA,CAAY,+BAAA,CACZ,eAAA,CAAiB,qCAAA,CACjB,MAAA,CAAQ,2BAAA,CACR,gBAAA,CAAkB,sCAAA,CAClB,gBAAA,CAAkB,sCAAA,CAClB,qBAAA,CAAuB,4CAAA,CACvB,YAAA,CAAc,kCAAA,CACd,SAAA,CAAW,+BAAA,CACX,KAAA,CAAO,0BAAA,CACP,eAAA,CAAiB,qCAAA,CACjB,eAAA,CAAiB,qCAAA,CACjB,MAAA,CAAQ,2BACV,CAAA,CASaC,EAAAA,CAGT,CACF,KAAA,CAAO,CACL,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,SAAA,CACR,gBAAA,CAAkB,SAAA,CAClB,gBAAA,CAAkB,SAAA,CAClB,qBAAA,CAAuB,SAAA,CACvB,YAAA,CAAc,SAAA,CACd,SAAA,CAAW,SAAA,CACX,KAAA,CAAO,SAAA,CACP,eAAA,CAAiB,SAAA,CACjB,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,KACV,CAAA,CACA,IAAA,CAAM,CACJ,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,SAAA,CACR,gBAAA,CAAkB,SAAA,CAClB,gBAAA,CAAkB,SAAA,CAClB,qBAAA,CAAuB,SAAA,CACvB,YAAA,CAAc,SAAA,CACd,SAAA,CAAW,SAAA,CACX,KAAA,CAAO,SAAA,CACP,eAAA,CAAiB,SAAA,CACjB,eAAA,CAAiB,SAAA,CACjB,MAAA,CAAQ,KACV,CACF,CAAA,CAGMC,EAAAA,CACJ,CAAC,CAAA,CAEI,SAASC,EAAAA,CACdC,CAAAA,CAC+B,CAC/B,IAAMC,CAAAA,CAAWC,gCAAAA,CAIfF,CAAY,CACZ,YAAA,CAAc,OAAA,CACd,OAAA,CAASH,EAAAA,CACT,SAAA,CAAWD,EAAAA,CACX,eAAA,CAAiBE,EACnB,CAAC,CAAA,CAED,MAAO,CACL,KAAA,CAAOG,CAAAA,CAAS,KAAA,CAChB,MAAA,CAAQA,CAAAA,CAAS,MAAA,CACjB,QAAA,CAAUA,CAAAA,CAAS,QAAA,CACnB,iBAAA,CAAmBA,CAAAA,CAAS,KAAA,CAC5B,aAAA,CAAeA,CAAAA,CAAS,aAC1B,CACF,CAGO,SAASE,CAAAA,CACdF,CAAAA,CACAG,CAAAA,CACuC,CACvC,OAAOC,gCAAAA,CAAkBJ,CAAS,QAAA,CAAUG,CAAI,CAClD,CChNA,SAASE,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CAC+B,CAC/B,GAAI,CACF,OAAO,IAAI,IAAA,CAAK,YAAA,CAAaD,CAAAA,CAAQ,CACnC,KAAA,CAAO,UAAA,CACP,QAAA,CAAAC,CAAAA,CACA,eAAA,CAAiB,QACnB,CAAC,CACH,CAAA,UAAQ,CAEN,MACF,CACF,CAOO,SAASC,CAAAA,CACdC,CAAAA,CACAF,CAAAA,CACAD,CAAAA,CAAiBI,kBAAAA,CACT,CACR,IAAMC,CAAAA,CAAQF,CAAAA,CAAS,GAAA,CACjBG,CAAAA,kBACJP,EAAAA,CAAgBC,CAAAA,CAAQC,CAAQ,CAAA,SAChCF,EAAAA,CAAgBK,kBAAAA,CAAgBH,CAAQ,GAAA,CAE1C,OAAOK,CAAAA,EAAa,IAAA,CAChBA,CAAAA,CAAU,MAAA,CAAOD,CAAK,CAAA,CACtB,CAAA,EAAA","file":"/home/emems/web/bitsnap/bitsnap/bitsnap-react/dist/chunk-XTIY6PXH.js","sourcesContent":[null,"import type { CSSProperties } from \"react\";\nimport {\n getSlotAppearance,\n resolveAppearanceCore,\n type AppearanceElements,\n type ShadcnVariableMapping,\n type SlotAppearance,\n} from \"@/src/lib/appearance-core\";\n\n/**\n * Product list appearance API.\n *\n * It mirrors `CheckoutAppearance` and `ReturnsAppearance` (theme, tokens,\n * elements) so a shop can reuse one brand object for all of them. The resolver\n * is pure: it turns the caller input into a theme name, the tokens in effect,\n * the slot overrides and the inline style for the theme boundary.\n */\n\nexport type ProductListTheme = \"light\" | \"dark\";\n\nexport type ProductListAppearanceTokens = {\n /** Font family of the list. The library never loads fonts. */\n fontFamily?: string;\n /** Base font size. */\n fontSize?: string;\n /** List background. */\n background?: string;\n /** Raised surfaces: cards, image placeholders, skeletons. */\n surface?: string;\n /** Main text color. */\n foreground?: string;\n /** Secondary text: descriptions, the struck-through price. */\n mutedForeground?: string;\n /** Borders of cards and buttons. */\n border?: string;\n /** \"Add to cart\" button background. */\n buttonBackground?: string;\n /** \"Add to cart\" button text. */\n buttonForeground?: string;\n /** \"Add to cart\" button background on hover. */\n buttonHoverBackground?: string;\n /** Hover surface of cards and secondary buttons. */\n hoverSurface?: string;\n /** Focus ring color. */\n focusRing?: string;\n /** Error and unavailable state color. */\n error?: string;\n /** Badge background (subscription, unavailable). */\n badgeBackground?: string;\n /** Badge text. */\n badgeForeground?: string;\n /** Corner radius of cards, images and buttons. */\n radius?: string;\n};\n\n/**\n * Stable slot names. They are exposed as `data-bitsnap-products-slot`\n * attributes so they can also be targeted from plain CSS.\n */\nexport const PRODUCT_LIST_SLOT_NAMES = [\n \"root\",\n \"grid\",\n \"card\",\n \"cardLink\",\n \"image\",\n \"imagePlaceholder\",\n \"body\",\n \"name\",\n \"description\",\n \"price\",\n \"comparePrice\",\n \"badge\",\n \"actions\",\n \"addToCartButton\",\n \"selectButton\",\n \"message\",\n \"pagination\",\n \"paginationButton\",\n \"pageIndicator\",\n \"emptyState\",\n \"error\",\n \"retryButton\",\n \"skeleton\",\n] as const;\n\nexport type ProductListSlotName = (typeof PRODUCT_LIST_SLOT_NAMES)[number];\n\nexport type ProductListSlotAppearance = SlotAppearance;\n\nexport type ProductListAppearanceElements =\n AppearanceElements<ProductListSlotName>;\n\nexport type ProductListAppearance = {\n /** `\"light\"` or `\"dark\"`. Omitted means `\"light\"`. */\n theme?: ProductListTheme;\n /** Partial overrides applied over the theme preset. */\n tokens?: ProductListAppearanceTokens;\n /** Per element `className`/`style` overrides. */\n elements?: ProductListAppearanceElements;\n};\n\nexport type ResolvedProductListAppearance = {\n theme: ProductListTheme;\n /** Tokens that are in effect (the theme preset plus caller overrides). */\n tokens: ProductListAppearanceTokens;\n elements: ProductListAppearanceElements;\n /** Theme marker class for the theme boundary. */\n boundaryClassName: string;\n /** Inline custom properties applied to the list root. */\n boundaryStyle: CSSProperties;\n};\n\n/** CSS custom property used for each token. */\nexport const PRODUCT_LIST_TOKEN_VARIABLES = {\n fontFamily: \"--bitsnap-products-font-family\",\n fontSize: \"--bitsnap-products-font-size\",\n background: \"--bitsnap-products-background\",\n surface: \"--bitsnap-products-surface\",\n foreground: \"--bitsnap-products-foreground\",\n mutedForeground: \"--bitsnap-products-muted-foreground\",\n border: \"--bitsnap-products-border\",\n buttonBackground: \"--bitsnap-products-button-background\",\n buttonForeground: \"--bitsnap-products-button-foreground\",\n buttonHoverBackground: \"--bitsnap-products-button-hover-background\",\n hoverSurface: \"--bitsnap-products-hover-surface\",\n focusRing: \"--bitsnap-products-focus-ring\",\n error: \"--bitsnap-products-error\",\n badgeBackground: \"--bitsnap-products-badge-background\",\n badgeForeground: \"--bitsnap-products-badge-foreground\",\n radius: \"--bitsnap-products-radius\",\n} as const;\n\nexport type ProductListTokenName = keyof typeof PRODUCT_LIST_TOKEN_VARIABLES;\n\n/**\n * Complete palettes. They carry colors and radius only, so typography is never\n * reset implicitly. `products.css` falls back to the light values, which keeps\n * the list usable even when the boundary style is missing.\n */\nexport const PRODUCT_LIST_THEME_PRESETS: Record<\n ProductListTheme,\n ProductListAppearanceTokens\n> = {\n light: {\n background: \"#ffffff\",\n surface: \"#f9fafb\",\n foreground: \"#18181b\",\n mutedForeground: \"#71717a\",\n border: \"#e4e4e7\",\n buttonBackground: \"#18181b\",\n buttonForeground: \"#fafafa\",\n buttonHoverBackground: \"#000000\",\n hoverSurface: \"#f4f4f5\",\n focusRing: \"#71717a\",\n error: \"#dc2626\",\n badgeBackground: \"#f4f4f5\",\n badgeForeground: \"#3f3f46\",\n radius: \"8px\",\n },\n dark: {\n background: \"#18181b\",\n surface: \"#27272a\",\n foreground: \"#fafafa\",\n mutedForeground: \"#a1a1aa\",\n border: \"#3f3f46\",\n buttonBackground: \"#fafafa\",\n buttonForeground: \"#18181b\",\n buttonHoverBackground: \"#e4e4e7\",\n hoverSurface: \"#3f3f46\",\n focusRing: \"#a1a1aa\",\n error: \"#f87171\",\n badgeBackground: \"#3f3f46\",\n badgeForeground: \"#e4e4e7\",\n radius: \"8px\",\n },\n};\n\n/** The list renders its own elements, so no shared primitive needs remapping. */\nconst PRODUCT_LIST_SHADCN_VARIABLES: ShadcnVariableMapping<ProductListTokenName> =\n [];\n\nexport function resolveProductListAppearance(\n appearance?: ProductListAppearance,\n): ResolvedProductListAppearance {\n const resolved = resolveAppearanceCore<\n ProductListTokenName,\n ProductListTheme,\n ProductListSlotName\n >(appearance, {\n defaultTheme: \"light\",\n presets: PRODUCT_LIST_THEME_PRESETS,\n variables: PRODUCT_LIST_TOKEN_VARIABLES,\n shadcnVariables: PRODUCT_LIST_SHADCN_VARIABLES,\n });\n\n return {\n theme: resolved.theme,\n tokens: resolved.tokens,\n elements: resolved.elements,\n boundaryClassName: resolved.theme,\n boundaryStyle: resolved.boundaryStyle,\n };\n}\n\n/** Caller overrides for a single slot, if any were provided. */\nexport function getProductListSlotAppearance(\n resolved: ResolvedProductListAppearance,\n slot: ProductListSlotName,\n): ProductListSlotAppearance | undefined {\n return getSlotAppearance(resolved.elements, slot);\n}\n","import { DEFAULT_LOCALE } from \"../checkout/locale\";\n\nfunction createFormatter(\n locale: string,\n currency: string,\n): Intl.NumberFormat | undefined {\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n currencyDisplay: \"symbol\",\n });\n } catch {\n // RangeError: invalid locale or currency code.\n return undefined;\n }\n}\n\n/**\n * Formats a price in minor units (grosze, cents) for the locale, the same way\n * the cart does (`amount / 100`). An unknown locale falls back to Polish and an\n * invalid currency code to a plain number followed by the code.\n */\nexport function formatProductPrice(\n amount: number,\n currency: string,\n locale: string = DEFAULT_LOCALE,\n): string {\n const value = amount / 100;\n const formatter =\n createFormatter(locale, currency) ??\n createFormatter(DEFAULT_LOCALE, currency);\n\n return formatter != null\n ? formatter.format(value)\n : `${value.toFixed(2)} ${currency}`;\n}\n"]}
package/dist/course.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk3IVLQILFjs = require('./chunk-3IVLQILF.js');var _chunkUFIOJGJZjs = require('./chunk-UFIOJGJZ.js');var _chunkQ25D7OAOjs = require('./chunk-Q25D7OAO.js');var _chunkWGJTXDISjs = require('./chunk-WGJTXDIS.js');require('./chunk-XIHGWNTS.js');require('./chunk-JSDGZ4NY.js');var _lucidereact = require('lucide-react');var _react = require('react');function De(e){let t={},s=_optionalChain([e, 'optionalAccess', _2 => _2.brand, 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()]),o=_optionalChain([e, 'optionalAccess', _5 => _5.brandDark, 'optionalAccess', _6 => _6.trim, 'call', _7 => _7()])||s;if(s){t["--course-accent"]=s;let n=_chunkUFIOJGJZjs.s.call(void 0, s);n&&(t["--course-accent-fg"]=n)}if(o){t["--course-accent-dark"]=o;let n=_chunkUFIOJGJZjs.s.call(void 0, o);n&&(t["--course-accent-dark-fg"]=n)}return t}var He=_react.createContext.call(void 0, void 0),qe=He.Provider;function h(){let e=_react.useContext.call(void 0, He);if(e==null)throw new Error("Course components have to be rendered inside PanelCourse");return e}function Q(){let{analytics:e,preview:t}=h();return _react.useCallback.call(void 0, (s,o)=>{t||_optionalChain([e, 'optionalAccess', _8 => _8.courseId])==null||e.instrument.track(s,{...o,course_id:e.courseId})},[e,t])}function ce(e){return[...e.sections.flatMap(t=>t.items.map(s=>({...s,sectionId:t.id}))),...e.finalItems.map(t=>({...t,sectionId:""}))]}function le(e,t){if(!(t==null||t===""))return ce(e).find(s=>s.id===t)}function ye(e,t){let s=ce(e),o=s.findIndex(n=>n.id===t);return o<0?{}:{prev:s[o-1],next:s[o+1]}}function Oe(e,t){let{next:s}=ye(e,t);return s!=null&&s.kind==="lesson"&&!s.locked?s:void 0}function zt(e){let t=0,s=0;for(let o of e.sections)for(let n of o.items)n.kind==="lesson"&&(t+=1,n.completed&&(s+=1));return{total:t,completed:s,percent:t===0?0:Math.round(s/t*100)}}function $e(e,t){let s=e.sections.map(n=>({...n,items:n.items.map(i=>i.id===t&&i.kind==="lesson"?{...i,completed:!0}:i)})),o=zt({sections:s});return{...e,sections:s,totalLessons:o.total,completedLessons:o.completed,progressPercent:o.percent}}function et(e,t){return le(e,t)!=null?t:_optionalChain([le, 'call', _9 => _9(e,e.resumeItemId), 'optionalAccess', _10 => _10.locked])===!1?e.resumeItemId:_optionalChain([ce, 'call', _11 => _11(e), 'access', _12 => _12.find, 'call', _13 => _13(s=>!s.locked), 'optionalAccess', _14 => _14.id])}function w(e,t){return e.replace(/\{(\w+)\}/g,(s,o)=>o in t?String(t[o]):s)}function tt(e,t){return t>0&&e/t>=.8}function st(e,t){return e<5||t>0&&e>=t-5?0:Math.floor(e)}function Se(e){let t=Math.max(0,Math.floor(e)),s=Math.floor(t/3600),o=Math.floor(t%3600/60),n=String(t%60).padStart(2,"0");return s>0?`${s}:${String(o).padStart(2,"0")}:${n}`:`${o}:${n}`}function nt(e){if(!(e>0))return"0 B";let t=["B","KB","MB","GB"],s=Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1),o=e/1024**s;return`${s===0||o>=10?Math.round(o):o.toFixed(1)} ${t[s]}`}function ot(e){switch(e.type){case"mcq":return{type:"mcq",selectedIds:[]};case"todolist":return{type:"todolist",checkedIds:[]};case"fill_gap":return{type:"fill_gap",values:{}};case"sort_order":return{type:"sort_order",orderedIds:e.items.map(t=>t.id)}}}function Qt(e,t){if(t==null||t.type!==e.config.type)return!1;switch(t.type){case"mcq":return t.selectedIds.length>0;case"todolist":return t.checkedIds.length>0;case"fill_gap":return Object.values(t.values).some(s=>s.trim()!=="");case"sort_order":return t.orderedIds.length>0}}function rt(e,t){return e.filter(s=>!Qt(s,t[s.id])).length}function at(e,t,s){if(t===s||t<0||s<0||t>=e.length||s>=e.length)return[...e];let o=[...e],[n]=o.splice(t,1);return o.splice(s,0,n),o}function he(e,t){let s=[],o=/\{\{\s*([^{}\s]+)\s*\}\}/g,n=0;for(let i of e.matchAll(o)){let a=i[1];t.includes(a)&&(i.index>n&&s.push({type:"text",text:e.slice(n,i.index)}),s.push({type:"blank",id:a}),n=i.index+i[0].length)}return n<e.length&&s.push({type:"text",text:e.slice(n)}),s}function it(e,t){let{config:s}=e;if(t==null||t.type!==s.type)return"";let o=(n,i)=>_nullishCoalesce(_optionalChain([n, 'access', _15 => _15.find, 'call', _16 => _16(a=>a.id===i), 'optionalAccess', _17 => _17.label]), () => (i));return s.type==="mcq"&&t.type==="mcq"?t.selectedIds.map(n=>o(s.choices,n)).join(", "):s.type==="todolist"&&t.type==="todolist"?t.checkedIds.map(n=>o(s.steps,n)).join(", "):s.type==="sort_order"&&t.type==="sort_order"?t.orderedIds.map(n=>o(s.items,n)).join(" \u2192 "):s.type==="fill_gap"&&t.type==="fill_gap"?he(s.template,s.blanks).map(n=>n.type==="text"?n.text:`[${_nullishCoalesce(t.values[n.id], () => (""))}]`).join(""):""}var _jsxruntime = require('react/jsx-runtime');function lt({item:e}){return e.locked?_jsxruntime.jsx.call(void 0, _lucidereact.Lock,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.completed?_jsxruntime.jsx.call(void 0, _lucidereact.CheckCircle2,{className:"size-4 text-emerald-600 dark:text-emerald-400","aria-hidden":!0}):e.kind==="test"?_jsxruntime.jsx.call(void 0, _lucidereact.ClipboardCheck,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.durationSeconds>0?_jsxruntime.jsx.call(void 0, _lucidereact.PlayCircle,{className:"size-4 text-neutral-500","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.FileText,{className:"size-4 text-neutral-500","aria-hidden":!0})}function Jt({item:e,selected:t,variant:s,onSelect:o}){let{texts:n}=h(),i=e.lockReason?w(n.lockedByTest,{test:e.lockReason.gatingTestTitle}):n.locked,a=e.locked?i:e.completed?n.completed:void 0;return _jsxruntime.jsx.call(void 0, "li",{children:_jsxruntime.jsxs.call(void 0, "button",{type:"button","data-item-id":e.id,"data-locked":e.locked||void 0,"aria-current":t?"true":void 0,"aria-disabled":e.locked||void 0,title:e.locked?i:void 0,onClick:()=>{e.locked||o(e)},className:_chunkQ25D7OAOjs.d.call(void 0, "flex w-full items-start gap-3 rounded-lg p-2 text-left text-sm outline-none transition focus-visible:ring-[3px] focus-visible:ring-ring/50",t?"bg-neutral-200 dark:bg-neutral-700":"hover:bg-neutral-100 dark:hover:bg-neutral-800",e.locked&&"cursor-not-allowed opacity-60 hover:bg-transparent dark:hover:bg-transparent"),children:[s==="playlist"&&e.kind==="lesson"&&_jsxruntime.jsxs.call(void 0, "span",{className:"relative aspect-video w-24 shrink-0 overflow-hidden rounded bg-neutral-200 dark:bg-neutral-800",children:[e.thumbnailUrl&&_jsxruntime.jsx.call(void 0, "img",{src:e.thumbnailUrl,alt:"",loading:"lazy",draggable:!1,className:"size-full object-cover"}),e.durationSeconds>0&&_jsxruntime.jsx.call(void 0, "span",{className:"absolute right-1 bottom-1 rounded bg-black/75 px-1 text-[10px] text-white",children:Se(e.durationSeconds)})]}),(s==="modules"||e.kind==="test")&&_jsxruntime.jsx.call(void 0, "span",{className:"mt-0.5 shrink-0",children:_jsxruntime.jsx.call(void 0, lt,{item:e})}),_jsxruntime.jsxs.call(void 0, "span",{className:"min-w-0 flex-1",children:[_jsxruntime.jsx.call(void 0, "span",{className:"block font-medium break-words",children:e.title}),_jsxruntime.jsxs.call(void 0, "span",{className:"mt-0.5 flex flex-wrap items-center gap-x-2 text-xs text-neutral-500 dark:text-neutral-400",children:[e.kind==="test"&&_jsxruntime.jsx.call(void 0, "span",{children:n.testBadge}),e.isFree&&!e.locked&&_jsxruntime.jsx.call(void 0, "span",{children:n.free}),s==="modules"&&e.durationSeconds>0&&_jsxruntime.jsx.call(void 0, "span",{children:Se(e.durationSeconds)}),a&&_jsxruntime.jsx.call(void 0, "span",{children:a})]})]}),s==="playlist"&&e.kind==="lesson"&&_jsxruntime.jsx.call(void 0, "span",{className:"mt-0.5 shrink-0",children:_jsxruntime.jsx.call(void 0, lt,{item:e})})]})})}function ct({course:e,selectedId:t,onSelect:s,variant:o,className:n}){let{texts:i}=h(),a=r=>_jsxruntime.jsx.call(void 0, "ul",{className:"flex flex-col gap-1",children:r.map(c=>_jsxruntime.jsx.call(void 0, Jt,{item:c,selected:c.id===t,variant:o,onSelect:s},c.id))});return _jsxruntime.jsxs.call(void 0, "nav",{"aria-label":i.contents,className:_chunkQ25D7OAOjs.d.call(void 0, "space-y-4",n),children:[e.sections.map(r=>{let c=r.items.filter(y=>y.kind==="lesson"),b=c.filter(y=>y.completed).length;return _jsxruntime.jsxs.call(void 0, "section",{"data-section-id":r.id,children:[_jsxruntime.jsxs.call(void 0, "h3",{className:"mb-1 flex items-baseline justify-between gap-2 px-2 text-sm font-semibold",children:[_jsxruntime.jsx.call(void 0, "span",{className:"break-words",children:r.title}),c.length>0&&_jsxruntime.jsxs.call(void 0, "span",{className:"shrink-0 text-xs font-normal text-neutral-500 dark:text-neutral-400",children:[b,"/",c.length]})]}),a(r.items)]},r.id)}),e.finalItems.length>0&&_jsxruntime.jsx.call(void 0, "section",{"data-section-id":"final",children:a(e.finalItems)})]})}var _connect = require('@connectrpc/connect');var _codegenv2 = require('@bufbuild/protobuf/codegenv2');var _wkt = require('@bufbuild/protobuf/wkt');var qt=_codegenv2.fileDesc.call(void 0, "CiFwdWJsaWMvdjEvdXNlcl9wYW5lbF9jb3Vyc2UucHJvdG8SDXB1YmxpY19hcGkudjEiRAoPUGFuZWxMb2NrUmVhc29uEhYKDmdhdGluZ190ZXN0X2lkGAEgASgJEhkKEWdhdGluZ190ZXN0X3RpdGxlGAIgASgJIrQCCg9QYW5lbENvdXJzZUl0ZW0SCgoCaWQYASABKAkSMAoEa2luZBgCIAEoDjIiLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtS2luZBINCgV0aXRsZRgDIAEoCRIPCgdpc19mcmVlGAQgASgIEg4KBmxvY2tlZBgFIAEoCBI4Cgtsb2NrX3JlYXNvbhgGIAEoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxMb2NrUmVhc29uSACIAQESEQoJY29tcGxldGVkGAcgASgIEhgKEGR1cmF0aW9uX3NlY29uZHMYCCABKAUSGgoNdGh1bWJuYWlsX3VybBgJIAEoCUgBiAEBEg4KBmdhdGluZxgKIAEoCEIOCgxfbG9ja19yZWFzb25CEAoOX3RodW1ibmFpbF91cmwicwoSUGFuZWxDb3Vyc2VTZWN0aW9uEgoKAmlkGAEgASgJEg0KBXRpdGxlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEi0KBWl0ZW1zGAQgAygLMh4ucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUl0ZW0i3wIKC1BhbmVsQ291cnNlEgoKAmlkGAEgASgJEiwKBHR5cGUYAiABKA4yHi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlVHlwZRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRIWCgljb3Zlcl91cmwYBSABKAlIAIgBARIVCg10b3RhbF9sZXNzb25zGAYgASgFEhkKEWNvbXBsZXRlZF9sZXNzb25zGAcgASgFEhgKEHByb2dyZXNzX3BlcmNlbnQYCCABKAUSMwoIc2VjdGlvbnMYCSADKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlU2VjdGlvbhIzCgtmaW5hbF9pdGVtcxgKIAMoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtEhYKDnJlc3VtZV9pdGVtX2lkGAsgASgJQgwKCl9jb3Zlcl91cmwiRAoZVXNlclBhbmVsR2V0Q291cnNlUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJIosBChpVc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRItCgdzdWNjZXNzGAEgASgLMhoucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJfCgpQYW5lbFZpZGVvEg8KB2hsc191cmwYASABKAkSFwoKcG9zdGVyX3VybBgCIAEoCUgAiAEBEhgKEGR1cmF0aW9uX3NlY29uZHMYAyABKAVCDQoLX3Bvc3Rlcl91cmwiRgoPUGFuZWxBdHRhY2htZW50EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2l6ZRgDIAEoAxILCgN1cmwYBCABKAkiTAoMUGFuZWxJdGVtUmVmEgoKAmlkGAEgASgJEjAKBGtpbmQYAiABKA4yIi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlSXRlbUtpbmQigQQKC1BhbmVsTGVzc29uEgoKAmlkGAEgASgJEhIKCnNlY3Rpb25faWQYAiABKAkSDQoFdGl0bGUYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSFAoMY29udGVudF9odG1sGAUgASgJEi0KBXZpZGVvGAYgASgLMhkucHVibGljX2FwaS52MS5QYW5lbFZpZGVvSACIAQESMwoLYXR0YWNobWVudHMYByADKAsyHi5wdWJsaWNfYXBpLnYxLlBhbmVsQXR0YWNobWVudBIuCgRwcmV2GAggASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAYgBARIuCgRuZXh0GAkgASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAogBARIRCgljb21wbGV0ZWQYCiABKAgSGAoQcG9zaXRpb25fc2Vjb25kcxgLIAEoBRIRCglteV9yYXRpbmcYDCABKAUSFgoOYXZlcmFnZV9yYXRpbmcYDSABKAISFAoMcmF0aW5nX2NvdW50GA4gASgFEjcKDnVybHNfZXhwaXJlX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDiAEBQggKBl92aWRlb0IHCgVfcHJldkIHCgVfbmV4dEIRCg9fdXJsc19leHBpcmVfYXQiVwoZVXNlclBhbmVsR2V0TGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCSKLAQoaVXNlclBhbmVsR2V0TGVzc29uUmVzcG9uc2USLQoHc3VjY2VzcxgBIAEoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25IABI0CgdmYWlsdXJlGAIgASgOMiEucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUZhaWx1cmVIAEIICgZyZXN1bHQipwEKIlVzZXJQYW5lbFNhdmVMZXNzb25Qcm9ncmVzc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAkSEQoJY29tcGxldGVkGAQgASgIEhgKEHBvc2l0aW9uX3NlY29uZHMYBSABKAUSGAoQZHVyYXRpb25fc2Vjb25kcxgGIAEoBSKFAgojVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USTAoHc3VjY2VzcxgBIAEoCzI5LnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaUAoGUmVzdWx0EhEKCWNvbXBsZXRlZBgBIAEoCBIZChFjb21wbGV0ZWRfbGVzc29ucxgCIAEoBRIYChBwcm9ncmVzc19wZXJjZW50GAMgASgFQggKBnJlc3VsdCIoCgtQYW5lbENob2ljZRIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCSJPCg5QYW5lbE1jcUNvbmZpZxIrCgdjaG9pY2VzGAEgAygLMhoucHVibGljX2FwaS52MS5QYW5lbENob2ljZRIQCghtdWx0aXBsZRgCIAEoCCKCAQoTUGFuZWxUb2RvbGlzdENvbmZpZxI2CgVzdGVwcxgBIAMoCzInLnB1YmxpY19hcGkudjEuUGFuZWxUb2RvbGlzdENvbmZpZy5TdGVwGjMKBFN0ZXASCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEAoIcmVxdWlyZWQYAyABKAgiNgoSUGFuZWxGaWxsR2FwQ29uZmlnEhAKCHRlbXBsYXRlGAEgASgJEg4KBmJsYW5rcxgCIAMoCSJBChRQYW5lbFNvcnRPcmRlckNvbmZpZxIpCgVpdGVtcxgBIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxDaG9pY2UioQIKEVBhbmVsVGVzdFF1ZXN0aW9uEgoKAmlkGAEgASgJEg4KBnByb21wdBgCIAEoCRIOCgZwb2ludHMYAyABKAUSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUNvbmZpZ0gAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0Q29uZmlnSAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcENvbmZpZ0gAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQ29uZmlnSABCCAoGY29uZmlnIqsCCglQYW5lbFRlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSDgoGZ2F0aW5nGAQgASgIEh4KFnBhc3NfdGhyZXNob2xkX3BlcmNlbnQYBSABKAUSGAoQYXR0ZW1wdHNfYWxsb3dlZBgGIAEoBRIaCg1hdHRlbXB0c19sZWZ0GAcgASgFSACIAQESFQoNYXR0ZW1wdF9jb3VudBgIIAEoBRIaChJiZXN0X3Njb3JlX3BlcmNlbnQYCSABKAUSDgoGcGFzc2VkGAogASgIEjMKCXF1ZXN0aW9ucxgLIAMoCzIgLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0UXVlc3Rpb25CEAoOX2F0dGVtcHRzX2xlZnQiUwoXVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIPCgd0ZXN0X2lkGAMgASgJIocBChhVc2VyUGFuZWxHZXRUZXN0UmVzcG9uc2USKwoHc3VjY2VzcxgBIAEoCzIYLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSABCCAoGcmVzdWx0IiYKDlBhbmVsTWNxQW5zd2VyEhQKDHNlbGVjdGVkX2lkcxgBIAMoCSIqChNQYW5lbFRvZG9saXN0QW5zd2VyEhMKC2NoZWNrZWRfaWRzGAEgAygJIoIBChJQYW5lbEZpbGxHYXBBbnN3ZXISPQoGdmFsdWVzGAEgAygLMi0ucHVibGljX2FwaS52MS5QYW5lbEZpbGxHYXBBbnN3ZXIuVmFsdWVzRW50cnkaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChRQYW5lbFNvcnRPcmRlckFuc3dlchITCgtvcmRlcmVkX2lkcxgBIAMoCSKDAgoLUGFuZWxBbnN3ZXISEwoLcXVlc3Rpb25faWQYASABKAkSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUFuc3dlckgAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0QW5zd2VySAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcEFuc3dlckgAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQW5zd2VySABCBwoFdmFsdWUijQEKE1BhbmVsVGVzdFN1Ym1pc3Npb24SCgoCaWQYASABKAkSFQoNc2NvcmVfcGVyY2VudBgCIAEoBRIOCgZwYXNzZWQYAyABKAgSEwoLZHVyYXRpb25fbXMYBCABKAMSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAilwEKE1BhbmVsUXVlc3Rpb25SZXN1bHQSEwoLcXVlc3Rpb25faWQYASABKAkSDwoHY29ycmVjdBgCIAEoCBIOCgZwb2ludHMYAyABKAUSNwoOY29ycmVjdF9hbnN3ZXIYBCABKAsyGi5wdWJsaWNfYXBpLnYxLlBhbmVsQW5zd2VySACIAQFCEQoPX2NvcnJlY3RfYW5zd2VyIpgBChpVc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkSKwoHYW5zd2VycxgEIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxBbnN3ZXISEwoLZHVyYXRpb25fbXMYBSABKAMiyQIKG1VzZXJQYW5lbFN1Ym1pdFRlc3RSZXNwb25zZRJECgdzdWNjZXNzGAEgASgLMjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaowEKBlJlc3VsdBI2CgpzdWJtaXNzaW9uGAEgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEjMKB3Jlc3VsdHMYAiADKAsyIi5wdWJsaWNfYXBpLnYxLlBhbmVsUXVlc3Rpb25SZXN1bHQSGgoNYXR0ZW1wdHNfbGVmdBgDIAEoBUgAiAEBQhAKDl9hdHRlbXB0c19sZWZ0QggKBnJlc3VsdCJfCiNVc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkiqwIKJFVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAadAoGUmVzdWx0EjcKC3N1Ym1pc3Npb25zGAEgAygLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEhoKEmJlc3Rfc2NvcmVfcGVyY2VudBgCIAEoBRIVCg1hdHRlbXB0X2NvdW50GAMgASgFQggKBnJlc3VsdCJWChNQYW5lbFF1ZXN0aW9uQW5zd2VyEg8KB2NvbnRlbnQYASABKAkSLgoKY3JlYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAizAEKE1BhbmVsTGVzc29uUXVlc3Rpb24SCgoCaWQYASABKAkSDwoHY29udGVudBgCIAEoCRITCgthdXRob3JfbmFtZRgDIAEoCRIPCgdpc19taW5lGAQgASgIEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjcKBmFuc3dlchgGIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxRdWVzdGlvbkFuc3dlckgAiAEBQgkKB19hbnN3ZXIiYQojVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAki9gEKJFVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0TGVzc29uUXVlc3Rpb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaPwoGUmVzdWx0EjUKCXF1ZXN0aW9ucxgBIAMoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkIICgZyZXN1bHQicAohVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0EhQKDGFjY2Vzc190b2tlbhgBIAEoCRIRCglhY2Nlc3NfaWQYAiABKAkSEQoJbGVzc29uX2lkGAMgASgJEg8KB2NvbnRlbnQYBCABKAkimwEKIlVzZXJQYW5lbEFza0xlc3NvblF1ZXN0aW9uUmVzcG9uc2USNQoHc3VjY2VzcxgBIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJ4ChpVc2VyUGFuZWxSYXRlTGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCRINCgVzY29yZRgEIAEoBRIPCgdjb21tZW50GAUgASgJIu4BChtVc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2USRAoHc3VjY2VzcxgBIAEoCzIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsUmF0ZUxlc3NvblJlc3BvbnNlLlJlc3VsdEgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAGkkKBlJlc3VsdBIRCglteV9yYXRpbmcYASABKAUSFgoOYXZlcmFnZV9yYXRpbmcYAiABKAISFAoMcmF0aW5nX2NvdW50GAMgASgFQggKBnJlc3VsdCr6AgoSUGFuZWxDb3Vyc2VGYWlsdXJlEiAKHFBBTkVMX0NPVVJTRV9GQUlMVVJFX1VOS05PV04QABIlCiFQQU5FTF9DT1VSU0VfRkFJTFVSRV9VTkFVVEhPUklaRUQQARIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9DT1VSU0VfTk9UX0ZPVU5EEAISJwojUEFORUxfQ09VUlNFX0ZBSUxVUkVfSVRFTV9OT1RfRk9VTkQQAxIkCiBQQU5FTF9DT1VSU0VfRkFJTFVSRV9JVEVNX0xPQ0tFRBAEEikKJVBBTkVMX0NPVVJTRV9GQUlMVVJFX05PX0FUVEVNUFRTX0xFRlQQBRIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9JTlZBTElEX0FSR1VNRU5UEAYSJQohUEFORUxfQ09VUlNFX0ZBSUxVUkVfUkFURV9MSU1JVEVEEAcSJAogUEFORUxfQ09VUlNFX0ZBSUxVUkVfVU5BVkFJTEFCTEUQCCptCg9QYW5lbENvdXJzZVR5cGUSHQoZUEFORUxfQ09VUlNFX1RZUEVfVU5LTk9XThAAEh4KGlBBTkVMX0NPVVJTRV9UWVBFX1NUQU5EQVJEEAESGwoXUEFORUxfQ09VUlNFX1RZUEVfVklERU8QAip9ChNQYW5lbENvdXJzZUl0ZW1LaW5kEiIKHlBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfVU5LTk9XThAAEiEKHVBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfTEVTU09OEAESHwobUEFORUxfQ09VUlNFX0lURU1fS0lORF9URVNUEAIy+QcKFlVzZXJQYW5lbENvdXJzZVNlcnZpY2USYAoJR2V0Q291cnNlEigucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXF1ZXN0GikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRJgCglHZXRMZXNzb24SKC5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlcXVlc3QaKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlc3BvbnNlEnsKElNhdmVMZXNzb25Qcm9ncmVzcxIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVxdWVzdBoyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USWgoHR2V0VGVzdBImLnB1YmxpY19hcGkudjEuVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QaJy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldFRlc3RSZXNwb25zZRJjCgpTdWJtaXRUZXN0EikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBoqLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU3VibWl0VGVzdFJlc3BvbnNlEn4KE0xpc3RUZXN0U3VibWlzc2lvbnMSMi5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXF1ZXN0GjMucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2USfgoTTGlzdExlc3NvblF1ZXN0aW9ucxIyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QaMy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJ4ChFBc2tMZXNzb25RdWVzdGlvbhIwLnB1YmxpY19hcGkudjEuVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0GjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxBc2tMZXNzb25RdWVzdGlvblJlc3BvbnNlEmMKClJhdGVMZXNzb24SKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbFJhdGVMZXNzb25SZXF1ZXN0GioucHVibGljX2FwaS52MS5Vc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2ViBnByb3RvMw",[_wkt.file_google_protobuf_timestamp]);var ut=_codegenv2.serviceDesc.call(void 0, qt,0);var Z=class extends Error{constructor(t,s){super(_nullishCoalesce(s, () => (t))),this.name="CourseError",this.code=t}};var $t={0:"unknown",1:"unauthorized",2:"course_not_found",3:"item_not_found",4:"item_locked",5:"no_attempts_left",6:"invalid_argument",7:"rate_limited",8:"unavailable"};function es(e){return _nullishCoalesce($t[e], () => ("unknown"))}function ts(e){if(e instanceof Z)return e;let t=_connect.ConnectError.from(e);switch(t.code){case _connect.Code.Unauthenticated:case _connect.Code.PermissionDenied:return new Z("unauthorized",t.rawMessage);case _connect.Code.NotFound:return new Z("course_not_found",t.rawMessage);case _connect.Code.ResourceExhausted:return new Z("rate_limited",t.rawMessage);case _connect.Code.Unavailable:case _connect.Code.DeadlineExceeded:return new Z("unavailable",t.rawMessage);default:return e}}function F(e){let{result:t}=e;if(t.case==="success")return t.value;throw t.case==="failure"?new Z(es(t.value)):new Z("unknown","empty response")}function dt(e){return{id:e.id,kind:e.kind===2?"test":"lesson",title:e.title,isFree:e.isFree,locked:e.locked,lockReason:e.locked&&e.lockReason!=null?{gatingTestId:e.lockReason.gatingTestId,gatingTestTitle:e.lockReason.gatingTestTitle}:void 0,completed:e.completed,durationSeconds:e.durationSeconds,thumbnailUrl:e.thumbnailUrl||void 0,gating:e.gating}}function ss(e){return{id:e.id,type:e.type===2?"video":"standard",title:e.title,description:e.description,coverUrl:e.coverUrl||void 0,totalLessons:e.totalLessons,completedLessons:e.completedLessons,progressPercent:e.progressPercent,sections:e.sections.map(t=>({id:t.id,title:t.title,description:t.description,items:t.items.map(dt)})),finalItems:e.finalItems.map(dt),resumeItemId:e.resumeItemId}}function pt(e){return e==null?void 0:{id:e.id,kind:e.kind===2?"test":"lesson"}}function ns(e){return{id:e.id,sectionId:e.sectionId,title:e.title,description:e.description,contentHtml:e.contentHtml,video:e.video!=null&&e.video.hlsUrl!==""?{hlsUrl:e.video.hlsUrl,posterUrl:e.video.posterUrl||void 0,durationSeconds:e.video.durationSeconds}:void 0,attachments:e.attachments.map(t=>({id:t.id,name:t.name,size:Number(t.size),url:t.url})),prev:pt(e.prev),next:pt(e.next),completed:e.completed,positionSeconds:e.positionSeconds,myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount,urlsExpireAt:e.urlsExpireAt!=null?_wkt.timestampDate.call(void 0, e.urlsExpireAt):void 0}}function os(e){let t={id:e.id,prompt:e.prompt,points:e.points},{config:s}=e;switch(s.case){case"mcq":return{...t,config:{type:"mcq",choices:s.value.choices.map(o=>({id:o.id,label:o.label})),multiple:s.value.multiple}};case"todolist":return{...t,config:{type:"todolist",steps:s.value.steps.map(o=>({id:o.id,label:o.label,required:o.required}))}};case"fillGap":return{...t,config:{type:"fill_gap",template:s.value.template,blanks:[...s.value.blanks]}};case"sortOrder":return{...t,config:{type:"sort_order",items:s.value.items.map(o=>({id:o.id,label:o.label}))}};default:return}}function rs(e){return{id:e.id,title:e.title,description:e.description,gating:e.gating,passThresholdPercent:e.passThresholdPercent,attemptsAllowed:e.attemptsAllowed,attemptsLeft:e.attemptsLeft,attemptCount:e.attemptCount,bestScorePercent:e.bestScorePercent,passed:e.passed,questions:e.questions.map(os).filter(t=>t!=null)}}function mt(e){return{id:e.id,scorePercent:e.scorePercent,passed:e.passed,durationMs:Number(e.durationMs),createdAt:e.createdAt!=null?_wkt.timestampDate.call(void 0, e.createdAt):void 0}}function as(e){let{value:t}=e;switch(t.case){case"mcq":return{type:"mcq",selectedIds:[...t.value.selectedIds]};case"todolist":return{type:"todolist",checkedIds:[...t.value.checkedIds]};case"fillGap":return{type:"fill_gap",values:{...t.value.values}};case"sortOrder":return{type:"sort_order",orderedIds:[...t.value.orderedIds]};default:return}}function is(e,t){switch(t.type){case"mcq":return{questionId:e,value:{case:"mcq",value:{selectedIds:t.selectedIds}}};case"todolist":return{questionId:e,value:{case:"todolist",value:{checkedIds:t.checkedIds}}};case"fill_gap":return{questionId:e,value:{case:"fillGap",value:{values:t.values}}};case"sort_order":return{questionId:e,value:{case:"sortOrder",value:{orderedIds:t.orderedIds}}}}}function gt(e){return{id:e.id,content:e.content,authorName:e.authorName,isMine:e.isMine,createdAt:e.createdAt!=null?_wkt.timestampDate.call(void 0, e.createdAt):void 0,answer:e.answer!=null?{content:e.answer.content,createdAt:e.answer.createdAt!=null?_wkt.timestampDate.call(void 0, e.answer.createdAt):void 0}:void 0}}function ve(e,t){let s=()=>({accessId:t.accessId,accessToken:typeof t.accessToken=="function"?_nullishCoalesce(t.accessToken(), () => ("")):t.accessToken});async function o(n){try{return await n()}catch(i){throw ts(i)}}return{getCourse:()=>o(async()=>ss(F(await e.getCourse(s())))),getLesson:n=>o(async()=>ns(F(await e.getLesson({...s(),lessonId:n})))),saveProgress:n=>o(async()=>{let i=F(await e.saveLessonProgress({...s(),...n}));return{completed:i.completed,completedLessons:i.completedLessons,progressPercent:i.progressPercent}}),getTest:n=>o(async()=>rs(F(await e.getTest({...s(),testId:n})))),submitTest:(n,i,a)=>o(async()=>{let r=F(await e.submitTest({...s(),testId:n,durationMs:BigInt(Math.max(0,Math.round(a))),answers:Object.entries(i).map(([c,b])=>is(c,b))}));if(r.submission==null)throw new Z("unknown","missing submission");return{submission:mt(r.submission),results:r.results.map(c=>({questionId:c.questionId,correct:c.correct,points:c.points,correctAnswer:c.correctAnswer!=null?as(c.correctAnswer):void 0})),attemptsLeft:r.attemptsLeft}}),listSubmissions:n=>o(async()=>{let i=F(await e.listTestSubmissions({...s(),testId:n}));return{submissions:i.submissions.map(mt),bestScorePercent:i.bestScorePercent,attemptCount:i.attemptCount}}),listQuestions:n=>o(async()=>F(await e.listLessonQuestions({...s(),lessonId:n})).questions.map(gt)),askQuestion:(n,i)=>o(async()=>gt(F(await e.askLessonQuestion({...s(),lessonId:n,content:i})))),rate:(n,i,a="")=>o(async()=>{let r=F(await e.rateLesson({...s(),lessonId:n,score:i,comment:a}));return{myRating:r.myRating,averageRating:r.averageRating,ratingCount:r.ratingCount}})}}function Ce(e){let t=_nullishCoalesce(e.host, () => (_chunkUFIOJGJZjs.m.call(void 0, ))),s=_connect.createClient.call(void 0, ut,_chunkUFIOJGJZjs.n.call(void 0, t));return ve(s,{accessId:e.accessId,accessToken:_nullishCoalesce(e.accessToken, () => ((()=>{let{projectID:o,host:n}=_chunk3IVLQILFjs.b.call(void 0, );return _chunk3IVLQILFjs.k.call(void 0, o,n)})))})}function bt({value:e,onSelect:t,disabled:s}){let{texts:o}=h(),[n,i]=_react.useState.call(void 0, 0),a=n||e;return _jsxruntime.jsx.call(void 0, "div",{className:"flex items-center gap-1",role:t?"radiogroup":"img","aria-label":w(o.rateStar,{n:Math.round(e)}),children:[1,2,3,4,5].map(r=>{let c=r<=Math.round(a),b=_jsxruntime.jsx.call(void 0, _lucidereact.Star,{className:_chunkQ25D7OAOjs.d.call(void 0, "size-5",c?"fill-amber-400 text-amber-400":"text-neutral-300 dark:text-neutral-600"),"aria-hidden":!0});return t?_jsxruntime.jsx.call(void 0, "button",{type:"button",role:"radio","aria-checked":r===e,"aria-label":w(o.rateStar,{n:r}),disabled:s,className:"rounded p-0.5 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",onMouseEnter:()=>i(r),onMouseLeave:()=>i(0),onClick:()=>t(r),children:b},r):_jsxruntime.jsx.call(void 0, "span",{children:b},r)})})}var ft="bg-[var(--course-accent,var(--primary))] text-[var(--course-accent-fg,var(--primary-foreground))] dark:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))] dark:text-[var(--course-accent-dark-fg,var(--course-accent-fg,var(--primary-foreground)))]",$=_chunkQ25D7OAOjs.d.call(void 0, ft,"hover:bg-[var(--course-accent,var(--primary))] hover:opacity-90 dark:hover:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))]"),z="rounded-xl bg-white p-4 drop-shadow-xl sm:p-6 dark:border dark:border-neutral-700 dark:bg-neutral-900 dark:drop-shadow-none";function J(e,t){if(e instanceof Z)switch(e.code){case"unauthorized":return t.errorUnauthorized;case"course_not_found":case"item_not_found":return t.errorNotFound;case"unavailable":return t.errorUnavailable}return t.errorGeneric}function ee({error:e,onRetry:t,className:s}){let{texts:o}=h();return _jsxruntime.jsxs.call(void 0, "div",{role:"alert",className:_chunkQ25D7OAOjs.d.call(void 0, "flex flex-col items-start gap-3 rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",s),children:[_jsxruntime.jsxs.call(void 0, "p",{className:"flex items-center gap-2 font-medium",children:[_jsxruntime.jsx.call(void 0, _lucidereact.AlertTriangle,{className:"size-4 shrink-0","aria-hidden":!0}),J(e,o)]}),t&&_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{variant:"outline",size:"sm",onClick:t,children:o.retry})]})}function ue({label:e}){let{texts:t}=h();return _jsxruntime.jsxs.call(void 0, "div",{role:"status","aria-label":_nullishCoalesce(e, () => (t.loading)),className:"space-y-3",children:[_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.u,{className:"aspect-video w-full"}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.u,{className:"h-6 w-2/3"}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.u,{className:"h-4 w-full"}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.u,{className:"h-4 w-5/6"})]})}function At({percent:e,label:t}){let s=Math.max(0,Math.min(100,Math.round(e)));return _jsxruntime.jsx.call(void 0, "div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":s,"aria-label":t,className:"h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-700",children:_jsxruntime.jsx.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, "h-full rounded-full transition-all duration-300",ft),style:{width:`${s}%`}})})}function j(e,t,s){let[o,n]=_react.useState.call(void 0, s!==void 0?{status:"success",data:s}:{status:"loading"}),[i,a]=_react.useState.call(void 0, 0),r=_react.useRef.call(void 0, 0),c=_react.useRef.call(void 0, e);c.current=e;let b=_react.useRef.call(void 0, s!==void 0);_react.useEffect.call(void 0, ()=>{if(b.current){b.current=!1;return}let p=++r.current;return n({status:"loading"}),c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(A=>{p===r.current&&n({status:"error",error:A})}),()=>{r.current+=1}},[...t,i]);let y=_react.useCallback.call(void 0, ()=>a(p=>p+1),[]),f=_react.useCallback.call(void 0, ()=>{let p=++r.current;c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(()=>{})},[]),d=_react.useCallback.call(void 0, p=>{n(A=>A.status==="success"?{status:"success",data:p(A.data)}:A)},[]);return{...o,reload:y,refresh:f,mutate:d}}function St({lessonId:e,initial:t}){let{dataSource:s,texts:o,preview:n}=h(),i=Q(),[a,r]=_react.useState.call(void 0, t),[c,b]=_react.useState.call(void 0, t.myRating),[y,f]=_react.useState.call(void 0, ""),[d,p]=_react.useState.call(void 0, "idle"),[A,C]=_react.useState.call(void 0, );async function I(){if(!(c<1)){p("saving");try{r(await s.rate(e,c,y.trim())),p("saved"),i("lesson_rated",{lesson_id:e,rating:c})}catch(g){C(g),p("error")}}}return _jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`rate-${e}`,className:"space-y-3",children:[_jsxruntime.jsx.call(void 0, "h3",{id:`rate-${e}`,className:"text-lg font-semibold",children:o.rateTitle}),_jsxruntime.jsx.call(void 0, bt,{value:c,onSelect:g=>{b(g),p("idle")},disabled:n||d==="saving"}),a.ratingCount>0&&_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(o.rateAverage,{average:a.averageRating.toFixed(1),count:a.ratingCount})}),!n&&c>0&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.v,{value:y,maxLength:1e3,placeholder:o.ratePlaceholder,onChange:g=>{f(g.target.value),p("idle")}}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{size:"sm",className:$,disabled:d==="saving",onClick:I,children:o.rateSubmit})]}),d==="saved"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:o.rateSaved}),d==="error"&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(A,o)})]})}function yt(e){return e==null?"":e.toLocaleDateString()}function ht({lessonId:e}){let{dataSource:t,texts:s,preview:o}=h(),n=j(()=>t.listQuestions(e),[t,e]),[i,a]=_react.useState.call(void 0, ""),[r,c]=_react.useState.call(void 0, "idle"),[b,y]=_react.useState.call(void 0, );async function f(){let d=i.trim();if(d!==""){c("sending");try{let p=await t.askQuestion(e,d);n.mutate(A=>[p,...A]),a(""),c("sent")}catch(p){y(p),c("error")}}}return _jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`qa-${e}`,className:"space-y-4",children:[_jsxruntime.jsx.call(void 0, "h3",{id:`qa-${e}`,className:"text-lg font-semibold",children:s.questionsTitle}),_jsxruntime.jsxs.call(void 0, "form",{className:"space-y-2",onSubmit:d=>{d.preventDefault(),f()},children:[_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.v,{value:i,maxLength:2e3,placeholder:s.questionPlaceholder,"aria-label":s.questionPlaceholder,onChange:d=>{a(d.target.value),c("idle")}}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{type:"submit",size:"sm",className:$,disabled:r==="sending"||i.trim()==="",children:s.questionSubmit}),r==="sent"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:s.questionSent}),r==="error"&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(b,s)})]}),n.status==="loading"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-neutral-500",children:s.loading}),n.status==="error"&&_jsxruntime.jsx.call(void 0, ee,{error:n.error,onRetry:n.reload}),n.status==="success"&&(n.data.length===0?_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:s.questionsEmpty}):_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-3",children:n.data.map(d=>_jsxruntime.jsxs.call(void 0, "li",{className:"rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsxs.call(void 0, "p",{className:"mb-1 text-xs text-neutral-500 dark:text-neutral-400",children:[d.isMine?s.questionMine:d.authorName,d.createdAt&&` \xB7 ${yt(d.createdAt)}`]}),_jsxruntime.jsx.call(void 0, "p",{className:"break-words whitespace-pre-wrap",children:d.content}),d.answer&&_jsxruntime.jsxs.call(void 0, "div",{className:"mt-2 border-l-2 border-neutral-400 pl-3 dark:border-neutral-500",children:[_jsxruntime.jsxs.call(void 0, "p",{className:"mb-1 text-xs font-medium text-neutral-500 dark:text-neutral-400",children:[s.questionTeamAnswer,d.answer.createdAt&&` \xB7 ${yt(d.answer.createdAt)}`]}),_jsxruntime.jsx.call(void 0, "p",{className:"break-words whitespace-pre-wrap",children:d.answer.content})]})]},d.id))}))]})}var _dompurify = require('dompurify'); var _dompurify2 = _interopRequireDefault(_dompurify);var gs={USE_PROFILES:{html:!0},FORBID_TAGS:["style","form","input","button","textarea","select","iframe","frame","object","embed","base","meta","link"],FORBID_ATTR:["style","srcdoc","formaction"],ALLOW_DATA_ATTR:!1,RETURN_TRUSTED_TYPE:!1};function bs(e){if(e.isSupported===!1||e.sanitize==null)return()=>"";let t=e.sanitize.bind(e);return _optionalChain([e, 'access', _18 => _18.addHook, 'optionalCall', _19 => _19("afterSanitizeAttributes",s=>{s.tagName==="A"&&s.hasAttribute("href")&&(s.setAttribute("target","_blank"),s.setAttribute("rel","noopener noreferrer nofollow")),s.tagName==="IMG"&&(s.setAttribute("loading","lazy"),s.setAttribute("referrerpolicy","no-referrer"))})]),s=>s==null||s===""?"":String(t(s,gs))}var vt;function Pe(e){return typeof window>"u"?"":(vt??=bs(_dompurify2.default),vt(e))}var _hlsjs = require('hls.js'); var _hlsjs2 = _interopRequireDefault(_hlsjs);function xs(e){return e.canPlayType("application/vnd.apple.mpegurl")!==""}function kt({src:e,poster:t,startAt:s=0,durationHint:o=0,autoPlay:n=!1,lessonId:i,onReport:a,onEnded:r,onExpired:c,className:b}){let{texts:y}=h(),f=Q(),d=_react.useRef.call(void 0, f);d.current=f;let p=_react.useRef.call(void 0, null),[A,C]=_react.useState.call(void 0, !1),[I,g]=_react.useState.call(void 0, 0),k=_react.useRef.call(void 0, {onReport:a,onEnded:r,onExpired:c,durationHint:o});k.current={onReport:a,onEnded:r,onExpired:c,durationHint:o};let M=_react.useRef.call(void 0, void 0),E=_react.useCallback.call(void 0, (l,R=p.current)=>{if(R==null||k.current.onReport==null)return;let m=Math.floor(R.currentTime);if(m<=0&&l!=="ended")return;let T=Number.isFinite(R.duration)?R.duration:k.current.durationHint;M.current=m,k.current.onReport({positionSeconds:m,durationSeconds:Math.floor(T||0),reason:l})},[]);return _react.useEffect.call(void 0, ()=>{let l=p.current;if(l==null)return;C(!1);let R,m=!1,T=!1,B,q=()=>{s>0&&(l.currentTime=s),n&&l.play().catch(()=>{})};xs(l)?(l.src=e,l.addEventListener("loadedmetadata",q,{once:!0})):_hlsjs2.default.isSupported()?(R=new _hlsjs2.default,R.attachMedia(l),R.loadSource(e),R.on(_hlsjs2.default.Events.MANIFEST_PARSED,q),R.on(_hlsjs2.default.Events.ERROR,(O,Y)=>{if(!Y.fatal)return;let Be=_optionalChain([Y, 'access', _20 => _20.response, 'optionalAccess', _21 => _21.code]);Be===401||Be===403?(_optionalChain([k, 'access', _22 => _22.current, 'access', _23 => _23.onExpired, 'optionalCall', _24 => _24()]),C(!0)):Y.type===_hlsjs2.default.ErrorTypes.NETWORK_ERROR&&!m?(m=!0,_optionalChain([R, 'optionalAccess', _25 => _25.startLoad, 'call', _26 => _26()])):Y.type===_hlsjs2.default.ErrorTypes.MEDIA_ERROR&&!T?(T=!0,_optionalChain([R, 'optionalAccess', _27 => _27.recoverMediaError, 'call', _28 => _28()])):C(!0)})):l.src=e;let pe=()=>{clearInterval(B),B=setInterval(()=>E("periodic"),15e3)},te=()=>{clearInterval(B),l.ended||E("pause")},oe=new Set,S=l.currentTime,W=0,re=O=>{if(i!=null)for(let Y of _chunkWGJTXDISjs.s.call(void 0, O,oe))d.current("video_progress",{lesson_id:i,milestone:Y})},ae=()=>{let O=l.currentTime,Y=Number.isFinite(l.duration)?l.duration:k.current.durationHint;Y>0&&!l.seeking&&O>=S&&O-S<=2&&(W=Math.max(W,O),re(W/Y*100)),S=O},Ue=()=>{clearInterval(B),i!=null&&!oe.has(100)&&(oe.add(100),d.current("video_progress",{lesson_id:i,milestone:100})),E("ended"),_optionalChain([k, 'access', _29 => _29.current, 'access', _30 => _30.onEnded, 'optionalCall', _31 => _31()])},Le=()=>{R==null&&C(!0)};return l.addEventListener("play",pe),l.addEventListener("pause",te),l.addEventListener("ended",Ue),l.addEventListener("error",Le),l.addEventListener("timeupdate",ae),()=>{clearInterval(B),l.removeEventListener("play",pe),l.removeEventListener("pause",te),l.removeEventListener("ended",Ue),l.removeEventListener("error",Le),l.removeEventListener("timeupdate",ae),l.removeEventListener("loadedmetadata",q),!l.ended&&l.currentTime>0&&E("leave",l),_optionalChain([R, 'optionalAccess', _32 => _32.destroy, 'call', _33 => _33()]),l.removeAttribute("src"),l.load()}},[e,I]),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, "relative overflow-hidden rounded-xl bg-black",b),children:[_jsxruntime.jsx.call(void 0, "video",{ref:p,className:"aspect-video w-full",poster:t,controls:!0,playsInline:!0,preload:"metadata",controlsList:"nodownload"}),A&&_jsxruntime.jsxs.call(void 0, "div",{role:"alert",className:"absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/80 p-4 text-center text-sm text-white",children:[_jsxruntime.jsx.call(void 0, "p",{children:y.videoError}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{variant:"secondary",size:"sm",onClick:()=>{_optionalChain([k, 'access', _34 => _34.current, 'access', _35 => _35.onExpired, 'optionalCall', _36 => _36()]),g(l=>l+1)},children:y.videoRetry})]})]})}function Vt({lesson:e,position:t=0,courseType:s,prev:o,next:n,autoplay:i,onAutoplayChange:a,startPlaying:r,onNavigate:c,onProgressSaved:b,onEnded:y,onUrlsExpired:f}){let{dataSource:d,texts:p,preview:A}=h(),C=Q(),[I,g]=_react.useState.call(void 0, e.completed),k=_react.useRef.call(void 0, e.completed),M=_react.useRef.call(void 0, void 0),E=_react.useRef.call(void 0, e.positionSeconds),[l,R]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{C("lesson_started",{lesson_id:e.id,position:t})},[e.id]);let m=_optionalChain([e, 'access', _37 => _37.urlsExpireAt, 'optionalAccess', _38 => _38.getTime, 'call', _39 => _39()]);_react.useEffect.call(void 0, ()=>{if(m==null)return;let S=m-Date.now()-6e4;if(S<=0||S>2**31-1)return;let W=setTimeout(f,S);return()=>clearTimeout(W)},[m]);let T=_react.useMemo.call(void 0, ()=>Pe(e.contentHtml),[e.contentHtml]);async function B(S,W,re){if(A)return;let ae=await d.saveProgress({lessonId:e.id,completed:re,positionSeconds:S,durationSeconds:W});M.current=S,ae.completed&&!k.current&&(k.current=!0,g(!0),C("lesson_completed",{lesson_id:e.id,position:t})),b(e.id,ae)}function q(S){if(E.current=S.positionSeconds,A||S.reason==="periodic"&&S.positionSeconds===M.current)return;let W=S.reason==="ended"||tt(S.positionSeconds,S.durationSeconds);B(S.positionSeconds,S.durationSeconds,W&&!k.current).catch(re=>{console.warn("Saving the progress of the lesson failed",re)})}async function pe(){R(!0);try{await B(E.current,_nullishCoalesce(_optionalChain([e, 'access', _40 => _40.video, 'optionalAccess', _41 => _41.durationSeconds]), () => (0)),!0)}catch(S){console.warn("Marking the lesson as completed failed",S)}finally{R(!1)}}let te=e.description.trim(),oe=T!==""||te!=="";return _jsxruntime.jsxs.call(void 0, "article",{"data-lesson-id":e.id,className:"min-w-0 space-y-5","aria-labelledby":`lesson-${e.id}`,children:[e.video&&_jsxruntime.jsx.call(void 0, kt,{src:e.video.hlsUrl,poster:e.video.posterUrl,lessonId:e.id,startAt:st(E.current,e.video.durationSeconds),durationHint:e.video.durationSeconds,autoPlay:r,onReport:q,onEnded:y,onExpired:f}),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, z,"space-y-5"),children:[_jsxruntime.jsxs.call(void 0, "header",{className:"flex flex-wrap items-start justify-between gap-3",children:[_jsxruntime.jsx.call(void 0, "h2",{id:`lesson-${e.id}`,className:"text-2xl font-semibold break-words",children:e.title}),!A&&_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{size:"sm",variant:I?"outline":"default",className:_chunkQ25D7OAOjs.d.call(void 0, !I&&$),disabled:I||l,onClick:pe,children:I?p.markedComplete:p.markComplete})]}),s==="video"&&e.video&&_jsxruntime.jsxs.call(void 0, "label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300",children:[_jsxruntime.jsx.call(void 0, "input",{type:"checkbox",checked:i,onChange:S=>a(S.target.checked)}),p.autoplay]}),te!==""&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:te}),T!==""&&_jsxruntime.jsx.call(void 0, "div",{className:"bitsnap-course-html break-words [&_a]:underline [&_blockquote]:border-l-4 [&_blockquote]:pl-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_img]:h-auto [&_img]:max-w-full [&_ol]:list-decimal [&_ol]:pl-6 [&_p]:my-3 [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto [&_ul]:list-disc [&_ul]:pl-6",dangerouslySetInnerHTML:{__html:T}}),!oe&&!e.video&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:p.noContent}),e.attachments.length>0&&_jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`files-${e.id}`,className:"space-y-2",children:[_jsxruntime.jsxs.call(void 0, "h3",{id:`files-${e.id}`,className:"flex items-center gap-2 text-lg font-semibold",children:[_jsxruntime.jsx.call(void 0, _lucidereact.Paperclip,{className:"size-4","aria-hidden":!0}),p.attachments]}),_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-2",children:e.attachments.map(S=>_jsxruntime.jsx.call(void 0, "li",{children:_jsxruntime.jsxs.call(void 0, "a",{href:S.url,target:"_blank",rel:"noopener noreferrer",download:S.name,className:"flex items-center justify-between gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm transition hover:bg-neutral-200 dark:bg-neutral-800 dark:hover:bg-neutral-700",children:[_jsxruntime.jsxs.call(void 0, "span",{className:"min-w-0 break-words",children:[S.name,_jsxruntime.jsx.call(void 0, "span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:nt(S.size)})]}),_jsxruntime.jsxs.call(void 0, "span",{className:"flex shrink-0 items-center gap-1 text-xs font-medium",children:[p.download,_jsxruntime.jsx.call(void 0, _lucidereact.Download,{className:"size-3.5","aria-hidden":!0})]})]})},S.id))})]}),_jsxruntime.jsxs.call(void 0, "nav",{className:"flex items-center justify-between gap-3 border-t pt-4",children:[_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"outline",size:"sm",disabled:o==null,onClick:()=>o&&c(o),children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),p.prevItem]}),_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"outline",size:"sm",disabled:n==null,onClick:()=>n&&c(n),children:[p.nextItem,_jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight,{"aria-hidden":!0})]})]})]}),_jsxruntime.jsx.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, z),children:_jsxruntime.jsx.call(void 0, St,{lessonId:e.id,initial:{myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount}})}),_jsxruntime.jsx.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, z),children:_jsxruntime.jsx.call(void 0, ht,{lessonId:e.id})})]})}var It={pl:{back:"Wr\xF3\u0107",loading:"\u0141adowanie kursu...",retry:"Spr\xF3buj ponownie",errorGeneric:"Nie uda\u0142o si\u0119 za\u0142adowa\u0107 danych. Spr\xF3buj ponownie za chwil\u0119.",errorUnauthorized:"Nie masz dost\u0119pu do tego kursu. Zaloguj si\u0119 ponownie lub skontaktuj si\u0119 z pomoc\u0105.",errorNotFound:"Nie znaleziono tego kursu lub lekcji.",errorUnavailable:"Kurs jest chwilowo niedost\u0119pny. Spr\xF3buj ponownie za chwil\u0119.",previewBadge:"Podgl\u0105d",progressLessons:"{done} z {total} lekcji",progressPercent:"{percent}% uko\u0144czono",contents:"Spis tre\u015Bci",free:"Darmowa",locked:"Zablokowane",lockedByTest:"Odblokuje je zaliczenie testu: {test}",lockedPage:"Ta lekcja jest zablokowana. Zalicz test \u201E{test}\u201D, aby j\u0105 odblokowa\u0107.",testBadge:"Test",completed:"Uko\u0144czono",continueCourse:"Kontynuuj kurs",noItem:"Wybierz lekcj\u0119 z listy.",markComplete:"Oznacz jako uko\u0144czon\u0105",markedComplete:"Lekcja uko\u0144czona",prevItem:"Poprzednia",nextItem:"Nast\u0119pna",attachments:"Materia\u0142y do pobrania",download:"Pobierz",autoplay:"Autoodtwarzanie nast\u0119pnej lekcji",videoError:"Nie uda\u0142o si\u0119 odtworzy\u0107 wideo.",videoRetry:"Od\u015Bwie\u017C wideo",noContent:"Ta lekcja nie ma jeszcze tre\u015Bci.",testGating:"Zaliczenie tego testu odblokowuje kolejne lekcje.",testAttemptsLeft:"Pozosta\u0142o pr\xF3b: {count}",testAttemptsUnlimited:"Liczba pr\xF3b nie jest ograniczona.",testNoAttemptsLeft:"Wykorzystano wszystkie pr\xF3by.",testPassThreshold:"Pr\xF3g zaliczenia: {percent}%",testBestScore:"Najlepszy wynik: {percent}%",testSubmit:"Sprawd\u017A odpowiedzi",testSubmitting:"Sprawdzanie...",testUnanswered:"Pytania bez odpowiedzi: {count}",testPassed:"Test zaliczony",testFailed:"Test niezaliczony",testScore:"Wynik: {percent}%",testCorrect:"Poprawnie",testIncorrect:"Niepoprawnie",testCorrectAnswer:"Poprawna odpowied\u017A",testTryAgain:"Spr\xF3buj ponownie",testPreviousAttempts:"Poprzednie podej\u015Bcia",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"Ten test nie ma jeszcze pyta\u0144.",mcqSingle:"Wybierz jedn\u0105 odpowied\u017A",mcqMultiple:"Zaznacz wszystkie poprawne odpowiedzi",todoHint:"Zaznacz wykonane kroki",todoRequired:"wymagany",gapPlaceholder:"uzupe\u0142nij",sortHint:"U\u0142\xF3\u017C elementy w poprawnej kolejno\u015Bci",moveUp:"Przesu\u0144 w g\xF3r\u0119",moveDown:"Przesu\u0144 w d\xF3\u0142",questionsTitle:"Pytania do lekcji",questionsEmpty:"Nikt jeszcze nie zada\u0142 pytania.",questionPlaceholder:"Zadaj pytanie autorowi kursu",questionSubmit:"Wy\u015Blij pytanie",questionSent:"Pytanie wys\u0142ane.",questionMine:"Ty",questionTeamAnswer:"Odpowied\u017A autora",rateTitle:"Oce\u0144 lekcj\u0119",rateStar:"{n} z 5",ratePlaceholder:"Komentarz (opcjonalnie)",rateSubmit:"Zapisz ocen\u0119",rateSaved:"Dzi\u0119kujemy za ocen\u0119.",rateAverage:"\u015Arednia ocena {average} ({count})"},en:{back:"Back",loading:"Loading the course...",retry:"Try again",errorGeneric:"Could not load the data. Please try again in a moment.",errorUnauthorized:"You do not have access to this course. Sign in again or contact support.",errorNotFound:"This course or lesson was not found.",errorUnavailable:"The course is temporarily unavailable. Please try again in a moment.",previewBadge:"Preview",progressLessons:"{done} of {total} lessons",progressPercent:"{percent}% complete",contents:"Contents",free:"Free",locked:"Locked",lockedByTest:"Pass the test to unlock it: {test}",lockedPage:"This lesson is locked. Pass the test \u201C{test}\u201D to unlock it.",testBadge:"Test",completed:"Completed",continueCourse:"Continue the course",noItem:"Pick a lesson from the list.",markComplete:"Mark as completed",markedComplete:"Lesson completed",prevItem:"Previous",nextItem:"Next",attachments:"Downloads",download:"Download",autoplay:"Autoplay the next lesson",videoError:"The video could not be played.",videoRetry:"Reload the video",noContent:"This lesson has no content yet.",testGating:"Passing this test unlocks the following lessons.",testAttemptsLeft:"Attempts left: {count}",testAttemptsUnlimited:"The number of attempts is unlimited.",testNoAttemptsLeft:"You have used all attempts.",testPassThreshold:"Passing score: {percent}%",testBestScore:"Best score: {percent}%",testSubmit:"Check answers",testSubmitting:"Checking...",testUnanswered:"Unanswered questions: {count}",testPassed:"Test passed",testFailed:"Test not passed",testScore:"Score: {percent}%",testCorrect:"Correct",testIncorrect:"Incorrect",testCorrectAnswer:"Correct answer",testTryAgain:"Try again",testPreviousAttempts:"Previous attempts",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"This test has no questions yet.",mcqSingle:"Choose one answer",mcqMultiple:"Select all correct answers",todoHint:"Check the steps you have done",todoRequired:"required",gapPlaceholder:"fill in",sortHint:"Put the items in the correct order",moveUp:"Move up",moveDown:"Move down",questionsTitle:"Questions about this lesson",questionsEmpty:"Nobody has asked a question yet.",questionPlaceholder:"Ask the course author a question",questionSubmit:"Send question",questionSent:"Question sent.",questionMine:"You",questionTeamAnswer:"Answer from the author",rateTitle:"Rate this lesson",rateStar:"{n} of 5",ratePlaceholder:"Comment (optional)",rateSubmit:"Save rating",rateSaved:"Thanks for your rating.",rateAverage:"Average rating {average} ({count})"}};function Te(e,t=_chunkQ25D7OAOjs.m.call(void 0, )){return _chunkQ25D7OAOjs.i.call(void 0, It,t,e)}function Ns({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="mcq")return null;let{choices:i,multiple:a}=e.config;return _jsxruntime.jsxs.call(void 0, "fieldset",{className:"space-y-2",disabled:s,children:[_jsxruntime.jsx.call(void 0, "legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:a?n.mcqMultiple:n.mcqSingle}),i.map(r=>{let c=t.selectedIds.includes(r.id);return _jsxruntime.jsxs.call(void 0, "label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsx.call(void 0, "input",{className:"mt-0.5",type:a?"checkbox":"radio",name:`q-${e.id}`,checked:c,onChange:()=>o({type:"mcq",selectedIds:a?c?t.selectedIds.filter(b=>b!==r.id):[...t.selectedIds,r.id]:[r.id]})}),_jsxruntime.jsx.call(void 0, "span",{className:"break-words",children:r.label})]},r.id)})]})}function Ps({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();return e.config.type!=="todolist"?null:_jsxruntime.jsxs.call(void 0, "fieldset",{className:"space-y-2",disabled:s,children:[_jsxruntime.jsx.call(void 0, "legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:n.todoHint}),e.config.steps.map(i=>{let a=t.checkedIds.includes(i.id);return _jsxruntime.jsxs.call(void 0, "label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsx.call(void 0, "input",{className:"mt-0.5",type:"checkbox",checked:a,onChange:()=>o({type:"todolist",checkedIds:a?t.checkedIds.filter(r=>r!==i.id):[...t.checkedIds,i.id]})}),_jsxruntime.jsxs.call(void 0, "span",{className:"break-words",children:[i.label,i.required&&_jsxruntime.jsxs.call(void 0, "span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:["(",n.todoRequired,")"]})]})]},i.id)})]})}function Vs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="fill_gap")return null;let i=he(e.config.template,e.config.blanks);return _jsxruntime.jsx.call(void 0, "p",{className:"text-sm leading-10 break-words",children:i.map((a,r)=>a.type==="text"?_jsxruntime.jsx.call(void 0, "span",{className:"whitespace-pre-wrap",children:a.text},r):_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.r,{className:"mx-1 inline-block h-8 w-36 align-middle","aria-label":`${n.gapPlaceholder} ${a.id}`,placeholder:n.gapPlaceholder,disabled:s,value:_nullishCoalesce(t.values[a.id], () => ("")),onChange:c=>o({type:"fill_gap",values:{...t.values,[a.id]:c.target.value}})},r))})}function Is({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="sort_order")return null;let i=new Map(e.config.items.map(r=>[r.id,r.label])),a=(r,c)=>o({type:"sort_order",orderedIds:at(t.orderedIds,r,c)});return _jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:n.sortHint}),_jsxruntime.jsx.call(void 0, "ol",{className:"space-y-2",children:t.orderedIds.map((r,c)=>_jsxruntime.jsxs.call(void 0, "li",{className:"flex items-center gap-2 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsxs.call(void 0, "span",{className:"w-5 text-xs text-neutral-500",children:[c+1,"."]}),_jsxruntime.jsx.call(void 0, "span",{className:"min-w-0 flex-1 break-words",children:_nullishCoalesce(i.get(r), () => (r))}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveUp,disabled:s||c===0,onClick:()=>a(c,c-1),children:_jsxruntime.jsx.call(void 0, _lucidereact.ArrowUp,{"aria-hidden":!0})}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveDown,disabled:s||c===t.orderedIds.length-1,onClick:()=>a(c,c+1),children:_jsxruntime.jsx.call(void 0, _lucidereact.ArrowDown,{"aria-hidden":!0})})]},r))})]})}function Ts({question:e,answer:t,disabled:s,onChange:o}){let n={question:e,disabled:s,onChange:o};switch(t.type){case"mcq":return _jsxruntime.jsx.call(void 0, Ns,{...n,answer:t});case"todolist":return _jsxruntime.jsx.call(void 0, Ps,{...n,answer:t});case"fill_gap":return _jsxruntime.jsx.call(void 0, Vs,{...n,answer:t});case"sort_order":return _jsxruntime.jsx.call(void 0, Is,{...n,answer:t})}}function ws({list:e}){let{texts:t}=h();return e.submissions.length===0?null:_jsxruntime.jsxs.call(void 0, "section",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, "h3",{className:"text-sm font-semibold",children:t.testPreviousAttempts}),_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-1 text-sm",children:e.submissions.map(s=>_jsxruntime.jsxs.call(void 0, "li",{className:"flex items-center gap-2 text-neutral-700 dark:text-neutral-300",children:[s.passed?_jsxruntime.jsx.call(void 0, _lucidereact.Check,{className:"size-4 text-emerald-600","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.X,{className:"size-4 text-red-600","aria-hidden":!0}),w(t.testAttemptRow,{percent:s.scorePercent,date:_nullishCoalesce(_optionalChain([s, 'access', _42 => _42.createdAt, 'optionalAccess', _43 => _43.toLocaleString, 'call', _44 => _44()]), () => (""))})]},s.id))})]})}function Es({test:e,onSubmitted:t,onTryAgain:s}){let{dataSource:o,texts:n}=h(),[i,a]=_react.useState.call(void 0, {}),[r,c]=_react.useState.call(void 0, ),[b,y]=_react.useState.call(void 0, !1),[f,d]=_react.useState.call(void 0, ),p=_react.useRef.call(void 0, Date.now()),A=_react.useRef.call(void 0, e.questions).current,C=e.attemptsLeft!=null&&e.attemptsLeft<=0,I=r?r.attemptsLeft:e.attemptsLeft,g=rt(A,i),k=l=>_nullishCoalesce(i[l.id], () => (ot(l.config)));async function M(){y(!0),d(void 0);try{let l={};for(let m of A)l[m.id]=k(m);let R=await o.submitTest(e.id,l,Date.now()-p.current);c(R),t(R)}catch(l){d(l)}finally{y(!1)}}let E=new Map(_optionalChain([r, 'optionalAccess', _45 => _45.results, 'access', _46 => _46.map, 'call', _47 => _47(l=>[l.questionId,l])]));return A.length===0?_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:n.testNoQuestions}):_jsxruntime.jsxs.call(void 0, "form",{className:"space-y-6",onSubmit:l=>{l.preventDefault(),r==null&&!C&&M()},children:[r&&_jsxruntime.jsxs.call(void 0, "div",{role:"status",className:_chunkQ25D7OAOjs.d.call(void 0, "rounded-xl p-4 text-sm",r.submission.passed?"bg-emerald-50 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-300":"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-300"),children:[_jsxruntime.jsx.call(void 0, "p",{className:"text-base font-semibold",children:r.submission.passed?n.testPassed:n.testFailed}),_jsxruntime.jsx.call(void 0, "p",{children:w(n.testScore,{percent:r.submission.scorePercent})})]}),_jsxruntime.jsx.call(void 0, "ol",{className:"space-y-6",children:A.map((l,R)=>{let m=E.get(l.id),T=_optionalChain([m, 'optionalAccess', _48 => _48.correctAnswer])!=null?it(l,m.correctAnswer):"";return _jsxruntime.jsxs.call(void 0, "li",{className:"space-y-3","data-question-id":l.id,children:[_jsxruntime.jsxs.call(void 0, "p",{className:"font-medium break-words",children:[R+1,". ",l.prompt]}),_jsxruntime.jsx.call(void 0, Ts,{question:l,answer:k(l),disabled:r!=null||b||C,onChange:B=>a(q=>({...q,[l.id]:B}))}),m&&_jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, "flex items-start gap-2 text-sm",m.correct?"text-emerald-700 dark:text-emerald-400":"text-red-700 dark:text-red-400"),children:[m.correct?_jsxruntime.jsx.call(void 0, _lucidereact.Check,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.X,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}),_jsxruntime.jsxs.call(void 0, "span",{children:[m.correct?n.testCorrect:n.testIncorrect,T!==""&&!m.correct&&_jsxruntime.jsxs.call(void 0, "span",{className:"block text-neutral-700 dark:text-neutral-300",children:[n.testCorrectAnswer,": ",T]})]})]})]},l.id)})}),f!=null&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(f,n)}),r==null?_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[g>0&&!C&&_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(n.testUnanswered,{count:g})}),_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{type:"submit",className:$,disabled:b||C,children:b?n.testSubmitting:n.testSubmit})]}):I!==0&&!r.submission.passed&&_jsxruntime.jsx.call(void 0, _chunkUFIOJGJZjs.q,{type:"button",variant:"outline",onClick:s,children:n.testTryAgain})]})}function Gt({testId:e,title:t,onSubmitted:s}){let{dataSource:o,texts:n}=h(),i=Q(),a=j(()=>o.getTest(e),[o,e]),r=j(()=>o.listSubmissions(e).catch(()=>{}),[o,e]),[c,b]=_react.useState.call(void 0, 0);return _jsxruntime.jsxs.call(void 0, "article",{"data-test-id":e,className:_chunkQ25D7OAOjs.d.call(void 0, z,"min-w-0 space-y-5"),children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:a.status==="success"?a.data.title:t}),a.status==="loading"&&_jsxruntime.jsx.call(void 0, ue,{}),a.status==="error"&&_jsxruntime.jsx.call(void 0, ee,{error:a.error,onRetry:a.reload}),a.status==="success"&&_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[a.data.description.trim()!==""&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:a.data.description}),_jsxruntime.jsxs.call(void 0, "ul",{className:"space-y-1 text-sm text-neutral-600 dark:text-neutral-400",children:[a.data.gating&&_jsxruntime.jsx.call(void 0, "li",{children:n.testGating}),_jsxruntime.jsx.call(void 0, "li",{children:w(n.testPassThreshold,{percent:a.data.passThresholdPercent})}),_jsxruntime.jsx.call(void 0, "li",{children:a.data.attemptsLeft==null?n.testAttemptsUnlimited:w(n.testAttemptsLeft,{count:a.data.attemptsLeft})}),a.data.attemptCount>0&&_jsxruntime.jsx.call(void 0, "li",{children:w(n.testBestScore,{percent:a.data.bestScorePercent})})]}),a.data.attemptsLeft!=null&&a.data.attemptsLeft<=0&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm font-medium text-red-700 dark:text-red-400",children:n.testNoAttemptsLeft}),_jsxruntime.jsx.call(void 0, Es,{test:a.data,onSubmitted:y=>{i("test_submitted",{lesson_id:e,score_bucket:_chunkWGJTXDISjs.r.call(void 0, y.submission.scorePercent)}),s(y),r.refresh(),a.refresh()},onTryAgain:()=>b(y=>y+1)},c),r.status==="success"&&r.data&&_jsxruntime.jsx.call(void 0, ws,{list:r.data})]})]})}var Ut="bitsnap-course-autoplay";function Zs(){let[e,t]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{try{t(window.localStorage.getItem(Ut)==="1")}catch (e2){}},[]);let s=_react.useCallback.call(void 0, o=>{t(o);try{window.localStorage.setItem(Ut,o?"1":"0")}catch (e3){}},[]);return[e,s]}function Lt(e){return e==null?void 0:{id:e.id,kind:e.kind}}function Xs({item:e}){let{texts:t}=h();return _jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, z,"space-y-2"),role:"status",children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:e.title}),_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-600 dark:text-neutral-300",children:e.lockReason?w(t.lockedPage,{test:e.lockReason.gatingTestTitle}):t.locked})]})}function Ms({course:e,item:t,autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onLocked:c}){let{dataSource:b,texts:y}=h(),f=j(()=>b.getLesson(t.id),[b,t.id]),d=f.status==="error"&&f.error instanceof Z&&f.error.code==="item_locked";if(_react.useEffect.call(void 0, ()=>{d&&c()},[d]),f.status==="loading")return _jsxruntime.jsx.call(void 0, ue,{});if(f.status==="error")return d?_jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, z,"space-y-2"),role:"alert",children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:t.title}),_jsxruntime.jsx.call(void 0, "p",{className:"text-sm",children:J(f.error,y)})]}):_jsxruntime.jsx.call(void 0, ee,{error:f.error,onRetry:f.reload});let p=ye(e,t.id),A=ce(e).filter(C=>C.kind!=="test").findIndex(C=>C.id===t.id)+1;return _jsxruntime.jsx.call(void 0, Vt,{lesson:f.data,position:A,courseType:e.type,prev:_nullishCoalesce(f.data.prev, () => (Lt(p.prev))),next:_nullishCoalesce(f.data.next, () => (Lt(p.next))),autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onUrlsExpired:f.refresh},f.data.id)}function zs({course:e,selectedId:t,onSelect:s,onBack:o,onCourseChange:n,onCourseRefresh:i}){let{texts:a,preview:r}=h(),c=Q(),b=_react.useRef.call(void 0, null),[y,f]=_react.useState.call(void 0, !1),[d,p]=Zs(),[A,C]=_react.useState.call(void 0, ),I=et(e,t),g=le(e,I);_react.useEffect.call(void 0, ()=>{c("course_opened",{})},[e.id]);let k=(m,T=!1)=>{C(T?m:void 0),f(!1),s(m),_optionalChain([b, 'access', _49 => _49.current, 'optionalAccess', _50 => _50.scrollIntoView, 'call', _51 => _51({block:"start",behavior:"smooth"})])},M=_jsxruntime.jsx.call(void 0, ct,{course:e,selectedId:I,variant:e.type==="video"?"playlist":"modules",onSelect:m=>k(m.id)}),E;g==null?E=_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500",children:a.noItem}):g.locked?E=_jsxruntime.jsx.call(void 0, Xs,{item:g}):g.kind==="test"?E=_jsxruntime.jsx.call(void 0, Gt,{testId:g.id,title:g.title,onSubmitted:()=>i()},g.id):E=_jsxruntime.jsx.call(void 0, Ms,{course:e,item:g,autoplay:d,onAutoplayChange:p,startPlaying:A===g.id,onNavigate:m=>k(m.id),onProgressSaved:(m,T)=>n(B=>({...T.completed?$e(B,m):B,completedLessons:T.completedLessons,progressPercent:T.progressPercent})),onEnded:()=>{if(!d)return;let m=Oe(e,g.id);m&&k(m.id,!0)},onLocked:i},g.id);let l=e.type==="video",R=e.resumeItemId!==""&&e.resumeItemId!==I&&_optionalChain([le, 'call', _52 => _52(e,e.resumeItemId), 'optionalAccess', _53 => _53.locked])===!1;return _jsxruntime.jsxs.call(void 0, "div",{ref:b,className:"space-y-4 scroll-mt-4",children:[_jsxruntime.jsxs.call(void 0, "header",{className:"space-y-3",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"flex flex-wrap items-center gap-2",children:[o&&_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"ghost",size:"sm",onClick:o,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),a.back]}),r&&_jsxruntime.jsx.call(void 0, "span",{"data-course-preview":!0,className:"rounded-full bg-amber-100 px-3 py-0.5 text-xs font-semibold text-amber-900 dark:bg-amber-900/40 dark:text-amber-200",children:a.previewBadge})]}),_jsxruntime.jsxs.call(void 0, "div",{className:"flex flex-wrap items-end justify-between gap-4",children:[_jsxruntime.jsx.call(void 0, "div",{className:"min-w-0 space-y-1",children:_jsxruntime.jsx.call(void 0, "h1",{className:"text-2xl font-semibold break-words sm:text-3xl",children:e.title})}),R&&_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{size:"sm",variant:"outline",onClick:()=>k(e.resumeItemId),children:[_jsxruntime.jsx.call(void 0, _lucidereact.Play,{"aria-hidden":!0}),a.continueCourse]})]}),_jsxruntime.jsxs.call(void 0, "div",{className:"max-w-xl space-y-1",children:[_jsxruntime.jsx.call(void 0, At,{percent:e.progressPercent,label:w(a.progressPercent,{percent:e.progressPercent})}),_jsxruntime.jsxs.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:[w(a.progressLessons,{done:e.completedLessons,total:e.totalLessons})," \xB7 ",w(a.progressPercent,{percent:e.progressPercent})]})]})]}),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkQ25D7OAOjs.d.call(void 0, "grid gap-6",l?"lg:grid-cols-[minmax(0,1fr)_380px]":"lg:grid-cols-[320px_minmax(0,1fr)]"),children:[!l&&_jsxruntime.jsx.call(void 0, "div",{className:"lg:hidden",children:_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"outline",size:"sm","aria-expanded":y,onClick:()=>f(m=>!m),children:[_jsxruntime.jsx.call(void 0, _lucidereact.List,{"aria-hidden":!0}),a.contents]})}),!l&&_jsxruntime.jsx.call(void 0, "aside",{className:_chunkQ25D7OAOjs.d.call(void 0, z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:block lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto",y?"block":"hidden"),children:M}),_jsxruntime.jsx.call(void 0, "div",{className:"min-w-0","data-course-content":!0,children:E}),l&&_jsxruntime.jsx.call(void 0, "aside",{className:_chunkQ25D7OAOjs.d.call(void 0, z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto"),children:M})]})]})}function Qs({accessId:e,accessToken:t,dataSource:s,preview:o=!1,itemId:n,onItemChange:i,onBack:a,initialCourse:r,texts:c,locale:b,theme:y,className:f,analytics:d}){let p=_chunk3IVLQILFjs.j.call(void 0, ),A=_chunkWGJTXDISjs.n.call(void 0, p.projectID,o?!1:d,"course"),C=_react.useMemo.call(void 0, ()=>Te(c,b),[c,b]),I=_react.useMemo.call(void 0, ()=>{if(s)return s;if(e==null||e==="")throw new Error("PanelCourse needs an accessId or a dataSource");return Ce({accessId:e,accessToken:t})},[s,e,t]),g=j(()=>I.getCourse(),[I],r),[k,M]=_react.useState.call(void 0, ),E=i?n:_nullishCoalesce(n, () => (k)),l=_react.useCallback.call(void 0, B=>{M(B),_optionalChain([i, 'optionalCall', _54 => _54(B)])},[i]),R=De(_nullishCoalesce(_optionalChain([y, 'optionalAccess', _55 => _55.colors]), () => (_optionalChain([p, 'access', _56 => _56.theme, 'optionalAccess', _57 => _57.colors])))),m=g.status==="success"?g.data.id:void 0,T=_react.useMemo.call(void 0, ()=>({dataSource:I,texts:C,preview:o,analytics:{courseId:m,instrument:A}}),[I,C,o,m,A]);return _jsxruntime.jsx.call(void 0, _chunkWGJTXDISjs.l,{value:A,children:_jsxruntime.jsx.call(void 0, qe,{value:T,children:_jsxruntime.jsxs.call(void 0, "div",{"data-bitsnap-course":!0,"data-course-type":g.status==="success"?g.data.type:void 0,style:R,className:_chunkQ25D7OAOjs.d.call(void 0, "font-inter w-full max-w-7xl",f),children:[g.status==="loading"&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-4",children:[a&&_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"ghost",size:"sm",onClick:a,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),C.back]}),_jsxruntime.jsx.call(void 0, "p",{className:"sr-only",role:"status",children:C.loading}),_jsxruntime.jsx.call(void 0, ue,{})]}),g.status==="error"&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-4",children:[a&&_jsxruntime.jsxs.call(void 0, _chunkUFIOJGJZjs.q,{variant:"ghost",size:"sm",onClick:a,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),C.back]}),_jsxruntime.jsx.call(void 0, ee,{error:g.error,onRetry:g.reload})]}),g.status==="success"&&_jsxruntime.jsx.call(void 0, zs,{course:g.data,selectedId:E,onSelect:l,onBack:a,onCourseChange:g.mutate,onCourseRefresh:g.refresh})]})})})}exports.COURSE_TEXT_TABLES = It; exports.CourseError = Z; exports.PanelCourse = Qs; exports.createCourseDataSource = ve; exports.createRpcCourseDataSource = Ce; exports.getCourseTexts = Te; exports.sanitizeLessonHtml = Pe;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkDGUIG334js = require('./chunk-DGUIG334.js');var _chunk6IACFTJRjs = require('./chunk-6IACFTJR.js');var _chunkERL4Z7M7js = require('./chunk-ERL4Z7M7.js');var _chunkDF2IK2GNjs = require('./chunk-DF2IK2GN.js');require('./chunk-XIHGWNTS.js');require('./chunk-JSDGZ4NY.js');var _lucidereact = require('lucide-react');var _react = require('react');function De(e){let t={},s=_optionalChain([e, 'optionalAccess', _2 => _2.brand, 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()]),o=_optionalChain([e, 'optionalAccess', _5 => _5.brandDark, 'optionalAccess', _6 => _6.trim, 'call', _7 => _7()])||s;if(s){t["--course-accent"]=s;let n=_chunk6IACFTJRjs.s.call(void 0, s);n&&(t["--course-accent-fg"]=n)}if(o){t["--course-accent-dark"]=o;let n=_chunk6IACFTJRjs.s.call(void 0, o);n&&(t["--course-accent-dark-fg"]=n)}return t}var He=_react.createContext.call(void 0, void 0),qe=He.Provider;function h(){let e=_react.useContext.call(void 0, He);if(e==null)throw new Error("Course components have to be rendered inside PanelCourse");return e}function Q(){let{analytics:e,preview:t}=h();return _react.useCallback.call(void 0, (s,o)=>{t||_optionalChain([e, 'optionalAccess', _8 => _8.courseId])==null||e.instrument.track(s,{...o,course_id:e.courseId})},[e,t])}function ce(e){return[...e.sections.flatMap(t=>t.items.map(s=>({...s,sectionId:t.id}))),...e.finalItems.map(t=>({...t,sectionId:""}))]}function le(e,t){if(!(t==null||t===""))return ce(e).find(s=>s.id===t)}function ye(e,t){let s=ce(e),o=s.findIndex(n=>n.id===t);return o<0?{}:{prev:s[o-1],next:s[o+1]}}function Oe(e,t){let{next:s}=ye(e,t);return s!=null&&s.kind==="lesson"&&!s.locked?s:void 0}function zt(e){let t=0,s=0;for(let o of e.sections)for(let n of o.items)n.kind==="lesson"&&(t+=1,n.completed&&(s+=1));return{total:t,completed:s,percent:t===0?0:Math.round(s/t*100)}}function $e(e,t){let s=e.sections.map(n=>({...n,items:n.items.map(i=>i.id===t&&i.kind==="lesson"?{...i,completed:!0}:i)})),o=zt({sections:s});return{...e,sections:s,totalLessons:o.total,completedLessons:o.completed,progressPercent:o.percent}}function et(e,t){return le(e,t)!=null?t:_optionalChain([le, 'call', _9 => _9(e,e.resumeItemId), 'optionalAccess', _10 => _10.locked])===!1?e.resumeItemId:_optionalChain([ce, 'call', _11 => _11(e), 'access', _12 => _12.find, 'call', _13 => _13(s=>!s.locked), 'optionalAccess', _14 => _14.id])}function w(e,t){return e.replace(/\{(\w+)\}/g,(s,o)=>o in t?String(t[o]):s)}function tt(e,t){return t>0&&e/t>=.8}function st(e,t){return e<5||t>0&&e>=t-5?0:Math.floor(e)}function Se(e){let t=Math.max(0,Math.floor(e)),s=Math.floor(t/3600),o=Math.floor(t%3600/60),n=String(t%60).padStart(2,"0");return s>0?`${s}:${String(o).padStart(2,"0")}:${n}`:`${o}:${n}`}function nt(e){if(!(e>0))return"0 B";let t=["B","KB","MB","GB"],s=Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1),o=e/1024**s;return`${s===0||o>=10?Math.round(o):o.toFixed(1)} ${t[s]}`}function ot(e){switch(e.type){case"mcq":return{type:"mcq",selectedIds:[]};case"todolist":return{type:"todolist",checkedIds:[]};case"fill_gap":return{type:"fill_gap",values:{}};case"sort_order":return{type:"sort_order",orderedIds:e.items.map(t=>t.id)}}}function Qt(e,t){if(t==null||t.type!==e.config.type)return!1;switch(t.type){case"mcq":return t.selectedIds.length>0;case"todolist":return t.checkedIds.length>0;case"fill_gap":return Object.values(t.values).some(s=>s.trim()!=="");case"sort_order":return t.orderedIds.length>0}}function rt(e,t){return e.filter(s=>!Qt(s,t[s.id])).length}function at(e,t,s){if(t===s||t<0||s<0||t>=e.length||s>=e.length)return[...e];let o=[...e],[n]=o.splice(t,1);return o.splice(s,0,n),o}function he(e,t){let s=[],o=/\{\{\s*([^{}\s]+)\s*\}\}/g,n=0;for(let i of e.matchAll(o)){let a=i[1];t.includes(a)&&(i.index>n&&s.push({type:"text",text:e.slice(n,i.index)}),s.push({type:"blank",id:a}),n=i.index+i[0].length)}return n<e.length&&s.push({type:"text",text:e.slice(n)}),s}function it(e,t){let{config:s}=e;if(t==null||t.type!==s.type)return"";let o=(n,i)=>_nullishCoalesce(_optionalChain([n, 'access', _15 => _15.find, 'call', _16 => _16(a=>a.id===i), 'optionalAccess', _17 => _17.label]), () => (i));return s.type==="mcq"&&t.type==="mcq"?t.selectedIds.map(n=>o(s.choices,n)).join(", "):s.type==="todolist"&&t.type==="todolist"?t.checkedIds.map(n=>o(s.steps,n)).join(", "):s.type==="sort_order"&&t.type==="sort_order"?t.orderedIds.map(n=>o(s.items,n)).join(" \u2192 "):s.type==="fill_gap"&&t.type==="fill_gap"?he(s.template,s.blanks).map(n=>n.type==="text"?n.text:`[${_nullishCoalesce(t.values[n.id], () => (""))}]`).join(""):""}var _jsxruntime = require('react/jsx-runtime');function lt({item:e}){return e.locked?_jsxruntime.jsx.call(void 0, _lucidereact.Lock,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.completed?_jsxruntime.jsx.call(void 0, _lucidereact.CheckCircle2,{className:"size-4 text-emerald-600 dark:text-emerald-400","aria-hidden":!0}):e.kind==="test"?_jsxruntime.jsx.call(void 0, _lucidereact.ClipboardCheck,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.durationSeconds>0?_jsxruntime.jsx.call(void 0, _lucidereact.PlayCircle,{className:"size-4 text-neutral-500","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.FileText,{className:"size-4 text-neutral-500","aria-hidden":!0})}function Jt({item:e,selected:t,variant:s,onSelect:o}){let{texts:n}=h(),i=e.lockReason?w(n.lockedByTest,{test:e.lockReason.gatingTestTitle}):n.locked,a=e.locked?i:e.completed?n.completed:void 0;return _jsxruntime.jsx.call(void 0, "li",{children:_jsxruntime.jsxs.call(void 0, "button",{type:"button","data-item-id":e.id,"data-locked":e.locked||void 0,"aria-current":t?"true":void 0,"aria-disabled":e.locked||void 0,title:e.locked?i:void 0,onClick:()=>{e.locked||o(e)},className:_chunkERL4Z7M7js.d.call(void 0, "flex w-full items-start gap-3 rounded-lg p-2 text-left text-sm outline-none transition focus-visible:ring-[3px] focus-visible:ring-ring/50",t?"bg-neutral-200 dark:bg-neutral-700":"hover:bg-neutral-100 dark:hover:bg-neutral-800",e.locked&&"cursor-not-allowed opacity-60 hover:bg-transparent dark:hover:bg-transparent"),children:[s==="playlist"&&e.kind==="lesson"&&_jsxruntime.jsxs.call(void 0, "span",{className:"relative aspect-video w-24 shrink-0 overflow-hidden rounded bg-neutral-200 dark:bg-neutral-800",children:[e.thumbnailUrl&&_jsxruntime.jsx.call(void 0, "img",{src:e.thumbnailUrl,alt:"",loading:"lazy",draggable:!1,className:"size-full object-cover"}),e.durationSeconds>0&&_jsxruntime.jsx.call(void 0, "span",{className:"absolute right-1 bottom-1 rounded bg-black/75 px-1 text-[10px] text-white",children:Se(e.durationSeconds)})]}),(s==="modules"||e.kind==="test")&&_jsxruntime.jsx.call(void 0, "span",{className:"mt-0.5 shrink-0",children:_jsxruntime.jsx.call(void 0, lt,{item:e})}),_jsxruntime.jsxs.call(void 0, "span",{className:"min-w-0 flex-1",children:[_jsxruntime.jsx.call(void 0, "span",{className:"block font-medium break-words",children:e.title}),_jsxruntime.jsxs.call(void 0, "span",{className:"mt-0.5 flex flex-wrap items-center gap-x-2 text-xs text-neutral-500 dark:text-neutral-400",children:[e.kind==="test"&&_jsxruntime.jsx.call(void 0, "span",{children:n.testBadge}),e.isFree&&!e.locked&&_jsxruntime.jsx.call(void 0, "span",{children:n.free}),s==="modules"&&e.durationSeconds>0&&_jsxruntime.jsx.call(void 0, "span",{children:Se(e.durationSeconds)}),a&&_jsxruntime.jsx.call(void 0, "span",{children:a})]})]}),s==="playlist"&&e.kind==="lesson"&&_jsxruntime.jsx.call(void 0, "span",{className:"mt-0.5 shrink-0",children:_jsxruntime.jsx.call(void 0, lt,{item:e})})]})})}function ct({course:e,selectedId:t,onSelect:s,variant:o,className:n}){let{texts:i}=h(),a=r=>_jsxruntime.jsx.call(void 0, "ul",{className:"flex flex-col gap-1",children:r.map(c=>_jsxruntime.jsx.call(void 0, Jt,{item:c,selected:c.id===t,variant:o,onSelect:s},c.id))});return _jsxruntime.jsxs.call(void 0, "nav",{"aria-label":i.contents,className:_chunkERL4Z7M7js.d.call(void 0, "space-y-4",n),children:[e.sections.map(r=>{let c=r.items.filter(y=>y.kind==="lesson"),b=c.filter(y=>y.completed).length;return _jsxruntime.jsxs.call(void 0, "section",{"data-section-id":r.id,children:[_jsxruntime.jsxs.call(void 0, "h3",{className:"mb-1 flex items-baseline justify-between gap-2 px-2 text-sm font-semibold",children:[_jsxruntime.jsx.call(void 0, "span",{className:"break-words",children:r.title}),c.length>0&&_jsxruntime.jsxs.call(void 0, "span",{className:"shrink-0 text-xs font-normal text-neutral-500 dark:text-neutral-400",children:[b,"/",c.length]})]}),a(r.items)]},r.id)}),e.finalItems.length>0&&_jsxruntime.jsx.call(void 0, "section",{"data-section-id":"final",children:a(e.finalItems)})]})}var _connect = require('@connectrpc/connect');var _codegenv2 = require('@bufbuild/protobuf/codegenv2');var _wkt = require('@bufbuild/protobuf/wkt');var qt=_codegenv2.fileDesc.call(void 0, "CiFwdWJsaWMvdjEvdXNlcl9wYW5lbF9jb3Vyc2UucHJvdG8SDXB1YmxpY19hcGkudjEiRAoPUGFuZWxMb2NrUmVhc29uEhYKDmdhdGluZ190ZXN0X2lkGAEgASgJEhkKEWdhdGluZ190ZXN0X3RpdGxlGAIgASgJIrQCCg9QYW5lbENvdXJzZUl0ZW0SCgoCaWQYASABKAkSMAoEa2luZBgCIAEoDjIiLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtS2luZBINCgV0aXRsZRgDIAEoCRIPCgdpc19mcmVlGAQgASgIEg4KBmxvY2tlZBgFIAEoCBI4Cgtsb2NrX3JlYXNvbhgGIAEoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxMb2NrUmVhc29uSACIAQESEQoJY29tcGxldGVkGAcgASgIEhgKEGR1cmF0aW9uX3NlY29uZHMYCCABKAUSGgoNdGh1bWJuYWlsX3VybBgJIAEoCUgBiAEBEg4KBmdhdGluZxgKIAEoCEIOCgxfbG9ja19yZWFzb25CEAoOX3RodW1ibmFpbF91cmwicwoSUGFuZWxDb3Vyc2VTZWN0aW9uEgoKAmlkGAEgASgJEg0KBXRpdGxlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEi0KBWl0ZW1zGAQgAygLMh4ucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUl0ZW0i3wIKC1BhbmVsQ291cnNlEgoKAmlkGAEgASgJEiwKBHR5cGUYAiABKA4yHi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlVHlwZRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRIWCgljb3Zlcl91cmwYBSABKAlIAIgBARIVCg10b3RhbF9sZXNzb25zGAYgASgFEhkKEWNvbXBsZXRlZF9sZXNzb25zGAcgASgFEhgKEHByb2dyZXNzX3BlcmNlbnQYCCABKAUSMwoIc2VjdGlvbnMYCSADKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlU2VjdGlvbhIzCgtmaW5hbF9pdGVtcxgKIAMoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtEhYKDnJlc3VtZV9pdGVtX2lkGAsgASgJQgwKCl9jb3Zlcl91cmwiRAoZVXNlclBhbmVsR2V0Q291cnNlUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJIosBChpVc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRItCgdzdWNjZXNzGAEgASgLMhoucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJfCgpQYW5lbFZpZGVvEg8KB2hsc191cmwYASABKAkSFwoKcG9zdGVyX3VybBgCIAEoCUgAiAEBEhgKEGR1cmF0aW9uX3NlY29uZHMYAyABKAVCDQoLX3Bvc3Rlcl91cmwiRgoPUGFuZWxBdHRhY2htZW50EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2l6ZRgDIAEoAxILCgN1cmwYBCABKAkiTAoMUGFuZWxJdGVtUmVmEgoKAmlkGAEgASgJEjAKBGtpbmQYAiABKA4yIi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlSXRlbUtpbmQigQQKC1BhbmVsTGVzc29uEgoKAmlkGAEgASgJEhIKCnNlY3Rpb25faWQYAiABKAkSDQoFdGl0bGUYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSFAoMY29udGVudF9odG1sGAUgASgJEi0KBXZpZGVvGAYgASgLMhkucHVibGljX2FwaS52MS5QYW5lbFZpZGVvSACIAQESMwoLYXR0YWNobWVudHMYByADKAsyHi5wdWJsaWNfYXBpLnYxLlBhbmVsQXR0YWNobWVudBIuCgRwcmV2GAggASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAYgBARIuCgRuZXh0GAkgASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAogBARIRCgljb21wbGV0ZWQYCiABKAgSGAoQcG9zaXRpb25fc2Vjb25kcxgLIAEoBRIRCglteV9yYXRpbmcYDCABKAUSFgoOYXZlcmFnZV9yYXRpbmcYDSABKAISFAoMcmF0aW5nX2NvdW50GA4gASgFEjcKDnVybHNfZXhwaXJlX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDiAEBQggKBl92aWRlb0IHCgVfcHJldkIHCgVfbmV4dEIRCg9fdXJsc19leHBpcmVfYXQiVwoZVXNlclBhbmVsR2V0TGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCSKLAQoaVXNlclBhbmVsR2V0TGVzc29uUmVzcG9uc2USLQoHc3VjY2VzcxgBIAEoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25IABI0CgdmYWlsdXJlGAIgASgOMiEucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUZhaWx1cmVIAEIICgZyZXN1bHQipwEKIlVzZXJQYW5lbFNhdmVMZXNzb25Qcm9ncmVzc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAkSEQoJY29tcGxldGVkGAQgASgIEhgKEHBvc2l0aW9uX3NlY29uZHMYBSABKAUSGAoQZHVyYXRpb25fc2Vjb25kcxgGIAEoBSKFAgojVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USTAoHc3VjY2VzcxgBIAEoCzI5LnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaUAoGUmVzdWx0EhEKCWNvbXBsZXRlZBgBIAEoCBIZChFjb21wbGV0ZWRfbGVzc29ucxgCIAEoBRIYChBwcm9ncmVzc19wZXJjZW50GAMgASgFQggKBnJlc3VsdCIoCgtQYW5lbENob2ljZRIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCSJPCg5QYW5lbE1jcUNvbmZpZxIrCgdjaG9pY2VzGAEgAygLMhoucHVibGljX2FwaS52MS5QYW5lbENob2ljZRIQCghtdWx0aXBsZRgCIAEoCCKCAQoTUGFuZWxUb2RvbGlzdENvbmZpZxI2CgVzdGVwcxgBIAMoCzInLnB1YmxpY19hcGkudjEuUGFuZWxUb2RvbGlzdENvbmZpZy5TdGVwGjMKBFN0ZXASCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEAoIcmVxdWlyZWQYAyABKAgiNgoSUGFuZWxGaWxsR2FwQ29uZmlnEhAKCHRlbXBsYXRlGAEgASgJEg4KBmJsYW5rcxgCIAMoCSJBChRQYW5lbFNvcnRPcmRlckNvbmZpZxIpCgVpdGVtcxgBIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxDaG9pY2UioQIKEVBhbmVsVGVzdFF1ZXN0aW9uEgoKAmlkGAEgASgJEg4KBnByb21wdBgCIAEoCRIOCgZwb2ludHMYAyABKAUSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUNvbmZpZ0gAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0Q29uZmlnSAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcENvbmZpZ0gAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQ29uZmlnSABCCAoGY29uZmlnIqsCCglQYW5lbFRlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSDgoGZ2F0aW5nGAQgASgIEh4KFnBhc3NfdGhyZXNob2xkX3BlcmNlbnQYBSABKAUSGAoQYXR0ZW1wdHNfYWxsb3dlZBgGIAEoBRIaCg1hdHRlbXB0c19sZWZ0GAcgASgFSACIAQESFQoNYXR0ZW1wdF9jb3VudBgIIAEoBRIaChJiZXN0X3Njb3JlX3BlcmNlbnQYCSABKAUSDgoGcGFzc2VkGAogASgIEjMKCXF1ZXN0aW9ucxgLIAMoCzIgLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0UXVlc3Rpb25CEAoOX2F0dGVtcHRzX2xlZnQiUwoXVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIPCgd0ZXN0X2lkGAMgASgJIocBChhVc2VyUGFuZWxHZXRUZXN0UmVzcG9uc2USKwoHc3VjY2VzcxgBIAEoCzIYLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSABCCAoGcmVzdWx0IiYKDlBhbmVsTWNxQW5zd2VyEhQKDHNlbGVjdGVkX2lkcxgBIAMoCSIqChNQYW5lbFRvZG9saXN0QW5zd2VyEhMKC2NoZWNrZWRfaWRzGAEgAygJIoIBChJQYW5lbEZpbGxHYXBBbnN3ZXISPQoGdmFsdWVzGAEgAygLMi0ucHVibGljX2FwaS52MS5QYW5lbEZpbGxHYXBBbnN3ZXIuVmFsdWVzRW50cnkaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChRQYW5lbFNvcnRPcmRlckFuc3dlchITCgtvcmRlcmVkX2lkcxgBIAMoCSKDAgoLUGFuZWxBbnN3ZXISEwoLcXVlc3Rpb25faWQYASABKAkSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUFuc3dlckgAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0QW5zd2VySAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcEFuc3dlckgAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQW5zd2VySABCBwoFdmFsdWUijQEKE1BhbmVsVGVzdFN1Ym1pc3Npb24SCgoCaWQYASABKAkSFQoNc2NvcmVfcGVyY2VudBgCIAEoBRIOCgZwYXNzZWQYAyABKAgSEwoLZHVyYXRpb25fbXMYBCABKAMSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAilwEKE1BhbmVsUXVlc3Rpb25SZXN1bHQSEwoLcXVlc3Rpb25faWQYASABKAkSDwoHY29ycmVjdBgCIAEoCBIOCgZwb2ludHMYAyABKAUSNwoOY29ycmVjdF9hbnN3ZXIYBCABKAsyGi5wdWJsaWNfYXBpLnYxLlBhbmVsQW5zd2VySACIAQFCEQoPX2NvcnJlY3RfYW5zd2VyIpgBChpVc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkSKwoHYW5zd2VycxgEIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxBbnN3ZXISEwoLZHVyYXRpb25fbXMYBSABKAMiyQIKG1VzZXJQYW5lbFN1Ym1pdFRlc3RSZXNwb25zZRJECgdzdWNjZXNzGAEgASgLMjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaowEKBlJlc3VsdBI2CgpzdWJtaXNzaW9uGAEgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEjMKB3Jlc3VsdHMYAiADKAsyIi5wdWJsaWNfYXBpLnYxLlBhbmVsUXVlc3Rpb25SZXN1bHQSGgoNYXR0ZW1wdHNfbGVmdBgDIAEoBUgAiAEBQhAKDl9hdHRlbXB0c19sZWZ0QggKBnJlc3VsdCJfCiNVc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkiqwIKJFVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAadAoGUmVzdWx0EjcKC3N1Ym1pc3Npb25zGAEgAygLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEhoKEmJlc3Rfc2NvcmVfcGVyY2VudBgCIAEoBRIVCg1hdHRlbXB0X2NvdW50GAMgASgFQggKBnJlc3VsdCJWChNQYW5lbFF1ZXN0aW9uQW5zd2VyEg8KB2NvbnRlbnQYASABKAkSLgoKY3JlYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAizAEKE1BhbmVsTGVzc29uUXVlc3Rpb24SCgoCaWQYASABKAkSDwoHY29udGVudBgCIAEoCRITCgthdXRob3JfbmFtZRgDIAEoCRIPCgdpc19taW5lGAQgASgIEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjcKBmFuc3dlchgGIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxRdWVzdGlvbkFuc3dlckgAiAEBQgkKB19hbnN3ZXIiYQojVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAki9gEKJFVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0TGVzc29uUXVlc3Rpb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaPwoGUmVzdWx0EjUKCXF1ZXN0aW9ucxgBIAMoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkIICgZyZXN1bHQicAohVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0EhQKDGFjY2Vzc190b2tlbhgBIAEoCRIRCglhY2Nlc3NfaWQYAiABKAkSEQoJbGVzc29uX2lkGAMgASgJEg8KB2NvbnRlbnQYBCABKAkimwEKIlVzZXJQYW5lbEFza0xlc3NvblF1ZXN0aW9uUmVzcG9uc2USNQoHc3VjY2VzcxgBIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJ4ChpVc2VyUGFuZWxSYXRlTGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCRINCgVzY29yZRgEIAEoBRIPCgdjb21tZW50GAUgASgJIu4BChtVc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2USRAoHc3VjY2VzcxgBIAEoCzIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsUmF0ZUxlc3NvblJlc3BvbnNlLlJlc3VsdEgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAGkkKBlJlc3VsdBIRCglteV9yYXRpbmcYASABKAUSFgoOYXZlcmFnZV9yYXRpbmcYAiABKAISFAoMcmF0aW5nX2NvdW50GAMgASgFQggKBnJlc3VsdCr6AgoSUGFuZWxDb3Vyc2VGYWlsdXJlEiAKHFBBTkVMX0NPVVJTRV9GQUlMVVJFX1VOS05PV04QABIlCiFQQU5FTF9DT1VSU0VfRkFJTFVSRV9VTkFVVEhPUklaRUQQARIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9DT1VSU0VfTk9UX0ZPVU5EEAISJwojUEFORUxfQ09VUlNFX0ZBSUxVUkVfSVRFTV9OT1RfRk9VTkQQAxIkCiBQQU5FTF9DT1VSU0VfRkFJTFVSRV9JVEVNX0xPQ0tFRBAEEikKJVBBTkVMX0NPVVJTRV9GQUlMVVJFX05PX0FUVEVNUFRTX0xFRlQQBRIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9JTlZBTElEX0FSR1VNRU5UEAYSJQohUEFORUxfQ09VUlNFX0ZBSUxVUkVfUkFURV9MSU1JVEVEEAcSJAogUEFORUxfQ09VUlNFX0ZBSUxVUkVfVU5BVkFJTEFCTEUQCCptCg9QYW5lbENvdXJzZVR5cGUSHQoZUEFORUxfQ09VUlNFX1RZUEVfVU5LTk9XThAAEh4KGlBBTkVMX0NPVVJTRV9UWVBFX1NUQU5EQVJEEAESGwoXUEFORUxfQ09VUlNFX1RZUEVfVklERU8QAip9ChNQYW5lbENvdXJzZUl0ZW1LaW5kEiIKHlBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfVU5LTk9XThAAEiEKHVBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfTEVTU09OEAESHwobUEFORUxfQ09VUlNFX0lURU1fS0lORF9URVNUEAIy+QcKFlVzZXJQYW5lbENvdXJzZVNlcnZpY2USYAoJR2V0Q291cnNlEigucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXF1ZXN0GikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRJgCglHZXRMZXNzb24SKC5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlcXVlc3QaKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlc3BvbnNlEnsKElNhdmVMZXNzb25Qcm9ncmVzcxIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVxdWVzdBoyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USWgoHR2V0VGVzdBImLnB1YmxpY19hcGkudjEuVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QaJy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldFRlc3RSZXNwb25zZRJjCgpTdWJtaXRUZXN0EikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBoqLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU3VibWl0VGVzdFJlc3BvbnNlEn4KE0xpc3RUZXN0U3VibWlzc2lvbnMSMi5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXF1ZXN0GjMucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2USfgoTTGlzdExlc3NvblF1ZXN0aW9ucxIyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QaMy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJ4ChFBc2tMZXNzb25RdWVzdGlvbhIwLnB1YmxpY19hcGkudjEuVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0GjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxBc2tMZXNzb25RdWVzdGlvblJlc3BvbnNlEmMKClJhdGVMZXNzb24SKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbFJhdGVMZXNzb25SZXF1ZXN0GioucHVibGljX2FwaS52MS5Vc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2ViBnByb3RvMw",[_wkt.file_google_protobuf_timestamp]);var ut=_codegenv2.serviceDesc.call(void 0, qt,0);var Z=class extends Error{constructor(t,s){super(_nullishCoalesce(s, () => (t))),this.name="CourseError",this.code=t}};var $t={0:"unknown",1:"unauthorized",2:"course_not_found",3:"item_not_found",4:"item_locked",5:"no_attempts_left",6:"invalid_argument",7:"rate_limited",8:"unavailable"};function es(e){return _nullishCoalesce($t[e], () => ("unknown"))}function ts(e){if(e instanceof Z)return e;let t=_connect.ConnectError.from(e);switch(t.code){case _connect.Code.Unauthenticated:case _connect.Code.PermissionDenied:return new Z("unauthorized",t.rawMessage);case _connect.Code.NotFound:return new Z("course_not_found",t.rawMessage);case _connect.Code.ResourceExhausted:return new Z("rate_limited",t.rawMessage);case _connect.Code.Unavailable:case _connect.Code.DeadlineExceeded:return new Z("unavailable",t.rawMessage);default:return e}}function F(e){let{result:t}=e;if(t.case==="success")return t.value;throw t.case==="failure"?new Z(es(t.value)):new Z("unknown","empty response")}function dt(e){return{id:e.id,kind:e.kind===2?"test":"lesson",title:e.title,isFree:e.isFree,locked:e.locked,lockReason:e.locked&&e.lockReason!=null?{gatingTestId:e.lockReason.gatingTestId,gatingTestTitle:e.lockReason.gatingTestTitle}:void 0,completed:e.completed,durationSeconds:e.durationSeconds,thumbnailUrl:e.thumbnailUrl||void 0,gating:e.gating}}function ss(e){return{id:e.id,type:e.type===2?"video":"standard",title:e.title,description:e.description,coverUrl:e.coverUrl||void 0,totalLessons:e.totalLessons,completedLessons:e.completedLessons,progressPercent:e.progressPercent,sections:e.sections.map(t=>({id:t.id,title:t.title,description:t.description,items:t.items.map(dt)})),finalItems:e.finalItems.map(dt),resumeItemId:e.resumeItemId}}function pt(e){return e==null?void 0:{id:e.id,kind:e.kind===2?"test":"lesson"}}function ns(e){return{id:e.id,sectionId:e.sectionId,title:e.title,description:e.description,contentHtml:e.contentHtml,video:e.video!=null&&e.video.hlsUrl!==""?{hlsUrl:e.video.hlsUrl,posterUrl:e.video.posterUrl||void 0,durationSeconds:e.video.durationSeconds}:void 0,attachments:e.attachments.map(t=>({id:t.id,name:t.name,size:Number(t.size),url:t.url})),prev:pt(e.prev),next:pt(e.next),completed:e.completed,positionSeconds:e.positionSeconds,myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount,urlsExpireAt:e.urlsExpireAt!=null?_wkt.timestampDate.call(void 0, e.urlsExpireAt):void 0}}function os(e){let t={id:e.id,prompt:e.prompt,points:e.points},{config:s}=e;switch(s.case){case"mcq":return{...t,config:{type:"mcq",choices:s.value.choices.map(o=>({id:o.id,label:o.label})),multiple:s.value.multiple}};case"todolist":return{...t,config:{type:"todolist",steps:s.value.steps.map(o=>({id:o.id,label:o.label,required:o.required}))}};case"fillGap":return{...t,config:{type:"fill_gap",template:s.value.template,blanks:[...s.value.blanks]}};case"sortOrder":return{...t,config:{type:"sort_order",items:s.value.items.map(o=>({id:o.id,label:o.label}))}};default:return}}function rs(e){return{id:e.id,title:e.title,description:e.description,gating:e.gating,passThresholdPercent:e.passThresholdPercent,attemptsAllowed:e.attemptsAllowed,attemptsLeft:e.attemptsLeft,attemptCount:e.attemptCount,bestScorePercent:e.bestScorePercent,passed:e.passed,questions:e.questions.map(os).filter(t=>t!=null)}}function mt(e){return{id:e.id,scorePercent:e.scorePercent,passed:e.passed,durationMs:Number(e.durationMs),createdAt:e.createdAt!=null?_wkt.timestampDate.call(void 0, e.createdAt):void 0}}function as(e){let{value:t}=e;switch(t.case){case"mcq":return{type:"mcq",selectedIds:[...t.value.selectedIds]};case"todolist":return{type:"todolist",checkedIds:[...t.value.checkedIds]};case"fillGap":return{type:"fill_gap",values:{...t.value.values}};case"sortOrder":return{type:"sort_order",orderedIds:[...t.value.orderedIds]};default:return}}function is(e,t){switch(t.type){case"mcq":return{questionId:e,value:{case:"mcq",value:{selectedIds:t.selectedIds}}};case"todolist":return{questionId:e,value:{case:"todolist",value:{checkedIds:t.checkedIds}}};case"fill_gap":return{questionId:e,value:{case:"fillGap",value:{values:t.values}}};case"sort_order":return{questionId:e,value:{case:"sortOrder",value:{orderedIds:t.orderedIds}}}}}function gt(e){return{id:e.id,content:e.content,authorName:e.authorName,isMine:e.isMine,createdAt:e.createdAt!=null?_wkt.timestampDate.call(void 0, e.createdAt):void 0,answer:e.answer!=null?{content:e.answer.content,createdAt:e.answer.createdAt!=null?_wkt.timestampDate.call(void 0, e.answer.createdAt):void 0}:void 0}}function ve(e,t){let s=()=>({accessId:t.accessId,accessToken:typeof t.accessToken=="function"?_nullishCoalesce(t.accessToken(), () => ("")):t.accessToken});async function o(n){try{return await n()}catch(i){throw ts(i)}}return{getCourse:()=>o(async()=>ss(F(await e.getCourse(s())))),getLesson:n=>o(async()=>ns(F(await e.getLesson({...s(),lessonId:n})))),saveProgress:n=>o(async()=>{let i=F(await e.saveLessonProgress({...s(),...n}));return{completed:i.completed,completedLessons:i.completedLessons,progressPercent:i.progressPercent}}),getTest:n=>o(async()=>rs(F(await e.getTest({...s(),testId:n})))),submitTest:(n,i,a)=>o(async()=>{let r=F(await e.submitTest({...s(),testId:n,durationMs:BigInt(Math.max(0,Math.round(a))),answers:Object.entries(i).map(([c,b])=>is(c,b))}));if(r.submission==null)throw new Z("unknown","missing submission");return{submission:mt(r.submission),results:r.results.map(c=>({questionId:c.questionId,correct:c.correct,points:c.points,correctAnswer:c.correctAnswer!=null?as(c.correctAnswer):void 0})),attemptsLeft:r.attemptsLeft}}),listSubmissions:n=>o(async()=>{let i=F(await e.listTestSubmissions({...s(),testId:n}));return{submissions:i.submissions.map(mt),bestScorePercent:i.bestScorePercent,attemptCount:i.attemptCount}}),listQuestions:n=>o(async()=>F(await e.listLessonQuestions({...s(),lessonId:n})).questions.map(gt)),askQuestion:(n,i)=>o(async()=>gt(F(await e.askLessonQuestion({...s(),lessonId:n,content:i})))),rate:(n,i,a="")=>o(async()=>{let r=F(await e.rateLesson({...s(),lessonId:n,score:i,comment:a}));return{myRating:r.myRating,averageRating:r.averageRating,ratingCount:r.ratingCount}})}}function Ce(e){let t=_nullishCoalesce(e.host, () => (_chunk6IACFTJRjs.m.call(void 0, ))),s=_connect.createClient.call(void 0, ut,_chunk6IACFTJRjs.n.call(void 0, t));return ve(s,{accessId:e.accessId,accessToken:_nullishCoalesce(e.accessToken, () => ((()=>{let{projectID:o,host:n}=_chunkDGUIG334js.b.call(void 0, );return _chunkDGUIG334js.k.call(void 0, o,n)})))})}function bt({value:e,onSelect:t,disabled:s}){let{texts:o}=h(),[n,i]=_react.useState.call(void 0, 0),a=n||e;return _jsxruntime.jsx.call(void 0, "div",{className:"flex items-center gap-1",role:t?"radiogroup":"img","aria-label":w(o.rateStar,{n:Math.round(e)}),children:[1,2,3,4,5].map(r=>{let c=r<=Math.round(a),b=_jsxruntime.jsx.call(void 0, _lucidereact.Star,{className:_chunkERL4Z7M7js.d.call(void 0, "size-5",c?"fill-amber-400 text-amber-400":"text-neutral-300 dark:text-neutral-600"),"aria-hidden":!0});return t?_jsxruntime.jsx.call(void 0, "button",{type:"button",role:"radio","aria-checked":r===e,"aria-label":w(o.rateStar,{n:r}),disabled:s,className:"rounded p-0.5 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",onMouseEnter:()=>i(r),onMouseLeave:()=>i(0),onClick:()=>t(r),children:b},r):_jsxruntime.jsx.call(void 0, "span",{children:b},r)})})}var ft="bg-[var(--course-accent,var(--primary))] text-[var(--course-accent-fg,var(--primary-foreground))] dark:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))] dark:text-[var(--course-accent-dark-fg,var(--course-accent-fg,var(--primary-foreground)))]",$=_chunkERL4Z7M7js.d.call(void 0, ft,"hover:bg-[var(--course-accent,var(--primary))] hover:opacity-90 dark:hover:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))]"),z="rounded-xl bg-white p-4 drop-shadow-xl sm:p-6 dark:border dark:border-neutral-700 dark:bg-neutral-900 dark:drop-shadow-none";function J(e,t){if(e instanceof Z)switch(e.code){case"unauthorized":return t.errorUnauthorized;case"course_not_found":case"item_not_found":return t.errorNotFound;case"unavailable":return t.errorUnavailable}return t.errorGeneric}function ee({error:e,onRetry:t,className:s}){let{texts:o}=h();return _jsxruntime.jsxs.call(void 0, "div",{role:"alert",className:_chunkERL4Z7M7js.d.call(void 0, "flex flex-col items-start gap-3 rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",s),children:[_jsxruntime.jsxs.call(void 0, "p",{className:"flex items-center gap-2 font-medium",children:[_jsxruntime.jsx.call(void 0, _lucidereact.AlertTriangle,{className:"size-4 shrink-0","aria-hidden":!0}),J(e,o)]}),t&&_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{variant:"outline",size:"sm",onClick:t,children:o.retry})]})}function ue({label:e}){let{texts:t}=h();return _jsxruntime.jsxs.call(void 0, "div",{role:"status","aria-label":_nullishCoalesce(e, () => (t.loading)),className:"space-y-3",children:[_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.u,{className:"aspect-video w-full"}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.u,{className:"h-6 w-2/3"}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.u,{className:"h-4 w-full"}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.u,{className:"h-4 w-5/6"})]})}function At({percent:e,label:t}){let s=Math.max(0,Math.min(100,Math.round(e)));return _jsxruntime.jsx.call(void 0, "div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":s,"aria-label":t,className:"h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-700",children:_jsxruntime.jsx.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, "h-full rounded-full transition-all duration-300",ft),style:{width:`${s}%`}})})}function j(e,t,s){let[o,n]=_react.useState.call(void 0, s!==void 0?{status:"success",data:s}:{status:"loading"}),[i,a]=_react.useState.call(void 0, 0),r=_react.useRef.call(void 0, 0),c=_react.useRef.call(void 0, e);c.current=e;let b=_react.useRef.call(void 0, s!==void 0);_react.useEffect.call(void 0, ()=>{if(b.current){b.current=!1;return}let p=++r.current;return n({status:"loading"}),c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(A=>{p===r.current&&n({status:"error",error:A})}),()=>{r.current+=1}},[...t,i]);let y=_react.useCallback.call(void 0, ()=>a(p=>p+1),[]),f=_react.useCallback.call(void 0, ()=>{let p=++r.current;c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(()=>{})},[]),d=_react.useCallback.call(void 0, p=>{n(A=>A.status==="success"?{status:"success",data:p(A.data)}:A)},[]);return{...o,reload:y,refresh:f,mutate:d}}function St({lessonId:e,initial:t}){let{dataSource:s,texts:o,preview:n}=h(),i=Q(),[a,r]=_react.useState.call(void 0, t),[c,b]=_react.useState.call(void 0, t.myRating),[y,f]=_react.useState.call(void 0, ""),[d,p]=_react.useState.call(void 0, "idle"),[A,C]=_react.useState.call(void 0, );async function I(){if(!(c<1)){p("saving");try{r(await s.rate(e,c,y.trim())),p("saved"),i("lesson_rated",{lesson_id:e,rating:c})}catch(g){C(g),p("error")}}}return _jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`rate-${e}`,className:"space-y-3",children:[_jsxruntime.jsx.call(void 0, "h3",{id:`rate-${e}`,className:"text-lg font-semibold",children:o.rateTitle}),_jsxruntime.jsx.call(void 0, bt,{value:c,onSelect:g=>{b(g),p("idle")},disabled:n||d==="saving"}),a.ratingCount>0&&_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(o.rateAverage,{average:a.averageRating.toFixed(1),count:a.ratingCount})}),!n&&c>0&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.v,{value:y,maxLength:1e3,placeholder:o.ratePlaceholder,onChange:g=>{f(g.target.value),p("idle")}}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{size:"sm",className:$,disabled:d==="saving",onClick:I,children:o.rateSubmit})]}),d==="saved"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:o.rateSaved}),d==="error"&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(A,o)})]})}function yt(e){return e==null?"":e.toLocaleDateString()}function ht({lessonId:e}){let{dataSource:t,texts:s,preview:o}=h(),n=j(()=>t.listQuestions(e),[t,e]),[i,a]=_react.useState.call(void 0, ""),[r,c]=_react.useState.call(void 0, "idle"),[b,y]=_react.useState.call(void 0, );async function f(){let d=i.trim();if(d!==""){c("sending");try{let p=await t.askQuestion(e,d);n.mutate(A=>[p,...A]),a(""),c("sent")}catch(p){y(p),c("error")}}}return _jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`qa-${e}`,className:"space-y-4",children:[_jsxruntime.jsx.call(void 0, "h3",{id:`qa-${e}`,className:"text-lg font-semibold",children:s.questionsTitle}),_jsxruntime.jsxs.call(void 0, "form",{className:"space-y-2",onSubmit:d=>{d.preventDefault(),f()},children:[_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.v,{value:i,maxLength:2e3,placeholder:s.questionPlaceholder,"aria-label":s.questionPlaceholder,onChange:d=>{a(d.target.value),c("idle")}}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{type:"submit",size:"sm",className:$,disabled:r==="sending"||i.trim()==="",children:s.questionSubmit}),r==="sent"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:s.questionSent}),r==="error"&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(b,s)})]}),n.status==="loading"&&_jsxruntime.jsx.call(void 0, "p",{role:"status",className:"text-sm text-neutral-500",children:s.loading}),n.status==="error"&&_jsxruntime.jsx.call(void 0, ee,{error:n.error,onRetry:n.reload}),n.status==="success"&&(n.data.length===0?_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:s.questionsEmpty}):_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-3",children:n.data.map(d=>_jsxruntime.jsxs.call(void 0, "li",{className:"rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsxs.call(void 0, "p",{className:"mb-1 text-xs text-neutral-500 dark:text-neutral-400",children:[d.isMine?s.questionMine:d.authorName,d.createdAt&&` \xB7 ${yt(d.createdAt)}`]}),_jsxruntime.jsx.call(void 0, "p",{className:"break-words whitespace-pre-wrap",children:d.content}),d.answer&&_jsxruntime.jsxs.call(void 0, "div",{className:"mt-2 border-l-2 border-neutral-400 pl-3 dark:border-neutral-500",children:[_jsxruntime.jsxs.call(void 0, "p",{className:"mb-1 text-xs font-medium text-neutral-500 dark:text-neutral-400",children:[s.questionTeamAnswer,d.answer.createdAt&&` \xB7 ${yt(d.answer.createdAt)}`]}),_jsxruntime.jsx.call(void 0, "p",{className:"break-words whitespace-pre-wrap",children:d.answer.content})]})]},d.id))}))]})}var _dompurify = require('dompurify'); var _dompurify2 = _interopRequireDefault(_dompurify);var gs={USE_PROFILES:{html:!0},FORBID_TAGS:["style","form","input","button","textarea","select","iframe","frame","object","embed","base","meta","link"],FORBID_ATTR:["style","srcdoc","formaction"],ALLOW_DATA_ATTR:!1,RETURN_TRUSTED_TYPE:!1};function bs(e){if(e.isSupported===!1||e.sanitize==null)return()=>"";let t=e.sanitize.bind(e);return _optionalChain([e, 'access', _18 => _18.addHook, 'optionalCall', _19 => _19("afterSanitizeAttributes",s=>{s.tagName==="A"&&s.hasAttribute("href")&&(s.setAttribute("target","_blank"),s.setAttribute("rel","noopener noreferrer nofollow")),s.tagName==="IMG"&&(s.setAttribute("loading","lazy"),s.setAttribute("referrerpolicy","no-referrer"))})]),s=>s==null||s===""?"":String(t(s,gs))}var vt;function Pe(e){return typeof window>"u"?"":(vt??=bs(_dompurify2.default),vt(e))}var _hlsjs = require('hls.js'); var _hlsjs2 = _interopRequireDefault(_hlsjs);function xs(e){return e.canPlayType("application/vnd.apple.mpegurl")!==""}function kt({src:e,poster:t,startAt:s=0,durationHint:o=0,autoPlay:n=!1,lessonId:i,onReport:a,onEnded:r,onExpired:c,className:b}){let{texts:y}=h(),f=Q(),d=_react.useRef.call(void 0, f);d.current=f;let p=_react.useRef.call(void 0, null),[A,C]=_react.useState.call(void 0, !1),[I,g]=_react.useState.call(void 0, 0),k=_react.useRef.call(void 0, {onReport:a,onEnded:r,onExpired:c,durationHint:o});k.current={onReport:a,onEnded:r,onExpired:c,durationHint:o};let M=_react.useRef.call(void 0, void 0),E=_react.useCallback.call(void 0, (l,R=p.current)=>{if(R==null||k.current.onReport==null)return;let m=Math.floor(R.currentTime);if(m<=0&&l!=="ended")return;let T=Number.isFinite(R.duration)?R.duration:k.current.durationHint;M.current=m,k.current.onReport({positionSeconds:m,durationSeconds:Math.floor(T||0),reason:l})},[]);return _react.useEffect.call(void 0, ()=>{let l=p.current;if(l==null)return;C(!1);let R,m=!1,T=!1,B,q=()=>{s>0&&(l.currentTime=s),n&&l.play().catch(()=>{})};xs(l)?(l.src=e,l.addEventListener("loadedmetadata",q,{once:!0})):_hlsjs2.default.isSupported()?(R=new _hlsjs2.default,R.attachMedia(l),R.loadSource(e),R.on(_hlsjs2.default.Events.MANIFEST_PARSED,q),R.on(_hlsjs2.default.Events.ERROR,(O,Y)=>{if(!Y.fatal)return;let Be=_optionalChain([Y, 'access', _20 => _20.response, 'optionalAccess', _21 => _21.code]);Be===401||Be===403?(_optionalChain([k, 'access', _22 => _22.current, 'access', _23 => _23.onExpired, 'optionalCall', _24 => _24()]),C(!0)):Y.type===_hlsjs2.default.ErrorTypes.NETWORK_ERROR&&!m?(m=!0,_optionalChain([R, 'optionalAccess', _25 => _25.startLoad, 'call', _26 => _26()])):Y.type===_hlsjs2.default.ErrorTypes.MEDIA_ERROR&&!T?(T=!0,_optionalChain([R, 'optionalAccess', _27 => _27.recoverMediaError, 'call', _28 => _28()])):C(!0)})):l.src=e;let pe=()=>{clearInterval(B),B=setInterval(()=>E("periodic"),15e3)},te=()=>{clearInterval(B),l.ended||E("pause")},oe=new Set,S=l.currentTime,W=0,re=O=>{if(i!=null)for(let Y of _chunkDF2IK2GNjs.s.call(void 0, O,oe))d.current("video_progress",{lesson_id:i,milestone:Y})},ae=()=>{let O=l.currentTime,Y=Number.isFinite(l.duration)?l.duration:k.current.durationHint;Y>0&&!l.seeking&&O>=S&&O-S<=2&&(W=Math.max(W,O),re(W/Y*100)),S=O},Ue=()=>{clearInterval(B),i!=null&&!oe.has(100)&&(oe.add(100),d.current("video_progress",{lesson_id:i,milestone:100})),E("ended"),_optionalChain([k, 'access', _29 => _29.current, 'access', _30 => _30.onEnded, 'optionalCall', _31 => _31()])},Le=()=>{R==null&&C(!0)};return l.addEventListener("play",pe),l.addEventListener("pause",te),l.addEventListener("ended",Ue),l.addEventListener("error",Le),l.addEventListener("timeupdate",ae),()=>{clearInterval(B),l.removeEventListener("play",pe),l.removeEventListener("pause",te),l.removeEventListener("ended",Ue),l.removeEventListener("error",Le),l.removeEventListener("timeupdate",ae),l.removeEventListener("loadedmetadata",q),!l.ended&&l.currentTime>0&&E("leave",l),_optionalChain([R, 'optionalAccess', _32 => _32.destroy, 'call', _33 => _33()]),l.removeAttribute("src"),l.load()}},[e,I]),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, "relative overflow-hidden rounded-xl bg-black",b),children:[_jsxruntime.jsx.call(void 0, "video",{ref:p,className:"aspect-video w-full",poster:t,controls:!0,playsInline:!0,preload:"metadata",controlsList:"nodownload"}),A&&_jsxruntime.jsxs.call(void 0, "div",{role:"alert",className:"absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/80 p-4 text-center text-sm text-white",children:[_jsxruntime.jsx.call(void 0, "p",{children:y.videoError}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{variant:"secondary",size:"sm",onClick:()=>{_optionalChain([k, 'access', _34 => _34.current, 'access', _35 => _35.onExpired, 'optionalCall', _36 => _36()]),g(l=>l+1)},children:y.videoRetry})]})]})}function Vt({lesson:e,position:t=0,courseType:s,prev:o,next:n,autoplay:i,onAutoplayChange:a,startPlaying:r,onNavigate:c,onProgressSaved:b,onEnded:y,onUrlsExpired:f}){let{dataSource:d,texts:p,preview:A}=h(),C=Q(),[I,g]=_react.useState.call(void 0, e.completed),k=_react.useRef.call(void 0, e.completed),M=_react.useRef.call(void 0, void 0),E=_react.useRef.call(void 0, e.positionSeconds),[l,R]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{C("lesson_started",{lesson_id:e.id,position:t})},[e.id]);let m=_optionalChain([e, 'access', _37 => _37.urlsExpireAt, 'optionalAccess', _38 => _38.getTime, 'call', _39 => _39()]);_react.useEffect.call(void 0, ()=>{if(m==null)return;let S=m-Date.now()-6e4;if(S<=0||S>2**31-1)return;let W=setTimeout(f,S);return()=>clearTimeout(W)},[m]);let T=_react.useMemo.call(void 0, ()=>Pe(e.contentHtml),[e.contentHtml]);async function B(S,W,re){if(A)return;let ae=await d.saveProgress({lessonId:e.id,completed:re,positionSeconds:S,durationSeconds:W});M.current=S,ae.completed&&!k.current&&(k.current=!0,g(!0),C("lesson_completed",{lesson_id:e.id,position:t})),b(e.id,ae)}function q(S){if(E.current=S.positionSeconds,A||S.reason==="periodic"&&S.positionSeconds===M.current)return;let W=S.reason==="ended"||tt(S.positionSeconds,S.durationSeconds);B(S.positionSeconds,S.durationSeconds,W&&!k.current).catch(re=>{console.warn("Saving the progress of the lesson failed",re)})}async function pe(){R(!0);try{await B(E.current,_nullishCoalesce(_optionalChain([e, 'access', _40 => _40.video, 'optionalAccess', _41 => _41.durationSeconds]), () => (0)),!0)}catch(S){console.warn("Marking the lesson as completed failed",S)}finally{R(!1)}}let te=e.description.trim(),oe=T!==""||te!=="";return _jsxruntime.jsxs.call(void 0, "article",{"data-lesson-id":e.id,className:"min-w-0 space-y-5","aria-labelledby":`lesson-${e.id}`,children:[e.video&&_jsxruntime.jsx.call(void 0, kt,{src:e.video.hlsUrl,poster:e.video.posterUrl,lessonId:e.id,startAt:st(E.current,e.video.durationSeconds),durationHint:e.video.durationSeconds,autoPlay:r,onReport:q,onEnded:y,onExpired:f}),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, z,"space-y-5"),children:[_jsxruntime.jsxs.call(void 0, "header",{className:"flex flex-wrap items-start justify-between gap-3",children:[_jsxruntime.jsx.call(void 0, "h2",{id:`lesson-${e.id}`,className:"text-2xl font-semibold break-words",children:e.title}),!A&&_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{size:"sm",variant:I?"outline":"default",className:_chunkERL4Z7M7js.d.call(void 0, !I&&$),disabled:I||l,onClick:pe,children:I?p.markedComplete:p.markComplete})]}),s==="video"&&e.video&&_jsxruntime.jsxs.call(void 0, "label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300",children:[_jsxruntime.jsx.call(void 0, "input",{type:"checkbox",checked:i,onChange:S=>a(S.target.checked)}),p.autoplay]}),te!==""&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:te}),T!==""&&_jsxruntime.jsx.call(void 0, "div",{className:"bitsnap-course-html break-words [&_a]:underline [&_blockquote]:border-l-4 [&_blockquote]:pl-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_img]:h-auto [&_img]:max-w-full [&_ol]:list-decimal [&_ol]:pl-6 [&_p]:my-3 [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto [&_ul]:list-disc [&_ul]:pl-6",dangerouslySetInnerHTML:{__html:T}}),!oe&&!e.video&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:p.noContent}),e.attachments.length>0&&_jsxruntime.jsxs.call(void 0, "section",{"aria-labelledby":`files-${e.id}`,className:"space-y-2",children:[_jsxruntime.jsxs.call(void 0, "h3",{id:`files-${e.id}`,className:"flex items-center gap-2 text-lg font-semibold",children:[_jsxruntime.jsx.call(void 0, _lucidereact.Paperclip,{className:"size-4","aria-hidden":!0}),p.attachments]}),_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-2",children:e.attachments.map(S=>_jsxruntime.jsx.call(void 0, "li",{children:_jsxruntime.jsxs.call(void 0, "a",{href:S.url,target:"_blank",rel:"noopener noreferrer",download:S.name,className:"flex items-center justify-between gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm transition hover:bg-neutral-200 dark:bg-neutral-800 dark:hover:bg-neutral-700",children:[_jsxruntime.jsxs.call(void 0, "span",{className:"min-w-0 break-words",children:[S.name,_jsxruntime.jsx.call(void 0, "span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:nt(S.size)})]}),_jsxruntime.jsxs.call(void 0, "span",{className:"flex shrink-0 items-center gap-1 text-xs font-medium",children:[p.download,_jsxruntime.jsx.call(void 0, _lucidereact.Download,{className:"size-3.5","aria-hidden":!0})]})]})},S.id))})]}),_jsxruntime.jsxs.call(void 0, "nav",{className:"flex items-center justify-between gap-3 border-t pt-4",children:[_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"outline",size:"sm",disabled:o==null,onClick:()=>o&&c(o),children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),p.prevItem]}),_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"outline",size:"sm",disabled:n==null,onClick:()=>n&&c(n),children:[p.nextItem,_jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight,{"aria-hidden":!0})]})]})]}),_jsxruntime.jsx.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, z),children:_jsxruntime.jsx.call(void 0, St,{lessonId:e.id,initial:{myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount}})}),_jsxruntime.jsx.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, z),children:_jsxruntime.jsx.call(void 0, ht,{lessonId:e.id})})]})}var It={pl:{back:"Wr\xF3\u0107",loading:"\u0141adowanie kursu...",retry:"Spr\xF3buj ponownie",errorGeneric:"Nie uda\u0142o si\u0119 za\u0142adowa\u0107 danych. Spr\xF3buj ponownie za chwil\u0119.",errorUnauthorized:"Nie masz dost\u0119pu do tego kursu. Zaloguj si\u0119 ponownie lub skontaktuj si\u0119 z pomoc\u0105.",errorNotFound:"Nie znaleziono tego kursu lub lekcji.",errorUnavailable:"Kurs jest chwilowo niedost\u0119pny. Spr\xF3buj ponownie za chwil\u0119.",previewBadge:"Podgl\u0105d",progressLessons:"{done} z {total} lekcji",progressPercent:"{percent}% uko\u0144czono",contents:"Spis tre\u015Bci",free:"Darmowa",locked:"Zablokowane",lockedByTest:"Odblokuje je zaliczenie testu: {test}",lockedPage:"Ta lekcja jest zablokowana. Zalicz test \u201E{test}\u201D, aby j\u0105 odblokowa\u0107.",testBadge:"Test",completed:"Uko\u0144czono",continueCourse:"Kontynuuj kurs",noItem:"Wybierz lekcj\u0119 z listy.",markComplete:"Oznacz jako uko\u0144czon\u0105",markedComplete:"Lekcja uko\u0144czona",prevItem:"Poprzednia",nextItem:"Nast\u0119pna",attachments:"Materia\u0142y do pobrania",download:"Pobierz",autoplay:"Autoodtwarzanie nast\u0119pnej lekcji",videoError:"Nie uda\u0142o si\u0119 odtworzy\u0107 wideo.",videoRetry:"Od\u015Bwie\u017C wideo",noContent:"Ta lekcja nie ma jeszcze tre\u015Bci.",testGating:"Zaliczenie tego testu odblokowuje kolejne lekcje.",testAttemptsLeft:"Pozosta\u0142o pr\xF3b: {count}",testAttemptsUnlimited:"Liczba pr\xF3b nie jest ograniczona.",testNoAttemptsLeft:"Wykorzystano wszystkie pr\xF3by.",testPassThreshold:"Pr\xF3g zaliczenia: {percent}%",testBestScore:"Najlepszy wynik: {percent}%",testSubmit:"Sprawd\u017A odpowiedzi",testSubmitting:"Sprawdzanie...",testUnanswered:"Pytania bez odpowiedzi: {count}",testPassed:"Test zaliczony",testFailed:"Test niezaliczony",testScore:"Wynik: {percent}%",testCorrect:"Poprawnie",testIncorrect:"Niepoprawnie",testCorrectAnswer:"Poprawna odpowied\u017A",testTryAgain:"Spr\xF3buj ponownie",testPreviousAttempts:"Poprzednie podej\u015Bcia",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"Ten test nie ma jeszcze pyta\u0144.",mcqSingle:"Wybierz jedn\u0105 odpowied\u017A",mcqMultiple:"Zaznacz wszystkie poprawne odpowiedzi",todoHint:"Zaznacz wykonane kroki",todoRequired:"wymagany",gapPlaceholder:"uzupe\u0142nij",sortHint:"U\u0142\xF3\u017C elementy w poprawnej kolejno\u015Bci",moveUp:"Przesu\u0144 w g\xF3r\u0119",moveDown:"Przesu\u0144 w d\xF3\u0142",questionsTitle:"Pytania do lekcji",questionsEmpty:"Nikt jeszcze nie zada\u0142 pytania.",questionPlaceholder:"Zadaj pytanie autorowi kursu",questionSubmit:"Wy\u015Blij pytanie",questionSent:"Pytanie wys\u0142ane.",questionMine:"Ty",questionTeamAnswer:"Odpowied\u017A autora",rateTitle:"Oce\u0144 lekcj\u0119",rateStar:"{n} z 5",ratePlaceholder:"Komentarz (opcjonalnie)",rateSubmit:"Zapisz ocen\u0119",rateSaved:"Dzi\u0119kujemy za ocen\u0119.",rateAverage:"\u015Arednia ocena {average} ({count})"},en:{back:"Back",loading:"Loading the course...",retry:"Try again",errorGeneric:"Could not load the data. Please try again in a moment.",errorUnauthorized:"You do not have access to this course. Sign in again or contact support.",errorNotFound:"This course or lesson was not found.",errorUnavailable:"The course is temporarily unavailable. Please try again in a moment.",previewBadge:"Preview",progressLessons:"{done} of {total} lessons",progressPercent:"{percent}% complete",contents:"Contents",free:"Free",locked:"Locked",lockedByTest:"Pass the test to unlock it: {test}",lockedPage:"This lesson is locked. Pass the test \u201C{test}\u201D to unlock it.",testBadge:"Test",completed:"Completed",continueCourse:"Continue the course",noItem:"Pick a lesson from the list.",markComplete:"Mark as completed",markedComplete:"Lesson completed",prevItem:"Previous",nextItem:"Next",attachments:"Downloads",download:"Download",autoplay:"Autoplay the next lesson",videoError:"The video could not be played.",videoRetry:"Reload the video",noContent:"This lesson has no content yet.",testGating:"Passing this test unlocks the following lessons.",testAttemptsLeft:"Attempts left: {count}",testAttemptsUnlimited:"The number of attempts is unlimited.",testNoAttemptsLeft:"You have used all attempts.",testPassThreshold:"Passing score: {percent}%",testBestScore:"Best score: {percent}%",testSubmit:"Check answers",testSubmitting:"Checking...",testUnanswered:"Unanswered questions: {count}",testPassed:"Test passed",testFailed:"Test not passed",testScore:"Score: {percent}%",testCorrect:"Correct",testIncorrect:"Incorrect",testCorrectAnswer:"Correct answer",testTryAgain:"Try again",testPreviousAttempts:"Previous attempts",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"This test has no questions yet.",mcqSingle:"Choose one answer",mcqMultiple:"Select all correct answers",todoHint:"Check the steps you have done",todoRequired:"required",gapPlaceholder:"fill in",sortHint:"Put the items in the correct order",moveUp:"Move up",moveDown:"Move down",questionsTitle:"Questions about this lesson",questionsEmpty:"Nobody has asked a question yet.",questionPlaceholder:"Ask the course author a question",questionSubmit:"Send question",questionSent:"Question sent.",questionMine:"You",questionTeamAnswer:"Answer from the author",rateTitle:"Rate this lesson",rateStar:"{n} of 5",ratePlaceholder:"Comment (optional)",rateSubmit:"Save rating",rateSaved:"Thanks for your rating.",rateAverage:"Average rating {average} ({count})"}};function Te(e,t=_chunkERL4Z7M7js.m.call(void 0, )){return _chunkERL4Z7M7js.i.call(void 0, It,t,e)}function Ns({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="mcq")return null;let{choices:i,multiple:a}=e.config;return _jsxruntime.jsxs.call(void 0, "fieldset",{className:"space-y-2",disabled:s,children:[_jsxruntime.jsx.call(void 0, "legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:a?n.mcqMultiple:n.mcqSingle}),i.map(r=>{let c=t.selectedIds.includes(r.id);return _jsxruntime.jsxs.call(void 0, "label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsx.call(void 0, "input",{className:"mt-0.5",type:a?"checkbox":"radio",name:`q-${e.id}`,checked:c,onChange:()=>o({type:"mcq",selectedIds:a?c?t.selectedIds.filter(b=>b!==r.id):[...t.selectedIds,r.id]:[r.id]})}),_jsxruntime.jsx.call(void 0, "span",{className:"break-words",children:r.label})]},r.id)})]})}function Ps({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();return e.config.type!=="todolist"?null:_jsxruntime.jsxs.call(void 0, "fieldset",{className:"space-y-2",disabled:s,children:[_jsxruntime.jsx.call(void 0, "legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:n.todoHint}),e.config.steps.map(i=>{let a=t.checkedIds.includes(i.id);return _jsxruntime.jsxs.call(void 0, "label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsx.call(void 0, "input",{className:"mt-0.5",type:"checkbox",checked:a,onChange:()=>o({type:"todolist",checkedIds:a?t.checkedIds.filter(r=>r!==i.id):[...t.checkedIds,i.id]})}),_jsxruntime.jsxs.call(void 0, "span",{className:"break-words",children:[i.label,i.required&&_jsxruntime.jsxs.call(void 0, "span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:["(",n.todoRequired,")"]})]})]},i.id)})]})}function Vs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="fill_gap")return null;let i=he(e.config.template,e.config.blanks);return _jsxruntime.jsx.call(void 0, "p",{className:"text-sm leading-10 break-words",children:i.map((a,r)=>a.type==="text"?_jsxruntime.jsx.call(void 0, "span",{className:"whitespace-pre-wrap",children:a.text},r):_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.r,{className:"mx-1 inline-block h-8 w-36 align-middle","aria-label":`${n.gapPlaceholder} ${a.id}`,placeholder:n.gapPlaceholder,disabled:s,value:_nullishCoalesce(t.values[a.id], () => ("")),onChange:c=>o({type:"fill_gap",values:{...t.values,[a.id]:c.target.value}})},r))})}function Is({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="sort_order")return null;let i=new Map(e.config.items.map(r=>[r.id,r.label])),a=(r,c)=>o({type:"sort_order",orderedIds:at(t.orderedIds,r,c)});return _jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:n.sortHint}),_jsxruntime.jsx.call(void 0, "ol",{className:"space-y-2",children:t.orderedIds.map((r,c)=>_jsxruntime.jsxs.call(void 0, "li",{className:"flex items-center gap-2 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[_jsxruntime.jsxs.call(void 0, "span",{className:"w-5 text-xs text-neutral-500",children:[c+1,"."]}),_jsxruntime.jsx.call(void 0, "span",{className:"min-w-0 flex-1 break-words",children:_nullishCoalesce(i.get(r), () => (r))}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveUp,disabled:s||c===0,onClick:()=>a(c,c-1),children:_jsxruntime.jsx.call(void 0, _lucidereact.ArrowUp,{"aria-hidden":!0})}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveDown,disabled:s||c===t.orderedIds.length-1,onClick:()=>a(c,c+1),children:_jsxruntime.jsx.call(void 0, _lucidereact.ArrowDown,{"aria-hidden":!0})})]},r))})]})}function Ts({question:e,answer:t,disabled:s,onChange:o}){let n={question:e,disabled:s,onChange:o};switch(t.type){case"mcq":return _jsxruntime.jsx.call(void 0, Ns,{...n,answer:t});case"todolist":return _jsxruntime.jsx.call(void 0, Ps,{...n,answer:t});case"fill_gap":return _jsxruntime.jsx.call(void 0, Vs,{...n,answer:t});case"sort_order":return _jsxruntime.jsx.call(void 0, Is,{...n,answer:t})}}function ws({list:e}){let{texts:t}=h();return e.submissions.length===0?null:_jsxruntime.jsxs.call(void 0, "section",{className:"space-y-2",children:[_jsxruntime.jsx.call(void 0, "h3",{className:"text-sm font-semibold",children:t.testPreviousAttempts}),_jsxruntime.jsx.call(void 0, "ul",{className:"space-y-1 text-sm",children:e.submissions.map(s=>_jsxruntime.jsxs.call(void 0, "li",{className:"flex items-center gap-2 text-neutral-700 dark:text-neutral-300",children:[s.passed?_jsxruntime.jsx.call(void 0, _lucidereact.Check,{className:"size-4 text-emerald-600","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.X,{className:"size-4 text-red-600","aria-hidden":!0}),w(t.testAttemptRow,{percent:s.scorePercent,date:_nullishCoalesce(_optionalChain([s, 'access', _42 => _42.createdAt, 'optionalAccess', _43 => _43.toLocaleString, 'call', _44 => _44()]), () => (""))})]},s.id))})]})}function Es({test:e,onSubmitted:t,onTryAgain:s}){let{dataSource:o,texts:n}=h(),[i,a]=_react.useState.call(void 0, {}),[r,c]=_react.useState.call(void 0, ),[b,y]=_react.useState.call(void 0, !1),[f,d]=_react.useState.call(void 0, ),p=_react.useRef.call(void 0, Date.now()),A=_react.useRef.call(void 0, e.questions).current,C=e.attemptsLeft!=null&&e.attemptsLeft<=0,I=r?r.attemptsLeft:e.attemptsLeft,g=rt(A,i),k=l=>_nullishCoalesce(i[l.id], () => (ot(l.config)));async function M(){y(!0),d(void 0);try{let l={};for(let m of A)l[m.id]=k(m);let R=await o.submitTest(e.id,l,Date.now()-p.current);c(R),t(R)}catch(l){d(l)}finally{y(!1)}}let E=new Map(_optionalChain([r, 'optionalAccess', _45 => _45.results, 'access', _46 => _46.map, 'call', _47 => _47(l=>[l.questionId,l])]));return A.length===0?_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:n.testNoQuestions}):_jsxruntime.jsxs.call(void 0, "form",{className:"space-y-6",onSubmit:l=>{l.preventDefault(),r==null&&!C&&M()},children:[r&&_jsxruntime.jsxs.call(void 0, "div",{role:"status",className:_chunkERL4Z7M7js.d.call(void 0, "rounded-xl p-4 text-sm",r.submission.passed?"bg-emerald-50 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-300":"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-300"),children:[_jsxruntime.jsx.call(void 0, "p",{className:"text-base font-semibold",children:r.submission.passed?n.testPassed:n.testFailed}),_jsxruntime.jsx.call(void 0, "p",{children:w(n.testScore,{percent:r.submission.scorePercent})})]}),_jsxruntime.jsx.call(void 0, "ol",{className:"space-y-6",children:A.map((l,R)=>{let m=E.get(l.id),T=_optionalChain([m, 'optionalAccess', _48 => _48.correctAnswer])!=null?it(l,m.correctAnswer):"";return _jsxruntime.jsxs.call(void 0, "li",{className:"space-y-3","data-question-id":l.id,children:[_jsxruntime.jsxs.call(void 0, "p",{className:"font-medium break-words",children:[R+1,". ",l.prompt]}),_jsxruntime.jsx.call(void 0, Ts,{question:l,answer:k(l),disabled:r!=null||b||C,onChange:B=>a(q=>({...q,[l.id]:B}))}),m&&_jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, "flex items-start gap-2 text-sm",m.correct?"text-emerald-700 dark:text-emerald-400":"text-red-700 dark:text-red-400"),children:[m.correct?_jsxruntime.jsx.call(void 0, _lucidereact.Check,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}):_jsxruntime.jsx.call(void 0, _lucidereact.X,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}),_jsxruntime.jsxs.call(void 0, "span",{children:[m.correct?n.testCorrect:n.testIncorrect,T!==""&&!m.correct&&_jsxruntime.jsxs.call(void 0, "span",{className:"block text-neutral-700 dark:text-neutral-300",children:[n.testCorrectAnswer,": ",T]})]})]})]},l.id)})}),f!=null&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(f,n)}),r==null?_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-2",children:[g>0&&!C&&_jsxruntime.jsx.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(n.testUnanswered,{count:g})}),_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{type:"submit",className:$,disabled:b||C,children:b?n.testSubmitting:n.testSubmit})]}):I!==0&&!r.submission.passed&&_jsxruntime.jsx.call(void 0, _chunk6IACFTJRjs.q,{type:"button",variant:"outline",onClick:s,children:n.testTryAgain})]})}function Gt({testId:e,title:t,onSubmitted:s}){let{dataSource:o,texts:n}=h(),i=Q(),a=j(()=>o.getTest(e),[o,e]),r=j(()=>o.listSubmissions(e).catch(()=>{}),[o,e]),[c,b]=_react.useState.call(void 0, 0);return _jsxruntime.jsxs.call(void 0, "article",{"data-test-id":e,className:_chunkERL4Z7M7js.d.call(void 0, z,"min-w-0 space-y-5"),children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:a.status==="success"?a.data.title:t}),a.status==="loading"&&_jsxruntime.jsx.call(void 0, ue,{}),a.status==="error"&&_jsxruntime.jsx.call(void 0, ee,{error:a.error,onRetry:a.reload}),a.status==="success"&&_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[a.data.description.trim()!==""&&_jsxruntime.jsx.call(void 0, "p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:a.data.description}),_jsxruntime.jsxs.call(void 0, "ul",{className:"space-y-1 text-sm text-neutral-600 dark:text-neutral-400",children:[a.data.gating&&_jsxruntime.jsx.call(void 0, "li",{children:n.testGating}),_jsxruntime.jsx.call(void 0, "li",{children:w(n.testPassThreshold,{percent:a.data.passThresholdPercent})}),_jsxruntime.jsx.call(void 0, "li",{children:a.data.attemptsLeft==null?n.testAttemptsUnlimited:w(n.testAttemptsLeft,{count:a.data.attemptsLeft})}),a.data.attemptCount>0&&_jsxruntime.jsx.call(void 0, "li",{children:w(n.testBestScore,{percent:a.data.bestScorePercent})})]}),a.data.attemptsLeft!=null&&a.data.attemptsLeft<=0&&_jsxruntime.jsx.call(void 0, "p",{role:"alert",className:"text-sm font-medium text-red-700 dark:text-red-400",children:n.testNoAttemptsLeft}),_jsxruntime.jsx.call(void 0, Es,{test:a.data,onSubmitted:y=>{i("test_submitted",{lesson_id:e,score_bucket:_chunkDF2IK2GNjs.r.call(void 0, y.submission.scorePercent)}),s(y),r.refresh(),a.refresh()},onTryAgain:()=>b(y=>y+1)},c),r.status==="success"&&r.data&&_jsxruntime.jsx.call(void 0, ws,{list:r.data})]})]})}var Ut="bitsnap-course-autoplay";function Zs(){let[e,t]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{try{t(window.localStorage.getItem(Ut)==="1")}catch (e2){}},[]);let s=_react.useCallback.call(void 0, o=>{t(o);try{window.localStorage.setItem(Ut,o?"1":"0")}catch (e3){}},[]);return[e,s]}function Lt(e){return e==null?void 0:{id:e.id,kind:e.kind}}function Xs({item:e}){let{texts:t}=h();return _jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, z,"space-y-2"),role:"status",children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:e.title}),_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-600 dark:text-neutral-300",children:e.lockReason?w(t.lockedPage,{test:e.lockReason.gatingTestTitle}):t.locked})]})}function Ms({course:e,item:t,autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onLocked:c}){let{dataSource:b,texts:y}=h(),f=j(()=>b.getLesson(t.id),[b,t.id]),d=f.status==="error"&&f.error instanceof Z&&f.error.code==="item_locked";if(_react.useEffect.call(void 0, ()=>{d&&c()},[d]),f.status==="loading")return _jsxruntime.jsx.call(void 0, ue,{});if(f.status==="error")return d?_jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, z,"space-y-2"),role:"alert",children:[_jsxruntime.jsx.call(void 0, "h2",{className:"text-2xl font-semibold break-words",children:t.title}),_jsxruntime.jsx.call(void 0, "p",{className:"text-sm",children:J(f.error,y)})]}):_jsxruntime.jsx.call(void 0, ee,{error:f.error,onRetry:f.reload});let p=ye(e,t.id),A=ce(e).filter(C=>C.kind!=="test").findIndex(C=>C.id===t.id)+1;return _jsxruntime.jsx.call(void 0, Vt,{lesson:f.data,position:A,courseType:e.type,prev:_nullishCoalesce(f.data.prev, () => (Lt(p.prev))),next:_nullishCoalesce(f.data.next, () => (Lt(p.next))),autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onUrlsExpired:f.refresh},f.data.id)}function zs({course:e,selectedId:t,onSelect:s,onBack:o,onCourseChange:n,onCourseRefresh:i}){let{texts:a,preview:r}=h(),c=Q(),b=_react.useRef.call(void 0, null),[y,f]=_react.useState.call(void 0, !1),[d,p]=Zs(),[A,C]=_react.useState.call(void 0, ),I=et(e,t),g=le(e,I);_react.useEffect.call(void 0, ()=>{c("course_opened",{})},[e.id]);let k=(m,T=!1)=>{C(T?m:void 0),f(!1),s(m),_optionalChain([b, 'access', _49 => _49.current, 'optionalAccess', _50 => _50.scrollIntoView, 'call', _51 => _51({block:"start",behavior:"smooth"})])},M=_jsxruntime.jsx.call(void 0, ct,{course:e,selectedId:I,variant:e.type==="video"?"playlist":"modules",onSelect:m=>k(m.id)}),E;g==null?E=_jsxruntime.jsx.call(void 0, "p",{className:"text-sm text-neutral-500",children:a.noItem}):g.locked?E=_jsxruntime.jsx.call(void 0, Xs,{item:g}):g.kind==="test"?E=_jsxruntime.jsx.call(void 0, Gt,{testId:g.id,title:g.title,onSubmitted:()=>i()},g.id):E=_jsxruntime.jsx.call(void 0, Ms,{course:e,item:g,autoplay:d,onAutoplayChange:p,startPlaying:A===g.id,onNavigate:m=>k(m.id),onProgressSaved:(m,T)=>n(B=>({...T.completed?$e(B,m):B,completedLessons:T.completedLessons,progressPercent:T.progressPercent})),onEnded:()=>{if(!d)return;let m=Oe(e,g.id);m&&k(m.id,!0)},onLocked:i},g.id);let l=e.type==="video",R=e.resumeItemId!==""&&e.resumeItemId!==I&&_optionalChain([le, 'call', _52 => _52(e,e.resumeItemId), 'optionalAccess', _53 => _53.locked])===!1;return _jsxruntime.jsxs.call(void 0, "div",{ref:b,className:"space-y-4 scroll-mt-4",children:[_jsxruntime.jsxs.call(void 0, "header",{className:"space-y-3",children:[_jsxruntime.jsxs.call(void 0, "div",{className:"flex flex-wrap items-center gap-2",children:[o&&_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"ghost",size:"sm",onClick:o,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),a.back]}),r&&_jsxruntime.jsx.call(void 0, "span",{"data-course-preview":!0,className:"rounded-full bg-amber-100 px-3 py-0.5 text-xs font-semibold text-amber-900 dark:bg-amber-900/40 dark:text-amber-200",children:a.previewBadge})]}),_jsxruntime.jsxs.call(void 0, "div",{className:"flex flex-wrap items-end justify-between gap-4",children:[_jsxruntime.jsx.call(void 0, "div",{className:"min-w-0 space-y-1",children:_jsxruntime.jsx.call(void 0, "h1",{className:"text-2xl font-semibold break-words sm:text-3xl",children:e.title})}),R&&_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{size:"sm",variant:"outline",onClick:()=>k(e.resumeItemId),children:[_jsxruntime.jsx.call(void 0, _lucidereact.Play,{"aria-hidden":!0}),a.continueCourse]})]}),_jsxruntime.jsxs.call(void 0, "div",{className:"max-w-xl space-y-1",children:[_jsxruntime.jsx.call(void 0, At,{percent:e.progressPercent,label:w(a.progressPercent,{percent:e.progressPercent})}),_jsxruntime.jsxs.call(void 0, "p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:[w(a.progressLessons,{done:e.completedLessons,total:e.totalLessons})," \xB7 ",w(a.progressPercent,{percent:e.progressPercent})]})]})]}),_jsxruntime.jsxs.call(void 0, "div",{className:_chunkERL4Z7M7js.d.call(void 0, "grid gap-6",l?"lg:grid-cols-[minmax(0,1fr)_380px]":"lg:grid-cols-[320px_minmax(0,1fr)]"),children:[!l&&_jsxruntime.jsx.call(void 0, "div",{className:"lg:hidden",children:_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"outline",size:"sm","aria-expanded":y,onClick:()=>f(m=>!m),children:[_jsxruntime.jsx.call(void 0, _lucidereact.List,{"aria-hidden":!0}),a.contents]})}),!l&&_jsxruntime.jsx.call(void 0, "aside",{className:_chunkERL4Z7M7js.d.call(void 0, z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:block lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto",y?"block":"hidden"),children:M}),_jsxruntime.jsx.call(void 0, "div",{className:"min-w-0","data-course-content":!0,children:E}),l&&_jsxruntime.jsx.call(void 0, "aside",{className:_chunkERL4Z7M7js.d.call(void 0, z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto"),children:M})]})]})}function Qs({accessId:e,accessToken:t,dataSource:s,preview:o=!1,itemId:n,onItemChange:i,onBack:a,initialCourse:r,texts:c,locale:b,theme:y,className:f,analytics:d}){let p=_chunkDGUIG334js.j.call(void 0, ),A=_chunkDF2IK2GNjs.n.call(void 0, p.projectID,o?!1:d,"course"),C=_react.useMemo.call(void 0, ()=>Te(c,b),[c,b]),I=_react.useMemo.call(void 0, ()=>{if(s)return s;if(e==null||e==="")throw new Error("PanelCourse needs an accessId or a dataSource");return Ce({accessId:e,accessToken:t})},[s,e,t]),g=j(()=>I.getCourse(),[I],r),[k,M]=_react.useState.call(void 0, ),E=i?n:_nullishCoalesce(n, () => (k)),l=_react.useCallback.call(void 0, B=>{M(B),_optionalChain([i, 'optionalCall', _54 => _54(B)])},[i]),R=De(_nullishCoalesce(_optionalChain([y, 'optionalAccess', _55 => _55.colors]), () => (_optionalChain([p, 'access', _56 => _56.theme, 'optionalAccess', _57 => _57.colors])))),m=g.status==="success"?g.data.id:void 0,T=_react.useMemo.call(void 0, ()=>({dataSource:I,texts:C,preview:o,analytics:{courseId:m,instrument:A}}),[I,C,o,m,A]);return _jsxruntime.jsx.call(void 0, _chunkDF2IK2GNjs.l,{value:A,children:_jsxruntime.jsx.call(void 0, qe,{value:T,children:_jsxruntime.jsxs.call(void 0, "div",{"data-bitsnap-course":!0,"data-course-type":g.status==="success"?g.data.type:void 0,style:R,className:_chunkERL4Z7M7js.d.call(void 0, "font-inter w-full max-w-7xl",f),children:[g.status==="loading"&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-4",children:[a&&_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"ghost",size:"sm",onClick:a,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),C.back]}),_jsxruntime.jsx.call(void 0, "p",{className:"sr-only",role:"status",children:C.loading}),_jsxruntime.jsx.call(void 0, ue,{})]}),g.status==="error"&&_jsxruntime.jsxs.call(void 0, "div",{className:"space-y-4",children:[a&&_jsxruntime.jsxs.call(void 0, _chunk6IACFTJRjs.q,{variant:"ghost",size:"sm",onClick:a,children:[_jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft,{"aria-hidden":!0}),C.back]}),_jsxruntime.jsx.call(void 0, ee,{error:g.error,onRetry:g.reload})]}),g.status==="success"&&_jsxruntime.jsx.call(void 0, zs,{course:g.data,selectedId:E,onSelect:l,onBack:a,onCourseChange:g.mutate,onCourseRefresh:g.refresh})]})})})}exports.COURSE_TEXT_TABLES = It; exports.CourseError = Z; exports.PanelCourse = Qs; exports.createCourseDataSource = ve; exports.createRpcCourseDataSource = Ce; exports.getCourseTexts = Te; exports.sanitizeLessonHtml = Pe;
2
2
  //# sourceMappingURL=course.js.map