@kahwee/sf-map-svg 1.5.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +160 -6
  3. package/SOURCES.md +34 -0
  4. package/dist/data/README.md +5 -1
  5. package/dist/data/candidates/2016-11-08.json +1 -0
  6. package/dist/data/candidates/2018-11-06.json +1 -0
  7. package/dist/data/candidates/2020-11-03.json +1 -0
  8. package/dist/data/candidates/2022-11-08.json +1 -0
  9. package/dist/data/candidates/2024-11-05.json +1 -0
  10. package/dist/data/candidates/2026-06-02.json +1 -0
  11. package/dist/data/candidates/README.md +43 -0
  12. package/dist/data/candidates/catalog.json +40 -0
  13. package/dist/data/types.d.ts +4 -1
  14. package/dist/src/api.d.ts +3 -0
  15. package/dist/src/api.js +3 -0
  16. package/dist/src/camera.d.ts +16 -0
  17. package/dist/src/camera.js +55 -0
  18. package/dist/src/clusters.d.ts +7 -0
  19. package/dist/src/clusters.js +33 -0
  20. package/dist/src/configuration.d.ts +5 -0
  21. package/dist/src/configuration.js +73 -0
  22. package/dist/src/controller-types.d.ts +84 -0
  23. package/dist/src/controller-types.js +1 -0
  24. package/dist/src/explorer-core.d.ts +1 -1
  25. package/dist/src/explorer-core.js +570 -145
  26. package/dist/src/features.d.ts +24 -0
  27. package/dist/src/features.js +99 -0
  28. package/dist/src/guide-data.js +3 -2
  29. package/dist/src/guide-detailed.js +3 -2
  30. package/dist/src/guide-map.d.ts +4 -0
  31. package/dist/src/guide-map.js +35 -10
  32. package/dist/src/guide-shell.d.ts +2 -0
  33. package/dist/src/guide-shell.js +16 -0
  34. package/dist/src/guide-static.d.ts +9 -0
  35. package/dist/src/guide-static.js +26 -0
  36. package/dist/src/guide.d.ts +2 -1
  37. package/dist/src/guide.js +1 -1
  38. package/dist/src/interactive-data.d.ts +1 -1
  39. package/dist/src/interactive-data.js +2 -0
  40. package/dist/src/interactive.d.ts +1 -1
  41. package/dist/src/interactive.js +2 -0
  42. package/dist/src/layers.js +3 -1
  43. package/dist/src/map-core.js +3 -8
  44. package/dist/src/map.d.ts +7 -0
  45. package/dist/src/map.js +106 -0
  46. package/dist/src/presets.d.ts +3 -0
  47. package/dist/src/presets.js +17 -0
  48. package/dist/src/static.d.ts +10 -0
  49. package/dist/src/static.js +5 -0
  50. package/dist/src/types.d.ts +73 -9
  51. package/dist/src/validation.d.ts +7 -0
  52. package/dist/src/validation.js +226 -0
  53. package/dist/src/viewport.js +9 -2
  54. package/docs/EXAMPLES.md +11 -1
  55. package/docs/api-audit.md +80 -0
  56. package/docs/consumer-integration.md +165 -0
  57. package/docs/guide-bundle-report.md +19 -0
  58. package/docs/migration-v2.md +238 -0
  59. package/package.json +40 -11
