[{"data":1,"prerenderedAt":1501},["ShallowReactive",2],{"navigation_docs":3,"-essentials-customization":111,"-essentials-customization-surround":1496},[4,20,30,66,82,89,96],{"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-rocket",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Concepts","i-lucide-compass","\u002Fconcepts","2.concepts",[26],{"title":27,"path":28,"stem":29,"icon":22},"How it works","\u002Fconcepts\u002Fhow-it-works","2.concepts\u002F1.how-it-works",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":6},"Essentials","i-lucide-book-open","\u002Fessentials","3.essentials",[36,41,46,51,56,61],{"title":37,"path":38,"stem":39,"icon":40},"Sources","\u002Fessentials\u002Fsources","3.essentials\u002F1.sources","i-lucide-layers",{"title":42,"path":43,"stem":44,"icon":45},"Filament UI","\u002Fessentials\u002Ffilament-ui","3.essentials\u002F2.filament-ui","i-lucide-layout-dashboard",{"title":47,"path":48,"stem":49,"icon":50},"Refining the timeline","\u002Fessentials\u002Frefining-the-timeline","3.essentials\u002F3.refining-the-timeline","i-lucide-filter",{"title":52,"path":53,"stem":54,"icon":55},"Customization","\u002Fessentials\u002Fcustomization","3.essentials\u002F4.customization","i-lucide-paintbrush",{"title":57,"path":58,"stem":59,"icon":60},"Caching","\u002Fessentials\u002Fcaching","3.essentials\u002F5.caching","i-lucide-database",{"title":62,"path":63,"stem":64,"icon":65},"Configuration","\u002Fessentials\u002Fconfiguration","3.essentials\u002F6.configuration","i-lucide-settings",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":6},"Recipes","i-lucide-chef-hat","\u002Frecipes","4.recipes",[72,77],{"title":73,"path":74,"stem":75,"icon":76},"CRM person feed","\u002Frecipes\u002Fcrm-person-feed","4.recipes\u002F1.crm-person-feed","i-lucide-users",{"title":78,"path":79,"stem":80,"icon":81},"Audit log for admins","\u002Frecipes\u002Faudit-log-for-admins","4.recipes\u002F2.audit-log-for-admins","i-lucide-shield",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Testing","\u002Ftesting","5.testing\u002F1.index",[87],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-flask-conical",{"title":90,"path":91,"stem":92,"children":93,"icon":95},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting\u002F1.index",[94],{"title":90,"path":91,"stem":92,"icon":95},"i-lucide-life-buoy",{"title":97,"path":98,"stem":99,"children":100,"page":6},"Community","\u002Fcommunity","7.community",[101,106],{"title":102,"path":103,"stem":104,"icon":105},"Contributing","\u002Fcommunity\u002Fcontributing","7.community\u002F1.contributing","i-lucide-heart-handshake",{"title":107,"path":108,"stem":109,"icon":110},"License","\u002Fcommunity\u002Flicense","7.community\u002F2.license","i-lucide-scale",{"id":112,"title":52,"body":113,"description":1487,"extension":1488,"links":1489,"meta":1490,"navigation":1491,"path":53,"seo":1492,"stem":54,"__hash__":1495},"docs\u002F3.essentials\u002F4.customization.md",{"type":114,"value":115,"toc":1474},"minimark",[116,125,132,137,143,185,204,208,211,222,327,337,494,504,562,566,569,574,585,766,770,781,873,879,883,893,955,959,970,973,997,1003,1019,1024,1033,1114,1117,1172,1179,1431,1456,1460,1470],[117,118,119,120,124],"p",{},"Renderers turn ",[121,122,123],"code",{},"TimelineEntry"," objects into Blade markup. The package ships sensible defaults for the entries it knows about; everything else falls back to a generic renderer. Customize per event, per type, or wholesale per surface — pick the channel that matches the scope you need.",[117,126,127,128,131],{},"For the underlying mental model (sources, entries, and how renderers fit into the pipeline), see ",[129,130,28],"a",{"href":28},".",[133,134,136],"h2",{"id":135},"renderer-resolution-order","Renderer resolution order",[117,138,139,140,142],{},"For each ",[121,141,123],{},", the registry looks up a renderer in this exact order and stops at the first match:",[144,145,146,153,163,179],"ol",{},[147,148,149,152],"li",{},[121,150,151],{},"$entry->renderer"," — explicit per-entry override (sources can set this when constructing the entry).",[147,154,155,158,159,162],{},[121,156,157],{},"bindings[$entry->event]"," — event-keyed registry binding (e.g., ",[121,160,161],{},"'email_sent'",").",[147,164,165,168,169,172,173,172,176,162],{},[121,166,167],{},"bindings[$entry->type]"," — type-keyed registry binding (e.g., ",[121,170,171],{},"'activity_log'",", ",[121,174,175],{},"'related_model'",[121,177,178],{},"'custom'",[147,180,181,184],{},[121,182,183],{},"Relaticle\\ActivityLog\\Renderers\\DefaultRenderer"," — fallback (title, description, causer, relative time, colored icon).",[117,186,187,188,191,192,194,195,203],{},"The built-in ",[121,189,190],{},"Relaticle\\ActivityLog\\Renderers\\ActivityLogRenderer"," is auto-registered for the ",[121,193,171],{}," type by the package service provider, so spatie activity-log entries get diff rendering for free without any opt-in. To replace it, see ",[129,196,198,199,202],{"href":197},"#replacing-the-built-in-activity_log-renderer","Replacing the built-in ",[121,200,201],{},"activity_log"," renderer"," below.",[133,205,207],{"id":206},"renderer-binding-forms","Renderer binding forms",[117,209,210],{},"The registry accepts three forms for any binding. Pick the lightest one that fits — there's no functional difference at render time.",[117,212,213,217,218,221],{},[214,215,216],"strong",{},"Class string"," implementing ",[121,219,220],{},"Relaticle\\ActivityLog\\Contracts\\TimelineRenderer",". Resolved through the container, so you can typehint dependencies in the constructor.",[223,224,229],"pre",{"className":225,"code":226,"language":227,"meta":228,"style":228},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Relaticle\\ActivityLog\\Facades\\Timeline;\n\nTimeline::registerRenderer('email_sent', \\App\\Timeline\\Renderers\\EmailSentRenderer::class);\n","php","",[121,230,231,264,271],{"__ignoreMap":228},[232,233,236,240,244,248,251,253,256,258,261],"span",{"class":234,"line":235},"line",1,[232,237,239],{"class":238},"sbssI","use",[232,241,243],{"class":242},"sTEyZ"," Relaticle",[232,245,247],{"class":246},"sMK4o","\\",[232,249,250],{"class":242},"ActivityLog",[232,252,247],{"class":246},[232,254,255],{"class":242},"Facades",[232,257,247],{"class":246},[232,259,260],{"class":242},"Timeline",[232,262,263],{"class":246},";\n",[232,265,267],{"class":234,"line":266},2,[232,268,270],{"emptyLinePlaceholder":269},true,"\n",[232,272,274,277,280,284,287,290,294,296,299,302,305,307,309,311,314,316,319,321,324],{"class":234,"line":273},3,[232,275,260],{"class":276},"sBMFI",[232,278,279],{"class":246},"::",[232,281,283],{"class":282},"s2Zo4","registerRenderer",[232,285,286],{"class":246},"(",[232,288,289],{"class":246},"'",[232,291,293],{"class":292},"sfazB","email_sent",[232,295,289],{"class":246},[232,297,298],{"class":246},",",[232,300,301],{"class":246}," \\",[232,303,304],{"class":242},"App",[232,306,247],{"class":246},[232,308,260],{"class":242},[232,310,247],{"class":246},[232,312,313],{"class":242},"Renderers",[232,315,247],{"class":246},[232,317,318],{"class":276},"EmailSentRenderer",[232,320,279],{"class":246},[232,322,323],{"class":238},"class",[232,325,326],{"class":246},");\n",[117,328,329,332,333,336],{},[214,330,331],{},"Closure"," with signature ",[121,334,335],{},"fn (TimelineEntry $entry): View|HtmlString",". Best for tiny per-entry markup or quick prototyping.",[223,338,340],{"className":225,"code":339,"language":227,"meta":228,"style":228},"use Illuminate\\Support\\HtmlString;\nuse Relaticle\\ActivityLog\\Facades\\Timeline;\nuse Relaticle\\ActivityLog\\Timeline\\TimelineEntry;\n\nTimeline::registerRenderer('task_done', fn (TimelineEntry $entry) => new HtmlString(\n    \"\u003Cstrong>{$entry->title}\u003C\u002Fstrong> finished\",\n));\n",[121,341,342,361,381,401,406,456,488],{"__ignoreMap":228},[232,343,344,346,349,351,354,356,359],{"class":234,"line":235},[232,345,239],{"class":238},[232,347,348],{"class":242}," Illuminate",[232,350,247],{"class":246},[232,352,353],{"class":242},"Support",[232,355,247],{"class":246},[232,357,358],{"class":242},"HtmlString",[232,360,263],{"class":246},[232,362,363,365,367,369,371,373,375,377,379],{"class":234,"line":266},[232,364,239],{"class":238},[232,366,243],{"class":242},[232,368,247],{"class":246},[232,370,250],{"class":242},[232,372,247],{"class":246},[232,374,255],{"class":242},[232,376,247],{"class":246},[232,378,260],{"class":242},[232,380,263],{"class":246},[232,382,383,385,387,389,391,393,395,397,399],{"class":234,"line":273},[232,384,239],{"class":238},[232,386,243],{"class":242},[232,388,247],{"class":246},[232,390,250],{"class":242},[232,392,247],{"class":246},[232,394,260],{"class":242},[232,396,247],{"class":246},[232,398,123],{"class":242},[232,400,263],{"class":246},[232,402,404],{"class":234,"line":403},4,[232,405,270],{"emptyLinePlaceholder":269},[232,407,409,411,413,415,417,419,422,424,426,430,433,435,438,441,444,447,450,453],{"class":234,"line":408},5,[232,410,260],{"class":276},[232,412,279],{"class":246},[232,414,283],{"class":282},[232,416,286],{"class":246},[232,418,289],{"class":246},[232,420,421],{"class":292},"task_done",[232,423,289],{"class":246},[232,425,298],{"class":246},[232,427,429],{"class":428},"spNyl"," fn",[232,431,432],{"class":246}," (",[232,434,123],{"class":276},[232,436,437],{"class":246}," $",[232,439,440],{"class":242},"entry",[232,442,443],{"class":246},")",[232,445,446],{"class":246}," =>",[232,448,449],{"class":238}," new",[232,451,452],{"class":276}," HtmlString",[232,454,455],{"class":246},"(\n",[232,457,459,462,465,468,470,473,476,479,482,485],{"class":234,"line":458},6,[232,460,461],{"class":246},"    \"",[232,463,464],{"class":292},"\u003Cstrong>",[232,466,467],{"class":246},"{$",[232,469,440],{"class":242},[232,471,472],{"class":246},"->",[232,474,475],{"class":242},"title",[232,477,478],{"class":246},"}",[232,480,481],{"class":292},"\u003C\u002Fstrong> finished",[232,483,484],{"class":246},"\"",[232,486,487],{"class":246},",\n",[232,489,491],{"class":234,"line":490},7,[232,492,493],{"class":246},"));\n",[117,495,496,499,500,503],{},[214,497,498],{},"View name"," — a string Blade view path. Receives ",[121,501,502],{},"$entry"," in scope automatically.",[223,505,507],{"className":225,"code":506,"language":227,"meta":228,"style":228},"use Relaticle\\ActivityLog\\Facades\\Timeline;\n\nTimeline::registerRenderer('note_added', 'app::timeline.note-added');\n",[121,508,509,529,533],{"__ignoreMap":228},[232,510,511,513,515,517,519,521,523,525,527],{"class":234,"line":235},[232,512,239],{"class":238},[232,514,243],{"class":242},[232,516,247],{"class":246},[232,518,250],{"class":242},[232,520,247],{"class":246},[232,522,255],{"class":242},[232,524,247],{"class":246},[232,526,260],{"class":242},[232,528,263],{"class":246},[232,530,531],{"class":234,"line":266},[232,532,270],{"emptyLinePlaceholder":269},[232,534,535,537,539,541,543,545,548,550,552,555,558,560],{"class":234,"line":273},[232,536,260],{"class":276},[232,538,279],{"class":246},[232,540,283],{"class":282},[232,542,286],{"class":246},[232,544,289],{"class":246},[232,546,547],{"class":292},"note_added",[232,549,289],{"class":246},[232,551,298],{"class":246},[232,553,554],{"class":246}," '",[232,556,557],{"class":292},"app::timeline.note-added",[232,559,289],{"class":246},[232,561,326],{"class":246},[133,563,565],{"id":564},"registration-channels","Registration channels",[117,567,568],{},"Three places to register renderers. They write to the same registry — pick by scope, not capability.",[570,571,573],"h3",{"id":572},"plugin","Plugin",[117,575,576,577,580,581,584],{},"Preferred for ",[214,578,579],{},"panel-scoped overrides",". Use ",[121,582,583],{},"Relaticle\\ActivityLog\\Filament\\ActivityLogPlugin"," and pass renderers directly to the plugin.",[223,586,588],{"className":225,"code":587,"language":227,"meta":228,"style":228},"use Illuminate\\Support\\HtmlString;\nuse Relaticle\\ActivityLog\\Filament\\ActivityLogPlugin;\n\n$panel->plugin(\n    ActivityLogPlugin::make()->renderers([\n        'email_sent' => \\App\\Timeline\\Renderers\\EmailSentRenderer::class,\n        'note_added' => 'app::timeline.note-added',\n        'task_done'  => fn ($entry) => new HtmlString('...'),\n    ]),\n);\n",[121,589,590,606,628,632,646,665,698,716,755,761],{"__ignoreMap":228},[232,591,592,594,596,598,600,602,604],{"class":234,"line":235},[232,593,239],{"class":238},[232,595,348],{"class":242},[232,597,247],{"class":246},[232,599,353],{"class":242},[232,601,247],{"class":246},[232,603,358],{"class":242},[232,605,263],{"class":246},[232,607,608,610,612,614,616,618,621,623,626],{"class":234,"line":266},[232,609,239],{"class":238},[232,611,243],{"class":242},[232,613,247],{"class":246},[232,615,250],{"class":242},[232,617,247],{"class":246},[232,619,620],{"class":242},"Filament",[232,622,247],{"class":246},[232,624,625],{"class":242},"ActivityLogPlugin",[232,627,263],{"class":246},[232,629,630],{"class":234,"line":273},[232,631,270],{"emptyLinePlaceholder":269},[232,633,634,637,640,642,644],{"class":234,"line":403},[232,635,636],{"class":246},"$",[232,638,639],{"class":242},"panel",[232,641,472],{"class":246},[232,643,572],{"class":282},[232,645,455],{"class":246},[232,647,648,651,653,656,659,662],{"class":234,"line":408},[232,649,650],{"class":276},"    ActivityLogPlugin",[232,652,279],{"class":246},[232,654,655],{"class":282},"make",[232,657,658],{"class":246},"()->",[232,660,661],{"class":282},"renderers",[232,663,664],{"class":246},"([\n",[232,666,667,670,672,674,676,678,680,682,684,686,688,690,692,694,696],{"class":234,"line":458},[232,668,669],{"class":246},"        '",[232,671,293],{"class":292},[232,673,289],{"class":246},[232,675,446],{"class":246},[232,677,301],{"class":246},[232,679,304],{"class":242},[232,681,247],{"class":246},[232,683,260],{"class":242},[232,685,247],{"class":246},[232,687,313],{"class":242},[232,689,247],{"class":246},[232,691,318],{"class":276},[232,693,279],{"class":246},[232,695,323],{"class":238},[232,697,487],{"class":246},[232,699,700,702,704,706,708,710,712,714],{"class":234,"line":490},[232,701,669],{"class":246},[232,703,547],{"class":292},[232,705,289],{"class":246},[232,707,446],{"class":246},[232,709,554],{"class":246},[232,711,557],{"class":292},[232,713,289],{"class":246},[232,715,487],{"class":246},[232,717,719,721,723,725,728,730,733,735,737,739,741,743,745,747,750,752],{"class":234,"line":718},8,[232,720,669],{"class":246},[232,722,421],{"class":292},[232,724,289],{"class":246},[232,726,727],{"class":246},"  =>",[232,729,429],{"class":428},[232,731,732],{"class":246}," ($",[232,734,440],{"class":242},[232,736,443],{"class":246},[232,738,446],{"class":246},[232,740,449],{"class":238},[232,742,452],{"class":276},[232,744,286],{"class":246},[232,746,289],{"class":246},[232,748,749],{"class":292},"...",[232,751,289],{"class":246},[232,753,754],{"class":246},"),\n",[232,756,758],{"class":234,"line":757},9,[232,759,760],{"class":246},"    ]),\n",[232,762,764],{"class":234,"line":763},10,[232,765,326],{"class":246},[570,767,769],{"id":768},"facade","Facade",[117,771,772,773,776,777,780],{},"Useful from a service provider's ",[121,774,775],{},"boot()"," for ",[214,778,779],{},"global, panel-agnostic overrides"," — or for runtime\u002Fconditional registration.",[223,782,784],{"className":225,"code":783,"language":227,"meta":228,"style":228},"use Relaticle\\ActivityLog\\Facades\\Timeline;\n\nTimeline::registerRenderer('email_sent', \\App\\Timeline\\Renderers\\EmailSentRenderer::class);\n\nTimeline::unregisterRenderer('email_sent');\n",[121,785,786,806,810,850,854],{"__ignoreMap":228},[232,787,788,790,792,794,796,798,800,802,804],{"class":234,"line":235},[232,789,239],{"class":238},[232,791,243],{"class":242},[232,793,247],{"class":246},[232,795,250],{"class":242},[232,797,247],{"class":246},[232,799,255],{"class":242},[232,801,247],{"class":246},[232,803,260],{"class":242},[232,805,263],{"class":246},[232,807,808],{"class":234,"line":266},[232,809,270],{"emptyLinePlaceholder":269},[232,811,812,814,816,818,820,822,824,826,828,830,832,834,836,838,840,842,844,846,848],{"class":234,"line":273},[232,813,260],{"class":276},[232,815,279],{"class":246},[232,817,283],{"class":282},[232,819,286],{"class":246},[232,821,289],{"class":246},[232,823,293],{"class":292},[232,825,289],{"class":246},[232,827,298],{"class":246},[232,829,301],{"class":246},[232,831,304],{"class":242},[232,833,247],{"class":246},[232,835,260],{"class":242},[232,837,247],{"class":246},[232,839,313],{"class":242},[232,841,247],{"class":246},[232,843,318],{"class":276},[232,845,279],{"class":246},[232,847,323],{"class":238},[232,849,326],{"class":246},[232,851,852],{"class":234,"line":403},[232,853,270],{"emptyLinePlaceholder":269},[232,855,856,858,860,863,865,867,869,871],{"class":234,"line":408},[232,857,260],{"class":276},[232,859,279],{"class":246},[232,861,862],{"class":282},"unregisterRenderer",[232,864,286],{"class":246},[232,866,289],{"class":246},[232,868,293],{"class":292},[232,870,289],{"class":246},[232,872,326],{"class":246},[117,874,875,878],{},[121,876,877],{},"unregisterRenderer($eventOrType)"," drops a binding from the registry — handy in tests, or when a feature flag flips off and you want the default renderer back.",[570,880,882],{"id":881},"config","Config",[117,884,885,886,889,890,131],{},"For ",[214,887,888],{},"static defaults"," that don't depend on runtime state. Lives in ",[121,891,892],{},"config\u002Factivity-log.php",[223,894,896],{"className":225,"code":895,"language":227,"meta":228,"style":228},"\u002F\u002F config\u002Factivity-log.php\n'renderers' => [\n    'email_sent' => \\App\\Timeline\\Renderers\\EmailSentRenderer::class,\n],\n",[121,897,898,904,917,950],{"__ignoreMap":228},[232,899,900],{"class":234,"line":235},[232,901,903],{"class":902},"sHwdD","\u002F\u002F config\u002Factivity-log.php\n",[232,905,906,908,910,912,914],{"class":234,"line":266},[232,907,289],{"class":246},[232,909,661],{"class":292},[232,911,289],{"class":246},[232,913,446],{"class":246},[232,915,916],{"class":246}," [\n",[232,918,919,922,924,926,928,930,932,934,936,938,940,942,944,946,948],{"class":234,"line":273},[232,920,921],{"class":246},"    '",[232,923,293],{"class":292},[232,925,289],{"class":246},[232,927,446],{"class":246},[232,929,301],{"class":246},[232,931,304],{"class":242},[232,933,247],{"class":246},[232,935,260],{"class":242},[232,937,247],{"class":246},[232,939,313],{"class":242},[232,941,247],{"class":246},[232,943,318],{"class":276},[232,945,279],{"class":246},[232,947,323],{"class":238},[232,949,487],{"class":246},[232,951,952],{"class":234,"line":403},[232,953,954],{"class":246},"],\n",[570,956,958],{"id":957},"resolution-precedence-between-channels","Resolution precedence between channels",[117,960,961,962,965,966,969],{},"The registry stores all bindings in a single keyed array (",[121,963,964],{},"array\u003Cstring, string|Closure>","). There is ",[214,967,968],{},"no \"plugin > facade > config\" priority"," — whichever channel registers last for a given key wins.",[117,971,972],{},"The boot order in practice:",[144,974,975,984,991],{},[147,976,977,980,981,983],{},[121,978,979],{},"ActivityLogServiceProvider::packageBooted()"," registers the built-in ",[121,982,171],{}," type renderer.",[147,985,986,987,990],{},"The plugin's ",[121,988,989],{},"register(Panel)"," runs when the panel boots, applying its renderers.",[147,992,993,994,996],{},"The facade can be called from anywhere (a service provider's ",[121,995,775],{},", middleware, runtime code).",[117,998,999,1000,131],{},"So the actual rule is ",[214,1001,1002],{},"last registration wins",[1004,1005,1008,1009,172,1012,1015,1016,131],"callout",{"color":1006,"icon":1007},"info","i-lucide-lightbulb","A clean split that avoids surprises: register ",[214,1010,1011],{},"stable defaults via config",[214,1013,1014],{},"panel-specific overrides via the plugin",", and ",[214,1017,1018],{},"runtime\u002Fconditional overrides via the facade",[133,1020,198,1022,202],{"id":1021},"replacing-the-built-in-activity_log-renderer",[121,1023,201],{},[117,1025,1026,1027,1029,1030,1032],{},"The service provider auto-registers ",[121,1028,190],{}," for the ",[121,1031,171],{}," type. To replace it wholesale — say, to redact sensitive fields, change the diff format, or embed approval buttons — register your own class for the same type key.",[223,1034,1036],{"className":225,"code":1035,"language":227,"meta":228,"style":228},"use Relaticle\\ActivityLog\\Filament\\ActivityLogPlugin;\n\nActivityLogPlugin::make()->renderers([\n    'activity_log' => \\App\\Timeline\\Renderers\\AuditedActivityLogRenderer::class,\n]);\n",[121,1037,1038,1058,1062,1076,1109],{"__ignoreMap":228},[232,1039,1040,1042,1044,1046,1048,1050,1052,1054,1056],{"class":234,"line":235},[232,1041,239],{"class":238},[232,1043,243],{"class":242},[232,1045,247],{"class":246},[232,1047,250],{"class":242},[232,1049,247],{"class":246},[232,1051,620],{"class":242},[232,1053,247],{"class":246},[232,1055,625],{"class":242},[232,1057,263],{"class":246},[232,1059,1060],{"class":234,"line":266},[232,1061,270],{"emptyLinePlaceholder":269},[232,1063,1064,1066,1068,1070,1072,1074],{"class":234,"line":273},[232,1065,625],{"class":276},[232,1067,279],{"class":246},[232,1069,655],{"class":282},[232,1071,658],{"class":246},[232,1073,661],{"class":282},[232,1075,664],{"class":246},[232,1077,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1103,1105,1107],{"class":234,"line":403},[232,1079,921],{"class":246},[232,1081,201],{"class":292},[232,1083,289],{"class":246},[232,1085,446],{"class":246},[232,1087,301],{"class":246},[232,1089,304],{"class":242},[232,1091,247],{"class":246},[232,1093,260],{"class":242},[232,1095,247],{"class":246},[232,1097,313],{"class":242},[232,1099,247],{"class":246},[232,1101,1102],{"class":276},"AuditedActivityLogRenderer",[232,1104,279],{"class":246},[232,1106,323],{"class":238},[232,1108,487],{"class":246},[232,1110,1111],{"class":234,"line":408},[232,1112,1113],{"class":246},"]);\n",[117,1115,1116],{},"You don't have to rebuild the diff parsing from scratch. The package exposes a small helper layer you can reuse from a custom renderer:",[1118,1119,1120,1126,1140,1166],"ul",{},[147,1121,1122,1125],{},[121,1123,1124],{},"Relaticle\\ActivityLog\\Support\\ActivityLogSummary::from(TimelineEntry $entry)"," — pre-built summary with causer name, operation enum, changed-field labels, a one-line summary sentence, and diff rows.",[147,1127,1128,1131,1132,1135,1136,1139],{},[121,1129,1130],{},"Relaticle\\ActivityLog\\Support\\ActivityLogDiffRow"," — single before\u002Fafter row with ",[121,1133,1134],{},"formattedOld()"," and ",[121,1137,1138],{},"formattedNew()"," accessors.",[147,1141,1142,1145,1146,1149,1150,1149,1153,1149,1156,1159,1160,1135,1163,1139],{},[121,1143,1144],{},"Relaticle\\ActivityLog\\Support\\ActivityLogOperation"," — ",[121,1147,1148],{},"Created"," \u002F ",[121,1151,1152],{},"Updated",[121,1154,1155],{},"Deleted",[121,1157,1158],{},"Restored"," enum with ",[121,1161,1162],{},"icon()",[121,1164,1165],{},"verb()",[147,1167,1168,1171],{},[121,1169,1170],{},"Relaticle\\ActivityLog\\Support\\AttributeFormatter::format(mixed $value)"," — turns null \u002F bool \u002F enum \u002F Carbon \u002F scalar \u002F array values into a readable string.",[117,1173,1174,1175,1178],{},"A minimal custom renderer that delegates to ",[121,1176,1177],{},"ActivityLogSummary"," and renders your own Blade view:",[223,1180,1182],{"className":225,"code":1181,"language":227,"meta":228,"style":228},"use Illuminate\\Contracts\\View\\View;\nuse Relaticle\\ActivityLog\\Contracts\\TimelineRenderer;\nuse Relaticle\\ActivityLog\\Support\\ActivityLogSummary;\nuse Relaticle\\ActivityLog\\Timeline\\TimelineEntry;\n\nfinal class AuditedActivityLogRenderer implements TimelineRenderer\n{\n    public function render(TimelineEntry $entry): View\n    {\n        $summary = ActivityLogSummary::from($entry);\n\n        return view('audit.timeline.entry', [\n            'entry' => $entry,\n            'summary' => $summary,\n        ]);\n    }\n}\n",[121,1183,1184,1206,1227,1247,1267,1271,1288,1293,1318,1323,1349,1354,1377,1395,1413,1419,1425],{"__ignoreMap":228},[232,1185,1186,1188,1190,1192,1195,1197,1200,1202,1204],{"class":234,"line":235},[232,1187,239],{"class":238},[232,1189,348],{"class":242},[232,1191,247],{"class":246},[232,1193,1194],{"class":242},"Contracts",[232,1196,247],{"class":246},[232,1198,1199],{"class":242},"View",[232,1201,247],{"class":246},[232,1203,1199],{"class":242},[232,1205,263],{"class":246},[232,1207,1208,1210,1212,1214,1216,1218,1220,1222,1225],{"class":234,"line":266},[232,1209,239],{"class":238},[232,1211,243],{"class":242},[232,1213,247],{"class":246},[232,1215,250],{"class":242},[232,1217,247],{"class":246},[232,1219,1194],{"class":242},[232,1221,247],{"class":246},[232,1223,1224],{"class":242},"TimelineRenderer",[232,1226,263],{"class":246},[232,1228,1229,1231,1233,1235,1237,1239,1241,1243,1245],{"class":234,"line":273},[232,1230,239],{"class":238},[232,1232,243],{"class":242},[232,1234,247],{"class":246},[232,1236,250],{"class":242},[232,1238,247],{"class":246},[232,1240,353],{"class":242},[232,1242,247],{"class":246},[232,1244,1177],{"class":242},[232,1246,263],{"class":246},[232,1248,1249,1251,1253,1255,1257,1259,1261,1263,1265],{"class":234,"line":403},[232,1250,239],{"class":238},[232,1252,243],{"class":242},[232,1254,247],{"class":246},[232,1256,250],{"class":242},[232,1258,247],{"class":246},[232,1260,260],{"class":242},[232,1262,247],{"class":246},[232,1264,123],{"class":242},[232,1266,263],{"class":246},[232,1268,1269],{"class":234,"line":408},[232,1270,270],{"emptyLinePlaceholder":269},[232,1272,1273,1276,1279,1282,1285],{"class":234,"line":458},[232,1274,1275],{"class":428},"final",[232,1277,1278],{"class":428}," class",[232,1280,1281],{"class":276}," AuditedActivityLogRenderer",[232,1283,1284],{"class":428}," implements",[232,1286,1287],{"class":276}," TimelineRenderer\n",[232,1289,1290],{"class":234,"line":490},[232,1291,1292],{"class":246},"{\n",[232,1294,1295,1298,1301,1304,1306,1308,1310,1312,1315],{"class":234,"line":718},[232,1296,1297],{"class":428},"    public",[232,1299,1300],{"class":428}," function",[232,1302,1303],{"class":282}," render",[232,1305,286],{"class":246},[232,1307,123],{"class":276},[232,1309,437],{"class":246},[232,1311,440],{"class":242},[232,1313,1314],{"class":246},"):",[232,1316,1317],{"class":276}," View\n",[232,1319,1320],{"class":234,"line":757},[232,1321,1322],{"class":246},"    {\n",[232,1324,1325,1328,1331,1334,1337,1339,1342,1345,1347],{"class":234,"line":763},[232,1326,1327],{"class":246},"        $",[232,1329,1330],{"class":242},"summary ",[232,1332,1333],{"class":246},"=",[232,1335,1336],{"class":276}," ActivityLogSummary",[232,1338,279],{"class":246},[232,1340,1341],{"class":282},"from",[232,1343,1344],{"class":246},"($",[232,1346,440],{"class":242},[232,1348,326],{"class":246},[232,1350,1352],{"class":234,"line":1351},11,[232,1353,270],{"emptyLinePlaceholder":269},[232,1355,1357,1361,1364,1366,1368,1371,1373,1375],{"class":234,"line":1356},12,[232,1358,1360],{"class":1359},"s7zQu","        return",[232,1362,1363],{"class":282}," view",[232,1365,286],{"class":246},[232,1367,289],{"class":246},[232,1369,1370],{"class":292},"audit.timeline.entry",[232,1372,289],{"class":246},[232,1374,298],{"class":246},[232,1376,916],{"class":246},[232,1378,1380,1383,1385,1387,1389,1391,1393],{"class":234,"line":1379},13,[232,1381,1382],{"class":246},"            '",[232,1384,440],{"class":292},[232,1386,289],{"class":246},[232,1388,446],{"class":246},[232,1390,437],{"class":246},[232,1392,440],{"class":242},[232,1394,487],{"class":246},[232,1396,1398,1400,1403,1405,1407,1409,1411],{"class":234,"line":1397},14,[232,1399,1382],{"class":246},[232,1401,1402],{"class":292},"summary",[232,1404,289],{"class":246},[232,1406,446],{"class":246},[232,1408,437],{"class":246},[232,1410,1402],{"class":242},[232,1412,487],{"class":246},[232,1414,1416],{"class":234,"line":1415},15,[232,1417,1418],{"class":246},"        ]);\n",[232,1420,1422],{"class":234,"line":1421},16,[232,1423,1424],{"class":246},"    }\n",[232,1426,1428],{"class":234,"line":1427},17,[232,1429,1430],{"class":246},"}\n",[117,1432,1433,1434,1436,1437,172,1440,172,1443,172,1446,172,1449,1015,1452,1455],{},"Inside ",[121,1435,1370],{},", you have full access to ",[121,1438,1439],{},"$summary->causerName",[121,1441,1442],{},"$summary->operation",[121,1444,1445],{},"$summary->changedFieldLabels",[121,1447,1448],{},"$summary->summarySentence",[121,1450,1451],{},"$summary->diffRows",[121,1453,1454],{},"$summary->hasDiff"," — render whatever markup your audit surface needs.",[133,1457,1459],{"id":1458},"tailwind-theme-integration","Tailwind theme integration",[117,1461,1462,1463,1466,1467,131],{},"If your panel ships a custom Tailwind theme, add the plugin's views to its ",[121,1464,1465],{},"@source"," list — see ",[129,1468,12],{"href":1469},"\u002Fgetting-started\u002Finstallation#tailwind-theme-integration",[1471,1472,1473],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":228,"searchDepth":266,"depth":266,"links":1475},[1476,1477,1478,1484,1486],{"id":135,"depth":266,"text":136},{"id":206,"depth":266,"text":207},{"id":564,"depth":266,"text":565,"children":1479},[1480,1481,1482,1483],{"id":572,"depth":273,"text":573},{"id":768,"depth":273,"text":769},{"id":881,"depth":273,"text":882},{"id":957,"depth":273,"text":958},{"id":1021,"depth":266,"text":1485},"Replacing the built-in activity_log renderer",{"id":1458,"depth":266,"text":1459},"Custom renderers, registration channels, and Tailwind theme integration.","md",null,{},{"icon":55},{"description":1493,"ogImage":1494,"title":52},"Register custom renderers per event or type, replace the built-in spatie diff renderer, and wire Tailwind for the timeline views in relaticle\u002Factivity-log.","\u002Fpreview.png","mWrDVUSZ3huLm-gxGVN4CqM89ue3RWQYDn88VjKEvjk",[1497,1499],{"title":47,"path":48,"stem":49,"description":1498,"icon":50,"children":-1},"Filter, sort, deduplicate, and paginate the merged stream.",{"title":57,"path":58,"stem":59,"description":1500,"icon":60,"children":-1},"Opt-in per-call caching, key composition, and invalidation caveats.",1780504149910]