[{"data":1,"prerenderedAt":704},["ShallowReactive",2],{"navigation_docs":3,"-essentials-pinning":85,"-essentials-pinning-surround":699},[4,20,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},"Upgrading","\u002Fgetting-started\u002Fupgrading","1.getting-started\u002F2.upgrading","i-lucide-arrow-up-circle",{"title":21,"path":22,"stem":23,"children":24,"page":6},"Essentials","\u002Fessentials","2.essentials",[25,30,35,40,45,50,55,60,65],{"title":26,"path":27,"stem":28,"icon":29},"Configuration","\u002Fessentials\u002Fconfiguration","2.essentials\u002F1.configuration","i-lucide-settings",{"title":31,"path":32,"stem":33,"icon":34},"Authorization","\u002Fessentials\u002Fauthorization","2.essentials\u002F2.authorization","i-lucide-shield",{"title":36,"path":37,"stem":38,"icon":39},"Mentions","\u002Fessentials\u002Fmentions","2.essentials\u002F3.mentions","i-lucide-at-sign",{"title":41,"path":42,"stem":43,"icon":44},"Reactions","\u002Fessentials\u002Freactions","2.essentials\u002F4.reactions","i-lucide-smile",{"title":46,"path":47,"stem":48,"icon":49},"Attachments","\u002Fessentials\u002Fattachments","2.essentials\u002F5.attachments","i-lucide-paperclip",{"title":51,"path":52,"stem":53,"icon":54},"Notifications","\u002Fessentials\u002Fnotifications","2.essentials\u002F6.notifications","i-lucide-bell",{"title":56,"path":57,"stem":58,"icon":59},"Database Schema","\u002Fessentials\u002Fdatabase-schema","2.essentials\u002F7.database-schema","i-lucide-database",{"title":61,"path":62,"stem":63,"icon":64},"Multi-tenancy","\u002Fessentials\u002Fmulti-tenancy","2.essentials\u002F8.multi-tenancy","i-lucide-building-2",{"title":66,"path":67,"stem":68,"icon":69},"Pinned Comments","\u002Fessentials\u002Fpinning","2.essentials\u002F9.pinning","i-lucide-pin",{"title":71,"path":72,"stem":73,"children":74,"page":6},"Community","\u002Fcommunity","4.community",[75,80],{"title":76,"path":77,"stem":78,"icon":79},"Contributing","\u002Fcommunity\u002Fcontributing","4.community\u002F1.contributing","i-lucide-heart-handshake",{"title":81,"path":82,"stem":83,"icon":84},"License","\u002Fcommunity\u002Flicense","4.community\u002F2.license","i-lucide-scale",{"id":86,"title":66,"body":87,"description":691,"extension":692,"links":693,"meta":694,"navigation":695,"path":67,"seo":696,"stem":68,"__hash__":698},"docs\u002F2.essentials\u002F9.pinning.md",{"type":88,"value":89,"toc":681},"minimark",[90,95,99,102,106,114,119,127,225,236,239,378,382,445,449,452,523,529,566,572,576,616,623,627,677],[91,92,94],"h2",{"id":93},"how-pinning-works","How Pinning Works",[96,97,98],"p",{},"Pinned comments appear in a dedicated section above the regular comment list. Only top-level comments (not replies) can be pinned.",[96,100,101],{},"When a comment is pinned it is excluded from the regular sorted list so it never appears twice.",[91,103,105],{"id":104},"setup","Setup",[96,107,108,109,113],{},"Pinning is enabled by default but ",[110,111,112],"strong",{},"nobody can pin"," until you configure authorization.",[115,116,118],"h3",{"id":117},"step-1-authorize-who-can-pin","Step 1 — Authorize who can pin",[96,120,121,122,126],{},"Register a callback in your ",[123,124,125],"code",{},"AppServiceProvider::boot()",":",[128,129,134],"pre",{"className":130,"code":131,"language":132,"meta":133,"style":133},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Relaticle\\Comments\\CommentsConfig;\n\nCommentsConfig::authorizePinUsing(fn ($user, $comment) => $user->is_admin);\n","php","",[123,135,136,164,171],{"__ignoreMap":133},[137,138,141,145,149,153,156,158,161],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sbssI","use",[137,146,148],{"class":147},"sTEyZ"," Relaticle",[137,150,152],{"class":151},"sMK4o","\\",[137,154,155],{"class":147},"Comments",[137,157,152],{"class":151},[137,159,160],{"class":147},"CommentsConfig",[137,162,163],{"class":151},";\n",[137,165,167],{"class":139,"line":166},2,[137,168,170],{"emptyLinePlaceholder":169},true,"\n",[137,172,174,177,180,184,187,191,194,197,200,203,206,209,212,214,216,219,222],{"class":139,"line":173},3,[137,175,160],{"class":176},"sBMFI",[137,178,179],{"class":151},"::",[137,181,183],{"class":182},"s2Zo4","authorizePinUsing",[137,185,186],{"class":151},"(",[137,188,190],{"class":189},"spNyl","fn",[137,192,193],{"class":151}," ($",[137,195,196],{"class":147},"user",[137,198,199],{"class":151},",",[137,201,202],{"class":151}," $",[137,204,205],{"class":147},"comment",[137,207,208],{"class":151},")",[137,210,211],{"class":151}," =>",[137,213,202],{"class":151},[137,215,196],{"class":147},[137,217,218],{"class":151},"->",[137,220,221],{"class":147},"is_admin",[137,223,224],{"class":151},");\n",[96,226,227,228,231,232,235],{},"The callback receives the authenticated user and the ",[123,229,230],{},"Comment"," model. Return ",[123,233,234],{},"true"," to allow.",[96,237,238],{},"Any logic works:",[128,240,242],{"className":130,"code":241,"language":132,"meta":133,"style":133},"\u002F\u002F Role-based (e.g. Spatie Permission)\nCommentsConfig::authorizePinUsing(\n    fn ($user, $comment) => $user->hasRole('moderator')\n);\n\n\u002F\u002F Comment owner can pin their own\nCommentsConfig::authorizePinUsing(\n    fn ($user, $comment) => $user->getKey() === $comment->commenter_id\n);\n",[123,243,244,250,261,303,308,313,319,330,373],{"__ignoreMap":133},[137,245,246],{"class":139,"line":140},[137,247,249],{"class":248},"sHwdD","\u002F\u002F Role-based (e.g. Spatie Permission)\n",[137,251,252,254,256,258],{"class":139,"line":166},[137,253,160],{"class":176},[137,255,179],{"class":151},[137,257,183],{"class":182},[137,259,260],{"class":151},"(\n",[137,262,263,266,268,270,272,274,276,278,280,282,284,286,289,291,294,298,300],{"class":139,"line":173},[137,264,265],{"class":189},"    fn",[137,267,193],{"class":151},[137,269,196],{"class":147},[137,271,199],{"class":151},[137,273,202],{"class":151},[137,275,205],{"class":147},[137,277,208],{"class":151},[137,279,211],{"class":151},[137,281,202],{"class":151},[137,283,196],{"class":147},[137,285,218],{"class":151},[137,287,288],{"class":182},"hasRole",[137,290,186],{"class":151},[137,292,293],{"class":151},"'",[137,295,297],{"class":296},"sfazB","moderator",[137,299,293],{"class":151},[137,301,302],{"class":151},")\n",[137,304,306],{"class":139,"line":305},4,[137,307,224],{"class":151},[137,309,311],{"class":139,"line":310},5,[137,312,170],{"emptyLinePlaceholder":169},[137,314,316],{"class":139,"line":315},6,[137,317,318],{"class":248},"\u002F\u002F Comment owner can pin their own\n",[137,320,322,324,326,328],{"class":139,"line":321},7,[137,323,160],{"class":176},[137,325,179],{"class":151},[137,327,183],{"class":182},[137,329,260],{"class":151},[137,331,333,335,337,339,341,343,345,347,349,351,353,355,358,361,364,366,368,370],{"class":139,"line":332},8,[137,334,265],{"class":189},[137,336,193],{"class":151},[137,338,196],{"class":147},[137,340,199],{"class":151},[137,342,202],{"class":151},[137,344,205],{"class":147},[137,346,208],{"class":151},[137,348,211],{"class":151},[137,350,202],{"class":151},[137,352,196],{"class":147},[137,354,218],{"class":151},[137,356,357],{"class":182},"getKey",[137,359,360],{"class":151},"()",[137,362,363],{"class":151}," ===",[137,365,202],{"class":151},[137,367,205],{"class":147},[137,369,218],{"class":151},[137,371,372],{"class":147},"commenter_id\n",[137,374,376],{"class":139,"line":375},9,[137,377,224],{"class":151},[115,379,381],{"id":380},"step-2-optional-config","Step 2 (optional) — Config",[128,383,385],{"className":130,"code":384,"language":132,"meta":133,"style":133},"\u002F\u002F config\u002Fcomments.php\n'pinning' => [\n    'enabled' => true,\n    'max_pinned' => 3,   \u002F\u002F null = unlimited\n],\n",[123,386,387,392,406,421,440],{"__ignoreMap":133},[137,388,389],{"class":139,"line":140},[137,390,391],{"class":248},"\u002F\u002F config\u002Fcomments.php\n",[137,393,394,396,399,401,403],{"class":139,"line":166},[137,395,293],{"class":151},[137,397,398],{"class":296},"pinning",[137,400,293],{"class":151},[137,402,211],{"class":151},[137,404,405],{"class":151}," [\n",[137,407,408,411,414,416,418],{"class":139,"line":173},[137,409,410],{"class":151},"    '",[137,412,413],{"class":296},"enabled",[137,415,293],{"class":151},[137,417,211],{"class":151},[137,419,420],{"class":151}," true,\n",[137,422,423,425,428,430,432,435,437],{"class":139,"line":305},[137,424,410],{"class":151},[137,426,427],{"class":296},"max_pinned",[137,429,293],{"class":151},[137,431,211],{"class":151},[137,433,434],{"class":143}," 3",[137,436,199],{"class":151},[137,438,439],{"class":248},"   \u002F\u002F null = unlimited\n",[137,441,442],{"class":139,"line":310},[137,443,444],{"class":151},"],\n",[91,446,448],{"id":447},"alternative-custom-policy","Alternative: Custom Policy",[96,450,451],{},"Instead of a callback you can override the policy:",[128,453,455],{"className":130,"code":454,"language":132,"meta":133,"style":133},"\u002F\u002F App\u002FPolicies\u002FCustomCommentPolicy.php\npublic function pin(Authenticatable $user, Comment $comment): bool\n{\n    return $user->is_admin;\n}\n",[123,456,457,462,497,502,518],{"__ignoreMap":133},[137,458,459],{"class":139,"line":140},[137,460,461],{"class":248},"\u002F\u002F App\u002FPolicies\u002FCustomCommentPolicy.php\n",[137,463,464,467,470,473,475,478,480,482,484,487,489,491,494],{"class":139,"line":166},[137,465,466],{"class":189},"public",[137,468,469],{"class":189}," function",[137,471,472],{"class":182}," pin",[137,474,186],{"class":151},[137,476,477],{"class":176},"Authenticatable",[137,479,202],{"class":151},[137,481,196],{"class":147},[137,483,199],{"class":151},[137,485,486],{"class":176}," Comment",[137,488,202],{"class":151},[137,490,205],{"class":147},[137,492,493],{"class":151},"):",[137,495,496],{"class":143}," bool\n",[137,498,499],{"class":139,"line":173},[137,500,501],{"class":151},"{\n",[137,503,504,508,510,512,514,516],{"class":139,"line":305},[137,505,507],{"class":506},"s7zQu","    return",[137,509,202],{"class":151},[137,511,196],{"class":147},[137,513,218],{"class":151},[137,515,221],{"class":147},[137,517,163],{"class":151},[137,519,520],{"class":139,"line":310},[137,521,522],{"class":151},"}\n",[96,524,525,526,126],{},"Register it in ",[123,527,528],{},"config\u002Fcomments.php",[128,530,532],{"className":130,"code":531,"language":132,"meta":133,"style":133},"'policy' => App\\Policies\\CustomCommentPolicy::class,\n",[123,533,534],{"__ignoreMap":133},[137,535,536,538,541,543,545,548,550,553,555,558,560,563],{"class":139,"line":140},[137,537,293],{"class":151},[137,539,540],{"class":296},"policy",[137,542,293],{"class":151},[137,544,211],{"class":151},[137,546,547],{"class":147}," App",[137,549,152],{"class":151},[137,551,552],{"class":147},"Policies",[137,554,152],{"class":151},[137,556,557],{"class":176},"CustomCommentPolicy",[137,559,179],{"class":151},[137,561,562],{"class":143},"class",[137,564,565],{"class":151},",\n",[96,567,568,569,571],{},"The ",[123,570,183],{}," callback takes priority over the policy when both are set.",[91,573,575],{"id":574},"events","Events",[577,578,579,592],"table",{},[580,581,582],"thead",{},[583,584,585,589],"tr",{},[586,587,588],"th",{},"Event",[586,590,591],{},"Fired when",[593,594,595,606],"tbody",{},[583,596,597,603],{},[598,599,600],"td",{},[123,601,602],{},"CommentPinned",[598,604,605],{},"A comment is pinned",[583,607,608,613],{},[598,609,610],{},[123,611,612],{},"CommentUnpinned",[598,614,615],{},"A comment is unpinned",[96,617,618,619,622],{},"Listen to them in your ",[123,620,621],{},"EventServiceProvider"," like any other Laravel event.",[91,624,626],{"id":625},"configuration-reference","Configuration Reference",[577,628,629,642],{},[580,630,631],{},[583,632,633,636,639],{},[586,634,635],{},"Key",[586,637,638],{},"Default",[586,640,641],{},"Description",[593,643,644,658],{},[583,645,646,651,655],{},[598,647,648],{},[123,649,650],{},"pinning.enabled",[598,652,653],{},[123,654,234],{},[598,656,657],{},"Enable\u002Fdisable pinning entirely",[583,659,660,665,670],{},[598,661,662],{},[123,663,664],{},"pinning.max_pinned",[598,666,667],{},[123,668,669],{},"3",[598,671,672,673,676],{},"Max pinned comments per thread (",[123,674,675],{},"null"," = unlimited)",[678,679,680],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":133,"searchDepth":166,"depth":166,"links":682},[683,684,688,689,690],{"id":93,"depth":166,"text":94},{"id":104,"depth":166,"text":105,"children":685},[686,687],{"id":117,"depth":173,"text":118},{"id":380,"depth":173,"text":381},{"id":447,"depth":166,"text":448},{"id":574,"depth":166,"text":575},{"id":625,"depth":166,"text":626},"Pin important comments to the top of a thread.","md",null,{},{"icon":69},{"description":697,"title":66},"Configure pinned comments — authorization, limits, and custom logic.","qdbUJtiPDOnNB5BL_SK1unWZapV6uzcLqtgsNOPEG0Y",[700,702],{"title":61,"path":62,"stem":63,"description":701,"icon":64,"children":-1},"Isolate comments per tenant with automatic query scoping and zero boilerplate.",{"title":76,"path":77,"stem":78,"description":703,"icon":79,"children":-1},"How to contribute to Comments",1777473063994]