Property
Designs
Sketch
ADU Report
Property
Designs
Sketch
ADU Report
ADU Report
Download Report
Select the ADU type you want to learn more about...
Change
Change
Show comparison
See the General ADU Report →
Design Standards
Alternatives
Other ways to add a dwelling unit:
    Design
    Edit
    Image of the ADU
    Rooms
    ADU Dimensions
    ADU Sqft
    ADU Height
    ADU Placement
    Cost
    Estimated Cost
    Construction Type
    Finish Quality
    Building Area
    sqft
    Cost per Area
    $
    / sqft
    Product Type
    Includes
    Next Steps
    Send feedback
    Help
    
    
    click(showsummary(N)) & adutype(X) ==> ~adutype(X)
    
    click(adutype(X,Y)) ==> adutype(Y)
    click(adutype(X,Y)) & adutype(Z) ==> ~adutype(Z)
    
    attribute(stickiness,class,X) :- evaluate(
      if (
      	someadutype,
      	"blue2-bg", %sticks-at-top - to stick to top
      	true,
      	"blue2-bg"
      ), X
    )
    style(showsummary(X),display,Y) :- evaluate(
      if(
      	someproject,
      	"none",
      	true,
      	""
      ), Y
    )
    style(goaway(X),display,Y) :- evaluate(
      if (
      	someproject,
      	"",
      	true,
      	"none"
      ), Y
    )
    style(goawaycontainer(X),display,Y) :- evaluate(
      if (
        someproject,
        "",
        true,
        "none"
      ), Y
    )
    attribute(goaway(X),href,Y) :- apn(A) & address(B) & evaluate(
      stringappend(
        "/designstandards/",
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            if(
              somehometype,
              stringappend("&residence=",choose(H,hometype(H))),
              true,
              ""
            ),
            "&jurisdiction=",getjur()
          )
        )
      ), Y
    )
    innerhtml(designadu,X) :- someproject & evaluate(design_sketch_header(),X)
    attribute(editlink,href,Y) :- someproject & apn(A) & address(B) & evaluate(
      stringappend(
        if(
          projectype(sketch),
          "/sketch/",
          true,
          "/design/"
        ),
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            if(
              somehometype,
              stringappend("&residence=",choose(H,hometype(H))),
              true,
              ""
            ),
            "&jurisdiction=",getjur(),
            if(
              projectype(sketch),
              stringappend("&project=",choose(P,project(P))),
              projectype(design),
              stringappend("&project=",choose(P,project(P))),
              true,
              ""
            )
          )
        )
      ), Y
    )
    
    innerhtml(summary,X) :- evaluate(summary_container(),X)
    innerhtml(disclaimertop,X) :- disclaimertop(X)
    innerhtml(aduheadercontainer,X) :- evaluate(aduheader_container(),X)
    innerhtml(propertyinfo,X) :- evaluate(factoids(),X)
    innerhtml(sitechallenge,X) :- evaluate(challengefactoids(),X)
    innerhtml(disclaimerbottom,X) :- disclaimerbottom(X)
    innerhtml(typeofadu(1),X) :- adutype(T) & evaluate(headingOf(T),X)
    innerhtml(typeofadu(2),X) :- adutype(T) & evaluate(headingOf(T),X)
    
    style(sitechallengecontainer,display,X) :- evaluate(
      if (
        somelotcondition,
        "",
        true,
        "none"
      ), X
    )
    
    style(alternatives,display,X) :- evaluate(
      if(
        somealternativescontent,
        "",
        true,
        "none"
      ), X
    )
    
    
    style(design,display,X) :- evaluate(
      if (
      	someproject,
      	"",
      	true,
      	"none"
      ), X
    )
    
    innerhtml(costheading,X) :- costheadingtext(X)
    innerhtml(costdisclaimer,X) :- costdisclaimer(X)
    
    innerhtml(location,X) :- address(A) & apn(B) & evaluate(
      if(
        distinct(A,""),
        capitalizeone(A),
        true,
        stringappend(B,", ",getjurprettyname())
      ), X
    )
    
    style(downloadreport,display,X) :- evaluate(
      if(
      	someadutype, "",
      	true, "none"
      ), X
    )
    
    style(section(X),display,Y) :- evaluate(
      if(
      	showsection(X), "",
      	true, "none"
      ), Y
    )
    showsection(summary) :- ~someadutype
    showsection(report) :- someadutype
    
    attribute(adutype(2,Y),class,C) :- evaluate(
      if(
      	adutype(Y), "button-text1-bold summary-nav-link active",
      	true, "button-text1-bold summary-nav-link"
      ), C
    )
    
    style(costwidget(X),display,Y) :- evaluate(
      if(
      	costwidget(X),
      	"",
      	true,
      	"none"
      ), Y
    )
    
    style(estimatedcosttooltip,display,Y) :- evaluate(
      if(
        projectype(design),
        "none",
        true,
        ""
      ), Y
    )
    
    attribute(footer,class,X) :- evaluate(
      if(
      	someadutype, "",
      	true, "blue2-bg"
      ), X
    )
    
    style(timeline,display,X) :- evaluate(
      if(
        hidetimeline,
        "none",
        true,
        ""
      ), X
    )
    
    %%Generic Defs
    
    interiorconversion :- adutype(interior)
    attachedadu :- adutype(attached)
    detachedadu :- adutype(detached)
    junioradu :- adutype(junior)
    someproject :- projectype(X)
    somedesign :- projectype(X) & distinct(X,sketch)
    
    interioradus :- interiorconversion
    interioradus :- junioradu
    someadutype :- adutype(X)
    
    %residence type
    singlefamilyresidence :- hometype(singlefamily)
    multifamilyresidence :- hometype(multifamily)
    someresidence :- somehometype & ~noresidence
    somehometype :- hometype(X)
    noresidence :- hometype(none)
    
    
    status(allowed) :- someallowed & someresidence & ~sometalkToPlanning
    status(talkToPlanning) :- ~notallowed & sometalkToPlanning
    status(notallowed) :- notallowed
    somestatus :- status(X)
    notallowed :- zoningdoesntallow
    notallowed :- noresidence
    permittedadu :- someallowed & ~noresidence
    
    somewaitandlisten :- waitandlisten(X)
    somewaitandlistenmoretext :- waitandlistenmoretext(X)
    somecontactPlanning :- contactPlanning(X)
    sometalkToPlanning :- talkToPlanning(X)
    sometalkToPlanning :- contactPlanning(X)
    sometalkToPlanning :- talktoDCP
    sometalkToPlanning :- someallowed & somenotallowed
    unknownstandards :- someallowed & somenotallowed
    
    innerhtml(moreeligibilitytext,Y) :- evaluate(
      if(
        status(allowed),
        if (
          california_law_applies,
          "",
          splitzoning,
          "However, your property has split zoning. Contact the ",choose(L,planningDepartmentLink(L))," to learn what standards apply to your property.",
          somewaitandlisten,
          choose(W,waitandlisten(W)),
          somewaitandlistenmoretext,
          choose(W,waitandlistenmoretext(W)),
          true,
          ""
        ),
        status(talkToPlanning),
        if(
          somecontactPlanning,
          "",
          true,
          stringappend(
            choose(Y,talkToPlanningMessage(Y)),
            " Contact the ",choose(L,planningDepartmentLink(L))," to learn what standards apply to your property."
          )
        ),
        somenotallowedreason,
        choose(R,notallowedreason(R)),
        zoningdoesntallow,
        "ADUs are only allowed in zoning districts in which residential uses are allowed. Because residential uses are not allowed in your zoning district, an ADU is not allowed here.",
        true,
        "Unfortunately, accessory dwelling units are not allowed on properties without a single-family or multi-family residence."
      ), Y
    )
    
    
    %Capture SF MF case
    showstandards :- someallowed & someresidence & ~unknownstandards & ~somecontactPlanning
    
    adu_heading_with_preposition() := if(
      custom_heading, 
        custom_adu_heading_with_preposition(),
      adutype(attached),
        "An attached ADU",
      adutype(detached),
        "A detached ADU",
      adutype(interior),
        "A conversion ADU",
      adutype(junior),
        "A junior ADU",
      true,
        ""
    )
    
    adu_heading_with_lowercase_preposition() := if(
      custom_heading, 
        custom_adu_heading_with_lowercase_preposition(),
      adutype(attached),
        "an attached ADU",
      adutype(detached),
        "a detached ADU",
      adutype(interior),
        "a conversion ADU",
      adutype(junior),
        "a junior ADU",
      true,
        ""
    )
    
    attribute(adustatuscontainer,class,Y) :- evaluate(
      if(
        status(allowed),
        "adustatus green100-bg white-fg padding-3x",
        status(talkToPlanning),
        "adustatus yellow100-bg white-fg padding-3x",
        true,
        "adustatus red100-bg white-fg padding-3x"
      ), Y
    )
    
    innerhtml(adustatus,Y) :- evaluate(
      if(
        status(allowed),
        if (
          california_law_applies,
          if (
            multifamilyresidence,
            if (
              detachedadu,
              stringappend("California law allows two detached ADUs here. Your ",cityorcounty()," may have more restrictions."),
              true,
              stringappend("California law allows at least one conversion ADU here. Your ",cityorcounty()," may have more restrictions.")
            ),
            true,
            stringappend("California law allows ",adu_heading_with_lowercase_preposition()," here. Your ",cityorcounty()," may have more restrictions.")
          ),
          splitzoning,
          stringappend(adu_heading_with_preposition(), " is possible here"),
          somewaitandlisten,
          stringappend(adu_heading_with_preposition(), " is possible here"),
          true,
          stringappend(adu_heading_with_preposition(), " is possible here")
        ),
        status(talkToPlanning),
        if(
          somecontactPlanning,
          choose(Y,contactPlanning(Y)),
          true,
          stringappend(adu_heading_with_preposition(), " might be allowed here")
        ),
        somenotallowedreason,
        stringappend(adu_heading_with_preposition(), " is not allowed here"),
        zoningdoesntallow,
        stringappend(adu_heading_with_preposition(), " is not allowed here"),
        true,
        stringappend(adu_heading_with_preposition(), " is not allowed here")
      ), Y
    )
    
    california_law_applies :- ~evaluate(jurisdictionimplemented(),yes)
    
    %Nav rules -- separate them out
    attribute(locationtext,placeholder,X) :- locationvalue(X)
    
    attribute(backtooverview(D),href,Y) :- apn(A) & address(B) & evaluate(
      stringappend(
        "/overview/",
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            "&jurisdiction=",getjur()
          )
        )
      ), Y
    )
    
    attribute(designlink(X),href,Y) :- apn(A) & address(B) & evaluate(
      stringappend(
        "/design/",
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            if(
              somehometype,
              stringappend("&residence=",choose(H,hometype(H))),
              true,
              ""
            ),
            "&jurisdiction=",getjur()
          )
        )
      ), Y
    )
    
    attribute(sketchlink(X),href,Y) :- apn(A) & address(B) & uuid(P) & evaluate(
      stringappend(
        "/sketch/",
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            "&project=",P,
            if(
              somehometype,
              stringappend("&residence=",choose(H,hometype(H))),
              true,
              ""
            ),
            "&jurisdiction=",getjur()
          )
        )
      ), Y
    )
    
    attribute(reportlink(X),href,Y) :- apn(A) & address(B) & evaluate(
      stringappend(
        "/designstandards/",
        convertbtoa(
          stringappend(
            "&apn=",A,
            "&address=",B,
            if(
              somehometype,
              stringappend("&residence=",choose(H,hometype(H))),
              true,
              ""
            ),
            "&jurisdiction=",getjur()
          )
        )
      ), Y
    )
    
    style(designlink(D),display,X) :- evaluate(
      if (
        design_disabled,
        "none",
        true,
        ""
      ), X
    )
    
    attribute(designlink(X),onclick,"return openandcheckdisclaimer()")
    attribute(sketchlink(X),onclick,"return true;")
    attribute(reportlink(X),onclick,"visitlinkonlogin(this.getAttribute('href')); return false;")
    
    attribute(designlink(2),class,X) :- evaluate(
      if (
        design_disabled,
        "disabled black",
        notallowed,
        "disabled black",
        true,
        ""
      ), X
    )
    
    attribute(designlink(1),class,X) :- evaluate(
      if(
        somestatus & ~notallowed,
        "link designlink",
        true,
        "link designlink disabled"
      ), X
    )
    attribute(sketchlink(1),class,X) :- evaluate(
      if(
        somestatus & ~notallowed,
        "link designlink",
        true,
        "link designlink disabled"
      ), X
    )
    
    locationvalue(X) :- addresstext(A) & apn(B) & jurisdiction(C) & jurisdictionname(C,N) & evaluate(
      if(
        distinct(A,"-"),
        A,
        true,
        stringappend(B,", ",N)
      ), X
    )
    jurisdictionname(X,Y) :- evaluate(getjur(),X) & evaluate(getjurprettyname(),Y)
    jurisdictionlink(X,Y,Z) :- evaluate(getjur(),X) & evaluate(getplanningdescriptiontext(),Y) & evaluate(planningdeptlink(),Z)
    addresstext(Y) :- address(X) & evaluate(
      if(
        empty(X),
        "-",
        true,
        capitalizeone(X)
      ), Y
    )
    
     %If there is an address, use everything before the ","| If just APN, then use APN + Jur
    innerhtml(title,X) :- locationvalue(K) & addresstext(I) & evaluate(
      stringappend(
        "ADU Report | ",
        if(
        matches(I,"-"),
        K,
        true,
        choose(V,matches(K,"^([^,]*),.*$",V))
        ),
        " | Symbium Build"
      ), X
    )