taleem-player 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14228,6 +14228,625 @@ var goldenDeckV1 = {
14228
14228
  };
14229
14229
  zodDeckV1.parse(goldenDeckV1);
14230
14230
 
14231
+ // node_modules/taleem-slides/src/slides/TitleSlide.js
14232
+ var TitleSlide = {
14233
+ type: "titleSlide",
14234
+ fromJSON(raw) {
14235
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14236
+ if (!title) throw new Error("titleSlide: title required");
14237
+ return Object.freeze({
14238
+ type: "titleSlide",
14239
+ title,
14240
+ render() {
14241
+ return `
14242
+ <section class="slide titleSlide">
14243
+ <h1>${title}</h1>
14244
+ </section>
14245
+ `;
14246
+ }
14247
+ });
14248
+ }
14249
+ };
14250
+
14251
+ // node_modules/taleem-slides/src/slides/TitleAndSubtitleSlide.js
14252
+ var TitleAndSubtitleSlide = {
14253
+ type: "titleAndSubtitle",
14254
+ fromJSON(raw) {
14255
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14256
+ const subtitle = raw.data?.find((d) => d.name === "subtitle")?.content;
14257
+ if (!title || !subtitle) {
14258
+ throw new Error("titleAndSubtitle: requires title and subtitle");
14259
+ }
14260
+ return Object.freeze({
14261
+ type: "titleAndSubtitle",
14262
+ title,
14263
+ subtitle,
14264
+ render() {
14265
+ return `
14266
+ <section class="slide titleAndSubtitle">
14267
+ <h1>${title}</h1>
14268
+ <h2>${subtitle}</h2>
14269
+ </section>
14270
+ `;
14271
+ }
14272
+ });
14273
+ }
14274
+ };
14275
+
14276
+ // node_modules/taleem-slides/src/slides/TitleAndParaSlide.js
14277
+ var TitleAndParaSlide = {
14278
+ type: "titleAndPara",
14279
+ fromJSON(raw) {
14280
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14281
+ const para = raw.data?.find((d) => d.name === "para")?.content;
14282
+ if (!title || !para) {
14283
+ throw new Error("titleAndPara: requires title and para");
14284
+ }
14285
+ return Object.freeze({
14286
+ type: "titleAndPara",
14287
+ title,
14288
+ para,
14289
+ render() {
14290
+ return `
14291
+ <section class="slide titleAndPara">
14292
+ <h1>${title}</h1>
14293
+ <p>${para}</p>
14294
+ </section>
14295
+ `;
14296
+ }
14297
+ });
14298
+ }
14299
+ };
14300
+
14301
+ // node_modules/taleem-slides/src/slides/BulletListSlide.js
14302
+ var BulletListSlide = {
14303
+ type: "bulletList",
14304
+ fromJSON(raw) {
14305
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14306
+ if (!bullets?.length) {
14307
+ throw new Error("bulletList: requires at least one bullet");
14308
+ }
14309
+ return Object.freeze({
14310
+ type: "bulletList",
14311
+ bullets,
14312
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14313
+ return `
14314
+ <section class="slide bulletList">
14315
+ <ul>
14316
+ ${bullets.map((b, i) => {
14317
+ if (i >= visibleCount) return "";
14318
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14319
+ return `<li class="${cls}">${b.content}</li>`;
14320
+ }).join("")}
14321
+ </ul>
14322
+ </section>
14323
+ `;
14324
+ }
14325
+ });
14326
+ }
14327
+ };
14328
+
14329
+ // node_modules/taleem-slides/src/slides/TwoColumnTextSlide.js
14330
+ var TwoColumnTextSlide = {
14331
+ type: "twoColumnText",
14332
+ fromJSON(raw) {
14333
+ const left = raw.data?.filter((d) => d.name === "left").map((d) => ({ content: d.content }));
14334
+ const right = raw.data?.filter((d) => d.name === "right").map((d) => ({ content: d.content }));
14335
+ if (!left?.length || !right?.length) {
14336
+ throw new Error("twoColumnText: requires left and right columns");
14337
+ }
14338
+ return Object.freeze({
14339
+ type: "twoColumnText",
14340
+ left,
14341
+ right,
14342
+ render({
14343
+ leftVisibleCount = left.length,
14344
+ rightVisibleCount = right.length,
14345
+ leftActiveIndex = null,
14346
+ rightActiveIndex = null
14347
+ } = {}) {
14348
+ return `
14349
+ <section class="slide twoColumnText">
14350
+ <div class="col left">
14351
+ ${left.map((l, i) => {
14352
+ if (i >= leftVisibleCount) return "";
14353
+ const cls = i === leftActiveIndex ? "is-active" : i < leftActiveIndex ? "is-dim" : "";
14354
+ return `<div class="${cls}">${l.content}</div>`;
14355
+ }).join("")}
14356
+ </div>
14357
+ <div class="col right">
14358
+ ${right.map((r, i) => {
14359
+ if (i >= rightVisibleCount) return "";
14360
+ const cls = i === rightActiveIndex ? "is-active" : i < rightActiveIndex ? "is-dim" : "";
14361
+ return `<div class="${cls}">${r.content}</div>`;
14362
+ }).join("")}
14363
+ </div>
14364
+ </section>
14365
+ `;
14366
+ }
14367
+ });
14368
+ }
14369
+ };
14370
+
14371
+ // node_modules/taleem-slides/src/slides/ImageSlide.js
14372
+ var ImageSlide = {
14373
+ type: "imageSlide",
14374
+ fromJSON(raw) {
14375
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14376
+ if (!src) throw new Error("imageSlide: image required");
14377
+ return Object.freeze({
14378
+ type: "imageSlide",
14379
+ src,
14380
+ render() {
14381
+ return `
14382
+ <section class="slide imageSlide">
14383
+ <img src="${src}" alt="" />
14384
+ </section>
14385
+ `;
14386
+ }
14387
+ });
14388
+ }
14389
+ };
14390
+
14391
+ // node_modules/taleem-slides/src/slides/FillImageSlide.js
14392
+ var FillImageSlide = {
14393
+ type: "fillImage",
14394
+ fromJSON(raw) {
14395
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14396
+ if (!image) throw new Error("fillImage: image required");
14397
+ return Object.freeze({
14398
+ type: "fillImage",
14399
+ image,
14400
+ render() {
14401
+ return `
14402
+ <section class="slide fillImage">
14403
+ <img src="${image}" alt="" />
14404
+ </section>
14405
+ `;
14406
+ }
14407
+ });
14408
+ }
14409
+ };
14410
+
14411
+ // node_modules/taleem-slides/src/slides/ImageWithTitleSlide.js
14412
+ var ImageWithTitleSlide = {
14413
+ type: "imageWithTitle",
14414
+ fromJSON(raw) {
14415
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14416
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14417
+ if (!src || !title) {
14418
+ throw new Error("imageWithTitle: image and title required");
14419
+ }
14420
+ return Object.freeze({
14421
+ type: "imageWithTitle",
14422
+ src,
14423
+ title,
14424
+ render() {
14425
+ return `
14426
+ <section class="slide imageWithTitle">
14427
+ <img src="${src}" alt="" />
14428
+ <h1>${title}</h1>
14429
+ </section>
14430
+ `;
14431
+ }
14432
+ });
14433
+ }
14434
+ };
14435
+
14436
+ // node_modules/taleem-slides/src/slides/ImageWithCaptionSlide.js
14437
+ var ImageWithCaptionSlide = {
14438
+ type: "imageWithCaption",
14439
+ fromJSON(raw) {
14440
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14441
+ const caption = raw.data?.find((d) => d.name === "caption")?.content;
14442
+ if (!src || !caption) {
14443
+ throw new Error("imageWithCaption: image and caption required");
14444
+ }
14445
+ return Object.freeze({
14446
+ type: "imageWithCaption",
14447
+ src,
14448
+ caption,
14449
+ render() {
14450
+ return `
14451
+ <figure class="slide imageWithCaption">
14452
+ <img src="${src}" alt="" />
14453
+ <figcaption>${caption}</figcaption>
14454
+ </figure>
14455
+ `;
14456
+ }
14457
+ });
14458
+ }
14459
+ };
14460
+
14461
+ // node_modules/taleem-slides/src/slides/ImageLeftBulletsRightSlide.js
14462
+ var ImageLeftBulletsRightSlide = {
14463
+ type: "imageLeftBulletsRight",
14464
+ fromJSON(raw) {
14465
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14466
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14467
+ if (!image || !bullets?.length) {
14468
+ throw new Error("imageLeftBulletsRight: image and bullets required");
14469
+ }
14470
+ return Object.freeze({
14471
+ type: "imageLeftBulletsRight",
14472
+ image,
14473
+ bullets,
14474
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14475
+ return `
14476
+ <section class="slide imageLeftBulletsRight">
14477
+ <img src="${image}" alt="" />
14478
+ <ul>
14479
+ ${bullets.map((b, i) => {
14480
+ if (i >= visibleCount) return "";
14481
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14482
+ return `<li class="${cls}">${b.content}</li>`;
14483
+ }).join("")}
14484
+ </ul>
14485
+ </section>
14486
+ `;
14487
+ }
14488
+ });
14489
+ }
14490
+ };
14491
+
14492
+ // node_modules/taleem-slides/src/slides/ImageRightBulletsLeftSlide.js
14493
+ var ImageRightBulletsLeftSlide = {
14494
+ type: "imageRightBulletsLeft",
14495
+ fromJSON(raw) {
14496
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14497
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14498
+ if (!image || !bullets?.length) {
14499
+ throw new Error("imageRightBulletsLeft: image and bullets required");
14500
+ }
14501
+ return Object.freeze({
14502
+ type: "imageRightBulletsLeft",
14503
+ image,
14504
+ bullets,
14505
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14506
+ return `
14507
+ <section class="slide imageRightBulletsLeft">
14508
+ <ul>
14509
+ ${bullets.map((b, i) => {
14510
+ if (i >= visibleCount) return "";
14511
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14512
+ return `<li class="${cls}">${b.content}</li>`;
14513
+ }).join("")}
14514
+ </ul>
14515
+ <img src="${image}" alt="" />
14516
+ </section>
14517
+ `;
14518
+ }
14519
+ });
14520
+ }
14521
+ };
14522
+
14523
+ // node_modules/taleem-slides/src/slides/TableSlide.js
14524
+ var TableSlide = {
14525
+ type: "table",
14526
+ fromJSON(raw) {
14527
+ const rows = raw.data?.filter((d) => d.name === "row").map((d) => ({ cells: d.content }));
14528
+ if (!rows?.length) {
14529
+ throw new Error("table: requires at least one row");
14530
+ }
14531
+ return Object.freeze({
14532
+ type: "table",
14533
+ rows,
14534
+ render({ visibleCount = rows.length, activeIndex = null } = {}) {
14535
+ return `
14536
+ <table class="slide table">
14537
+ ${rows.map((row, i) => {
14538
+ if (i >= visibleCount) return "";
14539
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14540
+ return `
14541
+ <tr class="${cls}">
14542
+ ${row.cells.map((c) => `<td>${c}</td>`).join("")}
14543
+ </tr>
14544
+ `;
14545
+ }).join("")}
14546
+ </table>
14547
+ `;
14548
+ }
14549
+ });
14550
+ }
14551
+ };
14552
+
14553
+ // node_modules/taleem-slides/src/slides/StatisticSlide.js
14554
+ var StatisticSlide = {
14555
+ type: "statistic",
14556
+ fromJSON(raw) {
14557
+ const label = raw.data?.find((d) => d.name === "label")?.content;
14558
+ const value = raw.data?.find((d) => d.name === "value")?.content;
14559
+ if (!label || value === void 0) {
14560
+ throw new Error("statistic: requires label and value");
14561
+ }
14562
+ return Object.freeze({
14563
+ type: "statistic",
14564
+ label,
14565
+ value,
14566
+ render() {
14567
+ return `
14568
+ <section class="slide statistic">
14569
+ <div class="stat-value">${value}</div>
14570
+ <div class="stat-label">${label}</div>
14571
+ </section>
14572
+ `;
14573
+ }
14574
+ });
14575
+ }
14576
+ };
14577
+
14578
+ // node_modules/taleem-slides/src/slides/BigNumberSlide.js
14579
+ var BigNumberSlide = {
14580
+ type: "bigNumber",
14581
+ fromJSON(raw) {
14582
+ const value = raw.data?.find((d) => d.name === "number")?.content;
14583
+ const label = raw.data?.find((d) => d.name === "label")?.content;
14584
+ if (!value) throw new Error("bigNumber: number required");
14585
+ return Object.freeze({
14586
+ type: "bigNumber",
14587
+ value,
14588
+ label,
14589
+ render() {
14590
+ return `
14591
+ <section class="slide bigNumber">
14592
+ <div class="number">${value}</div>
14593
+ ${label ? `<div class="label">${label}</div>` : ""}
14594
+ </section>
14595
+ `;
14596
+ }
14597
+ });
14598
+ }
14599
+ };
14600
+
14601
+ // node_modules/taleem-slides/src/slides/BarChartSlide.js
14602
+ var BarChartSlide = {
14603
+ type: "barChart",
14604
+ fromJSON(raw) {
14605
+ const bars = raw.data?.filter((d) => d.name === "bar").map((d) => ({
14606
+ label: d.content.label,
14607
+ value: d.content.value
14608
+ }));
14609
+ if (!bars?.length) {
14610
+ throw new Error("barChart: requires at least one bar");
14611
+ }
14612
+ return Object.freeze({
14613
+ type: "barChart",
14614
+ bars,
14615
+ render({ visibleCount = bars.length, activeIndex = null } = {}) {
14616
+ return `
14617
+ <section class="slide barChart">
14618
+ <ul class="bars">
14619
+ ${bars.map((b, i) => {
14620
+ if (i >= visibleCount) return "";
14621
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14622
+ return `
14623
+ <li class="bar ${cls}">
14624
+ <span class="bar-label">${b.label}</span>
14625
+ <span class="bar-value">${b.value}</span>
14626
+ </li>
14627
+ `;
14628
+ }).join("")}
14629
+ </ul>
14630
+ </section>
14631
+ `;
14632
+ }
14633
+ });
14634
+ }
14635
+ };
14636
+
14637
+ // node_modules/taleem-slides/src/slides/DonutChartSlide.js
14638
+ var DonutChartSlide = {
14639
+ type: "donutChart",
14640
+ fromJSON(raw) {
14641
+ const segments = raw.data?.filter((d) => d.name === "segment").map((d) => ({
14642
+ label: d.content.label,
14643
+ value: d.content.value
14644
+ }));
14645
+ if (!segments?.length) {
14646
+ throw new Error("donutChart: requires at least one segment");
14647
+ }
14648
+ return Object.freeze({
14649
+ type: "donutChart",
14650
+ segments,
14651
+ render({ visibleCount = segments.length, activeIndex = null } = {}) {
14652
+ return `
14653
+ <section class="slide donutChart">
14654
+ <ul>
14655
+ ${segments.map((s, i) => {
14656
+ if (i >= visibleCount) return "";
14657
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14658
+ return `<li class="${cls}">${s.label}: ${s.value}</li>`;
14659
+ }).join("")}
14660
+ </ul>
14661
+ </section>
14662
+ `;
14663
+ }
14664
+ });
14665
+ }
14666
+ };
14667
+
14668
+ // node_modules/taleem-slides/src/slides/QuoteSlide.js
14669
+ var QuoteSlide = {
14670
+ type: "quoteSlide",
14671
+ fromJSON(raw) {
14672
+ const text = raw.data?.find((d) => d.name === "quote")?.content;
14673
+ const author = raw.data?.find((d) => d.name === "author")?.content;
14674
+ if (!text) throw new Error("quoteSlide: quote required");
14675
+ return Object.freeze({
14676
+ type: "quoteSlide",
14677
+ text,
14678
+ author,
14679
+ render() {
14680
+ return `
14681
+ <blockquote class="slide quoteSlide">
14682
+ <p>${text}</p>
14683
+ ${author ? `<footer>${author}</footer>` : ""}
14684
+ </blockquote>
14685
+ `;
14686
+ }
14687
+ });
14688
+ }
14689
+ };
14690
+
14691
+ // node_modules/taleem-slides/src/slides/QuoteWithImageSlide.js
14692
+ var QuoteWithImageSlide = {
14693
+ type: "quoteWithImage",
14694
+ fromJSON(raw) {
14695
+ const quote = raw.data?.find((d) => d.name === "quote")?.content;
14696
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14697
+ const author = raw.data?.find((d) => d.name === "author")?.content;
14698
+ if (!quote || !image) {
14699
+ throw new Error("quoteWithImage: quote and image required");
14700
+ }
14701
+ return Object.freeze({
14702
+ type: "quoteWithImage",
14703
+ quote,
14704
+ image,
14705
+ author,
14706
+ render() {
14707
+ return `
14708
+ <section class="slide quoteWithImage">
14709
+ <img src="${image}" alt="" />
14710
+ <blockquote>
14711
+ <p>${quote}</p>
14712
+ ${author ? `<footer>${author}</footer>` : ""}
14713
+ </blockquote>
14714
+ </section>
14715
+ `;
14716
+ }
14717
+ });
14718
+ }
14719
+ };
14720
+
14721
+ // node_modules/taleem-slides/src/slides/CornerWordsSlide.js
14722
+ var CornerWordsSlide = {
14723
+ type: "cornerWordsSlide",
14724
+ fromJSON(raw) {
14725
+ const words = raw.data?.filter((d) => d.name === "word").map((d) => ({ content: d.content }));
14726
+ if (!words?.length) {
14727
+ throw new Error("cornerWordsSlide: requires at least one word");
14728
+ }
14729
+ return Object.freeze({
14730
+ type: "cornerWordsSlide",
14731
+ words,
14732
+ render({ visibleCount = words.length } = {}) {
14733
+ return `
14734
+ <section class="slide cornerWordsSlide">
14735
+ ${words.map((w, i) => {
14736
+ if (i >= visibleCount) return "";
14737
+ return `<span class="corner-word corner-${i + 1}">${w.content}</span>`;
14738
+ }).join("")}
14739
+ </section>
14740
+ `;
14741
+ }
14742
+ });
14743
+ }
14744
+ };
14745
+
14746
+ // node_modules/taleem-slides/src/slides/ContactSlide.js
14747
+ var ContactSlide = {
14748
+ type: "contactSlide",
14749
+ fromJSON(raw) {
14750
+ const items = raw.data?.map((d) => ({ content: d.content }));
14751
+ if (!items?.length) {
14752
+ throw new Error("contactSlide: content required");
14753
+ }
14754
+ return Object.freeze({
14755
+ type: "contactSlide",
14756
+ items,
14757
+ render() {
14758
+ return `
14759
+ <section class="slide contactSlide">
14760
+ ${items.map((i) => `<div>${i.content}</div>`).join("")}
14761
+ </section>
14762
+ `;
14763
+ }
14764
+ });
14765
+ }
14766
+ };
14767
+
14768
+ // node_modules/taleem-slides/src/slides/EqSlide.js
14769
+ var EqSlide = {
14770
+ type: "eq",
14771
+ fromJSON(raw) {
14772
+ if (!Array.isArray(raw.data)) {
14773
+ throw new Error("eq: data must be array");
14774
+ }
14775
+ const lines = raw.data.map((d) => ({
14776
+ content: d.content
14777
+ }));
14778
+ return Object.freeze({
14779
+ type: "eq",
14780
+ lines,
14781
+ render({ activeIndex = null } = {}) {
14782
+ return `
14783
+ <section class="slide eq">
14784
+ ${lines.map((l, i) => {
14785
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14786
+ return `<div class="eq-line ${cls}">${l.content}</div>`;
14787
+ }).join("")}
14788
+ </section>
14789
+ `;
14790
+ }
14791
+ });
14792
+ }
14793
+ };
14794
+
14795
+ // node_modules/taleem-slides/src/slides/SvgPointerSlide.js
14796
+ var SvgPointerSlide = {
14797
+ type: "svgPointer",
14798
+ fromJSON(raw) {
14799
+ const svg = raw.data?.find((d) => d.name === "svg")?.content;
14800
+ if (!svg) throw new Error("svgPointer: svg required");
14801
+ return Object.freeze({
14802
+ type: "svgPointer",
14803
+ svg,
14804
+ render() {
14805
+ return `
14806
+ <section class="slide svgPointer">
14807
+ ${svg}
14808
+ </section>
14809
+ `;
14810
+ }
14811
+ });
14812
+ }
14813
+ };
14814
+
14815
+ // node_modules/taleem-slides/src/SlideTemplates.js
14816
+ var SlideTemplates = {
14817
+ titleSlide: TitleSlide,
14818
+ titleAndSubtitle: TitleAndSubtitleSlide,
14819
+ titleAndPara: TitleAndParaSlide,
14820
+ bulletList: BulletListSlide,
14821
+ twoColumnText: TwoColumnTextSlide,
14822
+ imageSlide: ImageSlide,
14823
+ fillImage: FillImageSlide,
14824
+ imageWithTitle: ImageWithTitleSlide,
14825
+ imageWithCaption: ImageWithCaptionSlide,
14826
+ imageLeftBulletsRight: ImageLeftBulletsRightSlide,
14827
+ imageRightBulletsLeft: ImageRightBulletsLeftSlide,
14828
+ table: TableSlide,
14829
+ statistic: StatisticSlide,
14830
+ bigNumber: BigNumberSlide,
14831
+ barChart: BarChartSlide,
14832
+ donutChart: DonutChartSlide,
14833
+ quoteSlide: QuoteSlide,
14834
+ quoteWithImage: QuoteWithImageSlide,
14835
+ cornerWordsSlide: CornerWordsSlide,
14836
+ contactSlide: ContactSlide,
14837
+ eq: EqSlide,
14838
+ svgPointer: SvgPointerSlide
14839
+ };
14840
+
14841
+ // node_modules/taleem-slides/src/getSlideTemplate.js
14842
+ function getSlideTemplate(type) {
14843
+ const template = SlideTemplates[type];
14844
+ if (!template) {
14845
+ throw new Error(`Unknown slide template type "${type}"`);
14846
+ }
14847
+ return template;
14848
+ }
14849
+
14231
14850
  // src/core/stage.js