@@ -0,0 +1 @@
1
+ {"electionDate":"2022-11-08","electionName":"2022-11-08 San Francisco candidate results","districtYear":2022,"certifiedDate":"2022-12-01","downloadedDate":"2026-09-26","source":"https://www.sfelections.org/results/20221108/data/20221201/dsov.xlsx","sourceSha256":"68d450db01488b5f8fd81fac0f70feaaf460dbc6bc36c1904816c813f72d8183","geography":"Votes cast in San Francisco, reported by supervisorial district. Congressional and state legislative contests include only eligible portions of each district.","method":"Candidate vote share divides a candidate count by all valid votes in that contest and area. Write-ins are included when reported. District eligibility uses registered-voter counts in the official workbook compared with the election’s citywide presidential or gubernatorial contest. Missing supervisorial rows indicate no eligible voters, not zero support. County cumulative votes, when present, are recorded separately as unassigned.","contests":[{"id":"governor","title":"GOVERNOR","sourceSheet":"Sheet2","candidates":[{"name":"BRIAN DAHLE","party":"REP","sourceColumn":7},{"name":"GAVIN NEWSOM","party":"DEM","sourceColumn":9}],"citywide":{"votes":[44064,257402],"totalVotes":301466,"registeredVoters":497561,"undervotes":8465,"overvotes":59,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[4993,24642],"totalVotes":29635,"registeredVoters":45398,"undervotes":878,"overvotes":8,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5225,26171],"totalVotes":31396,"registeredVoters":46544,"undervotes":685,"overvotes":5,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[3686,19866],"totalVotes":23552,"registeredVoters":41094,"undervotes":857,"overvotes":4,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[6653,22551],"totalVotes":29204,"registeredVoters":48073,"undervotes":979,"overvotes":7,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2299,22839],"totalVotes":25138,"registeredVoters":42963,"undervotes":791,"overvotes":7,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2472,15815],"totalVotes":18287,"registeredVoters":33835,"undervotes":471,"overvotes":1,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[5858,27579],"totalVotes":33437,"registeredVoters":49306,"undervotes":839,"overvotes":6,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2739,38771],"totalVotes":41510,"registeredVoters":56528,"undervotes":934,"overvotes":3,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2647,24553],"totalVotes":27200,"registeredVoters":46401,"undervotes":908,"overvotes":6,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3002,17283],"totalVotes":20285,"registeredVoters":43017,"undervotes":486,"overvotes":5,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[4490,17332],"totalVotes":21822,"registeredVoters":44402,"undervotes":637,"overvotes":7,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"lieutenant-governor","title":"LIEUTENANT GOVERNOR","sourceSheet":"Sheet3","candidates":[{"name":"ANGELA E. UNDERWOOD JACOBS","party":"REP","sourceColumn":7},{"name":"ELENI KOUNALAKIS","party":"DEM","sourceColumn":9}],"citywide":{"votes":[45663,246398],"totalVotes":292061,"registeredVoters":497561,"undervotes":17867,"overvotes":62,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[4981,23686],"totalVotes":28667,"registeredVoters":45398,"undervotes":1845,"overvotes":9,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5291,25162],"totalVotes":30453,"registeredVoters":46544,"undervotes":1630,"overvotes":3,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[3802,19127],"totalVotes":22929,"registeredVoters":41094,"undervotes":1478,"overvotes":6,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[6756,21270],"totalVotes":28026,"registeredVoters":48073,"undervotes":2161,"overvotes":3,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2605,21711],"totalVotes":24316,"registeredVoters":42963,"undervotes":1609,"overvotes":11,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2620,15144],"totalVotes":17764,"registeredVoters":33835,"undervotes":990,"overvotes":5,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[5745,26812],"totalVotes":32557,"registeredVoters":49306,"undervotes":1721,"overvotes":4,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2723,37757],"totalVotes":40480,"registeredVoters":56528,"undervotes":1961,"overvotes":6,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2895,23458],"totalVotes":26353,"registeredVoters":46401,"undervotes":1756,"overvotes":5,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3434,16085],"totalVotes":19519,"registeredVoters":43017,"undervotes":1252,"overvotes":5,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[4811,16186],"totalVotes":20997,"registeredVoters":44402,"undervotes":1464,"overvotes":5,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"secretary-of-state","title":"SECRETARY OF STATE","sourceSheet":"Sheet4","candidates":[{"name":"ROB BERNOSKY","party":"REP","sourceColumn":7},{"name":"SHIRLEY N. WEBER","party":"DEM","sourceColumn":9}],"citywide":{"votes":[46696,247726],"totalVotes":294422,"registeredVoters":497561,"undervotes":15524,"overvotes":44,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[5225,23569],"totalVotes":28794,"registeredVoters":45398,"undervotes":1719,"overvotes":8,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5670,24773],"totalVotes":30443,"registeredVoters":46544,"undervotes":1643,"overvotes":0,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[3944,19031],"totalVotes":22975,"registeredVoters":41094,"undervotes":1433,"overvotes":5,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[7011,20992],"totalVotes":28003,"registeredVoters":48073,"undervotes":2186,"overvotes":1,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2514,22210],"totalVotes":24724,"registeredVoters":42963,"undervotes":1203,"overvotes":9,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2604,15231],"totalVotes":17835,"registeredVoters":33835,"undervotes":922,"overvotes":2,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[6012,26718],"totalVotes":32730,"registeredVoters":49306,"undervotes":1551,"overvotes":1,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2840,38122],"totalVotes":40962,"registeredVoters":56528,"undervotes":1483,"overvotes":2,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2772,24256],"totalVotes":27028,"registeredVoters":46401,"undervotes":1080,"overvotes":6,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3263,16437],"totalVotes":19700,"registeredVoters":43017,"undervotes":1072,"overvotes":4,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[4841,16387],"totalVotes":21228,"registeredVoters":44402,"undervotes":1232,"overvotes":6,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"controller","title":"CONTROLLER","sourceSheet":"Sheet5","candidates":[{"name":"MALIA M. COHEN","party":"DEM","sourceColumn":7},{"name":"LANHEE J. CHEN","party":"REP","sourceColumn":9}],"citywide":{"votes":[221334,70094],"totalVotes":291428,"registeredVoters":497561,"undervotes":18474,"overvotes":88,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[20939,7631],"totalVotes":28570,"registeredVoters":45398,"undervotes":1942,"overvotes":9,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[21377,8806],"totalVotes":30183,"registeredVoters":46544,"undervotes":1890,"overvotes":13,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[16874,5866],"totalVotes":22740,"registeredVoters":41094,"undervotes":1663,"overvotes":10,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[18545,9580],"totalVotes":28125,"registeredVoters":48073,"undervotes":2060,"overvotes":5,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[20309,3960],"totalVotes":24269,"registeredVoters":42963,"undervotes":1658,"overvotes":9,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[13516,4157],"totalVotes":17673,"registeredVoters":33835,"undervotes":1080,"overvotes":6,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[23655,8864],"totalVotes":32519,"registeredVoters":49306,"undervotes":1756,"overvotes":7,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[34128,6080],"totalVotes":40208,"registeredVoters":56528,"undervotes":2232,"overvotes":7,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[22049,4305],"totalVotes":26354,"registeredVoters":46401,"undervotes":1749,"overvotes":11,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[14833,4791],"totalVotes":19624,"registeredVoters":43017,"undervotes":1148,"overvotes":4,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[15109,6054],"totalVotes":21163,"registeredVoters":44402,"undervotes":1296,"overvotes":7,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"treasurer","title":"TREASURER","sourceSheet":"Sheet6","candidates":[{"name":"FIONA MA","party":"DEM","sourceColumn":7},{"name":"JACK M. GUERRERO","party":"REP","sourceColumn":9}],"citywide":{"votes":[243406,46681],"totalVotes":290087,"registeredVoters":497561,"undervotes":19856,"overvotes":47,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[23420,5028],"totalVotes":28448,"registeredVoters":45398,"undervotes":2070,"overvotes":3,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[23699,6227],"totalVotes":29926,"registeredVoters":46544,"undervotes":2156,"overvotes":4,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[18705,3952],"totalVotes":22657,"registeredVoters":41094,"undervotes":1753,"overvotes":3,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[21861,6345],"totalVotes":28206,"registeredVoters":48073,"undervotes":1982,"overvotes":2,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[21362,2671],"totalVotes":24033,"registeredVoters":42963,"undervotes":1895,"overvotes":8,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[14863,2746],"totalVotes":17609,"registeredVoters":33835,"undervotes":1148,"overvotes":2,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[26579,5855],"totalVotes":32434,"registeredVoters":49306,"undervotes":1844,"overvotes":4,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[36439,3381],"totalVotes":39820,"registeredVoters":56528,"undervotes":2623,"overvotes":4,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[23217,2932],"totalVotes":26149,"registeredVoters":46401,"undervotes":1960,"overvotes":5,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[16432,3150],"totalVotes":19582,"registeredVoters":43017,"undervotes":1190,"overvotes":4,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[16829,4394],"totalVotes":21223,"registeredVoters":44402,"undervotes":1235,"overvotes":8,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"attorney-general","title":"ATTORNEY GENERAL","sourceSheet":"Sheet7","candidates":[{"name":"ROB BONTA","party":"DEM","sourceColumn":7},{"name":"NATHAN HOCHMAN","party":"REP","sourceColumn":9}],"citywide":{"votes":[246762,48785],"totalVotes":295547,"registeredVoters":497561,"undervotes":14398,"overvotes":45,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[23487,5468],"totalVotes":28955,"registeredVoters":45398,"undervotes":1564,"overvotes":2,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[24382,6151],"totalVotes":30533,"registeredVoters":46544,"undervotes":1547,"overvotes":6,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[18945,4093],"totalVotes":23038,"registeredVoters":41094,"undervotes":1372,"overvotes":3,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[21077,7113],"totalVotes":28190,"registeredVoters":48073,"undervotes":1995,"overvotes":5,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[22105,2674],"totalVotes":24779,"registeredVoters":42963,"undervotes":1151,"overvotes":6,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[15027,2846],"totalVotes":17873,"registeredVoters":33835,"undervotes":885,"overvotes":1,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[26579,6291],"totalVotes":32870,"registeredVoters":49306,"undervotes":1411,"overvotes":1,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[37854,3247],"totalVotes":41101,"registeredVoters":56528,"undervotes":1341,"overvotes":5,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[24295,2813],"totalVotes":27108,"registeredVoters":46401,"undervotes":1000,"overvotes":6,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[16414,3359],"totalVotes":19773,"registeredVoters":43017,"undervotes":1000,"overvotes":3,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[16597,4730],"totalVotes":21327,"registeredVoters":44402,"undervotes":1132,"overvotes":7,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"insurance-commissioner","title":"INSURANCE COMMISSIONER","sourceSheet":"Sheet8","candidates":[{"name":"ROBERT HOWELL","party":"REP","sourceColumn":7},{"name":"RICARDO LARA","party":"DEM","sourceColumn":9}],"citywide":{"votes":[45567,237225],"totalVotes":282792,"registeredVoters":497561,"undervotes":27151,"overvotes":47,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[5096,22466],"totalVotes":27562,"registeredVoters":45398,"undervotes":2953,"overvotes":6,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5548,23549],"totalVotes":29097,"registeredVoters":46544,"undervotes":2988,"overvotes":1,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[3814,18203],"totalVotes":22017,"registeredVoters":41094,"undervotes":2390,"overvotes":6,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[6643,20344],"totalVotes":26987,"registeredVoters":48073,"undervotes":3199,"overvotes":4,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2545,21096],"totalVotes":23641,"registeredVoters":42963,"undervotes":2289,"overvotes":6,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2572,14616],"totalVotes":17188,"registeredVoters":33835,"undervotes":1568,"overvotes":3,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[5940,25554],"totalVotes":31494,"registeredVoters":49306,"undervotes":2784,"overvotes":4,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[3019,36192],"totalVotes":39211,"registeredVoters":56528,"undervotes":3231,"overvotes":5,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2695,23154],"totalVotes":25849,"registeredVoters":46401,"undervotes":2261,"overvotes":4,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3162,15955],"totalVotes":19117,"registeredVoters":43017,"undervotes":1656,"overvotes":3,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[4533,16096],"totalVotes":20629,"registeredVoters":44402,"undervotes":1832,"overvotes":5,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"board-of-equalization","title":"BOARD OF EQUALIZATION","sourceSheet":"Sheet9","candidates":[{"name":"PETER COE VERBICA","party":"REP","sourceColumn":7},{"name":"SALLY J. LIEBER","party":"DEM","sourceColumn":9}],"citywide":{"votes":[49170,229851],"totalVotes":279021,"registeredVoters":497561,"undervotes":30930,"overvotes":39,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[5477,21701],"totalVotes":27178,"registeredVoters":45398,"undervotes":3341,"overvotes":2,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[6210,22077],"totalVotes":28287,"registeredVoters":46544,"undervotes":3797,"overvotes":2,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[4117,17559],"totalVotes":21676,"registeredVoters":41094,"undervotes":2733,"overvotes":4,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[7010,19589],"totalVotes":26599,"registeredVoters":48073,"undervotes":3587,"overvotes":4,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2655,20831],"totalVotes":23486,"registeredVoters":42963,"undervotes":2444,"overvotes":6,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2817,14084],"totalVotes":16901,"registeredVoters":33835,"undervotes":1856,"overvotes":2,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[6377,24658],"totalVotes":31035,"registeredVoters":49306,"undervotes":3244,"overvotes":3,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[3444,35214],"totalVotes":38658,"registeredVoters":56528,"undervotes":3788,"overvotes":1,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2928,22961],"totalVotes":25889,"registeredVoters":46401,"undervotes":2217,"overvotes":8,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3358,15452],"totalVotes":18810,"registeredVoters":43017,"undervotes":1963,"overvotes":3,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[4777,15725],"totalVotes":20502,"registeredVoters":44402,"undervotes":1960,"overvotes":4,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"united-states-senator","title":"UNITED STATES SENATOR","sourceSheet":"Sheet10","candidates":[{"name":"ALEX PADILLA","party":"DEM","sourceColumn":7},{"name":"MARK P. MEUSER","party":"REP","sourceColumn":9}],"citywide":{"votes":[254756,42699],"totalVotes":297455,"registeredVoters":497561,"undervotes":12330,"overvotes":205,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[24323,4820],"totalVotes":29143,"registeredVoters":45398,"undervotes":1363,"overvotes":15,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[25993,5023],"totalVotes":31016,"registeredVoters":46544,"undervotes":1058,"overvotes":12,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[19680,3546],"totalVotes":23226,"registeredVoters":41094,"undervotes":1173,"overvotes":14,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[21689,6622],"totalVotes":28311,"registeredVoters":48073,"undervotes":1864,"overvotes":15,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[22637,2283],"totalVotes":24920,"registeredVoters":42963,"undervotes":986,"overvotes":30,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[15715,2313],"totalVotes":18028,"registeredVoters":33835,"undervotes":716,"overvotes":15,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[27433,5634],"totalVotes":33067,"registeredVoters":49306,"undervotes":1202,"overvotes":13,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[39060,2462],"totalVotes":41522,"registeredVoters":56528,"undervotes":902,"overvotes":23,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[24764,2445],"totalVotes":27209,"registeredVoters":46401,"undervotes":885,"overvotes":20,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[16679,3050],"totalVotes":19729,"registeredVoters":43017,"undervotes":1023,"overvotes":24,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[16783,4501],"totalVotes":21284,"registeredVoters":44402,"undervotes":1158,"overvotes":24,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"united-states-senator-partial-term","title":"UNITED STATES SENATOR PARTIAL TERM","sourceSheet":"Sheet11","candidates":[{"name":"ALEX PADILLA","party":"DEM","sourceColumn":7},{"name":"MARK P. MEUSER","party":"REP","sourceColumn":9}],"citywide":{"votes":[253856,42871],"totalVotes":296727,"registeredVoters":497561,"undervotes":13164,"overvotes":99,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[24280,4801],"totalVotes":29081,"registeredVoters":45398,"undervotes":1431,"overvotes":9,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[25937,5005],"totalVotes":30942,"registeredVoters":46544,"undervotes":1139,"overvotes":5,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[19602,3579],"totalVotes":23181,"registeredVoters":41094,"undervotes":1225,"overvotes":7,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[21596,6632],"totalVotes":28228,"registeredVoters":48073,"undervotes":1953,"overvotes":9,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[22539,2298],"totalVotes":24837,"registeredVoters":42963,"undervotes":1085,"overvotes":14,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[15647,2343],"totalVotes":17990,"registeredVoters":33835,"undervotes":760,"overvotes":9,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[27363,5608],"totalVotes":32971,"registeredVoters":49306,"undervotes":1305,"overvotes":6,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[38962,2500],"totalVotes":41462,"registeredVoters":56528,"undervotes":980,"overvotes":5,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[24639,2496],"totalVotes":27135,"registeredVoters":46401,"undervotes":968,"overvotes":11,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[16640,3063],"totalVotes":19703,"registeredVoters":43017,"undervotes":1063,"overvotes":10,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[16651,4546],"totalVotes":21197,"registeredVoters":44402,"undervotes":1255,"overvotes":14,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"us-house-of-rep-district-11","title":"US HOUSE OF REP DISTRICT 11","sourceSheet":"Sheet13","candidates":[{"name":"JOHN DENNIS","party":"REP","sourceColumn":7},{"name":"NANCY PELOSI","party":"DEM","sourceColumn":9}],"citywide":{"votes":[42217,220848],"totalVotes":263065,"registeredVoters":436996,"undervotes":17359,"overvotes":45,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[5455,23058],"totalVotes":28513,"registeredVoters":45398,"undervotes":2004,"overvotes":4,"sourceRow":43,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5662,24791],"totalVotes":30453,"registeredVoters":46544,"undervotes":1629,"overvotes":4,"sourceRow":47,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[4213,18384],"totalVotes":22597,"registeredVoters":41094,"undervotes":1813,"overvotes":3,"sourceRow":51,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[7495,20578],"totalVotes":28073,"registeredVoters":48073,"undervotes":2115,"overvotes":2,"sourceRow":55,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2763,21360],"totalVotes":24123,"registeredVoters":42963,"undervotes":1807,"overvotes":6,"sourceRow":59,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2780,14860],"totalVotes":17640,"registeredVoters":33835,"undervotes":1116,"overvotes":3,"sourceRow":63,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[6073,25993],"totalVotes":32066,"registeredVoters":48708,"undervotes":1847,"overvotes":9,"sourceRow":67,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[3018,37244],"totalVotes":40262,"registeredVoters":56528,"undervotes":2180,"overvotes":5,"sourceRow":71,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2051,20433],"totalVotes":22484,"registeredVoters":38330,"undervotes":1742,"overvotes":7,"sourceRow":75,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[2300,13047],"totalVotes":15347,"registeredVoters":32365,"undervotes":977,"overvotes":2,"sourceRow":79,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[407,1100],"totalVotes":1507,"registeredVoters":3158,"undervotes":129,"overvotes":0,"sourceRow":83,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"us-house-of-rep-district-15","title":"US HOUSE OF REP DISTRICT 15","sourceSheet":"Sheet15","candidates":[{"name":"DAVID J. CANEPA","party":"DEM","sourceColumn":7},{"name":"KEVIN MULLIN","party":"DEM","sourceColumn":9}],"citywide":{"votes":[12132,12204],"totalVotes":24336,"registeredVoters":60565,"undervotes":5141,"overvotes":44,"sourceRow":14},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":3,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[132,145],"totalVotes":277,"registeredVoters":598,"undervotes":83,"overvotes":0,"sourceRow":43,"partiallyEligible":true},{"district":8,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[1560,1557],"totalVotes":3117,"registeredVoters":8071,"undervotes":758,"overvotes":6,"sourceRow":47,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[1814,1739],"totalVotes":3553,"registeredVoters":10652,"undervotes":890,"overvotes":7,"sourceRow":51,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[8626,8763],"totalVotes":17389,"registeredVoters":41244,"undervotes":3410,"overvotes":31,"sourceRow":55,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-assembly-member-district-17","title":"STATE ASSEMBLY MEMBER DISTRICT 17","sourceSheet":"Sheet18","candidates":[{"name":"DAVID CAMPOS","party":"DEM","sourceColumn":7},{"name":"MATT HANEY","party":"DEM","sourceColumn":9}],"citywide":{"votes":[45470,101891],"totalVotes":147361,"registeredVoters":281435,"undervotes":21092,"overvotes":149,"sourceRow":14},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[808,2063],"totalVotes":2871,"registeredVoters":4872,"undervotes":460,"overvotes":3,"sourceRow":43,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[5191,12029],"totalVotes":17220,"registeredVoters":35104,"undervotes":3101,"overvotes":18,"sourceRow":47,"partiallyEligible":true},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[4968,11048],"totalVotes":16016,"registeredVoters":32383,"undervotes":2173,"overvotes":21,"sourceRow":51,"partiallyEligible":true},{"district":6,"eligible":true,"votes":[4174,12375],"totalVotes":16549,"registeredVoters":33835,"undervotes":2194,"overvotes":16,"sourceRow":55,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[2923,7817],"totalVotes":10740,"registeredVoters":17334,"undervotes":2028,"overvotes":8,"sourceRow":59,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[8669,24139],"totalVotes":32808,"registeredVoters":48796,"undervotes":3655,"overvotes":19,"sourceRow":63,"partiallyEligible":true},{"district":9,"eligible":true,"votes":[9093,15723],"totalVotes":24816,"registeredVoters":46401,"undervotes":3274,"overvotes":24,"sourceRow":67,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[6200,11852],"totalVotes":18052,"registeredVoters":43017,"undervotes":2697,"overvotes":27,"sourceRow":71,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[3444,4845],"totalVotes":8289,"registeredVoters":19693,"undervotes":1510,"overvotes":13,"sourceRow":75,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-assembly-member-district-19","title":"STATE ASSEMBLY MEMBER DISTRICT 19","sourceSheet":"Sheet20","candidates":[{"name":"PHIL TING","party":"DEM","sourceColumn":7},{"name":"KARSTEN WEIDE","party":"REP","sourceColumn":9}],"citywide":{"votes":[106319,23378],"totalVotes":129697,"registeredVoters":216126,"undervotes":11675,"overvotes":16,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[23276,4786],"totalVotes":28062,"registeredVoters":45398,"undervotes":2455,"overvotes":4,"sourceRow":43,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[21061,5146],"totalVotes":26207,"registeredVoters":41672,"undervotes":2545,"overvotes":0,"sourceRow":47,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[3064,593],"totalVotes":3657,"registeredVoters":5990,"undervotes":417,"overvotes":0,"sourceRow":51,"partiallyEligible":true},{"district":4,"eligible":true,"votes":[21424,6262],"totalVotes":27686,"registeredVoters":48073,"undervotes":2502,"overvotes":2,"sourceRow":55,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[6490,502],"totalVotes":6992,"registeredVoters":10580,"undervotes":732,"overvotes":2,"sourceRow":59,"partiallyEligible":true},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[16737,3268],"totalVotes":20005,"registeredVoters":31972,"undervotes":1499,"overvotes":2,"sourceRow":63,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[5118,420],"totalVotes":5538,"registeredVoters":7732,"undervotes":426,"overvotes":1,"sourceRow":67,"partiallyEligible":true},{"district":9,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":10,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[9149,2401],"totalVotes":11550,"registeredVoters":24709,"undervotes":1099,"overvotes":5,"sourceRow":71,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}}]}
@@ -0,0 +1 @@
1
+ {"electionDate":"2024-11-05","electionName":"2024-11-05 San Francisco candidate results","districtYear":2022,"certifiedDate":"2024-12-03","downloadedDate":"2026-09-26","source":"https://www.sfelections.org/results/20241105/data/20241203/dsov.xlsx","sourceSha256":"9bf9c7d767273e73b3cdf5b98086412cbe354b0928ee6abb0e379deb0353c403","geography":"Votes cast in San Francisco, reported by supervisorial district. Congressional and state legislative contests include only eligible portions of each district.","method":"Candidate vote share divides a candidate count by all valid votes in that contest and area. Write-ins are included when reported. District eligibility uses registered-voter counts in the official workbook compared with the election’s citywide presidential or gubernatorial contest. Missing supervisorial rows indicate no eligible voters, not zero support. County cumulative votes, when present, are recorded separately as unassigned.","contests":[{"id":"president-and-vice-president","title":"PRESIDENT AND VICE PRESIDENT","sourceSheet":"Sheet2","candidates":[{"name":"DONALD J. TRUMP / JD VANCE","party":"REP","sourceColumn":7},{"name":"CLAUDIA DE LA CRUZ / KARINA GARCIA","party":"PF","sourceColumn":9},{"name":"KAMALA D. HARRIS / TIM WALZ","party":"DEM","sourceColumn":11},{"name":"ROBERT F. KENNEDY JR. / NICOLE SHANAHAN","party":"AI","sourceColumn":14},{"name":"CHASE OLIVER / MIKE TER MAAT","party":"LIB","sourceColumn":16},{"name":"JILL STEIN / RUDOLPH WARE","party":"GRN","sourceColumn":19},{"name":"Write-in","party":null,"sourceColumn":21}],"citywide":{"votes":[62594,3645,323719,4239,1871,6896,33],"totalVotes":402997,"registeredVoters":522265,"undervotes":8463,"overvotes":661,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[6227,340,30768,409,179,644,7],"totalVotes":38574,"registeredVoters":47357,"undervotes":909,"overvotes":28,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[5678,175,34602,433,286,502,2],"totalVotes":41678,"registeredVoters":49605,"undervotes":1053,"overvotes":24,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[5425,243,26219,357,219,557,5],"totalVotes":33025,"registeredVoters":43795,"undervotes":751,"overvotes":55,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[9057,315,27144,606,165,597,5],"totalVotes":37889,"registeredVoters":49650,"undervotes":1092,"overvotes":45,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[3757,387,28551,318,132,692,3],"totalVotes":33840,"registeredVoters":45398,"undervotes":604,"overvotes":89,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[4108,251,21674,288,150,535,2],"totalVotes":27008,"registeredVoters":37101,"undervotes":516,"overvotes":57,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[6683,313,33758,418,190,705,1],"totalVotes":42068,"registeredVoters":50973,"undervotes":944,"overvotes":36,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2899,418,46960,259,186,895,2],"totalVotes":51619,"registeredVoters":59445,"undervotes":698,"overvotes":25,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[4545,578,30059,343,114,861,2],"totalVotes":36502,"registeredVoters":48350,"undervotes":618,"overvotes":93,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[5740,248,22193,362,136,438,2],"totalVotes":29119,"registeredVoters":44643,"undervotes":585,"overvotes":86,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[8475,377,21791,446,114,470,2],"totalVotes":31675,"registeredVoters":45948,"undervotes":693,"overvotes":123,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0]}},{"id":"united-states-senator","title":"UNITED STATES SENATOR","sourceSheet":"Sheet3","candidates":[{"name":"STEVE GARVEY","party":"REP","sourceColumn":7},{"name":"ADAM B. SCHIFF","party":"DEM","sourceColumn":9}],"citywide":{"votes":[66421,310932],"totalVotes":377353,"registeredVoters":522265,"undervotes":34597,"overvotes":171,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[6699,29637],"totalVotes":36336,"registeredVoters":47357,"undervotes":3164,"overvotes":11,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[7537,32617],"totalVotes":40154,"registeredVoters":49605,"undervotes":2585,"overvotes":16,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[5710,24907],"totalVotes":30617,"registeredVoters":43795,"undervotes":3198,"overvotes":16,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[9197,26123],"totalVotes":35320,"registeredVoters":49650,"undervotes":3695,"overvotes":11,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[3981,27296],"totalVotes":31277,"registeredVoters":45398,"undervotes":3234,"overvotes":22,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[4477,20749],"totalVotes":25226,"registeredVoters":37101,"undervotes":2345,"overvotes":10,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[7428,32568],"totalVotes":39996,"registeredVoters":50973,"undervotes":3041,"overvotes":11,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[3787,45525],"totalVotes":49312,"registeredVoters":59445,"undervotes":3023,"overvotes":7,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[4507,29105],"totalVotes":33612,"registeredVoters":48350,"undervotes":3573,"overvotes":28,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[5501,21136],"totalVotes":26637,"registeredVoters":44643,"undervotes":3142,"overvotes":11,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[7597,21269],"totalVotes":28866,"registeredVoters":45948,"undervotes":3597,"overvotes":28,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"united-states-senator-partial-term","title":"UNITED STATES SENATOR PARTIAL TERM","sourceSheet":"Sheet4","candidates":[{"name":"STEVE GARVEY","party":"REP","sourceColumn":7},{"name":"ADAM B. SCHIFF","party":"DEM","sourceColumn":9}],"citywide":{"votes":[65547,307511],"totalVotes":373058,"registeredVoters":522265,"undervotes":38960,"overvotes":103,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[6596,29290],"totalVotes":35886,"registeredVoters":47357,"undervotes":3619,"overvotes":6,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[7534,32286],"totalVotes":39820,"registeredVoters":49605,"undervotes":2927,"overvotes":8,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[5698,24606],"totalVotes":30304,"registeredVoters":43795,"undervotes":3521,"overvotes":6,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[8940,25899],"totalVotes":34839,"registeredVoters":49650,"undervotes":4182,"overvotes":5,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[3918,27002],"totalVotes":30920,"registeredVoters":45398,"undervotes":3602,"overvotes":11,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[4472,20527],"totalVotes":24999,"registeredVoters":37101,"undervotes":2574,"overvotes":8,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[7349,32178],"totalVotes":39527,"registeredVoters":50973,"undervotes":3510,"overvotes":11,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[3788,45160],"totalVotes":48948,"registeredVoters":59445,"undervotes":3393,"overvotes":1,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[4468,28742],"totalVotes":33210,"registeredVoters":48350,"undervotes":3982,"overvotes":21,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[5366,20823],"totalVotes":26189,"registeredVoters":44643,"undervotes":3591,"overvotes":10,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[7418,20998],"totalVotes":28416,"registeredVoters":45948,"undervotes":4059,"overvotes":16,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"united-states-representative-district-11","title":"UNITED STATES REPRESENTATIVE, DISTRICT 11","sourceSheet":"Sheet6","candidates":[{"name":"BRUCE LOU","party":"REP","sourceColumn":7},{"name":"NANCY PELOSI","party":"DEM","sourceColumn":9}],"citywide":{"votes":[64315,274796],"totalVotes":339111,"registeredVoters":459732,"undervotes":30043,"overvotes":77,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[7686,28550],"totalVotes":36236,"registeredVoters":47357,"undervotes":3269,"overvotes":6,"sourceRow":43,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[8224,31786],"totalVotes":40010,"registeredVoters":49605,"undervotes":2741,"overvotes":4,"sourceRow":47,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[6790,23830],"totalVotes":30620,"registeredVoters":43795,"undervotes":3196,"overvotes":15,"sourceRow":51,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[10517,24960],"totalVotes":35477,"registeredVoters":49650,"undervotes":3540,"overvotes":9,"sourceRow":55,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[4599,26731],"totalVotes":31330,"registeredVoters":45398,"undervotes":3197,"overvotes":6,"sourceRow":59,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[5354,19907],"totalVotes":25261,"registeredVoters":37101,"undervotes":2313,"overvotes":7,"sourceRow":63,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[8266,31135],"totalVotes":39401,"registeredVoters":50325,"undervotes":3133,"overvotes":9,"sourceRow":67,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[4589,44442],"totalVotes":49031,"registeredVoters":59445,"undervotes":3307,"overvotes":4,"sourceRow":71,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[3556,25008],"totalVotes":28564,"registeredVoters":40090,"undervotes":3091,"overvotes":12,"sourceRow":75,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[4098,17000],"totalVotes":21098,"registeredVoters":33727,"undervotes":2011,"overvotes":5,"sourceRow":79,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[636,1447],"totalVotes":2083,"registeredVoters":3239,"undervotes":245,"overvotes":0,"sourceRow":83,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"united-states-representative-district-15","title":"UNITED STATES REPRESENTATIVE, DISTRICT 15","sourceSheet":"Sheet8","candidates":[{"name":"KEVIN MULLIN","party":"DEM","sourceColumn":7},{"name":"ANNA CHENG KRAMER","party":"REP","sourceColumn":9}],"citywide":{"votes":[25287,10863],"totalVotes":36150,"registeredVoters":62533,"undervotes":6726,"overvotes":14,"sourceRow":14},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":3,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[309,115],"totalVotes":424,"registeredVoters":648,"undervotes":81,"overvotes":0,"sourceRow":43,"partiallyEligible":true},{"district":8,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[3129,1517],"totalVotes":4646,"registeredVoters":8260,"undervotes":898,"overvotes":2,"sourceRow":47,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[3631,1869],"totalVotes":5500,"registeredVoters":10916,"undervotes":1172,"overvotes":4,"sourceRow":51,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[18218,7362],"totalVotes":25580,"registeredVoters":42709,"undervotes":4575,"overvotes":8,"sourceRow":55,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-senator-district-11","title":"STATE SENATOR, DISTRICT 11","sourceSheet":"Sheet10","candidates":[{"name":"SCOTT WIENER","party":"DEM","sourceColumn":7},{"name":"YVETTE CORKREAN","party":"REP","sourceColumn":9}],"citywide":{"votes":[291123,77944],"totalVotes":369067,"registeredVoters":522265,"undervotes":42947,"overvotes":107,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[26975,8237],"totalVotes":35212,"registeredVoters":47357,"undervotes":4288,"overvotes":11,"sourceRow":47,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[30322,8794],"totalVotes":39116,"registeredVoters":49605,"undervotes":3632,"overvotes":7,"sourceRow":51,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[23510,6431],"totalVotes":29941,"registeredVoters":43795,"undervotes":3880,"overvotes":10,"sourceRow":55,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[23280,11114],"totalVotes":34394,"registeredVoters":49650,"undervotes":4624,"overvotes":8,"sourceRow":59,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[26322,4430],"totalVotes":30752,"registeredVoters":45398,"undervotes":3769,"overvotes":12,"sourceRow":63,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[19763,5132],"totalVotes":24895,"registeredVoters":37101,"undervotes":2676,"overvotes":10,"sourceRow":67,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[29707,9229],"totalVotes":38936,"registeredVoters":50973,"undervotes":4105,"overvotes":7,"sourceRow":71,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[43375,4895],"totalVotes":48270,"registeredVoters":59445,"undervotes":4068,"overvotes":4,"sourceRow":75,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[27497,5228],"totalVotes":32725,"registeredVoters":48350,"undervotes":4470,"overvotes":18,"sourceRow":79,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[20286,6032],"totalVotes":26318,"registeredVoters":44643,"undervotes":3464,"overvotes":8,"sourceRow":83,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[20086,8422],"totalVotes":28508,"registeredVoters":45948,"undervotes":3971,"overvotes":12,"sourceRow":87,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-assembly-member-district-17","title":"STATE ASSEMBLY MEMBER, DISTRICT 17","sourceSheet":"Sheet12","candidates":[{"name":"MATT HANEY","party":"DEM","sourceColumn":7},{"name":"MANUEL NORIS-BARRERA","party":"REP","sourceColumn":9}],"citywide":{"votes":[169490,30900],"totalVotes":200390,"registeredVoters":296147,"undervotes":26383,"overvotes":50,"sourceRow":14},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[3421,539],"totalVotes":3960,"registeredVoters":5262,"undervotes":475,"overvotes":0,"sourceRow":43,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[19993,4590],"totalVotes":24583,"registeredVoters":37365,"undervotes":3705,"overvotes":9,"sourceRow":47,"partiallyEligible":true},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[18758,2876],"totalVotes":21634,"registeredVoters":34158,"undervotes":3273,"overvotes":6,"sourceRow":51,"partiallyEligible":true},{"district":6,"eligible":true,"votes":[20322,4237],"totalVotes":24559,"registeredVoters":37101,"undervotes":3015,"overvotes":7,"sourceRow":55,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[10838,2866],"totalVotes":13704,"registeredVoters":17691,"undervotes":1458,"overvotes":3,"sourceRow":59,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[37813,3377],"totalVotes":41190,"registeredVoters":51343,"undervotes":3951,"overvotes":0,"sourceRow":63,"partiallyEligible":true},{"district":9,"eligible":true,"votes":[28287,4353],"totalVotes":32640,"registeredVoters":48350,"undervotes":4564,"overvotes":9,"sourceRow":67,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[20922,4974],"totalVotes":25896,"registeredVoters":44643,"undervotes":3885,"overvotes":9,"sourceRow":71,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[9136,3088],"totalVotes":12224,"registeredVoters":20234,"undervotes":2057,"overvotes":7,"sourceRow":75,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-assembly-member-district-19","title":"STATE ASSEMBLY MEMBER, DISTRICT 19","sourceSheet":"Sheet14","candidates":[{"name":"CATHERINE STEFANI","party":"DEM","sourceColumn":7},{"name":"DAVID E. LEE","party":"DEM","sourceColumn":9}],"citywide":{"votes":[95423,56913],"totalVotes":152336,"registeredVoters":226118,"undervotes":32860,"overvotes":102,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[19063,13470],"totalVotes":32533,"registeredVoters":47357,"undervotes":6952,"overvotes":26,"sourceRow":43,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[24022,8205],"totalVotes":32227,"registeredVoters":44343,"undervotes":6082,"overvotes":11,"sourceRow":47,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[3418,1159],"totalVotes":4577,"registeredVoters":6430,"undervotes":956,"overvotes":1,"sourceRow":51,"partiallyEligible":true},{"district":4,"eligible":true,"votes":[17183,14310],"totalVotes":31493,"registeredVoters":49650,"undervotes":7513,"overvotes":20,"sourceRow":55,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[5188,2722],"totalVotes":7910,"registeredVoters":11240,"undervotes":1708,"overvotes":2,"sourceRow":59,"partiallyEligible":true},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[14410,8553],"totalVotes":22963,"registeredVoters":33282,"undervotes":4910,"overvotes":10,"sourceRow":63,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[4289,1798],"totalVotes":6087,"registeredVoters":8102,"undervotes":1111,"overvotes":3,"sourceRow":67,"partiallyEligible":true},{"district":9,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":10,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[7850,6696],"totalVotes":14546,"registeredVoters":25714,"undervotes":3628,"overvotes":29,"sourceRow":71,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"treasurer","title":"TREASURER","sourceSheet":"Sheet29","candidates":[{"name":"JOSÉ CISNEROS","party":null,"sourceColumn":7},{"name":"Write-in","party":null,"sourceColumn":9}],"citywide":{"votes":[300411,0],"totalVotes":300411,"registeredVoters":522265,"undervotes":109691,"overvotes":3,"sourceRow":14},"districts":[{"district":1,"eligible":true,"votes":[28586,0],"totalVotes":28586,"registeredVoters":47357,"undervotes":10671,"overvotes":0,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[30727,0],"totalVotes":30727,"registeredVoters":49605,"undervotes":11820,"overvotes":0,"sourceRow":67,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[23534,0],"totalVotes":23534,"registeredVoters":43795,"undervotes":10138,"overvotes":0,"sourceRow":71,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[26969,0],"totalVotes":26969,"registeredVoters":49650,"undervotes":11915,"overvotes":0,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[25436,0],"totalVotes":25436,"registeredVoters":45398,"undervotes":8968,"overvotes":0,"sourceRow":79,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[19594,0],"totalVotes":19594,"registeredVoters":37101,"undervotes":7817,"overvotes":1,"sourceRow":83,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[31623,0],"totalVotes":31623,"registeredVoters":50973,"undervotes":11221,"overvotes":1,"sourceRow":87,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[40484,0],"totalVotes":40484,"registeredVoters":59445,"undervotes":11588,"overvotes":0,"sourceRow":91,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[28106,0],"totalVotes":28106,"registeredVoters":48350,"undervotes":8984,"overvotes":0,"sourceRow":95,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[21731,0],"totalVotes":21731,"registeredVoters":44643,"undervotes":7913,"overvotes":1,"sourceRow":99,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[23620,0],"totalVotes":23620,"registeredVoters":45948,"undervotes":8654,"overvotes":0,"sourceRow":103,"partiallyEligible":false}],"unassigned":{"totalVotes":1,"undervotes":2,"overvotes":0,"votes":[1,0]}}]}
@@ -0,0 +1 @@
1
+ {"electionDate":"2026-06-02","electionName":"2026-06-02 San Francisco candidate results","districtYear":2022,"certifiedDate":"2026-06-25","downloadedDate":"2026-09-26","source":"https://sfelections.org/results/20260602/data/20260625/dsov.xlsx","sourceSha256":"1103791ffe31599fe3a7a4c40d4a7c3492189dc3bd5ce2f992b5e1307e6286fe","geography":"Votes cast in San Francisco, reported by supervisorial district. Congressional and state legislative contests include only eligible portions of each district.","method":"Candidate vote share divides a candidate count by all valid votes in that contest and area. Write-ins are included when reported. District eligibility uses registered-voter counts in the official workbook compared with the election’s citywide presidential or gubernatorial contest. Missing supervisorial rows indicate no eligible voters, not zero support. County cumulative votes, when present, are recorded separately as unassigned.","contests":[{"id":"governor","title":"GOVERNOR","sourceSheet":"Sheet2","candidates":[{"name":"MARGARET TROWE","party":"NPP","sourceColumn":7},{"name":"TONY K. THURMOND","party":"DEM","sourceColumn":9},{"name":"THUNDER PARLEY","party":"DEM","sourceColumn":11},{"name":"KATIE PORTER","party":"DEM","sourceColumn":14},{"name":"TOM WOODARD","party":"LIB","sourceColumn":16},{"name":"LEO SAMUEL ZACKY","party":"REP","sourceColumn":19},{"name":"ERIN \"ZEZ\" ZEZULAK","party":"DEM","sourceColumn":21},{"name":"DAVID ZICKEFOOSE","party":"REP","sourceColumn":23},{"name":"AMANDA MARTIN","party":"NPP","sourceColumn":25},{"name":"MATT MAHAN","party":"DEM","sourceColumn":27},{"name":"BRENT MAUPIN","party":"NPP","sourceColumn":29},{"name":"DANIEL MERCURI","party":"NPP","sourceColumn":31},{"name":"BETTY T. YEE","party":"DEM","sourceColumn":33},{"name":"NANCY D. YOUNG","party":"NPP","sourceColumn":35},{"name":"ALICIA OLIVIA LAPP","party":"REP","sourceColumn":37},{"name":"MATTHEW CHASE LEVY","party":"DEM","sourceColumn":39},{"name":"DUANE TERRENCE LOYNES JR.","party":"NPP","sourceColumn":41},{"name":"RANDEEP S. DHILLON","party":"REP","sourceColumn":43},{"name":"LIVINGFORGOD ANDCOUNTRY DEMOTT","party":"NPP","sourceColumn":45},{"name":"PATRICIA DE LUCA BASUALDO","party":"REP","sourceColumn":47},{"name":"LOUIS A. DE BARRAICUA","party":"DEM","sourceColumn":49},{"name":"RAJI RAB","party":"DEM","sourceColumn":51},{"name":"SATISH RAO","party":"DEM","sourceColumn":53},{"name":"RAMSEY ROBINSON","party":"PF","sourceColumn":55},{"name":"LEWIS HERMS","party":"NPP","sourceColumn":57},{"name":"RAFAEL M. HERNANDEZ","party":"REP","sourceColumn":59},{"name":"JON HENDERSON","party":"NPP","sourceColumn":61},{"name":"STEVE HILTON","party":"REP","sourceColumn":63},{"name":"NAOMI BAR-LEV","party":"NPP","sourceColumn":65},{"name":"XAVIER BECERRA","party":"DEM","sourceColumn":67},{"name":"CAROLINA BUHLER","party":"DEM","sourceColumn":69},{"name":"CHAD BIANCO","party":"REP","sourceColumn":71},{"name":"JOSEPH CABRERA","party":"NPP","sourceColumn":73},{"name":"ELAINE CULOTTI","party":"NPP","sourceColumn":75},{"name":"JOEL E. JACOB","party":"DEM","sourceColumn":77},{"name":"MAX FOMIN","party":"NPP","sourceColumn":79},{"name":"LUKASZ ADAM FILINSKI","party":"NPP","sourceColumn":81},{"name":"SERGE FIANKAN","party":"NPP","sourceColumn":83},{"name":"LEO NARANJO IV","party":"REP","sourceColumn":85},{"name":"TIM NELSON","party":"REP","sourceColumn":87},{"name":"TOM STEYER","party":"DEM","sourceColumn":89},{"name":"ERIC SWALWELL","party":"DEM","sourceColumn":91},{"name":"SCOTT P SHIELDS","party":"DEM","sourceColumn":93},{"name":"FREDERIC C. SCHULTZ","party":"NPP","sourceColumn":95},{"name":"CHRISTINE R. SARMIENTO","party":"NPP","sourceColumn":97},{"name":"REZA SAFARNEJAD","party":"NPP","sourceColumn":99},{"name":"SAM SANDAK","party":"NPP","sourceColumn":101},{"name":"GRETHA SOLORZANO","party":"REP","sourceColumn":103},{"name":"JAMES ATHANS JR.","party":"REP","sourceColumn":105},{"name":"LARRY AZEVEDO","party":"DEM","sourceColumn":107},{"name":"MOHAMMAD ARIF","party":"DEM","sourceColumn":109},{"name":"AKINYEMI AGBEDE","party":"DEM","sourceColumn":111},{"name":"DEREK GRASTY","party":"DEM","sourceColumn":113},{"name":"DON J. GRUNDMANN","party":"NPP","sourceColumn":115},{"name":"DAWIT KELLEL","party":"NPP","sourceColumn":117},{"name":"ANNE KOMAROVSK","party":"NPP","sourceColumn":119},{"name":"GARY HOWARD KIDGELL","party":"DEM","sourceColumn":121},{"name":"SOPHIA EDUM-A-SAM","party":"DEM","sourceColumn":123},{"name":"MAURO ALBERTO OROZCO","party":"NPP","sourceColumn":125},{"name":"BARACK D. OBAMA SHAW","party":"DEM","sourceColumn":127},{"name":"ANTONIO VILLARAIGOSA","party":"DEM","sourceColumn":129},{"name":"Write-in","party":null,"sourceColumn":131}],"citywide":{"votes":[33,1694,47,22195,243,78,86,100,84,28109,33,51,2136,307,29,237,125,630,134,212,417,181,190,2035,185,128,110,24700,65,67287,256,4286,261,103,121,56,24,18,135,451,104239,926,156,135,79,31,31,182,133,40,198,61,93,38,80,18,28,37,20,280,888,812],"totalVotes":266077,"registeredVoters":533546,"undervotes":4107,"overvotes":1302,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[3,124,2,2266,24,12,8,18,5,2683,1,3,201,38,1,16,2,29,15,30,38,13,21,209,23,14,21,2788,4,6233,17,440,19,8,11,8,3,0,17,51,10710,78,13,9,7,3,2,13,4,2,19,5,8,8,9,3,3,3,1,20,72,62],"totalVotes":26473,"registeredVoters":48250,"undervotes":419,"overvotes":78,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[3,123,3,2167,28,3,6,3,0,4086,7,3,60,10,1,21,2,14,5,12,32,8,12,92,18,4,7,3141,5,6476,16,327,15,5,10,0,2,0,7,24,9989,45,9,5,2,0,1,14,8,1,12,4,6,2,3,0,1,1,1,13,69,47],"totalVotes":26991,"registeredVoters":50721,"undervotes":290,"overvotes":98,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[4,112,3,1755,25,2,9,5,8,2327,6,5,214,21,2,22,22,61,10,12,34,20,14,154,10,9,6,2047,1,5088,19,295,29,17,11,4,1,2,10,30,7556,118,16,8,2,4,3,20,18,5,17,3,10,4,8,0,3,4,0,21,75,55],"totalVotes":20376,"registeredVoters":44896,"undervotes":451,"overvotes":115,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[3,139,13,1972,26,12,5,26,4,2665,3,6,405,61,4,28,5,64,37,56,55,15,21,177,25,23,18,4126,9,6030,26,670,19,10,26,7,3,3,20,67,8963,136,21,18,11,5,2,34,4,1,22,2,8,7,7,2,2,3,5,14,58,89],"totalVotes":26298,"registeredVoters":50790,"undervotes":704,"overvotes":105,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[3,218,5,2021,23,5,14,7,10,2186,4,10,130,13,3,18,27,76,13,16,48,25,25,221,17,7,7,1092,10,5006,28,231,29,13,7,8,3,2,13,38,9719,116,16,12,13,2,6,20,11,4,22,9,14,2,14,1,5,3,0,35,75,75],"totalVotes":21806,"registeredVoters":46287,"undervotes":348,"overvotes":162,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[4,139,7,1325,13,3,10,3,7,2053,3,2,125,22,1,29,17,55,6,9,28,16,25,142,8,13,10,1320,8,4162,28,240,22,9,6,5,3,1,4,37,5639,79,9,14,6,5,4,11,16,2,19,6,8,3,2,1,2,4,1,28,57,45],"totalVotes":15881,"registeredVoters":38903,"undervotes":277,"overvotes":105,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[1,148,3,2527,24,12,9,6,8,2898,2,3,196,21,2,25,3,33,17,17,37,10,11,156,25,11,12,3410,4,8221,16,541,21,8,8,8,3,2,9,44,10607,64,8,9,10,5,3,25,5,3,15,8,12,2,4,3,3,1,1,21,95,69],"totalVotes":29485,"registeredVoters":52295,"undervotes":365,"overvotes":100,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2,196,2,3756,16,2,6,3,6,3809,1,2,72,2,1,21,5,13,3,3,37,7,12,220,17,5,4,1604,7,10453,17,224,23,9,1,3,2,0,5,15,17181,61,5,9,4,1,1,5,10,5,14,10,2,1,8,0,0,1,2,19,92,116],"totalVotes":38133,"registeredVoters":60213,"undervotes":338,"overvotes":101,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2,118,0,1991,19,5,7,6,9,1857,4,5,161,25,3,18,12,78,8,15,32,12,20,282,13,13,4,1308,7,6152,27,338,30,8,7,5,0,0,7,38,11606,58,8,6,5,0,3,10,17,5,17,4,9,3,2,3,2,6,2,17,128,117],"totalVotes":24674,"registeredVoters":49268,"undervotes":300,"overvotes":145,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[6,250,2,1262,17,5,6,4,9,1800,0,7,255,57,5,23,22,114,7,8,27,24,12,172,13,12,12,1493,4,4413,40,396,39,8,12,2,2,4,13,36,6026,89,23,24,10,2,4,12,23,6,18,3,9,3,10,1,3,4,1,52,78,64],"totalVotes":17058,"registeredVoters":45189,"undervotes":294,"overvotes":157,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[2,127,7,1153,28,17,6,19,18,1745,2,5,317,37,6,16,8,93,13,34,49,31,17,210,16,17,9,2371,6,5053,22,584,15,8,22,6,2,4,30,71,6243,82,28,21,9,4,2,18,17,6,23,7,7,3,13,4,4,7,6,40,89,73],"totalVotes":18902,"registeredVoters":46734,"undervotes":321,"overvotes":136,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},{"id":"lieutenant-governor","title":"LIEUTENANT GOVERNOR","sourceSheet":"Sheet3","candidates":[{"name":"MICHAEL TUBBS","party":"DEM","sourceColumn":7},{"name":"TIM MYERS","party":"DEM","sourceColumn":9},{"name":"FIONA MA","party":"DEM","sourceColumn":11},{"name":"OLIVER MA","party":"DEM","sourceColumn":14},{"name":"EBIE LYNCH","party":"REP","sourceColumn":16},{"name":"JEYSON LOPEZ","party":"DEM","sourceColumn":19},{"name":"GLORIA ROMERO","party":"REP","sourceColumn":21},{"name":"RAKESH CHRISTIAN","party":"NPP","sourceColumn":23},{"name":"DAVID COLLENBERG","party":"REP","sourceColumn":25},{"name":"SEAN COLLINSON","party":"NPP","sourceColumn":27},{"name":"JOSH FRYDAY","party":"DEM","sourceColumn":29},{"name":"DAVID FENNELL","party":"REP","sourceColumn":31},{"name":"ALICE STEK","party":"PF","sourceColumn":33},{"name":"SKIP SHELTON","party":"REP","sourceColumn":35},{"name":"ABDUR RAHMAN SIKDER","party":"DEM","sourceColumn":37},{"name":"JANELLE KELLMAN","party":"DEM","sourceColumn":39},{"name":"Write-in","party":null,"sourceColumn":41}],"citywide":{"votes":[48309,1945,70164,36244,1958,555,13236,258,3546,429,54089,5133,3325,3492,668,5105,0],"totalVotes":248456,"registeredVoters":533546,"undervotes":22633,"overvotes":397,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[4044,132,7640,3779,230,19,1392,27,401,46,5299,528,315,392,43,496,0],"totalVotes":24783,"registeredVoters":48250,"undervotes":2151,"overvotes":36,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[4382,146,6385,2353,159,14,1764,17,308,31,7497,565,221,356,44,627,0],"totalVotes":24869,"registeredVoters":50721,"undervotes":2481,"overvotes":29,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[3515,178,5145,2315,123,35,1058,18,270,39,4485,454,292,289,54,433,0],"totalVotes":18703,"registeredVoters":44896,"undervotes":2205,"overvotes":34,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[3061,134,9089,3193,373,28,2038,27,563,70,4160,834,314,516,61,360,0],"totalVotes":24821,"registeredVoters":50790,"undervotes":2246,"overvotes":40,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[4786,224,4571,3869,89,46,649,17,217,28,4361,236,359,193,88,490,0],"totalVotes":20223,"registeredVoters":46287,"undervotes":2036,"overvotes":57,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[3044,183,3729,1875,115,25,769,22,205,31,3581,301,213,202,82,337,0],"totalVotes":14714,"registeredVoters":38903,"undervotes":1520,"overvotes":29,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[4957,157,8986,3242,213,44,1729,23,441,57,5825,742,319,440,57,474,0],"totalVotes":27706,"registeredVoters":52295,"undervotes":2223,"overvotes":21,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[8940,208,8811,5493,101,33,851,17,198,27,8815,334,402,183,64,846,0],"totalVotes":35323,"registeredVoters":60213,"undervotes":3221,"overvotes":28,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[5401,214,5131,5594,142,133,806,25,241,24,4048,274,413,227,63,441,0],"totalVotes":23177,"registeredVoters":49268,"undervotes":1898,"overvotes":44,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3600,178,4681,1948,161,73,859,39,275,41,3066,352,222,249,56,304,0],"totalVotes":16104,"registeredVoters":45189,"undervotes":1369,"overvotes":36,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[2579,191,5996,2583,252,105,1321,26,427,35,2952,513,255,445,56,297,0],"totalVotes":18033,"registeredVoters":46734,"undervotes":1283,"overvotes":43,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},{"id":"secretary-of-state","title":"SECRETARY OF STATE","sourceSheet":"Sheet4","candidates":[{"name":"DONALD P. (DON) WAGNER","party":"REP","sourceColumn":7},{"name":"SHIRLEY N. WEBER","party":"DEM","sourceColumn":9},{"name":"GARY N. BLENNER","party":"GRN","sourceColumn":11},{"name":"MICHAEL FEINSTEIN","party":"GRN","sourceColumn":14},{"name":"Write-in","party":null,"sourceColumn":16}],"citywide":{"votes":[30445,200250,6306,6698,0],"totalVotes":243699,"registeredVoters":533546,"undervotes":27724,"overvotes":63,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[3266,19459,696,667,0],"totalVotes":24088,"registeredVoters":48250,"undervotes":2877,"overvotes":5,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[3594,19907,457,547,0],"totalVotes":24505,"registeredVoters":50721,"undervotes":2872,"overvotes":2,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[2501,14980,444,501,0],"totalVotes":18426,"registeredVoters":44896,"undervotes":2505,"overvotes":11,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[4878,17279,767,756,0],"totalVotes":23680,"registeredVoters":50790,"undervotes":3424,"overvotes":3,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[1486,17362,551,653,0],"totalVotes":20052,"registeredVoters":46287,"undervotes":2254,"overvotes":10,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[1748,11914,412,455,0],"totalVotes":14529,"registeredVoters":38903,"undervotes":1726,"overvotes":8,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[4023,21693,575,693,0],"totalVotes":26984,"registeredVoters":52295,"undervotes":2963,"overvotes":3,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[1901,31982,662,681,0],"totalVotes":35226,"registeredVoters":60213,"undervotes":3341,"overvotes":5,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[1779,19944,651,632,0],"totalVotes":23006,"registeredVoters":49268,"undervotes":2107,"overvotes":6,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[2091,12710,433,479,0],"totalVotes":15713,"registeredVoters":45189,"undervotes":1790,"overvotes":6,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[3178,13020,658,634,0],"totalVotes":17490,"registeredVoters":46734,"undervotes":1865,"overvotes":4,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0]}},{"id":"controller","title":"CONTROLLER","sourceSheet":"Sheet5","candidates":[{"name":"HERB W MORGAN","party":"REP","sourceColumn":7},{"name":"MALIA M. COHEN","party":"DEM","sourceColumn":9},{"name":"MEGHANN ADAMS","party":"PF","sourceColumn":11},{"name":"Write-in","party":null,"sourceColumn":14}],"citywide":{"votes":[33461,175509,32710,0],"totalVotes":241680,"registeredVoters":533546,"undervotes":29766,"overvotes":40,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[3715,17014,3320,0],"totalVotes":24049,"registeredVoters":48250,"undervotes":2918,"overvotes":3,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[4214,18162,1940,0],"totalVotes":24316,"registeredVoters":50721,"undervotes":3062,"overvotes":1,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[2667,13362,2130,0],"totalVotes":18159,"registeredVoters":44896,"undervotes":2776,"overvotes":7,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[5323,15683,2790,0],"totalVotes":23796,"registeredVoters":50790,"undervotes":3308,"overvotes":3,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[1632,14464,3645,0],"totalVotes":19741,"registeredVoters":46287,"undervotes":2570,"overvotes":5,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[1896,10739,1732,0],"totalVotes":14367,"registeredVoters":38903,"undervotes":1889,"overvotes":7,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[4363,19748,2783,0],"totalVotes":26894,"registeredVoters":52295,"undervotes":3054,"overvotes":2,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2238,27400,5051,0],"totalVotes":34689,"registeredVoters":60213,"undervotes":3881,"overvotes":2,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[1875,15541,5180,0],"totalVotes":22596,"registeredVoters":49268,"undervotes":2518,"overvotes":5,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[2167,11614,1853,0],"totalVotes":15634,"registeredVoters":45189,"undervotes":1873,"overvotes":2,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[3371,11782,2286,0],"totalVotes":17439,"registeredVoters":46734,"undervotes":1917,"overvotes":3,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0]}},{"id":"treasurer","title":"TREASURER","sourceSheet":"Sheet6","candidates":[{"name":"GLENN TURNER","party":"GRN","sourceColumn":7},{"name":"JENNIFER HAWKS","party":"REP","sourceColumn":9},{"name":"ANNA M. CABALLERO","party":"DEM","sourceColumn":11},{"name":"DAVID SERPA","party":"REP","sourceColumn":14},{"name":"ELENI KOUNALAKIS","party":"DEM","sourceColumn":16},{"name":"TONY VAZQUEZ","party":"DEM","sourceColumn":19},{"name":"Write-in","party":null,"sourceColumn":21}],"citywide":{"votes":[8031,18940,32754,10272,150941,11468,0],"totalVotes":232406,"registeredVoters":533546,"undervotes":38910,"overvotes":170,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[821,2041,3391,1122,14603,1037,0],"totalVotes":23015,"registeredVoters":48250,"undervotes":3947,"overvotes":8,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[499,2243,2900,1001,16463,730,0],"totalVotes":23836,"registeredVoters":50721,"undervotes":3534,"overvotes":9,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[609,1494,2214,787,11737,878,0],"totalVotes":17719,"registeredVoters":44896,"undervotes":3200,"overvotes":23,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[770,3219,3183,1618,12926,1113,0],"totalVotes":22829,"registeredVoters":50790,"undervotes":4267,"overvotes":11,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[835,931,3132,549,12283,1016,0],"totalVotes":18746,"registeredVoters":46287,"undervotes":3547,"overvotes":23,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[506,1039,1984,612,9088,772,0],"totalVotes":14001,"registeredVoters":38903,"undervotes":2249,"overvotes":13,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[728,2466,3180,1264,17387,1066,0],"totalVotes":26091,"registeredVoters":52295,"undervotes":3849,"overvotes":10,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[1082,1223,4250,540,24785,1267,0],"totalVotes":33147,"registeredVoters":60213,"undervotes":5414,"overvotes":11,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[1059,1046,3584,702,13204,1362,0],"totalVotes":20957,"registeredVoters":49268,"undervotes":4143,"overvotes":19,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[522,1268,2162,828,9427,960,0],"totalVotes":15167,"registeredVoters":45189,"undervotes":2320,"overvotes":22,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[600,1970,2774,1249,9038,1267,0],"totalVotes":16898,"registeredVoters":46734,"undervotes":2440,"overvotes":21,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0]}},{"id":"attorney-general","title":"ATTORNEY GENERAL","sourceSheet":"Sheet7","candidates":[{"name":"MARJORIE MIKELS","party":"GRN","sourceColumn":7},{"name":"ROB BONTA","party":"DEM","sourceColumn":9},{"name":"MICHAEL E. GATES","party":"REP","sourceColumn":11},{"name":"Write-in","party":null,"sourceColumn":14}],"citywide":{"votes":[17337,189269,35004,0],"totalVotes":241610,"registeredVoters":533546,"undervotes":29834,"overvotes":42,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[1850,18346,3704,0],"totalVotes":23900,"registeredVoters":48250,"undervotes":3064,"overvotes":6,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[1246,19422,4129,0],"totalVotes":24797,"registeredVoters":50721,"undervotes":2581,"overvotes":1,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[1338,14232,2800,0],"totalVotes":18370,"registeredVoters":44896,"undervotes":2566,"overvotes":6,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[1851,16388,5500,0],"totalVotes":23739,"registeredVoters":50790,"undervotes":3367,"overvotes":1,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[1756,15944,1881,0],"totalVotes":19581,"registeredVoters":46287,"undervotes":2732,"overvotes":3,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[1065,11379,2090,0],"totalVotes":14534,"registeredVoters":38903,"undervotes":1723,"overvotes":6,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[1632,20922,4526,0],"totalVotes":27080,"registeredVoters":52295,"undervotes":2866,"overvotes":4,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[2083,30416,2215,0],"totalVotes":34714,"registeredVoters":60213,"undervotes":3853,"overvotes":5,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[2005,17970,2055,0],"totalVotes":22030,"registeredVoters":49268,"undervotes":3084,"overvotes":5,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[1143,11945,2489,0],"totalVotes":15577,"registeredVoters":45189,"undervotes":1929,"overvotes":3,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[1368,12305,3615,0],"totalVotes":17288,"registeredVoters":46734,"undervotes":2069,"overvotes":2,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0]}},{"id":"insurance-commissioner","title":"INSURANCE COMMISSIONER","sourceSheet":"Sheet8","candidates":[{"name":"PATRICK WOLFF","party":"DEM","sourceColumn":7},{"name":"SEAN LEE","party":"REP","sourceColumn":9},{"name":"KEITH W. DAVIS","party":"AI","sourceColumn":11},{"name":"ROBERT P HOWELL","party":"REP","sourceColumn":14},{"name":"STEVEN CRAIG BRADFORD","party":"DEM","sourceColumn":16},{"name":"MERRITT FARREN","party":"REP","sourceColumn":19},{"name":"BEN ALLEN","party":"DEM","sourceColumn":21},{"name":"ERIC THOR AARNIO","party":"REP","sourceColumn":23},{"name":"STACY A. KORSGADEN","party":"REP","sourceColumn":25},{"name":"JANE KIM","party":"DEM","sourceColumn":27},{"name":"EDUARDO \"LALO\" VARGAS","party":"PF","sourceColumn":29},{"name":"Write-in","party":null,"sourceColumn":31}],"citywide":{"votes":[54304,5589,1365,5609,4472,7417,42995,1778,9996,100173,5669,0],"totalVotes":239367,"registeredVoters":533546,"undervotes":31749,"overvotes":370,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[5330,692,128,609,371,615,3779,219,1134,10358,516,0],"totalVotes":23751,"registeredVoters":48250,"undervotes":3185,"overvotes":34,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[7700,448,111,719,420,597,4587,204,1250,7340,313,0],"totalVotes":23689,"registeredVoters":50721,"undervotes":3659,"overvotes":31,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[4346,424,117,491,311,688,3429,91,743,7037,427,0],"totalVotes":18104,"registeredVoters":44896,"undervotes":2798,"overvotes":40,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[4109,1140,169,796,372,879,3435,413,1741,10077,479,0],"totalVotes":23610,"registeredVoters":50790,"undervotes":3467,"overvotes":30,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[4118,218,136,300,424,482,3430,95,487,9368,546,0],"totalVotes":19604,"registeredVoters":46287,"undervotes":2674,"overvotes":38,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[3480,259,105,355,317,571,2779,62,504,5392,413,0],"totalVotes":14237,"registeredVoters":38903,"undervotes":1998,"overvotes":28,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[6212,710,124,770,392,844,5035,244,1344,10347,526,0],"totalVotes":26548,"registeredVoters":52295,"undervotes":3368,"overvotes":34,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[9286,254,86,367,478,562,6711,77,610,15118,611,0],"totalVotes":34160,"registeredVoters":60213,"undervotes":4378,"overvotes":34,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[4067,262,79,317,399,630,3802,84,558,11685,763,0],"totalVotes":22646,"registeredVoters":49268,"undervotes":2444,"overvotes":29,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[3137,446,138,356,537,697,2995,90,586,6136,471,0],"totalVotes":15589,"registeredVoters":45189,"undervotes":1888,"overvotes":32,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[2519,736,172,529,451,852,3013,199,1039,7315,604,0],"totalVotes":17429,"registeredVoters":46734,"undervotes":1890,"overvotes":40,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0,0,0,0,0,0]}},{"id":"board-of-equalization-member-district-2","title":"BOARD OF EQUALIZATION MEMBER, DISTRICT 2","sourceSheet":"Sheet9","candidates":[{"name":"JOHN PIMENTEL","party":"DEM","sourceColumn":7},{"name":"JOHN W. ZARUKA","party":"REP","sourceColumn":9},{"name":"MARK MCCOMAS","party":"REP","sourceColumn":11},{"name":"J BRETT MARYMEE","party":"REP","sourceColumn":14},{"name":"SALLY J. LIEBER","party":"DEM","sourceColumn":16},{"name":"BILL SHIREMAN","party":"REP","sourceColumn":19},{"name":"Write-in","party":null,"sourceColumn":21}],"citywide":{"votes":[32335,3574,5075,9216,162680,14370,0],"totalVotes":227250,"registeredVoters":533546,"undervotes":43953,"overvotes":252,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[3034,271,464,1096,16132,1566,0],"totalVotes":22563,"registeredVoters":48250,"undervotes":4389,"overvotes":21,"sourceRow":83,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[3355,250,508,1146,15707,1566,0],"totalVotes":22532,"registeredVoters":50721,"undervotes":4817,"overvotes":16,"sourceRow":87,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[2356,382,454,645,12165,1071,0],"totalVotes":17073,"registeredVoters":44896,"undervotes":3836,"overvotes":26,"sourceRow":91,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[2766,323,657,1647,14305,2415,0],"totalVotes":22113,"registeredVoters":50790,"undervotes":5004,"overvotes":20,"sourceRow":95,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[2496,293,355,464,14356,719,0],"totalVotes":18683,"registeredVoters":46287,"undervotes":3599,"overvotes":33,"sourceRow":99,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[2058,294,321,448,9698,821,0],"totalVotes":13640,"registeredVoters":38903,"undervotes":2601,"overvotes":18,"sourceRow":103,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[3900,377,592,1162,17217,1851,0],"totalVotes":25099,"registeredVoters":52295,"undervotes":4826,"overvotes":16,"sourceRow":107,"partiallyEligible":false},{"district":8,"eligible":true,"votes":[4827,247,375,534,25469,877,0],"totalVotes":32329,"registeredVoters":60213,"undervotes":6211,"overvotes":19,"sourceRow":111,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[3044,336,366,462,16459,885,0],"totalVotes":21552,"registeredVoters":49268,"undervotes":3553,"overvotes":17,"sourceRow":115,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[2102,391,463,591,10357,1019,0],"totalVotes":14923,"registeredVoters":45189,"undervotes":2550,"overvotes":36,"sourceRow":119,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[2397,410,520,1021,10815,1580,0],"totalVotes":16743,"registeredVoters":46734,"undervotes":2567,"overvotes":30,"sourceRow":123,"partiallyEligible":false}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0]}},{"id":"united-states-representative-district-11","title":"UNITED STATES REPRESENTATIVE, DISTRICT 11","sourceSheet":"Sheet10","candidates":[{"name":"SCOTT WIENER","party":"DEM","sourceColumn":7},{"name":"NATHAN DEER","party":"NPP","sourceColumn":9},{"name":"OMED HAMID","party":"DEM","sourceColumn":11},{"name":"GREGORY M HAYNES","party":"DEM","sourceColumn":14},{"name":"MARIE HURABIELL","party":"DEM","sourceColumn":16},{"name":"JOHN \"GUS\" BUFFLER","party":"DEM","sourceColumn":19},{"name":"CONNIE CHAN","party":"DEM","sourceColumn":21},{"name":"SAIKAT CHAKRABARTI","party":"DEM","sourceColumn":23},{"name":"JINGCHAO XIONG","party":"REP","sourceColumn":25},{"name":"KEITH FREEDMAN","party":"DEM","sourceColumn":27},{"name":"DAVID GANEZER","party":"REP","sourceColumn":29},{"name":"Write-in","party":null,"sourceColumn":31}],"citywide":{"votes":[95816,649,401,2025,9410,942,69899,42060,4238,591,9299,7],"totalVotes":235337,"registeredVoters":470299,"undervotes":10659,"overvotes":428,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[9039,56,15,166,1361,86,8973,4432,537,81,1132,1],"totalVotes":25879,"registeredVoters":48250,"undervotes":1068,"overvotes":26,"sourceRow":79,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[12246,56,35,161,1940,126,5913,3906,367,69,1237,0],"totalVotes":26056,"registeredVoters":50721,"undervotes":1274,"overvotes":35,"sourceRow":83,"partiallyEligible":false},{"district":3,"eligible":true,"votes":[7962,78,59,177,714,87,5661,3733,369,55,927,1],"totalVotes":19823,"registeredVoters":44896,"undervotes":1074,"overvotes":38,"sourceRow":87,"partiallyEligible":false},{"district":4,"eligible":true,"votes":[7391,75,14,206,1426,112,9591,3996,1025,72,1715,1],"totalVotes":25624,"registeredVoters":50790,"undervotes":1477,"overvotes":36,"sourceRow":91,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[8595,64,59,316,496,89,6232,4627,265,59,547,1],"totalVotes":21350,"registeredVoters":46287,"undervotes":893,"overvotes":72,"sourceRow":95,"partiallyEligible":false},{"district":6,"eligible":true,"votes":[6852,64,56,184,478,90,3448,3272,320,46,575,0],"totalVotes":15385,"registeredVoters":38903,"undervotes":824,"overvotes":50,"sourceRow":99,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[11225,86,30,213,1579,136,8571,4335,593,71,1425,0],"totalVotes":28264,"registeredVoters":51639,"undervotes":1330,"overvotes":38,"sourceRow":103,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[19140,56,39,152,726,87,9737,6433,199,50,644,1],"totalVotes":37264,"registeredVoters":60213,"undervotes":1242,"overvotes":53,"sourceRow":107,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[7619,47,45,202,334,76,7543,4518,202,37,499,2],"totalVotes":21124,"registeredVoters":40969,"undervotes":747,"overvotes":36,"sourceRow":111,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[5332,63,47,221,318,51,3734,2597,286,47,516,0],"totalVotes":13212,"registeredVoters":34328,"undervotes":665,"overvotes":43,"sourceRow":115,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[415,4,2,27,38,2,496,211,75,4,82,0],"totalVotes":1356,"registeredVoters":3303,"undervotes":65,"overvotes":1,"sourceRow":119,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0,0,0,0,0,0,0]}},{"id":"united-states-representative-district-15","title":"UNITED STATES REPRESENTATIVE, DISTRICT 15","sourceSheet":"Sheet11","candidates":[{"name":"KEVIN MULLIN","party":"DEM","sourceColumn":7},{"name":"ANTHONY VAN DANG","party":"DEM","sourceColumn":9},{"name":"CHARLES HOELTER","party":"REP","sourceColumn":11},{"name":"JIM GARRITY","party":"NPP","sourceColumn":14},{"name":"MANTOSH KUMAR","party":"DEM","sourceColumn":16},{"name":"Write-in","party":null,"sourceColumn":19}],"citywide":{"votes":[13691,2036,3530,947,973,0],"totalVotes":21177,"registeredVoters":63247,"undervotes":3829,"overvotes":25,"sourceRow":9},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":3,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[153,24,56,5,14,0],"totalVotes":252,"registeredVoters":656,"undervotes":57,"overvotes":0,"sourceRow":63,"partiallyEligible":true},{"district":8,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":9,"eligible":true,"votes":[1718,232,491,150,111,0],"totalVotes":2702,"registeredVoters":8299,"undervotes":508,"overvotes":5,"sourceRow":67,"partiallyEligible":true},{"district":10,"eligible":true,"votes":[1909,285,560,140,140,0],"totalVotes":3034,"registeredVoters":10861,"undervotes":549,"overvotes":6,"sourceRow":71,"partiallyEligible":true},{"district":11,"eligible":true,"votes":[9911,1495,2423,652,708,0],"totalVotes":15189,"registeredVoters":43431,"undervotes":2715,"overvotes":14,"sourceRow":75,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0,0,0,0]}},{"id":"state-assembly-member-district-17","title":"STATE ASSEMBLY MEMBER, DISTRICT 17","sourceSheet":"Sheet14","candidates":[{"name":"MATT HANEY","party":"DEM","sourceColumn":7},{"name":"Write-in","party":null,"sourceColumn":9}],"citywide":{"votes":[106260,612],"totalVotes":106872,"registeredVoters":302434,"undervotes":41186,"overvotes":2,"sourceRow":9},"districts":[{"district":1,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[2267,21],"totalVotes":2288,"registeredVoters":5465,"undervotes":801,"overvotes":0,"sourceRow":63,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[12112,102],"totalVotes":12214,"registeredVoters":38266,"undervotes":5303,"overvotes":0,"sourceRow":67,"partiallyEligible":true},{"district":4,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[11207,62],"totalVotes":11269,"registeredVoters":34898,"undervotes":4430,"overvotes":0,"sourceRow":71,"partiallyEligible":true},{"district":6,"eligible":true,"votes":[11860,65],"totalVotes":11925,"registeredVoters":38903,"undervotes":4334,"overvotes":0,"sourceRow":75,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[7673,86],"totalVotes":7759,"registeredVoters":17955,"undervotes":3429,"overvotes":0,"sourceRow":79,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[24694,100],"totalVotes":24794,"registeredVoters":51977,"undervotes":8461,"overvotes":1,"sourceRow":83,"partiallyEligible":true},{"district":9,"eligible":true,"votes":[17597,87],"totalVotes":17684,"registeredVoters":49268,"undervotes":7438,"overvotes":0,"sourceRow":87,"partiallyEligible":false},{"district":10,"eligible":true,"votes":[12733,59],"totalVotes":12792,"registeredVoters":45189,"undervotes":4716,"overvotes":1,"sourceRow":91,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[6117,30],"totalVotes":6147,"registeredVoters":20513,"undervotes":2274,"overvotes":0,"sourceRow":95,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0]}},{"id":"state-assembly-member-district-19","title":"STATE ASSEMBLY MEMBER, DISTRICT 19","sourceSheet":"Sheet16","candidates":[{"name":"PHILIP LOUIS WING","party":"REP","sourceColumn":7},{"name":"CATHERINE STEFANI","party":"DEM","sourceColumn":9},{"name":"Write-in","party":null,"sourceColumn":11}],"citywide":{"votes":[15946,88138,0],"totalVotes":104084,"registeredVoters":231112,"undervotes":19304,"overvotes":7,"sourceRow":9},"districts":[{"district":1,"eligible":true,"votes":[3209,19347,0],"totalVotes":22556,"registeredVoters":48250,"undervotes":4416,"overvotes":1,"sourceRow":63,"partiallyEligible":false},{"district":2,"eligible":true,"votes":[2738,18165,0],"totalVotes":20903,"registeredVoters":45256,"undervotes":3372,"overvotes":1,"sourceRow":67,"partiallyEligible":true},{"district":3,"eligible":true,"votes":[308,2540,0],"totalVotes":2848,"registeredVoters":6630,"undervotes":570,"overvotes":0,"sourceRow":71,"partiallyEligible":true},{"district":4,"eligible":true,"votes":[5049,17563,0],"totalVotes":22612,"registeredVoters":50790,"undervotes":4523,"overvotes":2,"sourceRow":75,"partiallyEligible":false},{"district":5,"eligible":true,"votes":[265,5203,0],"totalVotes":5468,"registeredVoters":11389,"undervotes":1147,"overvotes":1,"sourceRow":79,"partiallyEligible":true},{"district":6,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":7,"eligible":true,"votes":[2231,13653,0],"totalVotes":15884,"registeredVoters":34340,"undervotes":2869,"overvotes":0,"sourceRow":83,"partiallyEligible":true},{"district":8,"eligible":true,"votes":[218,4240,0],"totalVotes":4458,"registeredVoters":8236,"undervotes":844,"overvotes":1,"sourceRow":87,"partiallyEligible":true},{"district":9,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":10,"eligible":false,"votes":null,"totalVotes":null,"undervotes":null,"overvotes":null,"registeredVoters":null,"sourceRow":null,"partiallyEligible":false},{"district":11,"eligible":true,"votes":[1928,7427,0],"totalVotes":9355,"registeredVoters":26221,"undervotes":1563,"overvotes":1,"sourceRow":91,"partiallyEligible":true}],"unassigned":{"totalVotes":0,"undervotes":0,"overvotes":0,"votes":[0,0,0]}}]}
@@ -0,0 +1,43 @@
1
+ # San Francisco candidate results
2
+
3
+ `catalog.json` lists six certified election snapshots. Each election JSON is
4
+ separate so the Pages explorer fetches only the selected year. Local builds
5
+ ship these files as optional JSON subpaths. For example:
6
+
7
+ ```js
8
+ import results from '@kahwee/sf-map-svg/data/candidates/2024-11-05.json' with { type: 'json' };
9
+ ```
10
+
11
+ No candidate results are imported by the default map renderer. These are
12
+ **San Francisco votes**, not statewide totals or votes by individual people.
13
+ The `districtYear` is the supervisorial map vintage, not a congressional
14
+ boundary. For House and state legislative contests, an `eligible: false` row
15
+ means that the workbook had no voters from that supervisorial district for
16
+ the contest. Do not convert it to zero support. Districts can be partly inside
17
+ a congressional district; the JSON does not provide congressional polygons.
18
+ `partiallyEligible` compares a contest's district registration with the same
19
+ election's citywide presidential or gubernatorial registration, so a client
20
+ can mark districts that straddle a contest boundary.
21
+
22
+ `contests` hold an election-scoped ID, official workbook title, source sheet,
23
+ candidate names and party labels, a citywide vote vector, and eleven
24
+ supervisorial district rows. Candidate positions in every `votes` array match
25
+ the `candidates` array. `totalVotes` includes reported write-ins. A candidate
26
+ share is `votes[index] / totalVotes` when the total is positive. The
27
+ `unassigned` object records rare county cumulative votes that the official
28
+ workbook does not assign to a supervisorial district; the 2024 Treasurer
29
+ contest has one such vote and two undervotes. These remain in citywide totals.
30
+
31
+ `scripts/import-candidate-results.py` reads the official final Excel workbooks,
32
+ records their SHA-256 digests, and checks candidate and district sums. Download
33
+ the six workbook URLs in `SOURCES.md` as `2016.xlsx`, `2018.xlsx`,
34
+ `2020.xlsx`, `2022.xlsx`, `2024.xlsx`, and `2026.xlsx` into a local folder, then run:
35
+
36
+ ```sh
37
+ uv run --with openpyxl python3 scripts/import-candidate-results.py /path/to/folder
38
+ ```
39
+
40
+ This archive includes federal, statewide, and state legislative candidate
41
+ contests with SF votes in these six elections. It is not an exhaustive
42
+ archive of every local office or election. Sources and limitations are in
43
+ `SOURCES.md`.
@@ -0,0 +1,40 @@
1
+ {
2
+ "elections": [
3
+ {
4
+ "date": "2016-11-08",
5
+ "label": "2016 November general",
6
+ "file": "2016-11-08.json",
7
+ "contestCount": 4
8
+ },
9
+ {
10
+ "date": "2018-11-06",
11
+ "label": "2018 November general",
12
+ "file": "2018-11-06.json",
13
+ "contestCount": 11
14
+ },
15
+ {
16
+ "date": "2020-11-03",
17
+ "label": "2020 November general",
18
+ "file": "2020-11-03.json",
19
+ "contestCount": 6
20
+ },
21
+ {
22
+ "date": "2022-11-08",
23
+ "label": "2022 November general",
24
+ "file": "2022-11-08.json",
25
+ "contestCount": 14
26
+ },
27
+ {
28
+ "date": "2024-11-05",
29
+ "label": "2024 November general",
30
+ "file": "2024-11-05.json",
31
+ "contestCount": 9
32
+ },
33
+ {
34
+ "date": "2026-06-02",
35
+ "label": "2026 June primary",
36
+ "file": "2026-06-02.json",
37
+ "contestCount": 12
38
+ }
39
+ ]
40
+ }
@@ -4,7 +4,10 @@ export type Geometry = {
4
4
  readonly type: 'Point';
5
5
  readonly coordinates: Position;
6
6
  } | {
7
- readonly type: 'LineString' | 'MultiPoint';
7
+ readonly type: 'LineString';
8
+ readonly coordinates: readonly Position[];
9
+ } | {
10
+ readonly type: 'MultiPoint';
8
11
  readonly coordinates: readonly Position[];
9
12
  } | {
10
13
  readonly type: 'Polygon';
@@ -0,0 +1,3 @@
1
+ /** v2 root: runtime and types only. Geography is always an explicit import. */
2
+ export * from './map.js';
3
+ export * from './static.js';
@@ -0,0 +1,3 @@
1
+ /** v2 root: runtime and types only. Geography is always an explicit import. */
2
+ export * from './map.js';
3
+ export * from './static.js';
@@ -0,0 +1,16 @@
1
+ import type { CameraOptions, MapViewport } from './types.js';
2
+ export declare function validateCameraOptions(options: CameraOptions): void;
3
+ /** A cancellable camera independent of DOM rendering; generation guards cover reentrant events. */
4
+ export declare function createCamera({ read, write, duration, reduced, request, cancel, now, }: {
5
+ read: () => MapViewport;
6
+ write: (view: MapViewport) => void;
7
+ duration: () => number;
8
+ reduced: () => boolean;
9
+ request: (callback: FrameRequestCallback) => number;
10
+ cancel: (id: number) => void;
11
+ now: () => number;
12
+ }): {
13
+ stop: () => void;
14
+ destroy(): void;
15
+ move(next: MapViewport, options?: CameraOptions): void;
16
+ };
@@ -0,0 +1,55 @@
1
+ import { assertOptions } from './validation.js';
2
+ import { validateViewport } from './viewport.js';
3
+ export function validateCameraOptions(options) {
4
+ assertOptions(options, 'camera', ['animate', 'duration', 'fit']);
5
+ if ('fit' in options && options.fit !== undefined && typeof options.fit !== 'boolean')
6
+ throw new TypeError('fit must be boolean.');
7
+ if (options.animate !== undefined && typeof options.animate !== 'boolean')
8
+ throw new TypeError('animate must be a boolean.');
9
+ if (options.duration !== undefined &&
10
+ (!Number.isFinite(options.duration) || options.duration < 0))
11
+ throw new RangeError('Duration must be finite and nonnegative.');
12
+ }
13
+ /** A cancellable camera independent of DOM rendering; generation guards cover reentrant events. */
14
+ export function createCamera({ read, write, duration, reduced, request, cancel, now, }) {
15
+ let frame = 0, generation = 0, destroyed = false;
16
+ function stop() {
17
+ generation++;
18
+ cancel(frame);
19
+ frame = 0;
20
+ }
21
+ return {
22
+ stop,
23
+ destroy() {
24
+ destroyed = true;
25
+ stop();
26
+ },
27
+ move(next, options = {}) {
28
+ if (destroyed)
29
+ return;
30
+ const target = validateViewport(next);
31
+ validateCameraOptions(options);
32
+ const ms = options.duration ?? (options.animate === true ? duration() || 320 : duration());
33
+ stop();
34
+ const token = generation;
35
+ if (options.animate === false || reduced() || !ms) {
36
+ write(target);
37
+ return;
38
+ }
39
+ const from = [...read()], start = now();
40
+ if (from.every((value, i) => value === target[i]))
41
+ return;
42
+ const tick = (time) => {
43
+ if (destroyed || token !== generation)
44
+ return;
45
+ const t = Math.max(0, Math.min(1, (time - start) / ms));
46
+ const eased = 1 - (1 - t) ** 3;
47
+ write(target.map((value, i) => from[i] + (value - from[i]) * eased));
48
+ if (destroyed || token !== generation)
49
+ return;
50
+ frame = t < 1 ? request(tick) : 0;
51
+ };
52
+ frame = request(tick);
53
+ },
54
+ };
55
+ }
@@ -0,0 +1,7 @@
1
+ /** Stable seed-distance groups with a spatial index, independent of input order and the DOM. */
2
+ export declare function clusterPoints<T extends {
3
+ marker: {
4
+ id: string;
5
+ };
6
+ point: readonly [number, number];
7
+ }>(items: readonly T[], unit: number, radius: number): T[][];
@@ -0,0 +1,33 @@
1
+ /** Stable seed-distance groups with a spatial index, independent of input order and the DOM. */
2
+ export function clusterPoints(items, unit, radius) {
3
+ const cellSize = unit * radius;
4
+ if (!Number.isFinite(cellSize) || cellSize <= 0)
5
+ throw new RangeError('Cluster scale and radius must be positive and finite.');
6
+ const cells = new Map();
7
+ const groups = [];
8
+ for (const item of [...items].sort((a, b) => a.marker.id < b.marker.id ? -1 : a.marker.id > b.marker.id ? 1 : 0)) {
9
+ const [x, y] = item.point;
10
+ const cx = Math.floor(x / cellSize), cy = Math.floor(y / cellSize);
11
+ let nearest, distance = cellSize;
12
+ for (let dx = -1; dx <= 1; dx++)
13
+ for (let dy = -1; dy <= 1; dy++) {
14
+ for (const candidate of cells.get(`${cx + dx}:${cy + dy}`) ?? []) {
15
+ const d = Math.hypot(x - candidate[0].point[0], y - candidate[0].point[1]);
16
+ if (d < distance) {
17
+ nearest = candidate;
18
+ distance = d;
19
+ }
20
+ }
21
+ }
22
+ if (nearest)
23
+ nearest.push(item);
24
+ else {
25
+ const group = [item], key = `${cx}:${cy}`;
26
+ groups.push(group);
27
+ const cell = cells.get(key) ?? [];
28
+ cell.push(group);
29
+ cells.set(key, cell);
30
+ }
31
+ }
32
+ return groups;
33
+ }
@@ -0,0 +1,5 @@
1
+ import type { MapConfiguration, MapConfigurationSnapshot, MapOptions } from './controller-types.js';
2
+ import type { NeighborhoodExplorerOptions } from './types.js';
3
+ export declare function expandMapOptions(options: MapOptions): NeighborhoodExplorerOptions;
4
+ /** Prepare the entire configuration before any DOM mutation. */
5
+ export declare function prepareConfiguration(current: MapConfigurationSnapshot, patch: MapConfiguration): MapConfigurationSnapshot;