[{"data":1,"prerenderedAt":1810},["ShallowReactive",2],{"navigation_docs":3,"-essentials-data-sources":85,"-essentials-data-sources-surround":1805},[4,20,45,70],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F2.quick-start","i-lucide-play",{"title":21,"path":22,"stem":23,"children":24,"page":6},"Essentials","\u002Fessentials","2.essentials",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Core Concepts","\u002Fessentials\u002Fcore-concepts","2.essentials\u002F1.core-concepts","i-lucide-book-open",{"title":31,"path":32,"stem":33,"icon":34},"Data Sources","\u002Fessentials\u002Fdata-sources","2.essentials\u002F2.data-sources","i-lucide-database",{"title":36,"path":37,"stem":38,"icon":39},"Refining the Timeline","\u002Fessentials\u002Frefining-the-timeline","2.essentials\u002F3.refining-the-timeline","i-lucide-filter",{"title":41,"path":42,"stem":43,"icon":44},"Components","\u002Fessentials\u002Fcomponents","2.essentials\u002F4.components","i-lucide-layout-panel-left",{"title":46,"path":47,"stem":48,"children":49,"page":6},"Customization","\u002Fcustomization","3.customization",[50,55,60,65],{"title":51,"path":52,"stem":53,"icon":54},"Custom Renderers","\u002Fcustomization\u002Fcustom-renderers","3.customization\u002F1.custom-renderers","i-lucide-paintbrush",{"title":56,"path":57,"stem":58,"icon":59},"Caching","\u002Fcustomization\u002Fcaching","3.customization\u002F2.caching","i-lucide-database-zap",{"title":61,"path":62,"stem":63,"icon":64},"Configuration","\u002Fcustomization\u002Fconfiguration","3.customization\u002F3.configuration","i-lucide-settings",{"title":66,"path":67,"stem":68,"icon":69},"Tailwind","\u002Fcustomization\u002Ftailwind","3.customization\u002F4.tailwind","i-simple-icons-tailwindcss",{"title":71,"path":72,"stem":73,"children":74,"page":6},"Advanced","\u002Fadvanced","4.advanced",[75,80],{"title":76,"path":77,"stem":78,"icon":79},"Performance Notes","\u002Fadvanced\u002Fperformance","4.advanced\u002F1.performance","i-lucide-gauge",{"title":81,"path":82,"stem":83,"icon":84},"Testing","\u002Fadvanced\u002Ftesting","4.advanced\u002F2.testing","i-lucide-flask-conical",{"id":86,"title":31,"body":87,"description":1798,"extension":1799,"links":1800,"meta":1801,"navigation":1802,"path":32,"seo":1803,"stem":33,"__hash__":1804},"docs\u002F2.essentials\u002F2.data-sources.md",{"type":88,"value":89,"toc":1788},"minimark",[90,99,104,115,149,178,182,188,241,247,251,268,676,683,768,772,785,1137,1141,1151,1173,1712,1715,1784],[91,92,93,94,98],"p",{},"All sources are registered fluently on ",[95,96,97],"code",{},"TimelineBuilder",". You can mix any number of them in one timeline.",[100,101,103],"h2",{"id":102},"the-records-own-spatie-log","The record's own spatie log",[91,105,106,107,110,111,114],{},"Use ",[95,108,109],{},"fromActivityLog()"," to pull the subject's own ",[95,112,113],{},"activity_log"," rows:",[116,117,122],"pre",{"className":118,"code":119,"language":120,"meta":121,"style":121},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","TimelineBuilder::make($this)->fromActivityLog();\n","php","",[95,123,124],{"__ignoreMap":121},[125,126,129,132,136,140,143,146],"span",{"class":127,"line":128},"line",1,[125,130,97],{"class":131},"sBMFI",[125,133,135],{"class":134},"sMK4o","::",[125,137,139],{"class":138},"s2Zo4","make",[125,141,142],{"class":134},"($this)->",[125,144,145],{"class":138},"fromActivityLog",[125,147,148],{"class":134},"();\n",[91,150,151,152,154,155,158,159,162,163,166,167,170,171,173,174,177],{},"Reads rows from ",[95,153,113],{}," where ",[95,156,157],{},"subject_type"," + ",[95,160,161],{},"subject_id"," match ",[95,164,165],{},"$this",". Entry ",[95,168,169],{},"event"," = the spatie ",[95,172,169],{}," column (or ",[95,175,176],{},"description"," as fallback).",[100,179,181],{"id":180},"related-models-spatie-logs","Related models' spatie logs",[91,183,106,184,187],{},[95,185,186],{},"fromActivityLogOf(array $relations)"," to include spatie logs from related records:",[116,189,191],{"className":118,"code":190,"language":120,"meta":121,"style":121},"TimelineBuilder::make($this)->fromActivityLogOf(['emails', 'notes', 'tasks']);\n",[95,192,193],{"__ignoreMap":121},[125,194,195,197,199,201,203,206,209,212,216,218,221,224,227,229,231,233,236,238],{"class":127,"line":128},[125,196,97],{"class":131},[125,198,135],{"class":134},[125,200,139],{"class":138},[125,202,142],{"class":134},[125,204,205],{"class":138},"fromActivityLogOf",[125,207,208],{"class":134},"([",[125,210,211],{"class":134},"'",[125,213,215],{"class":214},"sfazB","emails",[125,217,211],{"class":134},[125,219,220],{"class":134},",",[125,222,223],{"class":134}," '",[125,225,226],{"class":214},"notes",[125,228,211],{"class":134},[125,230,220],{"class":134},[125,232,223],{"class":134},[125,234,235],{"class":214},"tasks",[125,237,211],{"class":134},[125,239,240],{"class":134},"]);\n",[91,242,243,244,246],{},"For each named relation, reads ",[95,245,113],{}," rows whose subject matches any related record. Useful for \"show me everything that happened to anything attached to this person.\"",[100,248,250],{"id":249},"timestamp-columns-on-related-models","Timestamp columns on related models",[91,252,106,253,256,257,260,261,260,264,267],{},[95,254,255],{},"fromRelation(string $relation, Closure $configure)"," to turn rows on a related model into timeline entries keyed by a timestamp column. Ideal when related records already carry canonical timestamps (",[95,258,259],{},"sent_at",", ",[95,262,263],{},"completed_at",[95,265,266],{},"created_at",") and you don't need spatie-style change logs.",[116,269,271],{"className":118,"code":270,"language":120,"meta":121,"style":121},"->fromRelation('tasks', function (RelatedModelSource $source): void {\n    $source\n        ->event(\n            column: 'completed_at',\n            event: 'task_completed',\n            icon: 'heroicon-o-check-circle',\n            color: 'success',\n        )\n        ->event(\n            column: 'created_at',\n            event: 'task_created',\n            icon: 'heroicon-o-plus-circle',\n        )\n        \u002F\u002F Eager-load related rows to avoid N+1 inside renderers.\n        ->with(['creator', 'assignee'])\n        \u002F\u002F Extra query constraints (scopes, tenant filters, etc.).\n        ->using(fn ($query) => $query->whereNull('archived_at'))\n        ->title(fn ($task): string => $task->title ?? 'Task')\n        ->description(fn ($task): ?string => $task->summary)\n        \u002F\u002F Relation name on the row, or a Closure returning Model|null.\n        ->causer('creator');\n})\n",[95,272,273,319,328,339,357,374,391,408,414,423,438,454,470,475,482,511,517,563,609,645,651,670],{"__ignoreMap":121},[125,274,275,278,281,284,286,288,290,292,296,299,302,305,309,312,316],{"class":127,"line":128},[125,276,277],{"class":134},"->",[125,279,280],{"class":138},"fromRelation",[125,282,283],{"class":134},"(",[125,285,211],{"class":134},[125,287,235],{"class":214},[125,289,211],{"class":134},[125,291,220],{"class":134},[125,293,295],{"class":294},"spNyl"," function",[125,297,298],{"class":134}," (",[125,300,301],{"class":131},"RelatedModelSource",[125,303,304],{"class":134}," $",[125,306,308],{"class":307},"sTEyZ","source",[125,310,311],{"class":134},"):",[125,313,315],{"class":314},"sbssI"," void",[125,317,318],{"class":134}," {\n",[125,320,322,325],{"class":127,"line":321},2,[125,323,324],{"class":134},"    $",[125,326,327],{"class":307},"source\n",[125,329,331,334,336],{"class":127,"line":330},3,[125,332,333],{"class":134},"        ->",[125,335,169],{"class":138},[125,337,338],{"class":134},"(\n",[125,340,342,345,348,350,352,354],{"class":127,"line":341},4,[125,343,344],{"class":131},"            column",[125,346,347],{"class":134},":",[125,349,223],{"class":134},[125,351,263],{"class":214},[125,353,211],{"class":134},[125,355,356],{"class":134},",\n",[125,358,360,363,365,367,370,372],{"class":127,"line":359},5,[125,361,362],{"class":131},"            event",[125,364,347],{"class":134},[125,366,223],{"class":134},[125,368,369],{"class":214},"task_completed",[125,371,211],{"class":134},[125,373,356],{"class":134},[125,375,377,380,382,384,387,389],{"class":127,"line":376},6,[125,378,379],{"class":131},"            icon",[125,381,347],{"class":134},[125,383,223],{"class":134},[125,385,386],{"class":214},"heroicon-o-check-circle",[125,388,211],{"class":134},[125,390,356],{"class":134},[125,392,394,397,399,401,404,406],{"class":127,"line":393},7,[125,395,396],{"class":131},"            color",[125,398,347],{"class":134},[125,400,223],{"class":134},[125,402,403],{"class":214},"success",[125,405,211],{"class":134},[125,407,356],{"class":134},[125,409,411],{"class":127,"line":410},8,[125,412,413],{"class":134},"        )\n",[125,415,417,419,421],{"class":127,"line":416},9,[125,418,333],{"class":134},[125,420,169],{"class":138},[125,422,338],{"class":134},[125,424,426,428,430,432,434,436],{"class":127,"line":425},10,[125,427,344],{"class":131},[125,429,347],{"class":134},[125,431,223],{"class":134},[125,433,266],{"class":214},[125,435,211],{"class":134},[125,437,356],{"class":134},[125,439,441,443,445,447,450,452],{"class":127,"line":440},11,[125,442,362],{"class":131},[125,444,347],{"class":134},[125,446,223],{"class":134},[125,448,449],{"class":214},"task_created",[125,451,211],{"class":134},[125,453,356],{"class":134},[125,455,457,459,461,463,466,468],{"class":127,"line":456},12,[125,458,379],{"class":131},[125,460,347],{"class":134},[125,462,223],{"class":134},[125,464,465],{"class":214},"heroicon-o-plus-circle",[125,467,211],{"class":134},[125,469,356],{"class":134},[125,471,473],{"class":127,"line":472},13,[125,474,413],{"class":134},[125,476,478],{"class":127,"line":477},14,[125,479,481],{"class":480},"sHwdD","        \u002F\u002F Eager-load related rows to avoid N+1 inside renderers.\n",[125,483,485,487,490,492,494,497,499,501,503,506,508],{"class":127,"line":484},15,[125,486,333],{"class":134},[125,488,489],{"class":138},"with",[125,491,208],{"class":134},[125,493,211],{"class":134},[125,495,496],{"class":214},"creator",[125,498,211],{"class":134},[125,500,220],{"class":134},[125,502,223],{"class":134},[125,504,505],{"class":214},"assignee",[125,507,211],{"class":134},[125,509,510],{"class":134},"])\n",[125,512,514],{"class":127,"line":513},16,[125,515,516],{"class":480},"        \u002F\u002F Extra query constraints (scopes, tenant filters, etc.).\n",[125,518,520,522,525,527,530,533,536,539,542,544,546,548,551,553,555,558,560],{"class":127,"line":519},17,[125,521,333],{"class":134},[125,523,524],{"class":138},"using",[125,526,283],{"class":134},[125,528,529],{"class":294},"fn",[125,531,532],{"class":134}," ($",[125,534,535],{"class":307},"query",[125,537,538],{"class":134},")",[125,540,541],{"class":134}," =>",[125,543,304],{"class":134},[125,545,535],{"class":307},[125,547,277],{"class":134},[125,549,550],{"class":138},"whereNull",[125,552,283],{"class":134},[125,554,211],{"class":134},[125,556,557],{"class":214},"archived_at",[125,559,211],{"class":134},[125,561,562],{"class":134},"))\n",[125,564,566,568,571,573,575,577,580,582,585,587,589,591,593,596,599,601,604,606],{"class":127,"line":565},18,[125,567,333],{"class":134},[125,569,570],{"class":138},"title",[125,572,283],{"class":134},[125,574,529],{"class":294},[125,576,532],{"class":134},[125,578,579],{"class":307},"task",[125,581,311],{"class":134},[125,583,584],{"class":314}," string",[125,586,541],{"class":134},[125,588,304],{"class":134},[125,590,579],{"class":307},[125,592,277],{"class":134},[125,594,595],{"class":307},"title ",[125,597,598],{"class":134},"??",[125,600,223],{"class":134},[125,602,603],{"class":214},"Task",[125,605,211],{"class":134},[125,607,608],{"class":134},")\n",[125,610,612,614,616,618,620,622,624,626,629,632,634,636,638,640,643],{"class":127,"line":611},19,[125,613,333],{"class":134},[125,615,176],{"class":138},[125,617,283],{"class":134},[125,619,529],{"class":294},[125,621,532],{"class":134},[125,623,579],{"class":307},[125,625,311],{"class":134},[125,627,628],{"class":134}," ?",[125,630,631],{"class":314},"string",[125,633,541],{"class":134},[125,635,304],{"class":134},[125,637,579],{"class":307},[125,639,277],{"class":134},[125,641,642],{"class":307},"summary",[125,644,608],{"class":134},[125,646,648],{"class":127,"line":647},20,[125,649,650],{"class":480},"        \u002F\u002F Relation name on the row, or a Closure returning Model|null.\n",[125,652,654,656,659,661,663,665,667],{"class":127,"line":653},21,[125,655,333],{"class":134},[125,657,658],{"class":138},"causer",[125,660,283],{"class":134},[125,662,211],{"class":134},[125,664,496],{"class":214},[125,666,211],{"class":134},[125,668,669],{"class":134},");\n",[125,671,673],{"class":127,"line":672},22,[125,674,675],{"class":134},"})\n",[677,678,680,682],"h3",{"id":679},"relatedmodelsource-api",[95,681,301],{}," API",[684,685,686,699],"table",{},[687,688,689],"thead",{},[690,691,692,696],"tr",{},[693,694,695],"th",{},"Method",[693,697,698],{},"Purpose",[700,701,702,721,731,741,755],"tbody",{},[690,703,704,710],{},[705,706,707],"td",{},[95,708,709],{},"event($column, $event, $icon?, $color?, $when?)",[705,711,712,713,716,717,720],{},"Register one event per timestamp column. ",[95,714,715],{},"$when"," is an optional row-level filter returning ",[95,718,719],{},"bool",".",[690,722,723,728],{},[705,724,725],{},[95,726,727],{},"with($relations)",[705,729,730],{},"Eager-loads relations on every event query - prevents N+1 in renderers.",[690,732,733,738],{},[705,734,735],{},[95,736,737],{},"using($modifier)",[705,739,740],{},"Arbitrary query modifier (scopes, tenant filters, etc.).",[690,742,743,752],{},[705,744,745,748,749],{},[95,746,747],{},"title($resolver)"," \u002F ",[95,750,751],{},"description($resolver)",[705,753,754],{},"Per-row resolver for display fields.",[690,756,757,762],{},[705,758,759],{},[95,760,761],{},"causer($resolver)",[705,763,764,765,720],{},"Relation-name string, or Closure returning ",[95,766,767],{},"Model|null",[100,769,771],{"id":770},"custom-or-external-data","Custom or external data",[91,773,106,774,777,778,780,781,784],{},[95,775,776],{},"fromCustom(Closure $resolver)"," when the data isn't in ",[95,779,113],{}," and isn't a relation (e.g. entries coming from an external API). Yield your own ",[95,782,783],{},"TimelineEntry"," objects:",[116,786,788],{"className":118,"code":787,"language":120,"meta":121,"style":121},"->fromCustom(function (Model $subject, Window $window): iterable {\n    $rows = ExternalApi::events(\n        subject: $subject,\n        from: $window->from,\n        to: $window->to,\n        limit: $window->cap,\n    );\n\n    foreach ($rows as $row) {\n        yield new TimelineEntry(\n            id: 'external:'.$row['id'],\n            type: 'custom',\n            event: $row['event'],\n            occurredAt: CarbonImmutable::parse($row['at']),\n            dedupKey: 'external:'.$row['id'],\n            sourcePriority: 30,\n            title: $row['title'],\n        );\n    }\n})\n",[95,789,790,829,849,862,880,898,916,921,927,949,962,995,1011,1031,1063,1090,1102,1123,1128,1133],{"__ignoreMap":121},[125,791,792,794,797,799,802,804,807,809,812,814,817,819,822,824,827],{"class":127,"line":128},[125,793,277],{"class":134},[125,795,796],{"class":138},"fromCustom",[125,798,283],{"class":134},[125,800,801],{"class":294},"function",[125,803,298],{"class":134},[125,805,806],{"class":131},"Model",[125,808,304],{"class":134},[125,810,811],{"class":307},"subject",[125,813,220],{"class":134},[125,815,816],{"class":131}," Window",[125,818,304],{"class":134},[125,820,821],{"class":307},"window",[125,823,311],{"class":134},[125,825,826],{"class":314}," iterable",[125,828,318],{"class":134},[125,830,831,833,836,839,842,844,847],{"class":127,"line":321},[125,832,324],{"class":134},[125,834,835],{"class":307},"rows ",[125,837,838],{"class":134},"=",[125,840,841],{"class":131}," ExternalApi",[125,843,135],{"class":134},[125,845,846],{"class":138},"events",[125,848,338],{"class":134},[125,850,851,854,856,858,860],{"class":127,"line":330},[125,852,853],{"class":131},"        subject",[125,855,347],{"class":134},[125,857,304],{"class":134},[125,859,811],{"class":307},[125,861,356],{"class":134},[125,863,864,867,869,871,873,875,878],{"class":127,"line":341},[125,865,866],{"class":131},"        from",[125,868,347],{"class":134},[125,870,304],{"class":134},[125,872,821],{"class":307},[125,874,277],{"class":134},[125,876,877],{"class":307},"from",[125,879,356],{"class":134},[125,881,882,885,887,889,891,893,896],{"class":127,"line":359},[125,883,884],{"class":131},"        to",[125,886,347],{"class":134},[125,888,304],{"class":134},[125,890,821],{"class":307},[125,892,277],{"class":134},[125,894,895],{"class":307},"to",[125,897,356],{"class":134},[125,899,900,903,905,907,909,911,914],{"class":127,"line":376},[125,901,902],{"class":131},"        limit",[125,904,347],{"class":134},[125,906,304],{"class":134},[125,908,821],{"class":307},[125,910,277],{"class":134},[125,912,913],{"class":307},"cap",[125,915,356],{"class":134},[125,917,918],{"class":127,"line":393},[125,919,920],{"class":134},"    );\n",[125,922,923],{"class":127,"line":410},[125,924,926],{"emptyLinePlaceholder":925},true,"\n",[125,928,929,933,935,937,940,942,945,947],{"class":127,"line":416},[125,930,932],{"class":931},"s7zQu","    foreach",[125,934,532],{"class":134},[125,936,835],{"class":307},[125,938,939],{"class":134},"as",[125,941,304],{"class":134},[125,943,944],{"class":307},"row",[125,946,538],{"class":134},[125,948,318],{"class":134},[125,950,951,954,957,960],{"class":127,"line":425},[125,952,953],{"class":931},"        yield",[125,955,956],{"class":314}," new",[125,958,959],{"class":131}," TimelineEntry",[125,961,338],{"class":134},[125,963,964,967,969,971,974,977,980,982,985,987,990,992],{"class":127,"line":440},[125,965,966],{"class":131},"            id",[125,968,347],{"class":134},[125,970,223],{"class":134},[125,972,973],{"class":214},"external:",[125,975,976],{"class":134},"'.",[125,978,979],{"class":134},"$",[125,981,944],{"class":307},[125,983,984],{"class":134},"[",[125,986,211],{"class":134},[125,988,989],{"class":214},"id",[125,991,211],{"class":134},[125,993,994],{"class":134},"],\n",[125,996,997,1000,1002,1004,1007,1009],{"class":127,"line":456},[125,998,999],{"class":131},"            type",[125,1001,347],{"class":134},[125,1003,223],{"class":134},[125,1005,1006],{"class":214},"custom",[125,1008,211],{"class":134},[125,1010,356],{"class":134},[125,1012,1013,1015,1017,1019,1021,1023,1025,1027,1029],{"class":127,"line":472},[125,1014,362],{"class":131},[125,1016,347],{"class":134},[125,1018,304],{"class":134},[125,1020,944],{"class":307},[125,1022,984],{"class":134},[125,1024,211],{"class":134},[125,1026,169],{"class":214},[125,1028,211],{"class":134},[125,1030,994],{"class":134},[125,1032,1033,1036,1038,1041,1043,1046,1049,1051,1053,1055,1058,1060],{"class":127,"line":477},[125,1034,1035],{"class":131},"            occurredAt",[125,1037,347],{"class":134},[125,1039,1040],{"class":131}," CarbonImmutable",[125,1042,135],{"class":134},[125,1044,1045],{"class":138},"parse",[125,1047,1048],{"class":134},"($",[125,1050,944],{"class":307},[125,1052,984],{"class":134},[125,1054,211],{"class":134},[125,1056,1057],{"class":214},"at",[125,1059,211],{"class":134},[125,1061,1062],{"class":134},"]),\n",[125,1064,1065,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088],{"class":127,"line":484},[125,1066,1067],{"class":131},"            dedupKey",[125,1069,347],{"class":134},[125,1071,223],{"class":134},[125,1073,973],{"class":214},[125,1075,976],{"class":134},[125,1077,979],{"class":134},[125,1079,944],{"class":307},[125,1081,984],{"class":134},[125,1083,211],{"class":134},[125,1085,989],{"class":214},[125,1087,211],{"class":134},[125,1089,994],{"class":134},[125,1091,1092,1095,1097,1100],{"class":127,"line":513},[125,1093,1094],{"class":131},"            sourcePriority",[125,1096,347],{"class":134},[125,1098,1099],{"class":314}," 30",[125,1101,356],{"class":134},[125,1103,1104,1107,1109,1111,1113,1115,1117,1119,1121],{"class":127,"line":519},[125,1105,1106],{"class":131},"            title",[125,1108,347],{"class":134},[125,1110,304],{"class":134},[125,1112,944],{"class":307},[125,1114,984],{"class":134},[125,1116,211],{"class":134},[125,1118,570],{"class":214},[125,1120,211],{"class":134},[125,1122,994],{"class":134},[125,1124,1125],{"class":127,"line":565},[125,1126,1127],{"class":134},"        );\n",[125,1129,1130],{"class":127,"line":611},[125,1131,1132],{"class":134},"    }\n",[125,1134,1135],{"class":127,"line":647},[125,1136,675],{"class":134},[100,1138,1140],{"id":1139},"reusable-custom-source-classes","Reusable custom source classes",[91,1142,106,1143,1146,1147,1150],{},[95,1144,1145],{},"addSource(TimelineSource $source)"," for sources you want to reuse across models. Implement ",[95,1148,1149],{},"Relaticle\\ActivityLog\\Contracts\\TimelineSource"," and pass it directly - useful when the resolution logic warrants its own class.",[91,1152,1153,1154,1157,1158,1161,1162,1164,1165,1168,1169,1172],{},"The contract has two methods - ",[95,1155,1156],{},"priority()"," for dedup ordering, and ",[95,1159,1160],{},"resolve()"," which yields ",[95,1163,783],{}," objects for the given ",[95,1166,1167],{},"$subject"," within the ",[95,1170,1171],{},"Window","'s date range and cap:",[116,1174,1176],{"className":118,"code":1175,"language":120,"meta":121,"style":121},"namespace App\\Timeline\\Sources;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Relaticle\\ActivityLog\\Contracts\\TimelineSource;\nuse Relaticle\\ActivityLog\\Timeline\\TimelineEntry;\nuse Relaticle\\ActivityLog\\Timeline\\Window;\n\nfinal class StripePaymentSource implements TimelineSource\n{\n    public function priority(): int\n    {\n        return 30;\n    }\n\n    public function resolve(Model $subject, Window $window): iterable\n    {\n        $payments = StripeClient::paymentsFor(\n            customer: $subject->stripe_id,\n            from: $window->from,\n            to: $window->to,\n            limit: $window->cap,\n        );\n\n        foreach ($payments as $payment) {\n            yield new TimelineEntry(\n                id: \"stripe:{$payment->id}\",\n                type: 'custom',\n                event: 'payment_succeeded',\n                occurredAt: CarbonImmutable::parse($payment->created_at),\n                dedupKey: \"stripe:{$payment->id}\",\n                sourcePriority: $this->priority(),\n                title: \"Payment of {$payment->amount_formatted}\",\n            );\n        }\n    }\n}\n",[95,1177,1178,1200,1204,1219,1242,1266,1286,1306,1310,1327,1332,1348,1353,1362,1366,1370,1400,1404,1424,1442,1459,1476,1493,1498,1503,1524,1536,1564,1580,1597,1622,1646,1663,1689,1695,1701,1706],{"__ignoreMap":121},[125,1179,1180,1183,1186,1189,1192,1194,1197],{"class":127,"line":128},[125,1181,1182],{"class":314},"namespace",[125,1184,1185],{"class":131}," App",[125,1187,1188],{"class":134},"\\",[125,1190,1191],{"class":131},"Timeline",[125,1193,1188],{"class":134},[125,1195,1196],{"class":131},"Sources",[125,1198,1199],{"class":134},";\n",[125,1201,1202],{"class":127,"line":321},[125,1203,926],{"emptyLinePlaceholder":925},[125,1205,1206,1209,1212,1214,1217],{"class":127,"line":330},[125,1207,1208],{"class":314},"use",[125,1210,1211],{"class":307}," Carbon",[125,1213,1188],{"class":134},[125,1215,1216],{"class":307},"CarbonImmutable",[125,1218,1199],{"class":134},[125,1220,1221,1223,1226,1228,1231,1233,1236,1238,1240],{"class":127,"line":341},[125,1222,1208],{"class":314},[125,1224,1225],{"class":307}," Illuminate",[125,1227,1188],{"class":134},[125,1229,1230],{"class":307},"Database",[125,1232,1188],{"class":134},[125,1234,1235],{"class":307},"Eloquent",[125,1237,1188],{"class":134},[125,1239,806],{"class":307},[125,1241,1199],{"class":134},[125,1243,1244,1246,1249,1251,1254,1256,1259,1261,1264],{"class":127,"line":359},[125,1245,1208],{"class":314},[125,1247,1248],{"class":307}," Relaticle",[125,1250,1188],{"class":134},[125,1252,1253],{"class":307},"ActivityLog",[125,1255,1188],{"class":134},[125,1257,1258],{"class":307},"Contracts",[125,1260,1188],{"class":134},[125,1262,1263],{"class":307},"TimelineSource",[125,1265,1199],{"class":134},[125,1267,1268,1270,1272,1274,1276,1278,1280,1282,1284],{"class":127,"line":376},[125,1269,1208],{"class":314},[125,1271,1248],{"class":307},[125,1273,1188],{"class":134},[125,1275,1253],{"class":307},[125,1277,1188],{"class":134},[125,1279,1191],{"class":307},[125,1281,1188],{"class":134},[125,1283,783],{"class":307},[125,1285,1199],{"class":134},[125,1287,1288,1290,1292,1294,1296,1298,1300,1302,1304],{"class":127,"line":393},[125,1289,1208],{"class":314},[125,1291,1248],{"class":307},[125,1293,1188],{"class":134},[125,1295,1253],{"class":307},[125,1297,1188],{"class":134},[125,1299,1191],{"class":307},[125,1301,1188],{"class":134},[125,1303,1171],{"class":307},[125,1305,1199],{"class":134},[125,1307,1308],{"class":127,"line":410},[125,1309,926],{"emptyLinePlaceholder":925},[125,1311,1312,1315,1318,1321,1324],{"class":127,"line":416},[125,1313,1314],{"class":294},"final",[125,1316,1317],{"class":294}," class",[125,1319,1320],{"class":131}," StripePaymentSource",[125,1322,1323],{"class":294}," implements",[125,1325,1326],{"class":131}," TimelineSource\n",[125,1328,1329],{"class":127,"line":425},[125,1330,1331],{"class":134},"{\n",[125,1333,1334,1337,1339,1342,1345],{"class":127,"line":440},[125,1335,1336],{"class":294},"    public",[125,1338,295],{"class":294},[125,1340,1341],{"class":138}," priority",[125,1343,1344],{"class":134},"():",[125,1346,1347],{"class":314}," int\n",[125,1349,1350],{"class":127,"line":456},[125,1351,1352],{"class":134},"    {\n",[125,1354,1355,1358,1360],{"class":127,"line":472},[125,1356,1357],{"class":931},"        return",[125,1359,1099],{"class":314},[125,1361,1199],{"class":134},[125,1363,1364],{"class":127,"line":477},[125,1365,1132],{"class":134},[125,1367,1368],{"class":127,"line":484},[125,1369,926],{"emptyLinePlaceholder":925},[125,1371,1372,1374,1376,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397],{"class":127,"line":513},[125,1373,1336],{"class":294},[125,1375,295],{"class":294},[125,1377,1378],{"class":138}," resolve",[125,1380,283],{"class":134},[125,1382,806],{"class":131},[125,1384,304],{"class":134},[125,1386,811],{"class":307},[125,1388,220],{"class":134},[125,1390,816],{"class":131},[125,1392,304],{"class":134},[125,1394,821],{"class":307},[125,1396,311],{"class":134},[125,1398,1399],{"class":314}," iterable\n",[125,1401,1402],{"class":127,"line":519},[125,1403,1352],{"class":134},[125,1405,1406,1409,1412,1414,1417,1419,1422],{"class":127,"line":565},[125,1407,1408],{"class":134},"        $",[125,1410,1411],{"class":307},"payments ",[125,1413,838],{"class":134},[125,1415,1416],{"class":131}," StripeClient",[125,1418,135],{"class":134},[125,1420,1421],{"class":138},"paymentsFor",[125,1423,338],{"class":134},[125,1425,1426,1429,1431,1433,1435,1437,1440],{"class":127,"line":611},[125,1427,1428],{"class":131},"            customer",[125,1430,347],{"class":134},[125,1432,304],{"class":134},[125,1434,811],{"class":307},[125,1436,277],{"class":134},[125,1438,1439],{"class":307},"stripe_id",[125,1441,356],{"class":134},[125,1443,1444,1447,1449,1451,1453,1455,1457],{"class":127,"line":647},[125,1445,1446],{"class":131},"            from",[125,1448,347],{"class":134},[125,1450,304],{"class":134},[125,1452,821],{"class":307},[125,1454,277],{"class":134},[125,1456,877],{"class":307},[125,1458,356],{"class":134},[125,1460,1461,1464,1466,1468,1470,1472,1474],{"class":127,"line":653},[125,1462,1463],{"class":131},"            to",[125,1465,347],{"class":134},[125,1467,304],{"class":134},[125,1469,821],{"class":307},[125,1471,277],{"class":134},[125,1473,895],{"class":307},[125,1475,356],{"class":134},[125,1477,1478,1481,1483,1485,1487,1489,1491],{"class":127,"line":672},[125,1479,1480],{"class":131},"            limit",[125,1482,347],{"class":134},[125,1484,304],{"class":134},[125,1486,821],{"class":307},[125,1488,277],{"class":134},[125,1490,913],{"class":307},[125,1492,356],{"class":134},[125,1494,1496],{"class":127,"line":1495},23,[125,1497,1127],{"class":134},[125,1499,1501],{"class":127,"line":1500},24,[125,1502,926],{"emptyLinePlaceholder":925},[125,1504,1506,1509,1511,1513,1515,1517,1520,1522],{"class":127,"line":1505},25,[125,1507,1508],{"class":931},"        foreach",[125,1510,532],{"class":134},[125,1512,1411],{"class":307},[125,1514,939],{"class":134},[125,1516,304],{"class":134},[125,1518,1519],{"class":307},"payment",[125,1521,538],{"class":134},[125,1523,318],{"class":134},[125,1525,1527,1530,1532,1534],{"class":127,"line":1526},26,[125,1528,1529],{"class":931},"            yield",[125,1531,956],{"class":314},[125,1533,959],{"class":131},[125,1535,338],{"class":134},[125,1537,1539,1542,1544,1547,1550,1553,1555,1557,1559,1562],{"class":127,"line":1538},27,[125,1540,1541],{"class":131},"                id",[125,1543,347],{"class":134},[125,1545,1546],{"class":134}," \"",[125,1548,1549],{"class":214},"stripe:",[125,1551,1552],{"class":134},"{$",[125,1554,1519],{"class":307},[125,1556,277],{"class":134},[125,1558,989],{"class":307},[125,1560,1561],{"class":134},"}\"",[125,1563,356],{"class":134},[125,1565,1567,1570,1572,1574,1576,1578],{"class":127,"line":1566},28,[125,1568,1569],{"class":131},"                type",[125,1571,347],{"class":134},[125,1573,223],{"class":134},[125,1575,1006],{"class":214},[125,1577,211],{"class":134},[125,1579,356],{"class":134},[125,1581,1583,1586,1588,1590,1593,1595],{"class":127,"line":1582},29,[125,1584,1585],{"class":131},"                event",[125,1587,347],{"class":134},[125,1589,223],{"class":134},[125,1591,1592],{"class":214},"payment_succeeded",[125,1594,211],{"class":134},[125,1596,356],{"class":134},[125,1598,1600,1603,1605,1607,1609,1611,1613,1615,1617,1619],{"class":127,"line":1599},30,[125,1601,1602],{"class":131},"                occurredAt",[125,1604,347],{"class":134},[125,1606,1040],{"class":131},[125,1608,135],{"class":134},[125,1610,1045],{"class":138},[125,1612,1048],{"class":134},[125,1614,1519],{"class":307},[125,1616,277],{"class":134},[125,1618,266],{"class":307},[125,1620,1621],{"class":134},"),\n",[125,1623,1625,1628,1630,1632,1634,1636,1638,1640,1642,1644],{"class":127,"line":1624},31,[125,1626,1627],{"class":131},"                dedupKey",[125,1629,347],{"class":134},[125,1631,1546],{"class":134},[125,1633,1549],{"class":214},[125,1635,1552],{"class":134},[125,1637,1519],{"class":307},[125,1639,277],{"class":134},[125,1641,989],{"class":307},[125,1643,1561],{"class":134},[125,1645,356],{"class":134},[125,1647,1649,1652,1654,1657,1660],{"class":127,"line":1648},32,[125,1650,1651],{"class":131},"                sourcePriority",[125,1653,347],{"class":134},[125,1655,1656],{"class":134}," $this->",[125,1658,1659],{"class":138},"priority",[125,1661,1662],{"class":134},"(),\n",[125,1664,1666,1669,1671,1673,1676,1678,1680,1682,1685,1687],{"class":127,"line":1665},33,[125,1667,1668],{"class":131},"                title",[125,1670,347],{"class":134},[125,1672,1546],{"class":134},[125,1674,1675],{"class":214},"Payment of ",[125,1677,1552],{"class":134},[125,1679,1519],{"class":307},[125,1681,277],{"class":134},[125,1683,1684],{"class":307},"amount_formatted",[125,1686,1561],{"class":134},[125,1688,356],{"class":134},[125,1690,1692],{"class":127,"line":1691},34,[125,1693,1694],{"class":134},"            );\n",[125,1696,1698],{"class":127,"line":1697},35,[125,1699,1700],{"class":134},"        }\n",[125,1702,1704],{"class":127,"line":1703},36,[125,1705,1132],{"class":134},[125,1707,1709],{"class":127,"line":1708},37,[125,1710,1711],{"class":134},"}\n",[91,1713,1714],{},"Then register it on the builder:",[116,1716,1718],{"className":118,"code":1717,"language":120,"meta":121,"style":121},"public function timeline(): TimelineBuilder\n{\n    return TimelineBuilder::make($this)\n        ->fromActivityLog()\n        ->addSource(new StripePaymentSource());\n}\n",[95,1719,1720,1735,1739,1754,1763,1780],{"__ignoreMap":121},[125,1721,1722,1725,1727,1730,1732],{"class":127,"line":128},[125,1723,1724],{"class":294},"public",[125,1726,295],{"class":294},[125,1728,1729],{"class":138}," timeline",[125,1731,1344],{"class":134},[125,1733,1734],{"class":131}," TimelineBuilder\n",[125,1736,1737],{"class":127,"line":321},[125,1738,1331],{"class":134},[125,1740,1741,1744,1747,1749,1751],{"class":127,"line":330},[125,1742,1743],{"class":931},"    return",[125,1745,1746],{"class":131}," TimelineBuilder",[125,1748,135],{"class":134},[125,1750,139],{"class":138},[125,1752,1753],{"class":134},"($this)\n",[125,1755,1756,1758,1760],{"class":127,"line":341},[125,1757,333],{"class":134},[125,1759,145],{"class":138},[125,1761,1762],{"class":134},"()\n",[125,1764,1765,1767,1770,1772,1775,1777],{"class":127,"line":359},[125,1766,333],{"class":134},[125,1768,1769],{"class":138},"addSource",[125,1771,283],{"class":134},[125,1773,1774],{"class":314},"new",[125,1776,1320],{"class":131},[125,1778,1779],{"class":134},"());\n",[125,1781,1782],{"class":127,"line":376},[125,1783,1711],{"class":134},[1785,1786,1787],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":121,"searchDepth":321,"depth":321,"links":1789},[1790,1791,1792,1796,1797],{"id":102,"depth":321,"text":103},{"id":180,"depth":321,"text":181},{"id":249,"depth":321,"text":250,"children":1793},[1794],{"id":679,"depth":330,"text":1795},"RelatedModelSource API",{"id":770,"depth":321,"text":771},{"id":1139,"depth":321,"text":1140},"Compose sources for your timeline.","md",null,{},{"icon":34},{"title":31,"description":1798},"yESenzM70B9fsi59GtBzZb1w2kVUT8l8bmL9f5wTxYo",[1806,1808],{"title":26,"path":27,"stem":28,"description":1807,"icon":29,"children":-1},"Builder, sources, entries, and renderers.",{"title":36,"path":37,"stem":38,"description":1809,"icon":39,"children":-1},"Filters, sorting, and deduplication.",1776704455777]