14232
14851
  function createStage(mount) {
14233
14852
  if (!mount) throw new Error("taleem-player: mount is required");
@@ -14254,10 +14873,7 @@ function createStage(mount) {
14254
14873
  }
14255
14874
 
14256
14875
  // src/core/player.js
14257
- function createTaleemPlayer({ mount, deck, renderer }) {
14258
- if (!renderer || typeof renderer.render !== "function") {
14259
- throw new Error("taleem-player: renderer with render() required");
14260
- }
14876
+ function createTaleemPlayer({ mount, deck }) {
14261
14877
  const result = validateDeckV1(deck);
14262
14878
  if (!result.ok) {
14263
14879
  throw new Error(
@@ -14266,6 +14882,7 @@ function createTaleemPlayer({ mount, deck, renderer }) {
14266
14882
  }
14267
14883
  const stage = createStage(mount);
14268
14884
  let lastSlide = null;
14885
+ let lastRenderedKey = null;
14269
14886
  function getSlideAtTime(deck2, time3) {
14270
14887
  const slides = deck2.deck;
14271
14888
  for (let i = slides.length - 1; i >= 0; i--) {
@@ -14274,22 +14891,46 @@ function createTaleemPlayer({ mount, deck, renderer }) {
14274
14891
  }
14275
14892
  return null;
14276
14893
  }
14894
+ function computeRenderState(slide, time3) {
14895
+ if (!Array.isArray(slide.data)) {
14896
+ return {};
14897
+ }
14898
+ let visibleCount = 0;
14899
+ let activeIndex = -1;
14900
+ slide.data.forEach((item, index) => {
14901
+ if (typeof item.showAt === "number" && time3 >= item.showAt) {
14902
+ visibleCount++;
14903
+ activeIndex = index;
14904
+ }
14905
+ });
14906
+ return {
14907
+ visibleCount,
14908
+ activeIndex
14909
+ };
14910
+ }
14277
14911
  function renderAt(time3) {
14278
14912
  const slide = getSlideAtTime(deck, time3);
14279
14913
  if (!slide) {
14280
14914
  stage.clear();
14281
14915
  lastSlide = null;
14916
+ lastRenderedKey = null;
14282
14917
  return;
14283
14918
  }
14919
+ const renderState = computeRenderState(slide, time3);
14920
+ const renderKey = `${slide.start}-${renderState.visibleCount}-${renderState.activeIndex}`;
14284
14921
  if (slide !== lastSlide) {
14285
14922
  stage.clear();
14286
14923
  lastSlide = slide;
14924
+ lastRenderedKey = null;
14287
14925
  }
14288
- renderer.render({
14289
- mount: stage.el,
14290
- slide,
14291
- time: time3
14292
- });
14926
+ if (renderKey === lastRenderedKey) {
14927
+ return;
14928
+ }
14929
+ const Template = getSlideTemplate(slide.type);
14930
+ const slideInstance = Template.fromJSON(slide);
14931
+ const html = slideInstance.render(renderState);
14932
+ stage.el.innerHTML = html;
14933
+ lastRenderedKey = renderKey;
14293
14934
  }
14294
14935
  function destroy() {
14295
14936
  stage.destroy();
@@ -14247,6 +14247,625 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14247
14247
  };
14248
14248
  zodDeckV1.parse(goldenDeckV1);
14249
14249
 
14250
+ // node_modules/taleem-slides/src/slides/TitleSlide.js
14251
+ var TitleSlide = {
14252
+ type: "titleSlide",
14253
+ fromJSON(raw) {
14254
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14255
+ if (!title) throw new Error("titleSlide: title required");
14256
+ return Object.freeze({
14257
+ type: "titleSlide",
14258
+ title,
14259
+ render() {
14260
+ return `
14261
+ <section class="slide titleSlide">
14262
+ <h1>${title}</h1>
14263
+ </section>
14264
+ `;
14265
+ }
14266
+ });
14267
+ }
14268
+ };
14269
+
14270
+ // node_modules/taleem-slides/src/slides/TitleAndSubtitleSlide.js
14271
+ var TitleAndSubtitleSlide = {
14272
+ type: "titleAndSubtitle",
14273
+ fromJSON(raw) {
14274
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14275
+ const subtitle = raw.data?.find((d) => d.name === "subtitle")?.content;
14276
+ if (!title || !subtitle) {
14277
+ throw new Error("titleAndSubtitle: requires title and subtitle");
14278
+ }
14279
+ return Object.freeze({
14280
+ type: "titleAndSubtitle",
14281
+ title,
14282
+ subtitle,
14283
+ render() {
14284
+ return `
14285
+ <section class="slide titleAndSubtitle">
14286
+ <h1>${title}</h1>
14287
+ <h2>${subtitle}</h2>
14288
+ </section>
14289
+ `;
14290
+ }
14291
+ });
14292
+ }
14293
+ };
14294
+
14295
+ // node_modules/taleem-slides/src/slides/TitleAndParaSlide.js
14296
+ var TitleAndParaSlide = {
14297
+ type: "titleAndPara",
14298
+ fromJSON(raw) {
14299
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14300
+ const para = raw.data?.find((d) => d.name === "para")?.content;
14301
+ if (!title || !para) {
14302
+ throw new Error("titleAndPara: requires title and para");
14303
+ }
14304
+ return Object.freeze({
14305
+ type: "titleAndPara",
14306
+ title,
14307
+ para,
14308
+ render() {
14309
+ return `
14310
+ <section class="slide titleAndPara">
14311
+ <h1>${title}</h1>
14312
+ <p>${para}</p>
14313
+ </section>
14314
+ `;
14315
+ }
14316
+ });
14317
+ }
14318
+ };
14319
+
14320
+ // node_modules/taleem-slides/src/slides/BulletListSlide.js
14321
+ var BulletListSlide = {
14322
+ type: "bulletList",
14323
+ fromJSON(raw) {
14324
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14325
+ if (!bullets?.length) {
14326
+ throw new Error("bulletList: requires at least one bullet");
14327
+ }
14328
+ return Object.freeze({
14329
+ type: "bulletList",
14330
+ bullets,
14331
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14332
+ return `
14333
+ <section class="slide bulletList">
14334
+ <ul>
14335
+ ${bullets.map((b, i) => {
14336
+ if (i >= visibleCount) return "";
14337
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14338
+ return `<li class="${cls}">${b.content}</li>`;
14339
+ }).join("")}
14340
+ </ul>
14341
+ </section>
14342
+ `;
14343
+ }
14344
+ });
14345
+ }
14346
+ };
14347
+
14348
+ // node_modules/taleem-slides/src/slides/TwoColumnTextSlide.js
14349
+ var TwoColumnTextSlide = {
14350
+ type: "twoColumnText",
14351
+ fromJSON(raw) {
14352
+ const left = raw.data?.filter((d) => d.name === "left").map((d) => ({ content: d.content }));
14353
+ const right = raw.data?.filter((d) => d.name === "right").map((d) => ({ content: d.content }));
14354
+ if (!left?.length || !right?.length) {
14355
+ throw new Error("twoColumnText: requires left and right columns");
14356
+ }
14357
+ return Object.freeze({
14358
+ type: "twoColumnText",
14359
+ left,
14360
+ right,
14361
+ render({
14362
+ leftVisibleCount = left.length,
14363
+ rightVisibleCount = right.length,
14364
+ leftActiveIndex = null,
14365
+ rightActiveIndex = null
14366
+ } = {}) {
14367
+ return `
14368
+ <section class="slide twoColumnText">
14369
+ <div class="col left">
14370
+ ${left.map((l, i) => {
14371
+ if (i >= leftVisibleCount) return "";
14372
+ const cls = i === leftActiveIndex ? "is-active" : i < leftActiveIndex ? "is-dim" : "";
14373
+ return `<div class="${cls}">${l.content}</div>`;
14374
+ }).join("")}
14375
+ </div>
14376
+ <div class="col right">
14377
+ ${right.map((r, i) => {
14378
+ if (i >= rightVisibleCount) return "";
14379
+ const cls = i === rightActiveIndex ? "is-active" : i < rightActiveIndex ? "is-dim" : "";
14380
+ return `<div class="${cls}">${r.content}</div>`;
14381
+ }).join("")}
14382
+ </div>
14383
+ </section>
14384
+ `;
14385
+ }
14386
+ });
14387
+ }
14388
+ };
14389
+
14390
+ // node_modules/taleem-slides/src/slides/ImageSlide.js
14391
+ var ImageSlide = {
14392
+ type: "imageSlide",
14393
+ fromJSON(raw) {
14394
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14395
+ if (!src) throw new Error("imageSlide: image required");
14396
+ return Object.freeze({
14397
+ type: "imageSlide",
14398
+ src,
14399
+ render() {
14400
+ return `
14401
+ <section class="slide imageSlide">
14402
+ <img src="${src}" alt="" />
14403
+ </section>
14404
+ `;
14405
+ }
14406
+ });
14407
+ }
14408
+ };
14409
+
14410
+ // node_modules/taleem-slides/src/slides/FillImageSlide.js
14411
+ var FillImageSlide = {
14412
+ type: "fillImage",
14413
+ fromJSON(raw) {
14414
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14415
+ if (!image) throw new Error("fillImage: image required");
14416
+ return Object.freeze({
14417
+ type: "fillImage",
14418
+ image,
14419
+ render() {
14420
+ return `
14421
+ <section class="slide fillImage">
14422
+ <img src="${image}" alt="" />
14423
+ </section>
14424
+ `;
14425
+ }
14426
+ });
14427
+ }
14428
+ };
14429
+
14430
+ // node_modules/taleem-slides/src/slides/ImageWithTitleSlide.js
14431
+ var ImageWithTitleSlide = {
14432
+ type: "imageWithTitle",
14433
+ fromJSON(raw) {
14434
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14435
+ const title = raw.data?.find((d) => d.name === "title")?.content;
14436
+ if (!src || !title) {
14437
+ throw new Error("imageWithTitle: image and title required");
14438
+ }
14439
+ return Object.freeze({
14440
+ type: "imageWithTitle",
14441
+ src,
14442
+ title,
14443
+ render() {
14444
+ return `
14445
+ <section class="slide imageWithTitle">
14446
+ <img src="${src}" alt="" />
14447
+ <h1>${title}</h1>
14448
+ </section>
14449
+ `;
14450
+ }
14451
+ });
14452
+ }
14453
+ };
14454
+
14455
+ // node_modules/taleem-slides/src/slides/ImageWithCaptionSlide.js
14456
+ var ImageWithCaptionSlide = {
14457
+ type: "imageWithCaption",
14458
+ fromJSON(raw) {
14459
+ const src = raw.data?.find((d) => d.name === "image")?.content;
14460
+ const caption = raw.data?.find((d) => d.name === "caption")?.content;
14461
+ if (!src || !caption) {
14462
+ throw new Error("imageWithCaption: image and caption required");
14463
+ }
14464
+ return Object.freeze({
14465
+ type: "imageWithCaption",
14466
+ src,
14467
+ caption,
14468
+ render() {
14469
+ return `
14470
+ <figure class="slide imageWithCaption">
14471
+ <img src="${src}" alt="" />
14472
+ <figcaption>${caption}</figcaption>
14473
+ </figure>
14474
+ `;
14475
+ }
14476
+ });
14477
+ }
14478
+ };
14479
+
14480
+ // node_modules/taleem-slides/src/slides/ImageLeftBulletsRightSlide.js
14481
+ var ImageLeftBulletsRightSlide = {
14482
+ type: "imageLeftBulletsRight",
14483
+ fromJSON(raw) {
14484
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14485
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14486
+ if (!image || !bullets?.length) {
14487
+ throw new Error("imageLeftBulletsRight: image and bullets required");
14488
+ }
14489
+ return Object.freeze({
14490
+ type: "imageLeftBulletsRight",
14491
+ image,
14492
+ bullets,
14493
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14494
+ return `
14495
+ <section class="slide imageLeftBulletsRight">
14496
+ <img src="${image}" alt="" />
14497
+ <ul>
14498
+ ${bullets.map((b, i) => {
14499
+ if (i >= visibleCount) return "";
14500
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14501
+ return `<li class="${cls}">${b.content}</li>`;
14502
+ }).join("")}
14503
+ </ul>
14504
+ </section>
14505
+ `;
14506
+ }
14507
+ });
14508
+ }
14509
+ };
14510
+
14511
+ // node_modules/taleem-slides/src/slides/ImageRightBulletsLeftSlide.js
14512
+ var ImageRightBulletsLeftSlide = {
14513
+ type: "imageRightBulletsLeft",
14514
+ fromJSON(raw) {
14515
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14516
+ const bullets = raw.data?.filter((d) => d.name === "bullet").map((d) => ({ content: d.content }));
14517
+ if (!image || !bullets?.length) {
14518
+ throw new Error("imageRightBulletsLeft: image and bullets required");
14519
+ }
14520
+ return Object.freeze({
14521
+ type: "imageRightBulletsLeft",
14522
+ image,
14523
+ bullets,
14524
+ render({ visibleCount = bullets.length, activeIndex = null } = {}) {
14525
+ return `
14526
+ <section class="slide imageRightBulletsLeft">
14527
+ <ul>
14528
+ ${bullets.map((b, i) => {
14529
+ if (i >= visibleCount) return "";
14530
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14531
+ return `<li class="${cls}">${b.content}</li>`;
14532
+ }).join("")}
14533
+ </ul>
14534
+ <img src="${image}" alt="" />
14535
+ </section>
14536
+ `;
14537
+ }
14538
+ });
14539
+ }
14540
+ };
14541
+
14542
+ // node_modules/taleem-slides/src/slides/TableSlide.js
14543
+ var TableSlide = {
14544
+ type: "table",
14545
+ fromJSON(raw) {
14546
+ const rows = raw.data?.filter((d) => d.name === "row").map((d) => ({ cells: d.content }));
14547
+ if (!rows?.length) {
14548
+ throw new Error("table: requires at least one row");
14549
+ }
14550
+ return Object.freeze({
14551
+ type: "table",
14552
+ rows,
14553
+ render({ visibleCount = rows.length, activeIndex = null } = {}) {
14554
+ return `
14555
+ <table class="slide table">
14556
+ ${rows.map((row, i) => {
14557
+ if (i >= visibleCount) return "";
14558
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14559
+ return `
14560
+ <tr class="${cls}">
14561
+ ${row.cells.map((c) => `<td>${c}</td>`).join("")}
14562
+ </tr>
14563
+ `;
14564
+ }).join("")}
14565
+ </table>
14566
+ `;
14567
+ }
14568
+ });
14569
+ }
14570
+ };
14571
+
14572
+ // node_modules/taleem-slides/src/slides/StatisticSlide.js
14573
+ var StatisticSlide = {
14574
+ type: "statistic",
14575
+ fromJSON(raw) {
14576
+ const label = raw.data?.find((d) => d.name === "label")?.content;
14577
+ const value = raw.data?.find((d) => d.name === "value")?.content;
14578
+ if (!label || value === void 0) {
14579
+ throw new Error("statistic: requires label and value");
14580
+ }
14581
+ return Object.freeze({
14582
+ type: "statistic",
14583
+ label,
14584
+ value,
14585
+ render() {
14586
+ return `
14587
+ <section class="slide statistic">
14588
+ <div class="stat-value">${value}</div>
14589
+ <div class="stat-label">${label}</div>
14590
+ </section>
14591
+ `;
14592
+ }
14593
+ });
14594
+ }
14595
+ };
14596
+
14597
+ // node_modules/taleem-slides/src/slides/BigNumberSlide.js
14598
+ var BigNumberSlide = {
14599
+ type: "bigNumber",
14600
+ fromJSON(raw) {
14601
+ const value = raw.data?.find((d) => d.name === "number")?.content;
14602
+ const label = raw.data?.find((d) => d.name === "label")?.content;
14603
+ if (!value) throw new Error("bigNumber: number required");
14604
+ return Object.freeze({
14605
+ type: "bigNumber",
14606
+ value,
14607
+ label,
14608
+ render() {
14609
+ return `
14610
+ <section class="slide bigNumber">
14611
+ <div class="number">${value}</div>
14612
+ ${label ? `<div class="label">${label}</div>` : ""}
14613
+ </section>
14614
+ `;
14615
+ }
14616
+ });
14617
+ }
14618
+ };
14619
+
14620
+ // node_modules/taleem-slides/src/slides/BarChartSlide.js
14621
+ var BarChartSlide = {
14622
+ type: "barChart",
14623
+ fromJSON(raw) {
14624
+ const bars = raw.data?.filter((d) => d.name === "bar").map((d) => ({
14625
+ label: d.content.label,
14626
+ value: d.content.value
14627
+ }));
14628
+ if (!bars?.length) {
14629
+ throw new Error("barChart: requires at least one bar");
14630
+ }
14631
+ return Object.freeze({
14632
+ type: "barChart",
14633
+ bars,
14634
+ render({ visibleCount = bars.length, activeIndex = null } = {}) {
14635
+ return `
14636
+ <section class="slide barChart">
14637
+ <ul class="bars">
14638
+ ${bars.map((b, i) => {
14639
+ if (i >= visibleCount) return "";
14640
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14641
+ return `
14642
+ <li class="bar ${cls}">
14643
+ <span class="bar-label">${b.label}</span>
14644
+ <span class="bar-value">${b.value}</span>
14645
+ </li>
14646
+ `;
14647
+ }).join("")}
14648
+ </ul>
14649
+ </section>
14650
+ `;
14651
+ }
14652
+ });
14653
+ }
14654
+ };
14655
+
14656
+ // node_modules/taleem-slides/src/slides/DonutChartSlide.js
14657
+ var DonutChartSlide = {
14658
+ type: "donutChart",
14659
+ fromJSON(raw) {
14660
+ const segments = raw.data?.filter((d) => d.name === "segment").map((d) => ({
14661
+ label: d.content.label,
14662
+ value: d.content.value
14663
+ }));
14664
+ if (!segments?.length) {
14665
+ throw new Error("donutChart: requires at least one segment");
14666
+ }
14667
+ return Object.freeze({
14668
+ type: "donutChart",
14669
+ segments,
14670
+ render({ visibleCount = segments.length, activeIndex = null } = {}) {
14671
+ return `
14672
+ <section class="slide donutChart">
14673
+ <ul>
14674
+ ${segments.map((s, i) => {
14675
+ if (i >= visibleCount) return "";
14676
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14677
+ return `<li class="${cls}">${s.label}: ${s.value}</li>`;
14678
+ }).join("")}
14679
+ </ul>
14680
+ </section>
14681
+ `;
14682
+ }
14683
+ });
14684
+ }
14685
+ };
14686
+
14687
+ // node_modules/taleem-slides/src/slides/QuoteSlide.js
14688
+ var QuoteSlide = {
14689
+ type: "quoteSlide",
14690
+ fromJSON(raw) {
14691
+ const text = raw.data?.find((d) => d.name === "quote")?.content;
14692
+ const author = raw.data?.find((d) => d.name === "author")?.content;
14693
+ if (!text) throw new Error("quoteSlide: quote required");
14694
+ return Object.freeze({
14695
+ type: "quoteSlide",
14696
+ text,
14697
+ author,
14698
+ render() {
14699
+ return `
14700
+ <blockquote class="slide quoteSlide">
14701
+ <p>${text}</p>
14702
+ ${author ? `<footer>${author}</footer>` : ""}
14703
+ </blockquote>
14704
+ `;
14705
+ }
14706
+ });
14707
+ }
14708
+ };
14709
+
14710
+ // node_modules/taleem-slides/src/slides/QuoteWithImageSlide.js
14711
+ var QuoteWithImageSlide = {
14712
+ type: "quoteWithImage",
14713
+ fromJSON(raw) {
14714
+ const quote = raw.data?.find((d) => d.name === "quote")?.content;
14715
+ const image = raw.data?.find((d) => d.name === "image")?.content;
14716
+ const author = raw.data?.find((d) => d.name === "author")?.content;
14717
+ if (!quote || !image) {
14718
+ throw new Error("quoteWithImage: quote and image required");
14719
+ }
14720
+ return Object.freeze({
14721
+ type: "quoteWithImage",
14722
+ quote,
14723
+ image,
14724
+ author,
14725
+ render() {
14726
+ return `
14727
+ <section class="slide quoteWithImage">
14728
+ <img src="${image}" alt="" />
14729
+ <blockquote>
14730
+ <p>${quote}</p>
14731
+ ${author ? `<footer>${author}</footer>` : ""}
14732
+ </blockquote>
14733
+ </section>
14734
+ `;
14735
+ }
14736
+ });
14737
+ }
14738
+ };
14739
+
14740
+ // node_modules/taleem-slides/src/slides/CornerWordsSlide.js
14741
+ var CornerWordsSlide = {
14742
+ type: "cornerWordsSlide",
14743
+ fromJSON(raw) {
14744
+ const words = raw.data?.filter((d) => d.name === "word").map((d) => ({ content: d.content }));
14745
+ if (!words?.length) {
14746
+ throw new Error("cornerWordsSlide: requires at least one word");
14747
+ }
14748
+ return Object.freeze({
14749
+ type: "cornerWordsSlide",
14750
+ words,
14751
+ render({ visibleCount = words.length } = {}) {
14752
+ return `
14753
+ <section class="slide cornerWordsSlide">
14754
+ ${words.map((w, i) => {
14755
+ if (i >= visibleCount) return "";
14756
+ return `<span class="corner-word corner-${i + 1}">${w.content}</span>`;
14757
+ }).join("")}
14758
+ </section>
14759
+ `;
14760
+ }
14761
+ });
14762
+ }
14763
+ };
14764
+
14765
+ // node_modules/taleem-slides/src/slides/ContactSlide.js
14766
+ var ContactSlide = {
14767
+ type: "contactSlide",
14768
+ fromJSON(raw) {
14769
+ const items = raw.data?.map((d) => ({ content: d.content }));
14770
+ if (!items?.length) {
14771
+ throw new Error("contactSlide: content required");
14772
+ }
14773
+ return Object.freeze({
14774
+ type: "contactSlide",
14775
+ items,
14776
+ render() {
14777
+ return `
14778
+ <section class="slide contactSlide">
14779
+ ${items.map((i) => `<div>${i.content}</div>`).join("")}
14780
+ </section>
14781
+ `;
14782
+ }
14783
+ });
14784
+ }
14785
+ };
14786
+
14787
+ // node_modules/taleem-slides/src/slides/EqSlide.js
14788
+ var EqSlide = {
14789
+ type: "eq",
14790
+ fromJSON(raw) {
14791
+ if (!Array.isArray(raw.data)) {
14792
+ throw new Error("eq: data must be array");
14793
+ }
14794
+ const lines = raw.data.map((d) => ({
14795
+ content: d.content
14796
+ }));
14797
+ return Object.freeze({
14798
+ type: "eq",
14799
+ lines,
14800
+ render({ activeIndex = null } = {}) {
14801
+ return `
14802
+ <section class="slide eq">
14803
+ ${lines.map((l, i) => {
14804
+ const cls = i === activeIndex ? "is-active" : i < activeIndex ? "is-dim" : "";
14805
+ return `<div class="eq-line ${cls}">${l.content}</div>`;
14806
+ }).join("")}
14807
+ </section>
14808
+ `;
14809
+ }
14810
+ });
14811
+ }
14812
+ };
14813
+
14814
+ // node_modules/taleem-slides/src/slides/SvgPointerSlide.js
14815
+ var SvgPointerSlide = {
14816
+ type: "svgPointer",
14817
+ fromJSON(raw) {
14818
+ const svg = raw.data?.find((d) => d.name === "svg")?.content;
14819
+ if (!svg) throw new Error("svgPointer: svg required");
14820
+ return Object.freeze({
14821
+ type: "svgPointer",
14822
+ svg,
14823
+ render() {
14824
+ return `
14825
+ <section class="slide svgPointer">
14826
+ ${svg}
14827
+ </section>
14828
+ `;
14829
+ }
14830
+ });
14831
+ }
14832
+ };
14833
+
14834
+ // node_modules/taleem-slides/src/SlideTemplates.js
14835
+ var SlideTemplates = {
14836
+ titleSlide: TitleSlide,
14837
+ titleAndSubtitle: TitleAndSubtitleSlide,
14838
+ titleAndPara: TitleAndParaSlide,
14839
+ bulletList: BulletListSlide,
14840
+ twoColumnText: TwoColumnTextSlide,
14841
+ imageSlide: ImageSlide,
14842
+ fillImage: FillImageSlide,
14843
+ imageWithTitle: ImageWithTitleSlide,
14844
+ imageWithCaption: ImageWithCaptionSlide,
14845
+ imageLeftBulletsRight: ImageLeftBulletsRightSlide,
14846
+ imageRightBulletsLeft: ImageRightBulletsLeftSlide,
14847
+ table: TableSlide,
14848
+ statistic: StatisticSlide,
14849
+ bigNumber: BigNumberSlide,
14850
+ barChart: BarChartSlide,
14851
+ donutChart: DonutChartSlide,
14852
+ quoteSlide: QuoteSlide,
14853
+ quoteWithImage: QuoteWithImageSlide,
14854
+ cornerWordsSlide: CornerWordsSlide,
14855
+ contactSlide: ContactSlide,
14856
+ eq: EqSlide,
14857
+ svgPointer: SvgPointerSlide
14858
+ };
14859
+
14860
+ // node_modules/taleem-slides/src/getSlideTemplate.js
14861
+ function getSlideTemplate(type) {
14862
+ const template = SlideTemplates[type];
14863
+ if (!template) {
14864
+ throw new Error(`Unknown slide template type "${type}"`);
14865
+ }
14866
+ return template;
14867
+ }
14868
+
14250
14869
  // src/core/stage.js
14251
14870
  function createStage(mount) {
14252
14871
  if (!mount) throw new Error("taleem-player: mount is required");
@@ -14273,10 +14892,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14273
14892
  }
14274
14893
 
14275
14894
  // src/core/player.js
14276
- function createTaleemPlayer({ mount, deck, renderer }) {
14277
- if (!renderer || typeof renderer.render !== "function") {
14278
- throw new Error("taleem-player: renderer with render() required");
14279
- }
14895
+ function createTaleemPlayer({ mount, deck }) {
14280
14896
  const result = validateDeckV1(deck);
14281
14897
  if (!result.ok) {
14282
14898
  throw new Error(
@@ -14285,6 +14901,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14285
14901
  }
14286
14902
  const stage = createStage(mount);
14287
14903
  let lastSlide = null;
14904
+ let lastRenderedKey = null;
14288
14905
  function getSlideAtTime(deck2, time3) {
14289
14906
  const slides = deck2.deck;
14290
14907
  for (let i = slides.length - 1; i >= 0; i--) {
@@ -14293,22 +14910,46 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14293
14910
  }
14294
14911
  return null;
14295
14912
  }
14913
+ function computeRenderState(slide, time3) {
14914
+ if (!Array.isArray(slide.data)) {
14915
+ return {};
14916
+ }
14917
+ let visibleCount = 0;
14918
+ let activeIndex = -1;
14919
+ slide.data.forEach((item, index) => {
14920
+ if (typeof item.showAt === "number" && time3 >= item.showAt) {
14921
+ visibleCount++;
14922
+ activeIndex = index;
14923
+ }
14924
+ });
14925
+ return {
14926
+ visibleCount,
14927
+ activeIndex
14928
+ };
14929
+ }
14296
14930
  function renderAt(time3) {
14297
14931
  const slide = getSlideAtTime(deck, time3);
14298
14932
  if (!slide) {
14299
14933
  stage.clear();
14300
14934
  lastSlide = null;
14935
+ lastRenderedKey = null;
14301
14936
  return;
14302
14937
  }
14938
+ const renderState = computeRenderState(slide, time3);
14939
+ const renderKey = `${slide.start}-${renderState.visibleCount}-${renderState.activeIndex}`;
14303
14940
  if (slide !== lastSlide) {
14304
14941
  stage.clear();
14305
14942
  lastSlide = slide;
14943
+ lastRenderedKey = null;
14306
14944
  }
14307
- renderer.render({
14308
- mount: stage.el,
14309
- slide,
14310
- time: time3
14311
- });
14945
+ if (renderKey === lastRenderedKey) {
14946
+ return;
14947
+ }
14948
+ const Template = getSlideTemplate(slide.type);
14949
+ const slideInstance = Template.fromJSON(slide);
14950
+ const html = slideInstance.render(renderState);
14951
+ stage.el.innerHTML = html;
14952
+ lastRenderedKey = renderKey;
14312
14953
  }
14313
14954
  function destroy() {
14314
14955
  stage.destroy();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taleem-player",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/taleem-player.umd.js",
6
6
  "module": "./dist/taleem-player.esm.js",
@@ -19,6 +19,7 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "taleem-core": "^1.2.0",
22
+ "taleem-slides": "^0.5.0",
22
23
  "zod": "^4.3.5"
23
24
  },
24
25
  "devDependencies": {