PageSourceSearch

https://app.governance.center/_next/static/chunks/50571-85548daf4b7661e8.js

js governance.center collected 2026-10-08 13:11:59 UTC 27,378 bytes, 1 lines download raw bytes

1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="65bdf9e6-4f7b-4ce6-9bd7-8dc15209e085",e._sentryDebugIdIdentifier="sentry-dbid-65bdf9e6-4f7b-4ce6-9bd7-8dc15209e085")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[50571],{65010:function(e,t,n){n.d(t,{En:function(){return a},GV:function(){return r},fF:function(){return s}});var o=n(640);function a(e,t){let n="string"==typeof e?new Date(e):e;if(Number.isNaN(n.getTime()))return"";let a=function(e){if(e&&(0,o.Nh)(e))return e;try{return Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}catch{return"UTC"}}(t),r=n.toLocaleDateString("en-US",{weekday:"short",month:"short",day:"numeric",timeZone:a}),s=n.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",timeZone:a,timeZoneName:"short"});return`${r} at ${s}`}function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date,n=("string"==typeof e?new Date(e):e).getTime()-t.getTime(),o=Math.abs(n),a=Math.round(o/6e4),r=Math.round(o/36e5),s=Math.round(o/864e5),i=o<36e5?`${Math.max(1,a)} minute${a<=1?"":"s"}`:o<1728e5?`${r} hour${1===r?"":"s"}`:`${s} day${1===s?"":"s"}`;return n>=0?`in ${i}`:`${i} ago`}function s(e){return`${e} ${1===e?"voter":"voters"}`}},54043:function(e,t,n){n.d(t,{s:function(){return b}});var o=n(85067),a=n(41434),r=n(77324),s=n(5501),i=n(35634),l=n(11973),u=n(80823),c=n(69962),d=n(11331),m=n(37437),h=n(97313),p=n(92096),f=n(88694),g=n(65010);let _="h-11 border border-neutral-200 bg-white px-3 text-body hover:border-neutral-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50";function b(e){let{value:t,onChange:n,base:g,closesAt:b,opensAt:v=null,timezone:x,hasTextVoters:w=!1,sentCounts:j,now:N,idPrefix:q="reminders"}=e,[$,S]=(0,a.useState)(()=>new Date);(0,a.useEffect)(()=>{if(N)return;let e=setInterval(()=>S(new Date),6e4);return()=>clearInterval(e)},[N]);let T=N??$,[k,A]=(0,a.useState)(()=>new Set(t.steps.map((e,t)=>e.message?t:-1).filter(e=>e>=0))),C=e=>n({...t,...e}),D=(e,n)=>C({steps:t.steps.map((t,o)=>o===e?{...t,...n}:t)}),E=(0,a.useMemo)(()=>{let e=(0,f.GA)(g??{version:2,enabled:!1,steps:[]},t,T),n=new Map;for(let t of(0,f.YU)({config:{...e,enabled:!0},closeAt:b?new Date(b):null,openAt:v?new Date(v):null,timeZone:x,now:T,sentCounts:j}))n.set(t.key,t);return n},[g,t,T,b,v,x,j]),M=(0,f.D2)(t),I=t.steps.some(e=>"days"===e.unit),P=e=>{let t=k.has(e);t&&D(e,{message:null}),A(n=>{let o=new Set(n);return t?o.delete(e):o.add(e),o})},B=e=>
1{C({steps:t.steps.filter((t,n)=>n!==e)}),A(t=>{let n=new Set;return t.forEach(t=>{t<e?n.add(t):t>e&&n.add(t-1)}),n})};return(0,o.jsxs)("div",{className:"space-y-5","data-testid":"reminder-plan-editor",children:[(0,o.jsxs)("div",{className:"flex items-start justify-between gap-4 border border-neutral-200 bg-white p-4",children:[(0,o.jsxs)("div",{children:[(0,o.jsx)(d._,{htmlFor:`${q}-enabled`,className:"text-body font-semibold text-neutral-900",children:"Send automatic reminders"}),(0,o.jsxs)("p",{className:"mt-1 text-body-sm text-neutral-600",children:["Voters who have not voted yet get an email with their own ballot link",w?", and voters you invited by text get a text":"",". Nobody who has voted is reminded."]})]}),(0,o.jsx)(u.r,{id:`${q}-enabled`,checked:t.enabled,onCheckedChange:e=>C({enabled:e,steps:e&&0===t.steps.length?f.DE[0].steps.map(e=>({...e})):t.steps}),"aria-label":"Send automatic reminders"})]}),t.enabled&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("fieldset",{className:"space-y-2",children:[(0,o.jsx)("legend",{className:"text-body-sm font-semibold text-neutral-900",children:"Start from a plan"}),(0,o.jsx)("div",{className:"grid gap-2 sm:grid-cols-2",role:"group","aria-label":"Reminder plans",children:f.DE.map(e=>{let n=function(e,t){if(e.length!==t.length)return!1;let n=new Set(e.map(f.DY));return t.every(e=>n.has((0,f.DY)(e)))}(t.steps,e.steps);return(0,o.jsxs)("button",{type:"button","aria-pressed":n,title:e.description,onClick:()=>{A(new Set),C({steps:e.steps.map(e=>({anchor:e.anchor,amount:e.amount,unit:e.unit,message:null}))})},className:(0,p.cn)("min-h-[44px] border px-3 py-2 text-left text-body-sm transition-colors",n?"border-neutral-900 bg-neutral-900 text-white":"border-neutral-200 bg-white text-neutral-700 hover:border-neutral-400"),children:[(0,o.jsx)("span",{className:"block font-semibold",children:e.label}),(0,o.jsx)("span",{className:(0,p.cn)("block text-caption",n?"text-neutral-200":"text-neutral-500"),children:e.description})]},e.id)})})]}),!b&&t.steps.some(e=>"close"===e.anchor)&&(0,o.jsxs)("p",{className:"flex items-start gap-2 border border-warning bg-warning-light p-3 text-body-sm text-warning-dark",children:[(0,o.jsx)(r.Z,{className:"mt-0.5 h-4 w-4 shrink-0","aria-hidden":"true"}),"Reminders before the close are scheduled once the election has an end date. Set one under Settings, Schedule."]}),(0,o.jsx)("ol",{className:"space-y-3","aria-label":"Reminders",children:t.steps.map((e,n)=>{let a=(0,f.DY)(e),r=E.get(a),l=n+1,u="hours"===e.unit?f.Pt:f.eP,g=k.has(n);return(0,o.jsxs)("li",{className:"border border-neutral-200 bg-white p-3 sm:p-4","data-testid":"reminder-step",children:[(0,o.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,o.jsxs)("p",{className:"font-mono text-caption font-semibold uppercase tracking-wider text-neutral-500",children:["Reminder ",l]}),(0,o.jsx)(h.z,{type:"button",variant:"ghost",size:"icon",onClick:()=>B(n),"aria-label":`Remove reminder ${l}`,children:(0,o.jsx)(s.Z,{className:"h-4 w-4","aria-hidden":"true"})})]}),(0,o.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,o.jsx)(c.I,{type:"number",inputMode:"numeric",min:1,max:u,value:Number.isFinite(e.amount)&&e.amount>0?String(e.amount):"",onChange:e=>D(n,{amount:Math.trunc(Number(e.target.value))||0}),"aria-label":`Reminder ${l}: how many ${e.unit}`,className:"w-20"}),(0,o.jsxs)("select",{className:_,value:e.unit,onChange:e=>D(n,{unit:e.target.value}),"aria-label":`Reminder ${l}: hours or days`,children:[(0,o.jsx)("option",{value:"days",children:1===e.amount?"day":"days"}),(0,o.jsx)("option",{value:"hours",children:1===e.amount?"hour":"hours"})]}),(0,o.jsxs)("select",{className:(0,p.cn)(_,"w-full sm:w-auto"),value:e.anchor,onChange:e=>D(n,{anchor:e.target.value}),"aria-label":`Reminder ${l}: counted from`,children:[(0,o.jsx)("option",{value:"close",children:"before voting closes"}),(0,o.jsx)("option",{value:"invite",children:"after the ballot is sent"})]})]}),(0,o.jsx)(y,{step:e,placed:r,closesAt:b,timezone:x,sendTime:t.sendTime,now:T}),g?(0,o.jsxs)("div",{className:"mt-3 space-y-1",children:[(0,o.jsxs)(d._,{htmlFor:`${q}-step-${n}-message`,className:"text-body-sm text-neutral-700",children:["Message for reminder ",l," only"]}),(0,o.jsx)(m.g,{id:`${q}-step-${n}-message`,value:e.message??"",maxLength:f.P0,rows:3,className:"min-h-[88px]",placeholder:"For example: This is the last reminder before the annual meeting. We still need 12 votes for quorum.",onChange:e=>D(n,{message:e.target.value})}),(0,o.jsx)("button",{type:"button",className:"text-body-sm text-neutral-600 underline underline-offset-2",onClick:()=>P(n),children:"Use the shared message instead"})]}):(0,o.jsxs)("button",{type:"button",className:"mt-2 inline-flex min-h-[44px] items-center gap-1.5 text-body-sm text-neutral-700 underline underline-offset-2",onClick:()=>P(n),children:[(0,o.jsx)(i.Z,{className:"h-4 w-4","aria-hidden":"true"}),"Write a different message for this one"]})]},n)})}),(0,o.jsxs)(h.z,{type:"button",variant:"outline",onClick:()=>C({steps:[...t.steps,function(e){let t=new Set(e.map(f.DY));
1return[{anchor:"close",amount:1,unit:"days"},{anchor:"close",amount:3,unit:"days"},{anchor:"close",amount:7,unit:"days"},{anchor:"close",amount:4,unit:"hours"},{anchor:"close",amount:2,unit:"days"},{anchor:"invite",amount:3,unit:"days"},{anchor:"close",amount:14,unit:"days"}].find(e=>!t.has((0,f.DY)(e)))??{anchor:"close",amount:5,unit:"days"}}(t.steps)]}),disabled:t.steps.length>=f.Mq,children:[(0,o.jsx)(l.Z,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"Add a reminder"]}),t.steps.length>=f.Mq&&(0,o.jsxs)("p",{className:"text-body-sm text-neutral-600",children:[f.Mq," reminders is the most an election can have."]}),(0,o.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,o.jsxs)("div",{className:"space-y-1",children:[(0,o.jsx)(d._,{htmlFor:`${q}-send-time`,className:"text-body-sm font-semibold text-neutral-900",children:"Time of day for day reminders"}),(0,o.jsxs)("select",{id:`${q}-send-time`,className:(0,p.cn)(_,"w-full"),value:t.sendTime??"",disabled:!I,onChange:e=>C({sendTime:e.target.value||null}),children:[(0,o.jsx)("option",{value:"",children:"Same time of day as the close"}),f.mM.map(e=>(0,o.jsx)("option",{value:e,children:(0,f.s2)(e)},e))]}),(0,o.jsx)("p",{className:"text-caption text-neutral-500",children:"In the election's time zone. Hour reminders go out exactly that many hours before."})]}),(0,o.jsxs)("div",{className:"space-y-1",children:[(0,o.jsxs)(d._,{htmlFor:`${q}-subject`,className:"text-body-sm font-semibold text-neutral-900",children:["Subject line ",(0,o.jsx)("span",{className:"font-normal text-neutral-500",children:"(optional)"})]}),(0,o.jsx)(c.I,{id:`${q}-subject`,value:t.subject??"",maxLength:f.Jn,placeholder:"Leave blank to say when voting closes",onChange:e=>C({subject:e.target.value})}),(0,o.jsx)("p",{className:"text-caption text-neutral-500",children:"Blank reads “Reminder: … closes tomorrow”, worded for the time left."})]})]}),(0,o.jsxs)("div",{className:"space-y-1",children:[(0,o.jsxs)(d._,{htmlFor:`${q}-message`,className:"text-body-sm font-semibold text-neutral-900",children:["Your message ",(0,o.jsx)("span",{className:"font-normal text-neutral-500",children:"(optional)"})]}),(0,o.jsx)(m.g,{id:`${q}-message`,value:t.customMessage??"",maxLength:f.P0,rows:4,placeholder:"For example: Every vote counts toward the quorum we need to seat the new board. It takes two minutes.",onChange:e=>C({customMessage:e.target.value})}),(0,o.jsxs)("p",{className:"flex justify-between gap-2 text-caption text-neutral-500",children:[(0,o.jsx)("span",{children:"Printed in every reminder, above the Vote now button, signed with your organization's name."}),(0,o.jsxs)("span",{"aria-live":"polite",children:[(t.customMessage??"").length,"/",f.P0]})]})]}),w&&(0,o.jsxs)("div",{className:"flex items-start justify-between gap-4 border border-neutral-200 bg-white p-4",children:[(0,o.jsxs)("div",{children:[(0,o.jsx)(d._,{htmlFor:`${q}-sms`,className:"text-body font-semibold text-neutral-900",children:"Also text voters you invited by text"}),(0,o.jsx)("p",{className:"mt-1 text-body-sm text-neutral-600",children:"Same moments, a short text with their own link. A text due overnight waits until 8 AM."})]}),(0,o.jsx)(u.r,{id:`${q}-sms`,checked:!1!==t.sms,onCheckedChange:e=>C({sms:e}),"aria-label":"Also text voters you invited by text"})]})]}),M&&(0,o.jsxs)("p",{role:"alert",className:"flex items-start gap-2 border border-error bg-error-light p-3 text-body-sm text-error-dark",children:[(0,o.jsx)(r.Z,{className:"mt-0.5 h-4 w-4 shrink-0","aria-hidden":"true"}),M]})]})}function y(e){let{step:t,placed:n,closesAt:a,timezone:s,sendTime:i,now:l}=e;if("invite"===t.anchor){let e="days"===t.unit&&i?`, at ${(0,f.s2)(i)}`:"",a=n?.sentCount?` Sent to ${(0,g.fF)(n.sentCount)} so far.`:"";return(0,o.jsxs)("p",{className:"mt-2 text-body-sm text-neutral-600",children:["Goes to each voter ",t.amount," ","days"===t.unit?1===t.amount?"day":"days":1===t.amount?"hour":"hours"," after their ballot is sent",e,".",a]})}if(!a||!n?.at)return(0,o.jsx)("p",{className:"mt-2 text-body-sm text-neutral-500",children:"Scheduled once the election has an end date."});let u=(0,g.En)(n.at,s),c=(0,f.az)(n.at,s);switch(n.state){case"sent":return(0,o.jsxs)("p",{className:"mt-2 text-body-sm text-neutral-600",children:["Sent ",u," to ",(0,g.fF)(n.sentCount),"."]}
1);case"due":return(0,o.jsx)("p",{className:"mt-2 text-body-sm font-medium text-neutral-900",children:"Its time has come: it goes out at the next hourly run."});case"passed":return(0,o.jsxs)("p",{className:"mt-2 text-body-sm text-neutral-500",children:[u," has already passed, so this one will not be sent."]});case"before_open":return(0,o.jsxs)("p",{className:"mt-2 text-body-sm text-warning-dark",children:[u," is before voting opens, so this one will not be sent."]});default:return(0,o.jsxs)("div",{className:"mt-2 space-y-1",children:[(0,o.jsxs)("p",{className:"text-body-sm text-neutral-700",children:["Goes out ",(0,o.jsx)("span",{className:"font-medium text-neutral-900",children:u})," (",(0,g.GV)(n.at,l),")."]}),c&&(0,o.jsxs)("p",{className:"flex items-center gap-1.5 text-body-sm text-warning-dark",children:[(0,o.jsx)(r.Z,{className:"h-4 w-4 shrink-0","aria-hidden":"true"}),"That is the middle of the night for your voters. A time of day above, or fewer hours, lands better."]})]})}}},24764:function(e,t,n){n.d(t,{VR:function(){return o},e8:function(){return l},hr:function(){return i}});let o=[{code:"CA",name:"California"},{code:"FL",name:"Florida"},{code:"TX",name:"Texas"},{code:"CO",name:"Colorado"},{code:"AZ",name:"Arizona"},{code:"NV",name:"Nevada"}],a={authentication:{label:"Members authenticate before the ballot opens",satisfiedBy:"configured",met:e=>e.verificationLevels.some(e=>e&&"none"!==e),fix:"Turn on email, SMS or government-ID verification so each member proves who they are before voting"},ballot_secrecy:{label:"The ballot is kept secret in transit and in storage",satisfiedBy:"configured",met:e=>e.isAnonymous||!0===e.permanentSeparation,fix:"Turn on anonymous voting (or sealed ballots, where the statute asks for permanent separation)"},receipt_confirmation:{label:"Each voter is sent confirmation that their ballot was received",satisfiedBy:"platform"},receipt_verification:{label:"Each voter is sent confirmation that their ballot was received",satisfiedBy:"platform"},audit_trail:{label:"A hash-chained audit trail records every ballot event",satisfiedBy:"platform"},device_testing_30_days:{label:"Test the voting system with members’ own devices at least 30 days before the election, and keep the record",satisfiedBy:"association"},member_choice:{label:"Every member must be offered a paper ballot as an alternative, and may change their choice up to 90 days before the election",satisfiedBy:"association"}},r=[{key:"requires_board_resolution",label:()=>"The board must adopt an election rule authorizing electronic voting"},{key:"requires_written_consent",label:()=>"Each member must give written consent before receiving an electronic ballot"},{key:"board_meeting_notice_days",label:e=>`Notice the board meeting that adopts the electronic-voting rule at least ${String(e)} days beforehand`}],s={notice_period:function(e,t,n,o,a){!function(e,t,n,o,a){let r=Number(e.rule_value.ballot_delivery_days??0);if(!r||!t.closesAt)return;let s=t.startsImmediately?new Date:t.opensAt?new Date(t.opensAt):null;if(!s)return;let i=Math.floor((new Date(t.closesAt).getTime()-s.getTime())/864e5);if(i>=r){a.push(`Ballot delivery: ${i} days of voting (${r} required before the deadline)`);return}let l=`Ballots must reach members at least ${r} days before the voting deadline`,u=`Voting is open for ${i} day${1===i?"":"s"}`;"required"===e.enforcement_level?n.push({rule_category:"notice_period",requirement:l,current_value:u,statute_citation:e.statute_citation,fix_suggestion:`Move the closing date so voting stays open at least ${r} days after ballots go out`}):o.push({rule_category:"notice_period",recommendation:l,current_value:u,statute_citation:e.statute_citation})}(e,t,n,o,a),function(e,t){let n=Number(e.rule_value.results_notice_days??0);n&&t.push({rule_category:"notice_period",recommendation:`Report the tabulated results to members within ${n} days of the count`,current_value:"Due after the election closes — the platform cannot send this for you",statute_citation:e.statute_citation})}(e,o),function(e,t,n,o){let a;let r=Number(e.rule_value.min_days||e.rule_value.first_notice_days||0);if(!r)return;if(t.startsImmediately)a=0;else{if(!t.opensAt)return;a=Math.floor((new Date(t.opensAt).getTime()-Date.now())/864e5)}if(a>=r){o.push(`Notice period: ${a} days (${r} required)`);return}let s=Number(e.rule_value.max_days||0),i=s?`at least ${r} days (and no more than ${s} days)`:`at least ${r} days`,l=t.startsImmediately?"Voting opens when you publish.":`Voting opens in ${a} day${1===a?"":"s"}.`;n.push({rule_category:"notice_period",recommendation:"required"===e.enforcement_level?`${e.state_name} requires notice of this election ${i} before it. Confirm your notice went out in time.`:`State recommends notice ${i} before the election`,current_value:`${l} The platform cannot see when your notice was sent.`,statute_citation:e.statute_citation})}(e,t,o,a)},quorum:function(e,t,n,o,a){let r=e.rule_value;
1if(!1===r.required_for_board_elections){a.push("Quorum: not required for board elections in this state");return}if(r.default_percentage||r.default_percentage_small){let s=r.default_percentage||(t.totalEligibleVoters>(r.large_threshold_units||1e3)?r.default_percentage_large:r.default_percentage_small);"none"===t.quorumType?"required"===e.enforcement_level?n.push({rule_category:"quorum",requirement:`Quorum of ${s}% is required`,current_value:"No quorum configured",statute_citation:e.statute_citation,fix_suggestion:`Set quorum type to "percentage" with threshold of at least ${s}%`}):o.push({rule_category:"quorum",recommendation:`State default quorum is ${s}%`,current_value:"No quorum configured",statute_citation:e.statute_citation}):"percentage"===t.quorumType&&t.quorumThreshold<s?"required"===e.enforcement_level?n.push({rule_category:"quorum",requirement:`Minimum quorum of ${s}% required`,current_value:`Quorum set to ${t.quorumThreshold}%`,statute_citation:e.statute_citation,fix_suggestion:`Increase quorum threshold to at least ${s}%`}):o.push({rule_category:"quorum",recommendation:`State default quorum is ${s}%`,current_value:`Quorum set to ${t.quorumThreshold}%`,statute_citation:e.statute_citation}):a.push(`Quorum: ${t.quorumThreshold}% configured`);return}if("participation_threshold"===r.type&&r.threshold_percentage){"none"===t.quorumType?"required"===e.enforcement_level&&n.push({rule_category:"quorum",requirement:`${r.threshold_percentage}% participation threshold required`,current_value:"No quorum/participation threshold configured",statute_citation:e.statute_citation,fix_suggestion:`Set quorum type to "percentage" with threshold of at least ${r.threshold_percentage}%`}):a.push("Participation threshold configured");return}"governing_docs"===r.source&&("none"===t.quorumType?o.push({rule_category:"quorum",recommendation:"State defers quorum to governing documents; check your bylaws",current_value:"No quorum configured",statute_citation:e.statute_citation}):a.push("Quorum: configured per governing docs"))},proxy:function(e,t,n,o,a){let r=e.rule_value;if(!1===r.allowed){if(t.proxyEnabled){if("required"===e.enforcement_level){let o=r.ban_scope||"this vote type";n.push({rule_category:"proxy",requirement:`Proxy voting is prohibited for ${o}`,current_value:`Proxy voting is enabled (max ${t.maxProxiesPerHolder} per holder)`,statute_citation:e.statute_citation,fix_suggestion:"Disable proxy voting for this election"})}}else a.push("Proxy: correctly disabled (prohibited in this state)");return}if(!0===r.must_allow){t.proxyEnabled?a.push("Proxy: enabled as required"):"required"===e.enforcement_level?n.push({rule_category:"proxy",requirement:"Owners must be allowed to vote by proxy or absentee",current_value:"Proxy voting is disabled",statute_citation:e.statute_citation,fix_suggestion:"Enable proxy voting for this election"}):o.push({rule_category:"proxy",recommendation:"State recommends allowing proxy or absentee voting",current_value:"Proxy voting is disabled",statute_citation:e.statute_citation});return}!0===r.allowed&&(t.proxyEnabled?a.push("Proxy: enabled (allowed by state law)"):"if_bylaws_permit"!==r.condition&&o.push({rule_category:"proxy",recommendation:"State allows proxy voting; consider enabling if your bylaws permit",current_value:"Proxy voting is disabled",statute_citation:e.statute_citation}))},ballot_secrecy:function(e,t,n,o,a){let r=e.rule_value;if(!0===r.secret_ballot_required){if(t.isAnonymous){if(!0===r.permanent_separation_required){let n="string"==typeof r.permanent_separation_citation&&r.permanent_separation_citation?r.permanent_separation_citation:e.statute_citation;t.permanentSeparation?a.push("Ballot secrecy: sealed ballots — voter identity permanently separated from the ballot"):o.push({rule_category:"ballot_secrecy",recommendation:'This state\'s electronic-ballot statute requires the voting system to permanently separate identifying information from the ballot. Set Ballot secrecy to "Sealed (permanent separation)".',current_value:"Anonymous voting is on, but the voter-to-ballot link is retained in restricted storage (standard anonymous mode)",statute_citation:n})}else a.push(t.permanentSeparation?"Ballot secrecy: sealed ballots (permanent separation)":"Ballot secrecy: anonymous voting enabled")}else"required"===e.enforcement_level?n.push({rule_category:"ballot_secrecy",requirement:"Secret (anonymous) ballot is required",current_value:"Vote is configured as identified (not anonymous)",statute_citation:e.statute_citation,fix_suggestion:"Enable anonymous voting to comply with secret ballot requirements"}):o.push({rule_category:"ballot_secrecy",recommendation:"State recommends secret ballot for this vote type",current_value:"Vote is configured as identified",statute_citation:e.statute_citation})}},inspector_requirement:function(e,t,n,o,a){let r=e.rule_value;if(!0===r.required){let s=r.type?`${r.type.replace(/_/g," ")} required for ballot counting`:"Independent inspector(s) required for this election";if(!0===t.inspectorAppointed){a.push(`Inspector of elections appointed (${e.statute_citation})`);return}if(!1===t.inspectorAppointed){n.push({rule_category:"inspector_requirement",requirement:s,current_value:"No inspector of elections appointed",statute_citation:e.statute_citation,fix_suggestion:"Appoint an independent inspector of elections from the election page (Inspector of elections card) before publishing"});return}o.push({rule_category:"inspector_requirement",recommendation:s,current_value:"You will appoint an inspector of elections from the election page before publishing",statute_citation:e.statute_citation})}else!0===r.ballot_access_ban&&o.push({rule_category:"inspector_requirement",recommendation:`${(r.banned_persons||[]).join(" and ")} cannot possess, access, or count ballots before tabulation`,current_value:"Ensure admin access controls prevent prohibited ballot access",
1statute_citation:e.statute_citation})},electronic_voting:function(e,t,n,o,s){let i=e.rule_value;if(!1===i.authorized){let t="Electronic voting is not authorized for this election in this state";"required"===e.enforcement_level?n.push({rule_category:"electronic_voting",requirement:t,current_value:"This election collects ballots electronically",statute_citation:e.statute_citation,fix_suggestion:"Run this vote on paper ballots, or confirm with counsel that an exception applies"}):o.push({rule_category:"electronic_voting",recommendation:t,current_value:"This election collects ballots electronically",statute_citation:e.statute_citation});return}if(!0!==i.authorized)return;s.push(`Electronic voting: authorized in this state (${e.statute_citation})`);let l=Array.isArray(i.excluded_vote_types)?i.excluded_vote_types:[];for(let r of(l.length>0&&o.push({rule_category:"electronic_voting",recommendation:`Electronic ballots may not be used for: ${l.join(", ")}. Those votes must be held on paper.`,current_value:"This election collects ballots electronically",statute_citation:e.statute_citation}),Array.isArray(i.requirements)?i.requirements:[])){let i=a[r];if(!i){o.push({rule_category:"electronic_voting",recommendation:`Statute condition to confirm with counsel: ${r.replace(/_/g," ")}`,current_value:"Not checked automatically",statute_citation:e.statute_citation});continue}if("platform"===i.satisfiedBy){s.push(`Electronic voting: ${i.label}`);continue}if("association"===i.satisfiedBy){o.push({rule_category:"electronic_voting",recommendation:i.label,current_value:"The association must do this — the platform cannot confirm it",statute_citation:e.statute_citation});continue}i.met?.(t)?s.push(`Electronic voting: ${i.label}`):"required"===e.enforcement_level?n.push({rule_category:"electronic_voting",requirement:i.label,current_value:"This election is not configured for it",statute_citation:e.statute_citation,fix_suggestion:i.fix??"Change the election settings to meet this requirement"}):o.push({rule_category:"electronic_voting",recommendation:i.label,current_value:"This election is not configured for it",statute_citation:e.statute_citation})}for(let t of r){let n=i[t.key];null!=n&&!1!==n&&o.push({rule_category:"electronic_voting",recommendation:t.label(n),current_value:"The association must do this — the platform cannot confirm it",statute_citation:e.statute_citation})}},record_retention:function(e,t,n,o,a){let r=e.rule_value;r.ballot_retention_years?o.push({rule_category:"record_retention",recommendation:`Election records must be retained for ${r.ballot_retention_years} year(s)`,current_value:"Platform retains all records; ensure compliance with data retention policy",statute_citation:e.statute_citation}):a.push("Record retention: no specific requirement")},voter_eligibility:function(e,t,n,o,a){e.rule_value.cannot_bar_for_delinquent_assessments&&o.push({rule_category:"voter_eligibility",recommendation:"State law voids any governing-document provision that disqualifies an owner from voting (for example, for delinquent assessments or pending enforcement); ensure your voter list does not exclude owners on that basis",current_value:"Ensure voter list does not exclude members with outstanding balances",statute_citation:e.statute_citation})},candidate_nomination:()=>{}};function i(e,t){let n=[],o=[],a=[];if(0===t.length)return{compliant:!0,stateCode:"",stateName:"",violations:[],warnings:[],passed:["No state-specific rules to check"],checkedAt:new Date().toISOString()};let r=t[0].state_code,i=t[0].state_name;for(let r of t.filter(t=>"all"===t.applies_to||"hoa"===t.applies_to&&"hoa"===e.communityType||"condo"===t.applies_to&&"condo"===e.communityType||"board_election"===t.applies_to&&"board_election"===e.voteType||"general_vote"===t.applies_to&&"board_election"!==e.voteType)){let t=s[r.rule_category];t&&t(r,e,n,o,a)}return{compliant:0===n.length,stateCode:r,stateName:i,violations:n,warnings:o,passed:a,checkedAt:new Date().toISOString()}}function l(e){return e.violations.length>0?{status:"violations",label:`${e.violations.length} violation${1!==e.violations.length?"s":""}: must fix before publishing`,color:"red"}:e.warnings.length>0?{status:"warnings",label:`${e.warnings.length} advisory notice${1!==e.warnings.length?"s":""}`,color:"yellow"}:{status:"compliant",label:`Compliant with ${e.stateName} requirements`,color:"green"}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.