[{"data":1,"prerenderedAt":2860},["ShallowReactive",2],{"navigation":3,"\u002Fcomposables\u002Fuserealtimelock":111,"\u002Fcomposables\u002Fuserealtimelock-surround":2855},[4,38,77,97,104],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F3.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Usage","\u002Fgetting-started\u002Fusage","1.getting-started\u002F4.usage","i-lucide-code",{"title":28,"path":29,"stem":30,"icon":31},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F5.authentication","i-lucide-lock",{"title":33,"path":34,"stem":35,"icon":36},"DevTools","\u002Fgetting-started\u002Fdevtools","1.getting-started\u002F6.devtools","i-lucide-radio-tower",false,{"title":39,"icon":26,"path":40,"stem":41,"children":42,"page":37},"Composables","\u002Fcomposables","2.composables",[43,48,53,58,63,67,72],{"title":44,"path":45,"stem":46,"icon":47},"useRealtimeState","\u002Fcomposables\u002Fuserealtimestate","2.composables\u002F1.useRealtimeState","i-lucide-refresh-cw",{"title":49,"path":50,"stem":51,"icon":52},"useRealtimeEvents","\u002Fcomposables\u002Fuserealtimeevents","2.composables\u002F2.useRealtimeEvents","i-lucide-radio",{"title":54,"path":55,"stem":56,"icon":57},"useRealtimeConnection","\u002Fcomposables\u002Fuserealtimeconnection","2.composables\u002F3.useRealtimeConnection","i-lucide-wifi",{"title":59,"path":60,"stem":61,"icon":62},"useRealtimePresence","\u002Fcomposables\u002Fuserealtimepresence","2.composables\u002F4.useRealtimePresence","i-lucide-users",{"title":64,"path":65,"stem":66,"icon":31},"useRealtimeLock","\u002Fcomposables\u002Fuserealtimelock","2.composables\u002F5.useRealtimeLock",{"title":68,"path":69,"stem":70,"icon":71},"useRealtimeLockRoom","\u002Fcomposables\u002Fuserealtimelockroom","2.composables\u002F6.useRealtimeLockRoom","i-lucide-list-checks",{"title":73,"path":74,"stem":75,"icon":76},"useRealtimeRoom","\u002Fcomposables\u002Fuserealtimeroom","2.composables\u002F7.useRealtimeRoom","i-lucide-door-open",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":37},"Technical","i-lucide-cpu","\u002Ftechnical","3.technical",[83,88,92],{"title":84,"path":85,"stem":86,"icon":87},"Architecture","\u002Ftechnical\u002Farchitecture","3.technical\u002F1.architecture","i-lucide-network",{"title":89,"path":90,"stem":91,"icon":52},"Notification Layer","\u002Ftechnical\u002Fpubsub","3.technical\u002F2.pubsub",{"title":93,"path":94,"stem":95,"icon":96},"Multi-Server Sync","\u002Ftechnical\u002Fcross-server-sync","3.technical\u002F3.cross-server-sync","i-lucide-server",{"title":98,"path":99,"stem":100,"children":101,"icon":103},"Blocks","\u002Fblocks","4.blocks\u002F1.index",[102],{"title":98,"path":99,"stem":100,"icon":103},"i-lucide-layout-grid",{"title":105,"path":106,"stem":107,"children":108,"icon":110},"Components","\u002Fcomponents","5.components\u002F1.index",[109],{"title":105,"path":106,"stem":107,"icon":110},"i-lucide-component",{"id":112,"title":64,"body":113,"description":2848,"extension":2849,"links":2850,"meta":2851,"navigation":2852,"path":65,"seo":2853,"stem":66,"__hash__":2854},"docs\u002F2.composables\u002F5.useRealtimeLock.md",{"type":114,"value":115,"toc":2826},"minimark",[116,120,124,128,405,409,481,485,489,509,512,515,529,674,678,851,854,857,983,986,989,1049,1064,1115,1119,1129,1233,1236,1342,1345,1348,1433,1436,1439,1515,1519,1532,1699,1703,1710,1762,1772,1835,1839,1843,1846,2378,2382,2385,2684,2697,2701,2704,2822],[117,118,64],"h1",{"id":119},"userealtimelock",[121,122,123],"p",{},"Claim exclusive ownership of a key across all connected clients. Use this to prevent two users from editing the same record at once, dragging the same card, or otherwise stepping on each other.",[125,126,23],"h2",{"id":127},"usage",[129,130,135],"pre",{"className":131,"code":132,"language":133,"meta":134,"style":134},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nconst { claim, release, ownedByMe, locked } = useRealtimeLock('document:123')\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUButton v-if=\"!locked\" @click=\"claim()\">Start editing\u003C\u002FUButton>\n  \u003CUButton v-else-if=\"ownedByMe\" color=\"neutral\" @click=\"release()\">Done editing\u003C\u002FUButton>\n  \u003CUBadge v-else color=\"warning\" variant=\"subtle\">Someone else is editing this\u003C\u002FUBadge>\n\u003C\u002Ftemplate>\n","vue","",[136,137,138,173,226,236,243,253,298,351,396],"code",{"__ignoreMap":134},[139,140,143,147,151,155,158,161,164,168,170],"span",{"class":141,"line":142},"line",1,[139,144,146],{"class":145},"sMK4o","\u003C",[139,148,150],{"class":149},"swJcz","script",[139,152,154],{"class":153},"spNyl"," setup",[139,156,157],{"class":153}," lang",[139,159,160],{"class":145},"=",[139,162,163],{"class":145},"\"",[139,165,167],{"class":166},"sfazB","ts",[139,169,163],{"class":145},[139,171,172],{"class":145},">\n",[139,174,176,179,182,186,189,192,194,197,199,202,205,208,212,215,218,221,223],{"class":141,"line":175},2,[139,177,178],{"class":153},"const",[139,180,181],{"class":145}," {",[139,183,185],{"class":184},"sTEyZ"," claim",[139,187,188],{"class":145},",",[139,190,191],{"class":184}," release",[139,193,188],{"class":145},[139,195,196],{"class":184}," ownedByMe",[139,198,188],{"class":145},[139,200,201],{"class":184}," locked ",[139,203,204],{"class":145},"}",[139,206,207],{"class":145}," =",[139,209,211],{"class":210},"s2Zo4"," useRealtimeLock",[139,213,214],{"class":184},"(",[139,216,217],{"class":145},"'",[139,219,220],{"class":166},"document:123",[139,222,217],{"class":145},[139,224,225],{"class":184},")\n",[139,227,229,232,234],{"class":141,"line":228},3,[139,230,231],{"class":145},"\u003C\u002F",[139,233,150],{"class":149},[139,235,172],{"class":145},[139,237,239],{"class":141,"line":238},4,[139,240,242],{"emptyLinePlaceholder":241},true,"\n",[139,244,246,248,251],{"class":141,"line":245},5,[139,247,146],{"class":145},[139,249,250],{"class":149},"template",[139,252,172],{"class":145},[139,254,256,259,262,265,267,269,272,274,277,279,281,284,286,289,292,294,296],{"class":141,"line":255},6,[139,257,258],{"class":145},"  \u003C",[139,260,261],{"class":149},"UButton",[139,263,264],{"class":153}," v-if",[139,266,160],{"class":145},[139,268,163],{"class":145},[139,270,271],{"class":166},"!locked",[139,273,163],{"class":145},[139,275,276],{"class":153}," @click",[139,278,160],{"class":145},[139,280,163],{"class":145},[139,282,283],{"class":166},"claim()",[139,285,163],{"class":145},[139,287,288],{"class":145},">",[139,290,291],{"class":184},"Start editing",[139,293,231],{"class":145},[139,295,261],{"class":149},[139,297,172],{"class":145},[139,299,301,303,305,308,310,312,315,317,320,322,324,327,329,331,333,335,338,340,342,345,347,349],{"class":141,"line":300},7,[139,302,258],{"class":145},[139,304,261],{"class":149},[139,306,307],{"class":153}," v-else-if",[139,309,160],{"class":145},[139,311,163],{"class":145},[139,313,314],{"class":166},"ownedByMe",[139,316,163],{"class":145},[139,318,319],{"class":153}," color",[139,321,160],{"class":145},[139,323,163],{"class":145},[139,325,326],{"class":166},"neutral",[139,328,163],{"class":145},[139,330,276],{"class":153},[139,332,160],{"class":145},[139,334,163],{"class":145},[139,336,337],{"class":166},"release()",[139,339,163],{"class":145},[139,341,288],{"class":145},[139,343,344],{"class":184},"Done editing",[139,346,231],{"class":145},[139,348,261],{"class":149},[139,350,172],{"class":145},[139,352,354,356,359,362,364,366,368,371,373,376,378,380,383,385,387,390,392,394],{"class":141,"line":353},8,[139,355,258],{"class":145},[139,357,358],{"class":149},"UBadge",[139,360,361],{"class":153}," v-else",[139,363,319],{"class":153},[139,365,160],{"class":145},[139,367,163],{"class":145},[139,369,370],{"class":166},"warning",[139,372,163],{"class":145},[139,374,375],{"class":153}," variant",[139,377,160],{"class":145},[139,379,163],{"class":145},[139,381,382],{"class":166},"subtle",[139,384,163],{"class":145},[139,386,288],{"class":145},[139,388,389],{"class":184},"Someone else is editing this",[139,391,231],{"class":145},[139,393,358],{"class":149},[139,395,172],{"class":145},[139,397,399,401,403],{"class":141,"line":398},9,[139,400,231],{"class":145},[139,402,250],{"class":149},[139,404,172],{"class":145},[125,406,408],{"id":407},"type-signature","Type Signature",[129,410,413],{"className":411,"code":412,"language":167,"meta":134,"style":134},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function useRealtimeLock\u003CTOwnerInfo = string>(\n  key: string,\n  options?: UseRealtimeLockOptions\u003CTOwnerInfo>\n): UseRealtimeLockReturn\u003CTOwnerInfo>\n",[136,414,415,436,450,467],{"__ignoreMap":134},[139,416,417,420,422,424,428,430,433],{"class":141,"line":142},[139,418,419],{"class":153},"function",[139,421,211],{"class":210},[139,423,146],{"class":145},[139,425,427],{"class":426},"sBMFI","TOwnerInfo",[139,429,207],{"class":145},[139,431,432],{"class":426}," string",[139,434,435],{"class":145},">(\n",[139,437,438,442,445,447],{"class":141,"line":175},[139,439,441],{"class":440},"sHdIc","  key",[139,443,444],{"class":145},":",[139,446,432],{"class":426},[139,448,449],{"class":145},",\n",[139,451,452,455,458,461,463,465],{"class":141,"line":228},[139,453,454],{"class":440},"  options",[139,456,457],{"class":145},"?:",[139,459,460],{"class":426}," UseRealtimeLockOptions",[139,462,146],{"class":145},[139,464,427],{"class":426},[139,466,172],{"class":145},[139,468,469,472,475,477,479],{"class":141,"line":238},[139,470,471],{"class":145},"):",[139,473,474],{"class":426}," UseRealtimeLockReturn",[139,476,146],{"class":145},[139,478,427],{"class":426},[139,480,172],{"class":145},[125,482,484],{"id":483},"parameters","Parameters",[486,487,488],"h3",{"id":488},"key",[490,491,492,503],"ul",{},[493,494,495,499,500],"li",{},[496,497,498],"strong",{},"Type:"," ",[136,501,502],{},"string",[493,504,505,508],{},[496,506,507],{},"Required:"," Yes",[121,510,511],{},"A unique identifier for the lock. All clients using the same key contend for the same lock.",[486,513,514],{"id":514},"options",[490,516,517,524],{},[493,518,519,499,521],{},[496,520,498],{},[136,522,523],{},"UseRealtimeLockOptions\u003CTOwnerInfo>",[493,525,526,528],{},[496,527,507],{}," No",[129,530,532],{"className":411,"code":531,"language":167,"meta":134,"style":134},"interface UseRealtimeLockOptions\u003CTOwnerInfo> {\n  \u002F** Info about this client to show others while it holds the lock (e.g. `{ name, avatarUrl }`) *\u002F\n  ownerInfo?: TOwnerInfo\n\n  \u002F** Opaque group tag for bulk presence via useRealtimeLockRoom. Not a route\u002FURL concept. *\u002F\n  room?: string\n\n  \u002F**\n   * Auto-release after this many ms of being held, regardless of activity.\n   * Omitted = the module-level `lock.defaultTtl` (if any), 0 = never expires.\n   *\u002F\n  ttl?: number\n\n  \u002F** Called whenever the lock becomes free *\u002F\n  onReleased?: (payload: { changed: boolean }) => void\n}\n",[136,533,534,550,556,566,570,575,585,589,594,599,605,611,622,627,633,668],{"__ignoreMap":134},[139,535,536,539,541,543,545,547],{"class":141,"line":142},[139,537,538],{"class":153},"interface",[139,540,460],{"class":426},[139,542,146],{"class":145},[139,544,427],{"class":426},[139,546,288],{"class":145},[139,548,549],{"class":145}," {\n",[139,551,552],{"class":141,"line":175},[139,553,555],{"class":554},"sHwdD","  \u002F** Info about this client to show others while it holds the lock (e.g. `{ name, avatarUrl }`) *\u002F\n",[139,557,558,561,563],{"class":141,"line":228},[139,559,560],{"class":149},"  ownerInfo",[139,562,457],{"class":145},[139,564,565],{"class":426}," TOwnerInfo\n",[139,567,568],{"class":141,"line":238},[139,569,242],{"emptyLinePlaceholder":241},[139,571,572],{"class":141,"line":245},[139,573,574],{"class":554},"  \u002F** Opaque group tag for bulk presence via useRealtimeLockRoom. Not a route\u002FURL concept. *\u002F\n",[139,576,577,580,582],{"class":141,"line":255},[139,578,579],{"class":149},"  room",[139,581,457],{"class":145},[139,583,584],{"class":426}," string\n",[139,586,587],{"class":141,"line":300},[139,588,242],{"emptyLinePlaceholder":241},[139,590,591],{"class":141,"line":353},[139,592,593],{"class":554},"  \u002F**\n",[139,595,596],{"class":141,"line":398},[139,597,598],{"class":554},"   * Auto-release after this many ms of being held, regardless of activity.\n",[139,600,602],{"class":141,"line":601},10,[139,603,604],{"class":554},"   * Omitted = the module-level `lock.defaultTtl` (if any), 0 = never expires.\n",[139,606,608],{"class":141,"line":607},11,[139,609,610],{"class":554},"   *\u002F\n",[139,612,614,617,619],{"class":141,"line":613},12,[139,615,616],{"class":149},"  ttl",[139,618,457],{"class":145},[139,620,621],{"class":426}," number\n",[139,623,625],{"class":141,"line":624},13,[139,626,242],{"emptyLinePlaceholder":241},[139,628,630],{"class":141,"line":629},14,[139,631,632],{"class":554},"  \u002F** Called whenever the lock becomes free *\u002F\n",[139,634,636,639,641,644,647,649,651,654,656,659,662,665],{"class":141,"line":635},15,[139,637,638],{"class":149},"  onReleased",[139,640,457],{"class":145},[139,642,643],{"class":145}," (",[139,645,646],{"class":440},"payload",[139,648,444],{"class":145},[139,650,181],{"class":145},[139,652,653],{"class":149}," changed",[139,655,444],{"class":145},[139,657,658],{"class":426}," boolean",[139,660,661],{"class":145}," })",[139,663,664],{"class":153}," =>",[139,666,667],{"class":426}," void\n",[139,669,671],{"class":141,"line":670},16,[139,672,673],{"class":145},"}\n",[125,675,677],{"id":676},"return-value","Return Value",[129,679,681],{"className":411,"code":680,"language":167,"meta":134,"style":134},"interface UseRealtimeLockReturn\u003CTOwnerInfo> {\n  claim: () => Promise\u003Cboolean>\n  release: (options?: { changed?: boolean, meta?: unknown }) => Promise\u003Cvoid>\n  forceRelease: () => Promise\u003Cboolean>\n  ownedByMe: Readonly\u003CRef\u003Cboolean>>\n  locked: Readonly\u003CRef\u003Cboolean>>\n  ownerInfo: Readonly\u003CRef\u003CTOwnerInfo | null>>\n}\n",[136,682,683,697,719,763,782,804,823,847],{"__ignoreMap":134},[139,684,685,687,689,691,693,695],{"class":141,"line":142},[139,686,538],{"class":153},[139,688,474],{"class":426},[139,690,146],{"class":145},[139,692,427],{"class":426},[139,694,288],{"class":145},[139,696,549],{"class":145},[139,698,699,702,704,707,709,712,714,717],{"class":141,"line":175},[139,700,701],{"class":149},"  claim",[139,703,444],{"class":145},[139,705,706],{"class":145}," ()",[139,708,664],{"class":153},[139,710,711],{"class":426}," Promise",[139,713,146],{"class":145},[139,715,716],{"class":426},"boolean",[139,718,172],{"class":145},[139,720,721,724,726,728,730,732,734,736,738,740,742,745,747,750,752,754,756,758,761],{"class":141,"line":228},[139,722,723],{"class":149},"  release",[139,725,444],{"class":145},[139,727,643],{"class":145},[139,729,514],{"class":440},[139,731,457],{"class":145},[139,733,181],{"class":145},[139,735,653],{"class":149},[139,737,457],{"class":145},[139,739,658],{"class":426},[139,741,188],{"class":145},[139,743,744],{"class":149}," meta",[139,746,457],{"class":145},[139,748,749],{"class":426}," unknown",[139,751,661],{"class":145},[139,753,664],{"class":153},[139,755,711],{"class":426},[139,757,146],{"class":145},[139,759,760],{"class":426},"void",[139,762,172],{"class":145},[139,764,765,768,770,772,774,776,778,780],{"class":141,"line":238},[139,766,767],{"class":149},"  forceRelease",[139,769,444],{"class":145},[139,771,706],{"class":145},[139,773,664],{"class":153},[139,775,711],{"class":426},[139,777,146],{"class":145},[139,779,716],{"class":426},[139,781,172],{"class":145},[139,783,784,787,789,792,794,797,799,801],{"class":141,"line":245},[139,785,786],{"class":149},"  ownedByMe",[139,788,444],{"class":145},[139,790,791],{"class":426}," Readonly",[139,793,146],{"class":145},[139,795,796],{"class":426},"Ref",[139,798,146],{"class":145},[139,800,716],{"class":426},[139,802,803],{"class":145},">>\n",[139,805,806,809,811,813,815,817,819,821],{"class":141,"line":255},[139,807,808],{"class":149},"  locked",[139,810,444],{"class":145},[139,812,791],{"class":426},[139,814,146],{"class":145},[139,816,796],{"class":426},[139,818,146],{"class":145},[139,820,716],{"class":426},[139,822,803],{"class":145},[139,824,825,827,829,831,833,835,837,839,842,845],{"class":141,"line":300},[139,826,560],{"class":149},[139,828,444],{"class":145},[139,830,791],{"class":426},[139,832,146],{"class":145},[139,834,796],{"class":426},[139,836,146],{"class":145},[139,838,427],{"class":426},[139,840,841],{"class":145}," |",[139,843,844],{"class":426}," null",[139,846,803],{"class":145},[139,848,849],{"class":141,"line":353},[139,850,673],{"class":145},[486,852,283],{"id":853},"claim",[121,855,856],{},"Attempts to claim the lock. Succeeds if it's currently free or already owned by this client:",[129,858,860],{"className":411,"code":859,"language":167,"meta":134,"style":134},"const { claim } = useRealtimeLock('document:123', {\n  ownerInfo: { name: 'Alice' },\n})\n\nconst success = await claim()\nif (!success) {\n  console.log('Someone else already holds this lock')\n}\n",[136,861,862,889,913,919,923,941,957,979],{"__ignoreMap":134},[139,863,864,866,868,871,873,875,877,879,881,883,885,887],{"class":141,"line":142},[139,865,178],{"class":153},[139,867,181],{"class":145},[139,869,870],{"class":184}," claim ",[139,872,204],{"class":145},[139,874,207],{"class":145},[139,876,211],{"class":210},[139,878,214],{"class":184},[139,880,217],{"class":145},[139,882,220],{"class":166},[139,884,217],{"class":145},[139,886,188],{"class":145},[139,888,549],{"class":145},[139,890,891,893,895,897,900,902,905,908,910],{"class":141,"line":175},[139,892,560],{"class":149},[139,894,444],{"class":145},[139,896,181],{"class":145},[139,898,899],{"class":149}," name",[139,901,444],{"class":145},[139,903,904],{"class":145}," '",[139,906,907],{"class":166},"Alice",[139,909,217],{"class":145},[139,911,912],{"class":145}," },\n",[139,914,915,917],{"class":141,"line":228},[139,916,204],{"class":145},[139,918,225],{"class":184},[139,920,921],{"class":141,"line":238},[139,922,242],{"emptyLinePlaceholder":241},[139,924,925,927,930,932,936,938],{"class":141,"line":245},[139,926,178],{"class":153},[139,928,929],{"class":184}," success ",[139,931,160],{"class":145},[139,933,935],{"class":934},"s7zQu"," await",[139,937,185],{"class":210},[139,939,940],{"class":184},"()\n",[139,942,943,946,948,951,954],{"class":141,"line":255},[139,944,945],{"class":934},"if",[139,947,643],{"class":184},[139,949,950],{"class":145},"!",[139,952,953],{"class":184},"success) ",[139,955,956],{"class":145},"{\n",[139,958,959,962,965,968,970,972,975,977],{"class":141,"line":300},[139,960,961],{"class":184},"  console",[139,963,964],{"class":145},".",[139,966,967],{"class":210},"log",[139,969,214],{"class":149},[139,971,217],{"class":145},[139,973,974],{"class":166},"Someone else already holds this lock",[139,976,217],{"class":145},[139,978,225],{"class":149},[139,980,981],{"class":141,"line":353},[139,982,673],{"class":145},[486,984,337],{"id":985},"release",[121,987,988],{},"Releases the lock. Resolves once the server has acknowledged; a no-op if this client doesn't own it:",[129,990,992],{"className":411,"code":991,"language":167,"meta":134,"style":134},"const { claim, release } = useRealtimeLock('document:123')\n\nawait claim()\n\u002F\u002F ... editing happens ...\nawait release()\n",[136,993,994,1023,1027,1036,1041],{"__ignoreMap":134},[139,995,996,998,1000,1002,1004,1007,1009,1011,1013,1015,1017,1019,1021],{"class":141,"line":142},[139,997,178],{"class":153},[139,999,181],{"class":145},[139,1001,185],{"class":184},[139,1003,188],{"class":145},[139,1005,1006],{"class":184}," release ",[139,1008,204],{"class":145},[139,1010,207],{"class":145},[139,1012,211],{"class":210},[139,1014,214],{"class":184},[139,1016,217],{"class":145},[139,1018,220],{"class":166},[139,1020,217],{"class":145},[139,1022,225],{"class":184},[139,1024,1025],{"class":141,"line":175},[139,1026,242],{"emptyLinePlaceholder":241},[139,1028,1029,1032,1034],{"class":141,"line":228},[139,1030,1031],{"class":934},"await",[139,1033,185],{"class":210},[139,1035,940],{"class":184},[139,1037,1038],{"class":141,"line":238},[139,1039,1040],{"class":554},"\u002F\u002F ... editing happens ...\n",[139,1042,1043,1045,1047],{"class":141,"line":245},[139,1044,1031],{"class":934},[139,1046,191],{"class":210},[139,1048,940],{"class":184},[121,1050,1051,1052,1055,1056,1059,1060,1063],{},"Pass ",[136,1053,1054],{},"changed: true"," when the release follows an actual edit, so other clients' ",[136,1057,1058],{},"onReleased"," can tell that apart from someone abandoning without changing anything. ",[136,1061,1062],{},"meta"," is relayed verbatim to other clients, useful for passing a diff or a reason:",[129,1065,1067],{"className":411,"code":1066,"language":167,"meta":134,"style":134},"await release({ changed: true, meta: { field: 'title' } })\n",[136,1068,1069],{"__ignoreMap":134},[139,1070,1071,1073,1075,1077,1080,1082,1084,1088,1090,1092,1094,1096,1099,1101,1103,1106,1108,1111,1113],{"class":141,"line":142},[139,1072,1031],{"class":934},[139,1074,191],{"class":210},[139,1076,214],{"class":184},[139,1078,1079],{"class":145},"{",[139,1081,653],{"class":149},[139,1083,444],{"class":145},[139,1085,1087],{"class":1086},"sfNiH"," true",[139,1089,188],{"class":145},[139,1091,744],{"class":149},[139,1093,444],{"class":145},[139,1095,181],{"class":145},[139,1097,1098],{"class":149}," field",[139,1100,444],{"class":145},[139,1102,904],{"class":145},[139,1104,1105],{"class":166},"title",[139,1107,217],{"class":145},[139,1109,1110],{"class":145}," }",[139,1112,1110],{"class":145},[139,1114,225],{"class":184},[486,1116,1118],{"id":1117},"forcerelease","forceRelease()",[121,1120,1121,1122,1125,1126,964],{},"Forcibly releases the lock regardless of who holds it. Denied by default: it only succeeds if the server has a ",[136,1123,1124],{},"nuxt-realtime:canForceRelease"," hook registered that sets ",[136,1127,1128],{},"ctx.allow = true",[129,1130,1132],{"className":411,"code":1131,"language":167,"meta":134,"style":134},"const { forceRelease } = useRealtimeLock('document:123')\n\nasync function unlockAsAdmin() {\n  const success = await forceRelease()\n  if (!success) console.log('Not allowed to force-release')\n}\n",[136,1133,1134,1159,1163,1179,1196,1229],{"__ignoreMap":134},[139,1135,1136,1138,1140,1143,1145,1147,1149,1151,1153,1155,1157],{"class":141,"line":142},[139,1137,178],{"class":153},[139,1139,181],{"class":145},[139,1141,1142],{"class":184}," forceRelease ",[139,1144,204],{"class":145},[139,1146,207],{"class":145},[139,1148,211],{"class":210},[139,1150,214],{"class":184},[139,1152,217],{"class":145},[139,1154,220],{"class":166},[139,1156,217],{"class":145},[139,1158,225],{"class":184},[139,1160,1161],{"class":141,"line":175},[139,1162,242],{"emptyLinePlaceholder":241},[139,1164,1165,1168,1171,1174,1177],{"class":141,"line":228},[139,1166,1167],{"class":153},"async",[139,1169,1170],{"class":153}," function",[139,1172,1173],{"class":210}," unlockAsAdmin",[139,1175,1176],{"class":145},"()",[139,1178,549],{"class":145},[139,1180,1181,1184,1187,1189,1191,1194],{"class":141,"line":238},[139,1182,1183],{"class":153},"  const",[139,1185,1186],{"class":184}," success",[139,1188,207],{"class":145},[139,1190,935],{"class":934},[139,1192,1193],{"class":210}," forceRelease",[139,1195,940],{"class":149},[139,1197,1198,1201,1203,1205,1208,1211,1214,1216,1218,1220,1222,1225,1227],{"class":141,"line":245},[139,1199,1200],{"class":934},"  if",[139,1202,643],{"class":149},[139,1204,950],{"class":145},[139,1206,1207],{"class":184},"success",[139,1209,1210],{"class":149},") ",[139,1212,1213],{"class":184},"console",[139,1215,964],{"class":145},[139,1217,967],{"class":210},[139,1219,214],{"class":149},[139,1221,217],{"class":145},[139,1223,1224],{"class":166},"Not allowed to force-release",[139,1226,217],{"class":145},[139,1228,225],{"class":149},[139,1230,1231],{"class":141,"line":255},[139,1232,673],{"class":145},[121,1234,1235],{},"Register the hook on the server:",[129,1237,1240],{"className":411,"code":1238,"filename":1239,"language":167,"meta":134,"style":134},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('nuxt-realtime:canForceRelease', (ctx) => {\n    ctx.allow = isAdmin(ctx.connectionId)\n  })\n})\n","server\u002Fplugins\u002Frealtime-force-release.ts",[136,1241,1242,1267,1303,1329,1336],{"__ignoreMap":134},[139,1243,1244,1247,1250,1253,1255,1257,1260,1263,1265],{"class":141,"line":142},[139,1245,1246],{"class":934},"export",[139,1248,1249],{"class":934}," default",[139,1251,1252],{"class":210}," defineNitroPlugin",[139,1254,214],{"class":184},[139,1256,214],{"class":145},[139,1258,1259],{"class":440},"nitroApp",[139,1261,1262],{"class":145},")",[139,1264,664],{"class":153},[139,1266,549],{"class":145},[139,1268,1269,1272,1274,1277,1279,1282,1284,1286,1288,1290,1292,1294,1297,1299,1301],{"class":141,"line":175},[139,1270,1271],{"class":184},"  nitroApp",[139,1273,964],{"class":145},[139,1275,1276],{"class":184},"hooks",[139,1278,964],{"class":145},[139,1280,1281],{"class":210},"hook",[139,1283,214],{"class":149},[139,1285,217],{"class":145},[139,1287,1124],{"class":166},[139,1289,217],{"class":145},[139,1291,188],{"class":145},[139,1293,643],{"class":145},[139,1295,1296],{"class":440},"ctx",[139,1298,1262],{"class":145},[139,1300,664],{"class":153},[139,1302,549],{"class":145},[139,1304,1305,1308,1310,1313,1315,1318,1320,1322,1324,1327],{"class":141,"line":228},[139,1306,1307],{"class":184},"    ctx",[139,1309,964],{"class":145},[139,1311,1312],{"class":184},"allow",[139,1314,207],{"class":145},[139,1316,1317],{"class":210}," isAdmin",[139,1319,214],{"class":149},[139,1321,1296],{"class":184},[139,1323,964],{"class":145},[139,1325,1326],{"class":184},"connectionId",[139,1328,225],{"class":149},[139,1330,1331,1334],{"class":141,"line":238},[139,1332,1333],{"class":145},"  }",[139,1335,225],{"class":149},[139,1337,1338,1340],{"class":141,"line":245},[139,1339,204],{"class":145},[139,1341,225],{"class":184},[486,1343,314],{"id":1344},"ownedbyme",[121,1346,1347],{},"Whether this client currently owns the lock:",[129,1349,1351],{"className":411,"code":1350,"language":167,"meta":134,"style":134},"const { ownedByMe } = useRealtimeLock('document:123')\n\nwatchEffect(() => {\n  if (ownedByMe.value) console.log('I hold the lock')\n})\n",[136,1352,1353,1378,1382,1395,1427],{"__ignoreMap":134},[139,1354,1355,1357,1359,1362,1364,1366,1368,1370,1372,1374,1376],{"class":141,"line":142},[139,1356,178],{"class":153},[139,1358,181],{"class":145},[139,1360,1361],{"class":184}," ownedByMe ",[139,1363,204],{"class":145},[139,1365,207],{"class":145},[139,1367,211],{"class":210},[139,1369,214],{"class":184},[139,1371,217],{"class":145},[139,1373,220],{"class":166},[139,1375,217],{"class":145},[139,1377,225],{"class":184},[139,1379,1380],{"class":141,"line":175},[139,1381,242],{"emptyLinePlaceholder":241},[139,1383,1384,1387,1389,1391,1393],{"class":141,"line":228},[139,1385,1386],{"class":210},"watchEffect",[139,1388,214],{"class":184},[139,1390,1176],{"class":145},[139,1392,664],{"class":153},[139,1394,549],{"class":145},[139,1396,1397,1399,1401,1403,1405,1408,1410,1412,1414,1416,1418,1420,1423,1425],{"class":141,"line":238},[139,1398,1200],{"class":934},[139,1400,643],{"class":149},[139,1402,314],{"class":184},[139,1404,964],{"class":145},[139,1406,1407],{"class":184},"value",[139,1409,1210],{"class":149},[139,1411,1213],{"class":184},[139,1413,964],{"class":145},[139,1415,967],{"class":210},[139,1417,214],{"class":149},[139,1419,217],{"class":145},[139,1421,1422],{"class":166},"I hold the lock",[139,1424,217],{"class":145},[139,1426,225],{"class":149},[139,1428,1429,1431],{"class":141,"line":245},[139,1430,204],{"class":145},[139,1432,225],{"class":184},[486,1434,1435],{"id":1435},"locked",[121,1437,1438],{},"Whether anyone (not necessarily this client) currently owns the lock:",[129,1440,1442],{"className":411,"code":1441,"language":167,"meta":134,"style":134},"const { locked, ownedByMe } = useRealtimeLock('document:123')\n\nconst canEdit = computed(() => !locked.value || ownedByMe.value)\n",[136,1443,1444,1473,1477],{"__ignoreMap":134},[139,1445,1446,1448,1450,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471],{"class":141,"line":142},[139,1447,178],{"class":153},[139,1449,181],{"class":145},[139,1451,1452],{"class":184}," locked",[139,1454,188],{"class":145},[139,1456,1361],{"class":184},[139,1458,204],{"class":145},[139,1460,207],{"class":145},[139,1462,211],{"class":210},[139,1464,214],{"class":184},[139,1466,217],{"class":145},[139,1468,220],{"class":166},[139,1470,217],{"class":145},[139,1472,225],{"class":184},[139,1474,1475],{"class":141,"line":175},[139,1476,242],{"emptyLinePlaceholder":241},[139,1478,1479,1481,1484,1486,1489,1491,1493,1495,1498,1500,1502,1505,1508,1510,1512],{"class":141,"line":228},[139,1480,178],{"class":153},[139,1482,1483],{"class":184}," canEdit ",[139,1485,160],{"class":145},[139,1487,1488],{"class":210}," computed",[139,1490,214],{"class":184},[139,1492,1176],{"class":145},[139,1494,664],{"class":153},[139,1496,1497],{"class":145}," !",[139,1499,1435],{"class":184},[139,1501,964],{"class":145},[139,1503,1504],{"class":184},"value ",[139,1506,1507],{"class":145},"||",[139,1509,196],{"class":184},[139,1511,964],{"class":145},[139,1513,1514],{"class":184},"value)\n",[486,1516,1518],{"id":1517},"ownerinfo","ownerInfo",[121,1520,1521,1522,1524,1525,1527,1528,1531],{},"Info about the current holder, passed to their ",[136,1523,283],{},"'s ",[136,1526,1518],{}," option, or ",[136,1529,1530],{},"null"," if unlocked or unknown:",[129,1533,1535],{"className":131,"code":1534,"language":133,"meta":134,"style":134},"\u003Cscript setup lang=\"ts\">\nconst { locked, ownedByMe, ownerInfo } = useRealtimeLock('document:123', {\n  ownerInfo: { name: 'Alice' },\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUBadge v-if=\"locked && !ownedByMe\" color=\"warning\" variant=\"subtle\">\n    Locked by {{ ownerInfo?.name ?? 'someone' }}\n  \u003C\u002FUBadge>\n\u003C\u002Ftemplate>\n",[136,1536,1537,1557,1592,1612,1618,1626,1630,1638,1677,1682,1691],{"__ignoreMap":134},[139,1538,1539,1541,1543,1545,1547,1549,1551,1553,1555],{"class":141,"line":142},[139,1540,146],{"class":145},[139,1542,150],{"class":149},[139,1544,154],{"class":153},[139,1546,157],{"class":153},[139,1548,160],{"class":145},[139,1550,163],{"class":145},[139,1552,167],{"class":166},[139,1554,163],{"class":145},[139,1556,172],{"class":145},[139,1558,1559,1561,1563,1565,1567,1569,1571,1574,1576,1578,1580,1582,1584,1586,1588,1590],{"class":141,"line":175},[139,1560,178],{"class":153},[139,1562,181],{"class":145},[139,1564,1452],{"class":184},[139,1566,188],{"class":145},[139,1568,196],{"class":184},[139,1570,188],{"class":145},[139,1572,1573],{"class":184}," ownerInfo ",[139,1575,204],{"class":145},[139,1577,207],{"class":145},[139,1579,211],{"class":210},[139,1581,214],{"class":184},[139,1583,217],{"class":145},[139,1585,220],{"class":166},[139,1587,217],{"class":145},[139,1589,188],{"class":145},[139,1591,549],{"class":145},[139,1593,1594,1596,1598,1600,1602,1604,1606,1608,1610],{"class":141,"line":228},[139,1595,560],{"class":149},[139,1597,444],{"class":145},[139,1599,181],{"class":145},[139,1601,899],{"class":149},[139,1603,444],{"class":145},[139,1605,904],{"class":145},[139,1607,907],{"class":166},[139,1609,217],{"class":145},[139,1611,912],{"class":145},[139,1613,1614,1616],{"class":141,"line":238},[139,1615,204],{"class":145},[139,1617,225],{"class":184},[139,1619,1620,1622,1624],{"class":141,"line":245},[139,1621,231],{"class":145},[139,1623,150],{"class":149},[139,1625,172],{"class":145},[139,1627,1628],{"class":141,"line":255},[139,1629,242],{"emptyLinePlaceholder":241},[139,1631,1632,1634,1636],{"class":141,"line":300},[139,1633,146],{"class":145},[139,1635,250],{"class":149},[139,1637,172],{"class":145},[139,1639,1640,1642,1644,1646,1648,1650,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675],{"class":141,"line":353},[139,1641,258],{"class":145},[139,1643,358],{"class":149},[139,1645,264],{"class":153},[139,1647,160],{"class":145},[139,1649,163],{"class":145},[139,1651,1652],{"class":166},"locked && !ownedByMe",[139,1654,163],{"class":145},[139,1656,319],{"class":153},[139,1658,160],{"class":145},[139,1660,163],{"class":145},[139,1662,370],{"class":166},[139,1664,163],{"class":145},[139,1666,375],{"class":153},[139,1668,160],{"class":145},[139,1670,163],{"class":145},[139,1672,382],{"class":166},[139,1674,163],{"class":145},[139,1676,172],{"class":145},[139,1678,1679],{"class":141,"line":398},[139,1680,1681],{"class":184},"    Locked by {{ ownerInfo?.name ?? 'someone' }}\n",[139,1683,1684,1687,1689],{"class":141,"line":601},[139,1685,1686],{"class":145},"  \u003C\u002F",[139,1688,358],{"class":149},[139,1690,172],{"class":145},[139,1692,1693,1695,1697],{"class":141,"line":607},[139,1694,231],{"class":145},[139,1696,250],{"class":149},[139,1698,172],{"class":145},[125,1700,1702],{"id":1701},"ttl-auto-release-after-a-timeout","TTL: Auto-Release After a Timeout",[121,1704,1705,1706,1709],{},"By default a lock stays held until it's explicitly released, or the owning connection disconnects. Set ",[136,1707,1708],{},"ttl"," to also release it automatically after a fixed duration, regardless of activity, useful as a safety net against a client that crashes without releasing cleanly:",[129,1711,1713],{"className":411,"code":1712,"language":167,"meta":134,"style":134},"const { claim } = useRealtimeLock('document:123', {\n  ttl: 60_000, \u002F\u002F auto-release after 1 minute\n})\n",[136,1714,1715,1741,1756],{"__ignoreMap":134},[139,1716,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739],{"class":141,"line":142},[139,1718,178],{"class":153},[139,1720,181],{"class":145},[139,1722,870],{"class":184},[139,1724,204],{"class":145},[139,1726,207],{"class":145},[139,1728,211],{"class":210},[139,1730,214],{"class":184},[139,1732,217],{"class":145},[139,1734,220],{"class":166},[139,1736,217],{"class":145},[139,1738,188],{"class":145},[139,1740,549],{"class":145},[139,1742,1743,1745,1747,1751,1753],{"class":141,"line":175},[139,1744,616],{"class":149},[139,1746,444],{"class":145},[139,1748,1750],{"class":1749},"sbssI"," 60_000",[139,1752,188],{"class":145},[139,1754,1755],{"class":554}," \u002F\u002F auto-release after 1 minute\n",[139,1757,1758,1760],{"class":141,"line":228},[139,1759,204],{"class":145},[139,1761,225],{"class":184},[121,1763,1764,1765,1768,1769,1771],{},"Set a module-wide default in ",[136,1766,1767],{},"nuxt.config.ts"," instead of repeating ",[136,1770,1708],{}," everywhere:",[129,1773,1775],{"className":411,"code":1774,"filename":1767,"language":167,"meta":134,"style":134},"export default defineNuxtConfig({\n  nuxtRealtime: {\n    lock: {\n      defaultTtl: 60_000,\n    },\n  },\n})\n",[136,1776,1777,1790,1799,1808,1819,1824,1829],{"__ignoreMap":134},[139,1778,1779,1781,1783,1786,1788],{"class":141,"line":142},[139,1780,1246],{"class":934},[139,1782,1249],{"class":934},[139,1784,1785],{"class":210}," defineNuxtConfig",[139,1787,214],{"class":184},[139,1789,956],{"class":145},[139,1791,1792,1795,1797],{"class":141,"line":175},[139,1793,1794],{"class":149},"  nuxtRealtime",[139,1796,444],{"class":145},[139,1798,549],{"class":145},[139,1800,1801,1804,1806],{"class":141,"line":228},[139,1802,1803],{"class":149},"    lock",[139,1805,444],{"class":145},[139,1807,549],{"class":145},[139,1809,1810,1813,1815,1817],{"class":141,"line":238},[139,1811,1812],{"class":149},"      defaultTtl",[139,1814,444],{"class":145},[139,1816,1750],{"class":1749},[139,1818,449],{"class":145},[139,1820,1821],{"class":141,"line":245},[139,1822,1823],{"class":145},"    },\n",[139,1825,1826],{"class":141,"line":255},[139,1827,1828],{"class":145},"  },\n",[139,1830,1831,1833],{"class":141,"line":300},[139,1832,204],{"class":145},[139,1834,225],{"class":184},[125,1836,1838],{"id":1837},"examples","Examples",[486,1840,1842],{"id":1841},"exclusive-form-editing","Exclusive Form Editing",[121,1844,1845],{},"Only let one user edit a record at a time:",[129,1847,1850],{"className":131,"code":1848,"filename":1849,"language":133,"meta":134,"style":134},"\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{ recordId: string }>()\nconst currentUser = useCurrentUser()\n\nconst { claim, release, locked, ownedByMe, ownerInfo } = useRealtimeLock(\n  `record:${props.recordId}`,\n  { ownerInfo: { name: currentUser.name } },\n)\n\nconst record = useRealtimeState(`record:${props.recordId}`, { title: '' })\n\nasync function startEditing() {\n  await claim()\n}\n\nasync function save() {\n  await release({ changed: true })\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"space-y-2\">\n    \u003CUBadge v-if=\"locked && !ownedByMe\" color=\"warning\" variant=\"subtle\">\n      {{ ownerInfo?.name ?? 'Someone' }} is editing this record\n    \u003C\u002FUBadge>\n\n    \u003CUInput v-model=\"record.title\" :disabled=\"locked && !ownedByMe\" \u002F>\n\n    \u003CUButton v-if=\"!ownedByMe\" :disabled=\"locked\" @click=\"startEditing\">\n      Edit\n    \u003C\u002FUButton>\n    \u003CUButton v-else @click=\"save\">Save\u003C\u002FUButton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","RecordEditor.vue",[136,1851,1852,1872,1899,1913,1917,1950,1974,2002,2006,2010,2055,2059,2072,2081,2085,2089,2102,2123,2128,2137,2142,2151,2173,2213,2219,2229,2234,2268,2273,2314,2320,2329,2360,2369],{"__ignoreMap":134},[139,1853,1854,1856,1858,1860,1862,1864,1866,1868,1870],{"class":141,"line":142},[139,1855,146],{"class":145},[139,1857,150],{"class":149},[139,1859,154],{"class":153},[139,1861,157],{"class":153},[139,1863,160],{"class":145},[139,1865,163],{"class":145},[139,1867,167],{"class":166},[139,1869,163],{"class":145},[139,1871,172],{"class":145},[139,1873,1874,1876,1879,1881,1884,1887,1890,1892,1894,1897],{"class":141,"line":175},[139,1875,178],{"class":153},[139,1877,1878],{"class":184}," props ",[139,1880,160],{"class":145},[139,1882,1883],{"class":210}," defineProps",[139,1885,1886],{"class":145},"\u003C{",[139,1888,1889],{"class":149}," recordId",[139,1891,444],{"class":145},[139,1893,432],{"class":426},[139,1895,1896],{"class":145}," }>",[139,1898,940],{"class":184},[139,1900,1901,1903,1906,1908,1911],{"class":141,"line":228},[139,1902,178],{"class":153},[139,1904,1905],{"class":184}," currentUser ",[139,1907,160],{"class":145},[139,1909,1910],{"class":210}," useCurrentUser",[139,1912,940],{"class":184},[139,1914,1915],{"class":141,"line":238},[139,1916,242],{"emptyLinePlaceholder":241},[139,1918,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947],{"class":141,"line":245},[139,1920,178],{"class":153},[139,1922,181],{"class":145},[139,1924,185],{"class":184},[139,1926,188],{"class":145},[139,1928,191],{"class":184},[139,1930,188],{"class":145},[139,1932,1452],{"class":184},[139,1934,188],{"class":145},[139,1936,196],{"class":184},[139,1938,188],{"class":145},[139,1940,1573],{"class":184},[139,1942,204],{"class":145},[139,1944,207],{"class":145},[139,1946,211],{"class":210},[139,1948,1949],{"class":184},"(\n",[139,1951,1952,1955,1958,1961,1964,1966,1969,1972],{"class":141,"line":255},[139,1953,1954],{"class":145},"  `",[139,1956,1957],{"class":166},"record:",[139,1959,1960],{"class":145},"${",[139,1962,1963],{"class":184},"props",[139,1965,964],{"class":145},[139,1967,1968],{"class":184},"recordId",[139,1970,1971],{"class":145},"}`",[139,1973,449],{"class":145},[139,1975,1976,1979,1982,1984,1986,1988,1990,1993,1995,1998,2000],{"class":141,"line":300},[139,1977,1978],{"class":145},"  {",[139,1980,1981],{"class":149}," ownerInfo",[139,1983,444],{"class":145},[139,1985,181],{"class":145},[139,1987,899],{"class":149},[139,1989,444],{"class":145},[139,1991,1992],{"class":184}," currentUser",[139,1994,964],{"class":145},[139,1996,1997],{"class":184},"name ",[139,1999,204],{"class":145},[139,2001,912],{"class":145},[139,2003,2004],{"class":141,"line":353},[139,2005,225],{"class":184},[139,2007,2008],{"class":141,"line":398},[139,2009,242],{"emptyLinePlaceholder":241},[139,2011,2012,2014,2017,2019,2022,2024,2027,2029,2031,2033,2035,2037,2039,2041,2043,2046,2048,2051,2053],{"class":141,"line":601},[139,2013,178],{"class":153},[139,2015,2016],{"class":184}," record ",[139,2018,160],{"class":145},[139,2020,2021],{"class":210}," useRealtimeState",[139,2023,214],{"class":184},[139,2025,2026],{"class":145},"`",[139,2028,1957],{"class":166},[139,2030,1960],{"class":145},[139,2032,1963],{"class":184},[139,2034,964],{"class":145},[139,2036,1968],{"class":184},[139,2038,1971],{"class":145},[139,2040,188],{"class":145},[139,2042,181],{"class":145},[139,2044,2045],{"class":149}," title",[139,2047,444],{"class":145},[139,2049,2050],{"class":145}," ''",[139,2052,1110],{"class":145},[139,2054,225],{"class":184},[139,2056,2057],{"class":141,"line":607},[139,2058,242],{"emptyLinePlaceholder":241},[139,2060,2061,2063,2065,2068,2070],{"class":141,"line":613},[139,2062,1167],{"class":153},[139,2064,1170],{"class":153},[139,2066,2067],{"class":210}," startEditing",[139,2069,1176],{"class":145},[139,2071,549],{"class":145},[139,2073,2074,2077,2079],{"class":141,"line":624},[139,2075,2076],{"class":934},"  await",[139,2078,185],{"class":210},[139,2080,940],{"class":149},[139,2082,2083],{"class":141,"line":629},[139,2084,673],{"class":145},[139,2086,2087],{"class":141,"line":635},[139,2088,242],{"emptyLinePlaceholder":241},[139,2090,2091,2093,2095,2098,2100],{"class":141,"line":670},[139,2092,1167],{"class":153},[139,2094,1170],{"class":153},[139,2096,2097],{"class":210}," save",[139,2099,1176],{"class":145},[139,2101,549],{"class":145},[139,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121],{"class":141,"line":2104},17,[139,2106,2076],{"class":934},[139,2108,191],{"class":210},[139,2110,214],{"class":149},[139,2112,1079],{"class":145},[139,2114,653],{"class":149},[139,2116,444],{"class":145},[139,2118,1087],{"class":1086},[139,2120,1110],{"class":145},[139,2122,225],{"class":149},[139,2124,2126],{"class":141,"line":2125},18,[139,2127,673],{"class":145},[139,2129,2131,2133,2135],{"class":141,"line":2130},19,[139,2132,231],{"class":145},[139,2134,150],{"class":149},[139,2136,172],{"class":145},[139,2138,2140],{"class":141,"line":2139},20,[139,2141,242],{"emptyLinePlaceholder":241},[139,2143,2145,2147,2149],{"class":141,"line":2144},21,[139,2146,146],{"class":145},[139,2148,250],{"class":149},[139,2150,172],{"class":145},[139,2152,2154,2156,2159,2162,2164,2166,2169,2171],{"class":141,"line":2153},22,[139,2155,258],{"class":145},[139,2157,2158],{"class":149},"div",[139,2160,2161],{"class":153}," class",[139,2163,160],{"class":145},[139,2165,163],{"class":145},[139,2167,2168],{"class":166},"space-y-2",[139,2170,163],{"class":145},[139,2172,172],{"class":145},[139,2174,2176,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211],{"class":141,"line":2175},23,[139,2177,2178],{"class":145},"    \u003C",[139,2180,358],{"class":149},[139,2182,264],{"class":153},[139,2184,160],{"class":145},[139,2186,163],{"class":145},[139,2188,1652],{"class":166},[139,2190,163],{"class":145},[139,2192,319],{"class":153},[139,2194,160],{"class":145},[139,2196,163],{"class":145},[139,2198,370],{"class":166},[139,2200,163],{"class":145},[139,2202,375],{"class":153},[139,2204,160],{"class":145},[139,2206,163],{"class":145},[139,2208,382],{"class":166},[139,2210,163],{"class":145},[139,2212,172],{"class":145},[139,2214,2216],{"class":141,"line":2215},24,[139,2217,2218],{"class":184},"      {{ ownerInfo?.name ?? 'Someone' }} is editing this record\n",[139,2220,2222,2225,2227],{"class":141,"line":2221},25,[139,2223,2224],{"class":145},"    \u003C\u002F",[139,2226,358],{"class":149},[139,2228,172],{"class":145},[139,2230,2232],{"class":141,"line":2231},26,[139,2233,242],{"emptyLinePlaceholder":241},[139,2235,2237,2239,2242,2245,2247,2249,2252,2254,2257,2259,2261,2263,2265],{"class":141,"line":2236},27,[139,2238,2178],{"class":145},[139,2240,2241],{"class":149},"UInput",[139,2243,2244],{"class":153}," v-model",[139,2246,160],{"class":145},[139,2248,163],{"class":145},[139,2250,2251],{"class":166},"record.title",[139,2253,163],{"class":145},[139,2255,2256],{"class":153}," :disabled",[139,2258,160],{"class":145},[139,2260,163],{"class":145},[139,2262,1652],{"class":166},[139,2264,163],{"class":145},[139,2266,2267],{"class":145}," \u002F>\n",[139,2269,2271],{"class":141,"line":2270},28,[139,2272,242],{"emptyLinePlaceholder":241},[139,2274,2276,2278,2280,2282,2284,2286,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2310,2312],{"class":141,"line":2275},29,[139,2277,2178],{"class":145},[139,2279,261],{"class":149},[139,2281,264],{"class":153},[139,2283,160],{"class":145},[139,2285,163],{"class":145},[139,2287,2288],{"class":166},"!ownedByMe",[139,2290,163],{"class":145},[139,2292,2256],{"class":153},[139,2294,160],{"class":145},[139,2296,163],{"class":145},[139,2298,1435],{"class":166},[139,2300,163],{"class":145},[139,2302,276],{"class":153},[139,2304,160],{"class":145},[139,2306,163],{"class":145},[139,2308,2309],{"class":166},"startEditing",[139,2311,163],{"class":145},[139,2313,172],{"class":145},[139,2315,2317],{"class":141,"line":2316},30,[139,2318,2319],{"class":184},"      Edit\n",[139,2321,2323,2325,2327],{"class":141,"line":2322},31,[139,2324,2224],{"class":145},[139,2326,261],{"class":149},[139,2328,172],{"class":145},[139,2330,2332,2334,2336,2338,2340,2342,2344,2347,2349,2351,2354,2356,2358],{"class":141,"line":2331},32,[139,2333,2178],{"class":145},[139,2335,261],{"class":149},[139,2337,361],{"class":153},[139,2339,276],{"class":153},[139,2341,160],{"class":145},[139,2343,163],{"class":145},[139,2345,2346],{"class":166},"save",[139,2348,163],{"class":145},[139,2350,288],{"class":145},[139,2352,2353],{"class":184},"Save",[139,2355,231],{"class":145},[139,2357,261],{"class":149},[139,2359,172],{"class":145},[139,2361,2363,2365,2367],{"class":141,"line":2362},33,[139,2364,1686],{"class":145},[139,2366,2158],{"class":149},[139,2368,172],{"class":145},[139,2370,2372,2374,2376],{"class":141,"line":2371},34,[139,2373,231],{"class":145},[139,2375,250],{"class":149},[139,2377,172],{"class":145},[486,2379,2381],{"id":2380},"kanban-card-drag-lock","Kanban Card Drag Lock",[121,2383,2384],{},"Prevent two users from dragging the same card at once:",[129,2386,2389],{"className":131,"code":2387,"filename":2388,"language":133,"meta":134,"style":134},"\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{ cardId: string }>()\n\nconst { claim, release, locked, ownedByMe } = useRealtimeLock(`card:${props.cardId}`, {\n  room: 'board:main',\n})\n\nfunction onDragStart() {\n  claim()\n}\n\nfunction onDragEnd() {\n  release({ changed: true })\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUCard\n    :draggable=\"!locked || ownedByMe\"\n    :class=\"{ 'opacity-50': locked && !ownedByMe }\"\n    @dragstart=\"onDragStart\"\n    @dragend=\"onDragEnd\"\n  >\n    \u003Cslot \u002F>\n  \u003C\u002FUCard>\n\u003C\u002Ftemplate>\n","KanbanCard.vue",[136,2390,2391,2411,2434,2438,2486,2501,2507,2511,2522,2528,2532,2536,2547,2565,2569,2577,2581,2589,2596,2611,2625,2639,2653,2658,2667,2676],{"__ignoreMap":134},[139,2392,2393,2395,2397,2399,2401,2403,2405,2407,2409],{"class":141,"line":142},[139,2394,146],{"class":145},[139,2396,150],{"class":149},[139,2398,154],{"class":153},[139,2400,157],{"class":153},[139,2402,160],{"class":145},[139,2404,163],{"class":145},[139,2406,167],{"class":166},[139,2408,163],{"class":145},[139,2410,172],{"class":145},[139,2412,2413,2415,2417,2419,2421,2423,2426,2428,2430,2432],{"class":141,"line":175},[139,2414,178],{"class":153},[139,2416,1878],{"class":184},[139,2418,160],{"class":145},[139,2420,1883],{"class":210},[139,2422,1886],{"class":145},[139,2424,2425],{"class":149}," cardId",[139,2427,444],{"class":145},[139,2429,432],{"class":426},[139,2431,1896],{"class":145},[139,2433,940],{"class":184},[139,2435,2436],{"class":141,"line":228},[139,2437,242],{"emptyLinePlaceholder":241},[139,2439,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2471,2473,2475,2477,2480,2482,2484],{"class":141,"line":238},[139,2441,178],{"class":153},[139,2443,181],{"class":145},[139,2445,185],{"class":184},[139,2447,188],{"class":145},[139,2449,191],{"class":184},[139,2451,188],{"class":145},[139,2453,1452],{"class":184},[139,2455,188],{"class":145},[139,2457,1361],{"class":184},[139,2459,204],{"class":145},[139,2461,207],{"class":145},[139,2463,211],{"class":210},[139,2465,214],{"class":184},[139,2467,2026],{"class":145},[139,2469,2470],{"class":166},"card:",[139,2472,1960],{"class":145},[139,2474,1963],{"class":184},[139,2476,964],{"class":145},[139,2478,2479],{"class":184},"cardId",[139,2481,1971],{"class":145},[139,2483,188],{"class":145},[139,2485,549],{"class":145},[139,2487,2488,2490,2492,2494,2497,2499],{"class":141,"line":245},[139,2489,579],{"class":149},[139,2491,444],{"class":145},[139,2493,904],{"class":145},[139,2495,2496],{"class":166},"board:main",[139,2498,217],{"class":145},[139,2500,449],{"class":145},[139,2502,2503,2505],{"class":141,"line":255},[139,2504,204],{"class":145},[139,2506,225],{"class":184},[139,2508,2509],{"class":141,"line":300},[139,2510,242],{"emptyLinePlaceholder":241},[139,2512,2513,2515,2518,2520],{"class":141,"line":353},[139,2514,419],{"class":153},[139,2516,2517],{"class":210}," onDragStart",[139,2519,1176],{"class":145},[139,2521,549],{"class":145},[139,2523,2524,2526],{"class":141,"line":398},[139,2525,701],{"class":210},[139,2527,940],{"class":149},[139,2529,2530],{"class":141,"line":601},[139,2531,673],{"class":145},[139,2533,2534],{"class":141,"line":607},[139,2535,242],{"emptyLinePlaceholder":241},[139,2537,2538,2540,2543,2545],{"class":141,"line":613},[139,2539,419],{"class":153},[139,2541,2542],{"class":210}," onDragEnd",[139,2544,1176],{"class":145},[139,2546,549],{"class":145},[139,2548,2549,2551,2553,2555,2557,2559,2561,2563],{"class":141,"line":624},[139,2550,723],{"class":210},[139,2552,214],{"class":149},[139,2554,1079],{"class":145},[139,2556,653],{"class":149},[139,2558,444],{"class":145},[139,2560,1087],{"class":1086},[139,2562,1110],{"class":145},[139,2564,225],{"class":149},[139,2566,2567],{"class":141,"line":629},[139,2568,673],{"class":145},[139,2570,2571,2573,2575],{"class":141,"line":635},[139,2572,231],{"class":145},[139,2574,150],{"class":149},[139,2576,172],{"class":145},[139,2578,2579],{"class":141,"line":670},[139,2580,242],{"emptyLinePlaceholder":241},[139,2582,2583,2585,2587],{"class":141,"line":2104},[139,2584,146],{"class":145},[139,2586,250],{"class":149},[139,2588,172],{"class":145},[139,2590,2591,2593],{"class":141,"line":2125},[139,2592,258],{"class":145},[139,2594,2595],{"class":149},"UCard\n",[139,2597,2598,2601,2603,2605,2608],{"class":141,"line":2130},[139,2599,2600],{"class":153},"    :draggable",[139,2602,160],{"class":145},[139,2604,163],{"class":145},[139,2606,2607],{"class":166},"!locked || ownedByMe",[139,2609,2610],{"class":145},"\"\n",[139,2612,2613,2616,2618,2620,2623],{"class":141,"line":2139},[139,2614,2615],{"class":153},"    :class",[139,2617,160],{"class":145},[139,2619,163],{"class":145},[139,2621,2622],{"class":166},"{ 'opacity-50': locked && !ownedByMe }",[139,2624,2610],{"class":145},[139,2626,2627,2630,2632,2634,2637],{"class":141,"line":2144},[139,2628,2629],{"class":153},"    @dragstart",[139,2631,160],{"class":145},[139,2633,163],{"class":145},[139,2635,2636],{"class":166},"onDragStart",[139,2638,2610],{"class":145},[139,2640,2641,2644,2646,2648,2651],{"class":141,"line":2153},[139,2642,2643],{"class":153},"    @dragend",[139,2645,160],{"class":145},[139,2647,163],{"class":145},[139,2649,2650],{"class":166},"onDragEnd",[139,2652,2610],{"class":145},[139,2654,2655],{"class":141,"line":2175},[139,2656,2657],{"class":145},"  >\n",[139,2659,2660,2662,2665],{"class":141,"line":2215},[139,2661,2178],{"class":145},[139,2663,2664],{"class":149},"slot",[139,2666,2267],{"class":145},[139,2668,2669,2671,2674],{"class":141,"line":2221},[139,2670,1686],{"class":145},[139,2672,2673],{"class":149},"UCard",[139,2675,172],{"class":145},[139,2677,2678,2680,2682],{"class":141,"line":2231},[139,2679,231],{"class":145},[139,2681,250],{"class":149},[139,2683,172],{"class":145},[2685,2686,2688],"callout",{"icon":2687},"i-lucide-info",[121,2689,2690,2691,2696],{},"See ",[2692,2693,2694],"a",{"href":69},[136,2695,68],{}," for a bulk view of every locked card on the board at once, so you don't need to subscribe to each card's lock individually.",[486,2698,2700],{"id":2699},"notify-others-when-a-lock-is-released","Notify Others When a Lock Is Released",[121,2702,2703],{},"React when a lock someone else held becomes free, distinguishing a real edit from an abandoned session:",[129,2705,2707],{"className":411,"code":2706,"language":167,"meta":134,"style":134},"const documentData = useRealtimeState('document:123', null)\n\nconst { claim } = useRealtimeLock('document:123', {\n  onReleased: ({ changed }) => {\n    if (changed) {\n      documentData.refresh()\n    }\n  },\n})\n",[136,2708,2709,2734,2738,2764,2781,2795,2807,2812,2816],{"__ignoreMap":134},[139,2710,2711,2713,2716,2718,2720,2722,2724,2726,2728,2730,2732],{"class":141,"line":142},[139,2712,178],{"class":153},[139,2714,2715],{"class":184}," documentData ",[139,2717,160],{"class":145},[139,2719,2021],{"class":210},[139,2721,214],{"class":184},[139,2723,217],{"class":145},[139,2725,220],{"class":166},[139,2727,217],{"class":145},[139,2729,188],{"class":145},[139,2731,844],{"class":145},[139,2733,225],{"class":184},[139,2735,2736],{"class":141,"line":175},[139,2737,242],{"emptyLinePlaceholder":241},[139,2739,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762],{"class":141,"line":228},[139,2741,178],{"class":153},[139,2743,181],{"class":145},[139,2745,870],{"class":184},[139,2747,204],{"class":145},[139,2749,207],{"class":145},[139,2751,211],{"class":210},[139,2753,214],{"class":184},[139,2755,217],{"class":145},[139,2757,220],{"class":166},[139,2759,217],{"class":145},[139,2761,188],{"class":145},[139,2763,549],{"class":145},[139,2765,2766,2768,2770,2773,2775,2777,2779],{"class":141,"line":238},[139,2767,638],{"class":210},[139,2769,444],{"class":145},[139,2771,2772],{"class":145}," ({",[139,2774,653],{"class":440},[139,2776,661],{"class":145},[139,2778,664],{"class":153},[139,2780,549],{"class":145},[139,2782,2783,2786,2788,2791,2793],{"class":141,"line":245},[139,2784,2785],{"class":934},"    if",[139,2787,643],{"class":149},[139,2789,2790],{"class":184},"changed",[139,2792,1210],{"class":149},[139,2794,956],{"class":145},[139,2796,2797,2800,2802,2805],{"class":141,"line":255},[139,2798,2799],{"class":184},"      documentData",[139,2801,964],{"class":145},[139,2803,2804],{"class":210},"refresh",[139,2806,940],{"class":149},[139,2808,2809],{"class":141,"line":300},[139,2810,2811],{"class":145},"    }\n",[139,2813,2814],{"class":141,"line":353},[139,2815,1828],{"class":145},[139,2817,2818,2820],{"class":141,"line":398},[139,2819,204],{"class":145},[139,2821,225],{"class":184},[2823,2824,2825],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":134,"searchDepth":142,"depth":175,"links":2827},[2828,2829,2830,2834,2842,2843],{"id":127,"depth":175,"text":23},{"id":407,"depth":175,"text":408},{"id":483,"depth":175,"text":484,"children":2831},[2832,2833],{"id":488,"depth":228,"text":488},{"id":514,"depth":228,"text":514},{"id":676,"depth":175,"text":677,"children":2835},[2836,2837,2838,2839,2840,2841],{"id":853,"depth":228,"text":283},{"id":985,"depth":228,"text":337},{"id":1117,"depth":228,"text":1118},{"id":1344,"depth":228,"text":314},{"id":1435,"depth":228,"text":1435},{"id":1517,"depth":228,"text":1518},{"id":1701,"depth":175,"text":1702},{"id":1837,"depth":175,"text":1838,"children":2844},[2845,2846,2847],{"id":1841,"depth":228,"text":1842},{"id":2380,"depth":228,"text":2381},{"id":2699,"depth":228,"text":2700},"Claim exclusive ownership of a resource across clients.","md",null,{},{"icon":31},{"title":64,"description":2848},"Rs_Zgfg5QB4tkqHtlOIlespOIQ2vhpfZHfnYPMD2Fkc",[2856,2858],{"title":59,"path":60,"stem":61,"description":2857,"icon":62,"children":-1},"Track who else is present in a room.",{"title":68,"path":69,"stem":70,"description":2859,"icon":71,"children":-1},"Bulk view of every lock tagged with a room.",1787657974100]