vehicles 0.6.1 → 0.8.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,860 @@
1
+ # plates/hr.yml — Croatia (PRD-PLATES gate L1, wave 2).
2
+ #
3
+ # EVERY format, colour and class claim in this file is read from Narodne novine
4
+ # — the Croatian official gazette — in the instruments' own published text, on
5
+ # 2026-08-02. Five instruments carry the file:
6
+ # * Pravilnik o registraciji i označavanju vozila, NN 130/2017 (27.12.2017.)
7
+ # — THE CURRENT BASE. Čl. 18 (the plate), čl. 21-22 (to-order and by-choice
8
+ # marks), čl. 24 (diplomatic), čl. 25 (when a new mark is issued),
9
+ # čl. 34 (test), čl. 39 (transferable), čl. 44 (export), čl. 47-48
10
+ # (deregistration and change of owner), čl. 52 + Prilog 1 (the area codes).
11
+ # * Pravilnik o izmjenama i dopunama …, NN 45/2016 (13.5.2016.) — THE EU-BAND
12
+ # AMENDMENT and the ownership-transfer reform. Čl. 10 dates both.
13
+ # * Pravilnik o registraciji i označavanju vozila, NN 151/2008 (23.12.2008.)
14
+ # — the previous base; the origin of the by-choice, oldtimer (PV),
15
+ # transferable (PP) and export (RH) series.
16
+ # * Pravilnik o registraciji vozila na motorni pogon i priključnih vozila,
17
+ # NN 12/1993 (5.2.1993.) — the founding independent-Croatia instrument.
18
+ # * Pravilnik o registraciji i označavanju vozila Ministarstva obrane i
19
+ # Oružanih snaga RH, NN 71/2018 (4.8.2018.) — the military system, which is
20
+ # a SEPARATE pravilnik under a separate enabling provision.
21
+ #
22
+ # THE SIX STRUCTURAL FACTS THAT SHAPE THIS FILE
23
+ #
24
+ # 1. THE CODE LIST IS IN THE REGULATION, like Austria's Anlage 5d and unlike
25
+ # Germany's Bundesanzeiger list. Čl. 52 st. 2 NN 130/2017: "Popis oznaka
26
+ # registracijskih područja nalazi se u Prilogu 1. koji je tiskan uz ovaj
27
+ # Pravilnik i njegov je sastavni dio." Thirty-four codes, extracted
28
+ # mechanically into hr-cities.yml. No Wikipedia table was used for it.
29
+ #
30
+ # 2. THE SERIAL GRAMMAR HAS NOT CHANGED SINCE 1993. Čl. 18 st. 2 NN 130/2017:
31
+ # "Registarski broj vozila sastoji se od tri ili četiri numeričke i jedne
32
+ # ili dvije slovne oznake." Čl. 18 NN 12/1993, verbatim, thirty-three years
33
+ # earlier: "Registarski broj vozila sastoji se od tri ili četiri numeričke i
34
+ # jedne ili dvije slovne oznake." Word for word. Every Croatian series break
35
+ # in this file is therefore a DESIGN break, never a format break.
36
+ #
37
+ # 3. THE EU BAND ARRIVED IN 2016, NOT AT ACCESSION IN 2013 — and this is the
38
+ # instrument-date rule earning its keep. Croatia acceded on 1 July 2013 and
39
+ # NN 83/2013 is dated 1.7.2013, but that amendment does not touch the plate:
40
+ # it rewrites čl. 5 (registration of EEA nationals), čl. 40 and čl. 50. The
41
+ # band comes from NN 45/2016 čl. 2, which rewrote čl. 13 st. 1 to add "Na
42
+ # krajnjoj lijevoj strani registarske pločice otisnuta je oznaka Republike
43
+ # Hrvatske sukladno Uredbi Vijeća (EZ) broj 2411/98". And NN 45/2016's own
44
+ # čl. 10 gives the date, which is neither its gazette date nor 2013:
45
+ # "Ovaj Pravilnik objavit će se u »Narodnim novinama«, a stupa na snagu
46
+ # 4. srpnja 2016. godine." Published 13 May 2016, in force 4 JULY 2016.
47
+ # THREE YEARS AND THREE DAYS after accession.
48
+ #
49
+ # 4. THE 2016 REFORM ALSO CUT THE PLATE LOOSE FROM THE OWNER. NN 45/2016 čl. 5
50
+ # replaced čl. 40 outright. Before: the SELLER deregistered and returned the
51
+ # plates, and they could pass to the buyer only "ako su kupoprodajnim
52
+ # ugovorom ili pisanom izjavom … ustupljene kupcu i AKO SE PRI PROMJENI
53
+ # VLASNIŠTVA NE MIJENJA REGISTRACIJSKO PODRUČJE" (NN 151/2008 čl. 40 st. 3).
54
+ # After: "novi vlasnik vozila dužan je u roku od 15 dana od stjecanja vozila
55
+ # registrirati vozilo na svoje ime ili ga odjaviti" — the duty is the
56
+ # BUYER'S and surrender drops out of the sale case. Carried forward verbatim
57
+ # as čl. 48 st. 1 NN 130/2017. What SURVIVES is čl. 25 st. 1: a new mark is
58
+ # still issued "za vozilo koje se registrira u drugom registracijskom
59
+ # području". So the code is not severed from geography — it is frozen at
60
+ # issue. The full caveat is stated inside hr-cities.yml, where a consumer
61
+ # who never reads this file will still meet it.
62
+ #
63
+ # 5. SIX OF THE THIRTY-FOUR AREA CODES CANNOT BE SPELLED BY THIS DATASET.
64
+ # ČK, KŽ, PŽ, ŠI, VŽ and ŽU carry a caron; the serial alphabet in
65
+ # plates/_meta/separators.yml is A-Z 0-9. Every `[A-Z]{2}` prefix below is
66
+ # therefore NARROWER than the issuing grammar for those six areas — still
67
+ # `matching: strict` per PRD-PLATES §2.7 (narrower is strict), but a
68
+ # consumer matching a photographed plate must ASCII-fold first. The
69
+ # regulation knows the problem: čl. 22 st. 7 refuses a by-choice mark that
70
+ # could "doći do dupliranja prilikom transliteracije registarskih brojeva".
71
+ # Extending the serial alphabet is a §2.6 schema amendment and is NOT
72
+ # attempted here. `code_ascii` in hr-cities.yml carries our fold.
73
+ #
74
+ # 6. THE PLATE DIMENSIONS ARE A RECORDED GAP, HONESTLY. The pravilnik gives no
75
+ # millimetres for registarske pločice: čl. 18 st. 5-7 delegates "oblik i
76
+ # sadržaj" to Obrasci 3-6, which are DIMENSIONED DRAWINGS. Narodne novine
77
+ # publishes them as 229x70-pixel rasters in which the dimension figures are
78
+ # not legible. Two of them are big enough to read and are recorded as spec
79
+ # (Obrazac 4 = 280 x 200 mm, Obrazac 5 = 180 x 180 mm); the single-line
80
+ # plate's 520 x 110 mm is carried as `secondary-wikipedia` and labelled as
81
+ # such, because guessing it from the EU norm would be a guess.
82
+ #
83
+ # WHAT IS NOT IN THIS FILE, and why. Croatian POLICE plates (reportedly six
84
+ # digits in two groups, blue on white) are NOT modelled: no instrument
85
+ # prescribing them was reached in this pass, and the civil pravilnik does not
86
+ # mention them. Recorded as a gap rather than filled from an enthusiast
87
+ # description. Likewise the 1990s code list (the popis attached to NN 12/93,
88
+ # 22/93, 19/96, 149/02), which NN 12/1993 čl. 34 expressly kept alive for a
89
+ # transitional period and which was not fetched.
90
+ # The registration-area position prints six codes with a caron (ČK KŽ PŽ ŠI
91
+ # VŽ ŽU). Declared here in exact codepoints per PRD-PLATES §2.6 so the regexes
92
+ # below can express the plate's REAL alphabet instead of an ASCII shadow of it.
93
+ # The SERIAL-suffix position does NOT carry diacritics — see regex_strict, which
94
+ # enumerates the Croatian alphabet without them — so only the AREA position is
95
+ # widened. One pattern token `L`, two different letter alphabets.
96
+ serial_alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ČŠŽ"
97
+ jurisdiction: hr
98
+ authority:
99
+ name: Ministarstvo unutarnjih poslova Republike Hrvatske — Pravilnik o registraciji i označavanju vozila
100
+ url: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html"
101
+ binding: vehicle
102
+ binding_note: >-
103
+ The mark is assigned to the VEHICLE at registration and, since 2016-07-04,
104
+ survives a change of owner without being surrendered (NN 130/2017 čl. 48
105
+ st. 1). Vehicle-keyed consumers may join on it. Two qualifications: čl. 25
106
+ st. 1 re-issues the mark when the vehicle is registered in a different
107
+ registration area, and čl. 47 st. 7 lets a surrendered plate be taken over
108
+ by "druga osoba na temelju ovjerene izjave vlasnika registarskih pločica o
109
+ ustupanju" — a plate can move to another person's vehicle.
110
+ instrument:
111
+ citation: "Pravilnik o registraciji i označavanju vozila, »Narodne novine« br. 130/2017"
112
+ enabling: "Zakon o sigurnosti prometa na cestama, čl. 242 st. 4 — the delegation named in the pravilnik's own preamble"
113
+ objava: "2017-12-27"
114
+ stupanje_na_snagu: "2018-01-01"
115
+ stupanje_source: "Čl. 59 NN 130/2017, verbatim: 'Ovaj Pravilnik objavit će se u »Narodnim novinama«, a stupa na snagu 1. siječnja 2018. godine, osim članka 7. stavka 3., 4. i 5., članka 12. stavka 3. i 4., članka 18. stavka 7. … koji stupaju na snagu 20. svibnja 2018. godine.'"
116
+ predecessors:
117
+ - "NN 151/2008 (23.12.2008.), in force on the eighth day after publication — Pravilnik o registraciji i označavanju vozila; amended by NN 89/2010, 104/2010, 83/2013, 52/2015, 45/2016"
118
+ - "NN 12/1993 (5.2.1993.), signed 22 January 1993, in force on the eighth day after publication — Pravilnik o registraciji vozila na motorni pogon i priključnih vozila; amended by NN 22/1993, 19/1996, 149/2002"
119
+ - "NN 5/2005 … 68/2007 — Pravilnik o registraciji vozila, named in NN 151/2008 čl. 53 and NOT fetched in this pass (recorded gap)"
120
+ amendment_search: >-
121
+ A title search of the Narodne novine index for "registraciji i označavanju
122
+ vozila" (naslovi=da) on 2026-08-02 returns exactly nine items: the 2008
123
+ base, its five amendments, the 2017 base, and the two military pravilnici.
124
+ NO amendment to NN 130/2017 appears. The file therefore treats NN 130/2017
125
+ as the consolidated current text; if an amendment exists outside the title
126
+ index it is a recorded gap in this pass, not a denial.
127
+
128
+ # ---------------------------------------------------------------------------
129
+ # Jurisdiction-wide facts, cited once and referenced per series.
130
+ # ---------------------------------------------------------------------------
131
+ common:
132
+ plate_text_structure: >-
133
+ Čl. 18 st. 1 NN 130/2017, verbatim and complete: "Registarske pločice za
134
+ vozila izrađene su od metala, presvučene reflektirajućom folijom, bijele su
135
+ boje na kojima je crnim slovima otisnuta oznaka registracijskog područja i
136
+ registarski broj vozila. Na krajnjoj lijevoj strani registarske pločice
137
+ otisnuta je razlikovna oznaka Republike Hrvatske, a između oznake
138
+ registracijskog područja i registarskog broja otisnut je grb Republike
139
+ Hrvatske." Four zones, left to right: EU band — area code — coat of arms —
140
+ registration number.
141
+ colours:
142
+ statute: >-
143
+ The pravilnik states colours as WORDS, never as coordinates: "bijele su
144
+ boje" (white ground), "crnim slovima" (black characters) for the ordinary
145
+ plate; "otisnute brojke i slova zelene su boje" for foreigners' and
146
+ temporarily registered vehicles (čl. 18 st. 3); "crvene su boje" for
147
+ oversize/overweight vehicles (čl. 18 st. 4); "plave su boje … brojke i
148
+ slova su žute boje" for diplomatic (čl. 24 st. 1); "zelene su boje …
149
+ žutim slovima" for export (čl. 44 st. 1).
150
+ hex_basis_rule: >-
151
+ No Croatian instrument in this pass gives a colorimetric specification
152
+ for CIVIL plates — no CIE quadrangle as in Austria, no RAL number. Every
153
+ civil hex below is therefore `hex_basis: observed` and is the obvious
154
+ reading of the colour word, recorded as such. THE MILITARY PRAVILNIK IS
155
+ THE EXCEPTION and is the only sourced colour in the file: NN 71/2018
156
+ čl. 23 st. 1 gives "žute je boje broj 1003, prema RAL-ovu katalogu boja".
157
+ retroreflective: "'presvučene reflektirajućom folijom' — čl. 18 st. 1, unconditional for civil plates. Expressly NOT so for military ones: NN 71/2018 čl. 23 st. 7, 'Registarska pločica za vozila Ministarstva i Oružanih snaga nema reflektirajuća svojstva.'"
158
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 1-4, čl. 24 st. 1, čl. 44 st. 1. Accessed 2026-08-02"
159
+ alphabet:
160
+ ordinary: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V, Z]
161
+ excluded: [Q, W, X, Y, "Č", "Ć", "Đ", "Š", "Ž"]
162
+ basis: >-
163
+ INFERRED, and labelled as inferred rather than quoted, because no
164
+ provision spells the ordinary series' alphabet directly. Two provisions
165
+ bound it. (1) Čl. 21 NN 130/2017 lets an owner order a plate carrying a
166
+ pre-chosen "registarskim brojem vozila IZ ČLANKA 18. STAVKA 2." — i.e.
167
+ drawn from the ordinary space — and st. 2 then says "Registarski broj iz
168
+ stavka 1. ovoga članka ne može sadržavati slova Č, Ć, Đ, Š i Ž." (2) Čl.
169
+ 22 st. 3 says the BY-CHOICE mark "uključuje i strana slova X, Y i W" —
170
+ "also includes the FOREIGN letters X, Y and W", which only parses if they
171
+ are absent from the ordinary set. Q is in neither alphabet: it is not a
172
+ letter of Croatian. The 22 letters above are the Croatian Latin alphabet
173
+ minus its five diacritic letters and minus the digraphs.
174
+ caution: >-
175
+ The area CODE is a different alphabet from the registration NUMBER and
176
+ does carry diacritics (ČK, KŽ, PŽ, ŠI, VŽ, ŽU). Do not apply the 22-letter
177
+ set to the prefix.
178
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 21 st. 1-2, čl. 22 st. 3. Accessed 2026-08-02"
179
+ separator:
180
+ printed: "-"
181
+ statute_for_by_choice: >-
182
+ Čl. 22 st. 2, verbatim: "Između brojčanih i slovnih oznaka obvezna je
183
+ crtica, a između slovnih oznaka može se odabrati crtica. Crtica se računa
184
+ kao jedan od znakova." A hyphen is MANDATORY between the digit group and
185
+ the letter group, OPTIONAL between letter groups, and counts against the
186
+ seven-character budget. This is a primary source for the glyph.
187
+ ordinary_series_gap: >-
188
+ For the ORDINARY mark, čl. 18 prescribes no separator glyph at all — the
189
+ hyphen is visible only in Obrazac 3, a drawing. Every ordinary regex here
190
+ therefore spells that position as the separator-only class `[- ]`
191
+ (PRD-PLATES §2.8, the es-consular precedent): the printed hyphen is
192
+ certain from the drawing, its statutory basis is not, and `pattern` shows
193
+ the canonical printed form.
194
+ arms_position: >-
195
+ The gap between the area code and the number is occupied by the ŠAHOVNICA
196
+ (čl. 18 st. 1, "između oznake registracijskog područja i registarskog
197
+ broja otisnut je grb Republike Hrvatske"), not by a separator glyph. It is
198
+ written here as an optional emitted SPACE, exactly as Italy's marchio
199
+ ufficiale is in plates/it.yml.
200
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 22 st. 2, čl. 18 st. 1. Accessed 2026-08-02"
201
+ script:
202
+ statute: "Čl. 19 st. 1, verbatim: 'Slovne oznake na registarskim pločicama upisuju se latiničnim pismom, a brojčane oznake arapskim brojkama. Oblik slova i brojki tiskan je na Obrascu 15, a izgled grba na Obrascu 16.'"
203
+ font: >-
204
+ NO TYPEFACE IS NAMED. As in the UK, Germany, Spain and Austria, the legal
205
+ object is a DRAWING — Obrazac 15 — and the render layer must derive glyphs
206
+ from it rather than from any third-party TTF (PRD-PLATES §6). Unlike the
207
+ Austrian KDV, Obrazac 15 publishes no per-glyph millimetres in a form this
208
+ pass could read (see structural fact 6). Recorded gap.
209
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 19. Accessed 2026-08-02"
210
+ euro_band:
211
+ side: left
212
+ content: eu-stars+HR
213
+ statute: >-
214
+ Čl. 18 st. 1: "Na krajnjoj lijevoj strani registarske pločice otisnuta je
215
+ razlikovna oznaka Republike Hrvatske". The cross-reference to Reg. (EC)
216
+ 2411/98 is in the amending instrument that introduced it (NN 45/2016
217
+ čl. 2) and in čl. 1a st. 2 as inserted by NN 45/2016 čl. 1: "Ovim se
218
+ Pravilnikom uređuje primjena Uredbe Vijeća (EZ) br. 2411/98…".
219
+ oval_still_prescribed: >-
220
+ Čl. 20 keeps the separate adhesive OVAL for international traffic — white,
221
+ major axis 175 mm, minor axis 115 mm, letters "HR" in black 80 mm high
222
+ with a 10 mm stroke — and st. 2 then says that inside the EU the band on
223
+ the plate is accepted instead. These are the only millimetres the
224
+ pravilnik prints for any marking.
225
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 1, čl. 20 st. 1-2; https://narodne-novine.nn.hr/clanci/sluzbeni/2016_05_45_1165.html # čl. 1-2. Accessed 2026-08-02"
226
+ emblem:
227
+ name: "grb Republike Hrvatske (šahovnica)"
228
+ statute: "Čl. 18 st. 1 places it between the area code and the number; čl. 19 st. 1 delegates its appearance to Obrazac 16."
229
+ artwork_risk: unresearched
230
+ artwork_note: >-
231
+ The Croatian coat of arms is a state symbol whose use is regulated
232
+ independently of copyright, and no assessment was made in this pass.
233
+ PRD-PLATES §3 applies unchanged: `rendered: placeholder` on every series.
234
+ dimensions:
235
+ obrazac_3: { note: "single-line plate for motor vehicles, trailers, tractors and machines — čl. 18 st. 5. Dimensions NOT legible in the published raster; see structural fact 6" }
236
+ obrazac_4: { w: 280, h: 200, unit: mm, basis: read-from-drawing, note: "two-line plate for vehicles whose construction cannot take Obrazac 3 — čl. 18 st. 6. 280 and 200 are the two figures legible in the published drawing" }
237
+ obrazac_5: { w: 180, h: 180, unit: mm, basis: read-from-drawing, note: "motorcycles and quadricycles — čl. 18 st. 7" }
238
+ obrazac_6: { note: "mopeds and light quadricycles — čl. 18 st. 7. Dimensions not legible" }
239
+ source: "https://narodne-novine.nn.hr/files/_web/sluzbeni-dio/2017/130000/images/9529.jpg # Obrazac 4, the dimensioned drawing; https://narodne-novine.nn.hr/files/_web/sluzbeni-dio/2017/130000/images/9521.jpg # Obrazac 5. Accessed 2026-08-02"
240
+ predecessor_system:
241
+ decision: >-
242
+ THE SFRY SERIES IS DELIBERATELY NOT AUTHORED HERE, AND THE SAME DECISION
243
+ IS TAKEN IN plates/si.yml. Croatia and Slovenia both left one federal
244
+ system in 1991, so authoring it in each national file would duplicate a
245
+ single historical layer in two places, give it two ids, and invite the two
246
+ copies to drift. It belongs in ONE historical jurisdiction file at gate L4
247
+ (PRD-PLATES §7), not twice at L1. What IS recorded here is the hinge, from
248
+ the Croatian primary itself.
249
+ hinge: >-
250
+ NN 12/1993 čl. 34, verbatim: "Danom stupanja na snagu ovoga Pravilnika
251
+ prestaje važiti Pravilnik o registraciji vozila (»Narodne novine«, broj
252
+ 46/84.) i Pravilnik o registraciji motornih i priključnih vozila, obrascu
253
+ prometne i vozačke dozvole (»Narodne novine«, broj 54/91., 6/92. i
254
+ 35/92.), OSIM POPISA REGISTRACIJSKIH PODRUČJA koja vrijede do isteka roka
255
+ iz članka 322. stavak 1. Zakona o sigurnosti prometa na cestama." NN 46/84
256
+ is the SFRY-era instrument as republished in the Croatian gazette; NN
257
+ 54/91 is the first instrument of independent Croatia (1991). Neither was
258
+ fetched in this pass. Note what the article does: it repeals the old rules
259
+ but KEEPS THE OLD AREA-CODE LIST alive transitionally — which is why the
260
+ 1990s code set is a recorded gap in hr-cities.yml rather than a guess.
261
+ design_continuity: >-
262
+ The white ground, black characters and the arms-between-groups layout of
263
+ the 1993 plate are commonly described as the Yugoslav design with the red
264
+ star replaced by the šahovnica. That specific claim is secondary and is
265
+ tagged as such; what the primary supports is only that čl. 18 NN 12/1993
266
+ already prescribes exactly the layout still in force.
267
+ transitional_validity: >-
268
+ THE OLD PLATES DID NOT VANISH IN 1991, AND THE PRIMARIES SAY SO TWICE.
269
+ NN 12/1993 čl. 34 repealed the pre-independence pravilnici "OSIM POPISA
270
+ REGISTRACIJSKIH PODRUČJA koja vrijede do isteka roka iz članka 322. stavak
271
+ 1. Zakona o sigurnosti prometa na cestama" — the OLD AREA-CODE LIST
272
+ survived the repeal for a statutory transitional period. Fifteen years
273
+ later NN 151/2008 čl. 53 was still winding it down: marks issued under the
274
+ 1993 and 2005 popisi "usklađivat će se s Popisom oznaka registracijskih
275
+ područja iz članka 52. stavka 2. ovog Pravilnika KOD PRVE REGISTRACIJE
276
+ VOZILA U REPUBLICI HRVATSKOJ I KOD PROMJENE VLASNIKA" — harmonised on
277
+ first registration or change of owner, i.e. never for a car that simply
278
+ stayed put. This is why "the SFRY series ended in 1991" would be a false
279
+ claim and why the pre-1991 layer is period-tagged `transitional-provision`
280
+ wherever it is eventually authored.
281
+ transitional_validity_evidence: transitional-provision
282
+ transitional_validity_source: "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 53; https://narodne-novine.nn.hr/clanci/sluzbeni/1993_02_12_185.html # NN 12/1993 čl. 34"
283
+ design_continuity_evidence: secondary-wikipedia
284
+ design_continuity_source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Croatia # 'The design of Croatian license plates comes from old Yugoslav license plates from the 1980s … switching the red star … with the coat of arms'. Accessed 2026-08-02"
285
+ source: "https://narodne-novine.nn.hr/clanci/sluzbeni/1993_02_12_185.html # NN 12/1993 čl. 34. Accessed 2026-08-02"
286
+
287
+ region_encoding_tables:
288
+ reference: "plates/_decode/hr-cities.yml"
289
+ bare_filename: "hr-cities.yml"
290
+ reference_note: "the full path is what resolves and is what 77 of the 78 corpus references use; the bare filename is carried alongside because plates/ie.yml (wave 2) references its table bare, and a consumer may meet either form"
291
+ note: >-
292
+ One closed, primary, 34-row table (Prilog 1 NN 130/2017), extracted
293
+ mechanically. The 2016 caveat is stated INSIDE that file, not only here.
294
+
295
+ series:
296
+
297
+ # =========================================================================
298
+ # THE CURRENT STANDARD SERIES — the 1993 serial inside the 2016 design.
299
+ # =========================================================================
300
+ - id: hr-standard-2016
301
+ class: standard
302
+ categories: [car, van, truck, bus, trailer, tractor, machine]
303
+ period: { start: 2016 }
304
+ period_evidence: enacted-commencement
305
+ period_start_precise: "2016-07-04"
306
+ matching: strict
307
+ format:
308
+ pattern: "LL 9999-LL"
309
+ regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z'
310
+ regex_strict: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][ABCDEFGHIJKLMNOPRSTUVZ]{1,2}\z'
311
+ charset:
312
+ letters: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V, Z]
313
+ letters_excluded: [Q, W, X, Y]
314
+ notes: "see common.alphabet — INFERRED from čl. 21 st. 2 and čl. 22 st. 3, not quoted. The prefix is a different alphabet and DOES carry carons; `[A-Z]{2}` cannot express ČK KŽ PŽ ŠI VŽ ŽU."
315
+ progression: >-
316
+ NOT PUBLISHED. Čl. 18 st. 2 fixes the shape (three or four digits, one
317
+ or two letters) and nothing in the pravilnik says how the space is
318
+ walked, so a Croatian plate CANNOT be dated from its serial by anything
319
+ in this file. Recorded gap. The only serial-borne era signal is the
320
+ WIDTH: a three-digit/one-letter mark is an early allocation in its area
321
+ and a four-digit/two-letter mark a late one, which is an ordering, not
322
+ a date.
323
+ separator_note: >-
324
+ Two positions, and they are different in kind. The gap after the area
325
+ code holds the ŠAHOVNICA and is written as an optional emitted space.
326
+ The gap between digits and letters is a printed hyphen, certain from
327
+ Obrazac 3 but not spelled in čl. 18, so it is written as the
328
+ separator-only class `[- ]` per PRD-PLATES §2.8.
329
+ design:
330
+ plate: { w: 520, h: 110, unit: mm, basis: secondary-wikipedia, basis_note: "the pravilnik delegates dimensions to Obrazac 3, whose figures are illegible in the published 229x70 raster — see the file header, structural fact 6" }
331
+ plate_variants:
332
+ - { w: 280, h: 200, unit: mm, basis: read-from-drawing, note: "Obrazac 4 — vehicles whose construction cannot take the single-line plate (čl. 18 st. 6)" }
333
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed, spec_note: "'bijele su boje … presvučene reflektirajućom folijom' (čl. 18 st. 1) — a colour WORD, not a coordinate" }
334
+ foreground: "#000000"
335
+ foreground_hex_basis: observed
336
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed, note: "čl. 18 st. 1 'razlikovna oznaka Republike Hrvatske'; the 2411/98 cross-reference is in NN 45/2016 čl. 1-2" }
337
+ emblem: { present: true, rendered: placeholder, position: "between the area code and the number", note: "grb Republike Hrvatske, čl. 18 st. 1; appearance delegated to Obrazac 16" }
338
+ rear_differs: false
339
+ display: "front and rear (čl. 24 st. 1 of the Pravilnik o registraciji … Ministarstva obrane uses the same phrasing for military vehicles; the civil requirement is in the Zakon o sigurnosti prometa na cestama, not in this pravilnik — recorded gap)"
340
+ region_encoding: "plates/_decode/hr-cities.yml"
341
+ region_encoding_mechanism: >-
342
+ THE PREFIX IS THE DECODE, AND ITS BINDING IS FROZEN AT ISSUE. Čl. 5 st. 1
343
+ NN 130/2017 registers a vehicle at a station "prema registracijskom
344
+ području u kojem vlasnik vozila ima prebivalište, boravište, privremeni
345
+ ili stalni boravak ili sjedište", and st. 2 lets a station OUTSIDE that
346
+ area do the work while still issuing the owner's own area code. Since
347
+ 2016-07-04 the mark is not surrendered on a sale (čl. 48 st. 1), so it
348
+ records the area of the owner AT ISSUE and of nobody since. Čl. 25 st. 1
349
+ still re-issues on a move to another area. A parse API must report
350
+ "area at issue", never "current owner's area".
351
+ variants:
352
+ - class: personalized
353
+ name: "registarske pločice po narudžbi"
354
+ format: { pattern: "LL 9999-LL", regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z' }
355
+ period: { start: 2018 }
356
+ note: >-
357
+ A TO-ORDER mark, not a vanity mark: čl. 21 st. 1 lets the owner order
358
+ plates carrying "unaprijed zadanim registarskim brojem vozila iz
359
+ članka 18. stavka 2. ovoga Pravilnika ako je zatraženi registarski
360
+ broj slobodan" — a CHOSEN serial inside the ordinary grammar, so a
361
+ sub-entry rather than a series (PRD-PLATES §2.3). Format and design
362
+ are identical to the standard series. It is new in NN 130/2017: no
363
+ equivalent appears in NN 151/2008. Čl. 21 st. 2 supplies the file's
364
+ only direct statement about the ordinary alphabet.
365
+ sources:
366
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 21 st. 1-2"
367
+ - class: temporary
368
+ name: "green characters — foreigners and temporary registration"
369
+ format: { pattern: "LL 9999-LL", regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z' }
370
+ design: { foreground: "#008000", hex_basis: observed }
371
+ note: >-
372
+ Čl. 18 st. 3, verbatim: "Na registarskim pločicama za vozila stranaca
373
+ kojima je odobren privremeni ili stalni boravak i za privremeno
374
+ registrirana vozila, otisnute brojke i slova zelene su boje." A
375
+ COLOUR-ONLY variant of the same format and period, therefore a
376
+ sub-entry and not a series (PRD-PLATES §2.3). Note that the 2008 text
377
+ of the same rule also covered foreign trade, transport and cultural
378
+ representations and foreign correspondents; NN 130/2017 dropped that
379
+ clause.
380
+ sources:
381
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 3"
382
+ - class: standard
383
+ name: "red characters — oversize and overweight vehicles"
384
+ format: { pattern: "LL 9999-LL", regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z' }
385
+ design: { foreground: "#CC0000", hex_basis: observed }
386
+ note: >-
387
+ Čl. 18 st. 4: red characters "za vozila koja ne odgovaraju propisanim
388
+ uvjetima za dimenzije vozila (duljina, širina, visina) odnosno čija je
389
+ najveća dopuštena masa veća od propisane, odnosno koja premašuju
390
+ dopuštena osovinska opterećenja". Colour-only, hence a sub-entry.
391
+ sources:
392
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 4"
393
+ sources:
394
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2016_05_45_1165.html # NN 45/2016 čl. 2 (the band added to čl. 13 st. 1) and čl. 10 ('stupa na snagu 4. srpnja 2016. godine') — the period start, dated to the day by the instrument itself"
395
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 18 (plate, format, colours), čl. 19 (script), čl. 20 (the oval), čl. 25 (re-issue), čl. 48 (change of owner), čl. 52 + Prilog 1 (area codes)"
396
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Croatia # 520 x 110 mm single-line dimensions ONLY — tagged secondary-wikipedia; every other claim on this series is from Narodne novine. Accessed 2026-08-02"
397
+ notes: >-
398
+ THE CURRENT CROATIAN PLATE, and the file's headline finding is its START
399
+ DATE. Not 2013 (accession), not 13 May 2016 (the gazette date of the
400
+ amending pravilnik), but 4 JULY 2016, because NN 45/2016 čl. 10 says so in
401
+ terms. The serial grammar it carries is the 1993 one, unchanged; what 2016
402
+ changed is the band on the left and, in the same instrument, the rule that
403
+ used to hand the plates back on every sale. Old plates were NOT recalled —
404
+ NN 45/2016 čl. 8 says the owner "nije dužan mijenjati registarske pločice
405
+ izdane na obrascima koji su vrijedili do stupanja na snagu ovoga
406
+ Pravilnika" — so band-less plates remain legal indefinitely and the two
407
+ standard series overlap in the wild by design. One further reversal is
408
+ worth recording: NN 45/2016 čl. 7 ordered that a worn plate be replaced
409
+ with a NEW mark, and NN 130/2017 čl. 25 st. 3 undid that, restoring the
410
+ SAME mark with the band added.
411
+
412
+ # =========================================================================
413
+ # ONE SERIES BACK — the same serial, no band. 1993 to 2016.
414
+ # =========================================================================
415
+ - id: hr-standard-1993
416
+ class: standard
417
+ categories: [car, van, truck, bus, trailer, tractor, machine]
418
+ period: { start: 1993, end: 2016 }
419
+ period_evidence: enacted-commencement
420
+ period_start_precise: "1993-02-13"
421
+ period_start_note: >-
422
+ NN 12/1993 was published on 5 February 1993 and its čl. 35 says "Ovaj
423
+ Pravilnik stupa na snagu osmoga dana od objave u »Narodnim novinama«" —
424
+ the eighth day, i.e. 13 February 1993. The instrument is signed 22 January
425
+ 1993; neither the signature date nor the gazette date is the period start.
426
+ matching: strict
427
+ format:
428
+ pattern: "LL 9999-LL"
429
+ regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z'
430
+ charset: { letters_excluded: [Q, W, X, Y], notes: "no alphabet provision appears in NN 12/1993 at all — the exclusion is carried over from the modern instruments and is weaker evidence here than on hr-standard-2016. Recorded as such; no regex_strict is shipped for this series." }
431
+ separator_note: "as on hr-standard-2016 — the arms occupy the first gap, the hyphen the second, and NN 12/1993 čl. 18 spells neither."
432
+ design:
433
+ plate: { w: 520, h: 110, unit: mm, basis: secondary-wikipedia, basis_note: "NN 12/1993 čl. 18 delegates size to Obrasci 4-7, which are not published as legible drawings" }
434
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed, spec_note: "'presvučena reflektirajućom folijom, bijele je boje' — čl. 18 NN 12/1993" }
435
+ foreground: "#000000"
436
+ foreground_hex_basis: observed
437
+ band: { side: none }
438
+ band_note: "NO EU band and no distinguishing sign on the plate. Čl. 18 NN 12/1993 describes only the area code, the arms and the number; the distinguishing sign was the separate white oval, which čl. 24 of that pravilnik prescribes for international traffic."
439
+ emblem: { present: true, rendered: placeholder, note: "grb Republike Hrvatske 'propisanim bojama', čl. 18 NN 12/1993 — the arms are in the plate from the first independent-era instrument" }
440
+ rear_differs: false
441
+ region_encoding: "plates/_decode/hr-cities.yml"
442
+ region_encoding_mechanism: >-
443
+ Same prefix mechanism, but with the PRE-2016 binding, which was tighter:
444
+ NN 151/2008 čl. 40 st. 3 let the plates pass to a buyer only if the
445
+ registration area did not change, so for a plate issued before
446
+ 2016-07-04 and not re-registered since, the code is much better evidence
447
+ about the current owner's area than it is for a later plate. The CODE SET
448
+ of the 1990s is a recorded gap — NN 12/1993 čl. 34 kept the older popis
449
+ alive transitionally and that list was not fetched.
450
+ sources:
451
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/1993_02_12_185.html # NN 12/1993 (5.2.1993.) čl. 18 (the plate and the serial grammar, word for word identical to the 2017 text), čl. 19 (diplomatic), čl. 34 (repeals), čl. 35 (in force on the eighth day)"
452
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 13 (the same plate), čl. 40 st. 3 (the pre-2016 same-area condition on ceding plates to a buyer)"
453
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2016_05_45_1165.html # NN 45/2016 čl. 2 and čl. 10 — what ends this series and when"
454
+ notes: >-
455
+ THE PLATE THAT IS STILL ON THE ROAD. This series ends as an ISSUING
456
+ series on 2016-07-04 and not as a VALID one: NN 45/2016 čl. 8 and
457
+ NN 130/2017 čl. 57 both say the owner is not obliged to change plates
458
+ issued on the older forms, and NN 130/2017 čl. 25 st. 3 replaces a worn
459
+ band-less plate with the same mark PLUS the band. The 1993-2016 window
460
+ spans three base pravilnici (NN 12/1993, the 2005 series, NN 151/2008)
461
+ and is cut here as ONE series because the three of them prescribe the
462
+ same plate: white ground, black characters, area code, arms, three-or-four
463
+ digits and one-or-two letters. Where they differ is in procedure, not in
464
+ the mark. The 2005-2007 instruments (NN 5/05 … 68/07) were named in
465
+ NN 151/2008 čl. 53 but not fetched — a recorded gap that could yet split
466
+ this series.
467
+
468
+ # =========================================================================
469
+ # MOTORCYCLES AND MOPEDS — same serial, different plate.
470
+ # =========================================================================
471
+ - id: hr-motorcycle-2016
472
+ class: motorcycle
473
+ categories: [motorcycle]
474
+ period: { start: 2016 }
475
+ period_evidence: enacted-commencement
476
+ matching: strict
477
+ format:
478
+ pattern: "LL 9999-LL"
479
+ regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z'
480
+ regex_strict: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][ABCDEFGHIJKLMNOPRSTUVZ]{1,2}\z'
481
+ charset: { letters_excluded: [Q, W, X, Y], notes: "as common.alphabet" }
482
+ layout_note: "the same mark on a SQUARE plate, laid out over three lines in Obrazac 5: area code and arms on line 1, digits on line 2, letters on line 3. The hyphen is not printed in the two-line arrangement — a rendering fact, not a format fact."
483
+ design:
484
+ plate: { w: 180, h: 180, unit: mm, basis: read-from-drawing, spec_note: "read from Obrazac 5, the only Croatian plate drawing published at a legible size" }
485
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
486
+ foreground: "#000000"
487
+ foreground_hex_basis: observed
488
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed }
489
+ emblem: { present: true, rendered: placeholder }
490
+ rear_differs: false
491
+ region_encoding: "plates/_decode/hr-cities.yml"
492
+ sources:
493
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 7 ('Oblik i sadržaj registarskih pločica za motocikle i četverocikle tiskan je na Obrascu 5, a za mopede i lake četverocikle na Obrascu 6')"
494
+ - "https://narodne-novine.nn.hr/files/_web/sluzbeni-dio/2017/130000/images/9521.jpg # Obrazac 5, the dimensioned drawing: 180 x 180 mm, three-line layout"
495
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2016_05_45_1165.html # čl. 9 replaces Obrasci 5-12 and čl. 10 dates the change to 2016-07-04"
496
+ notes: >-
497
+ A SEPARATE SERIES ON DESIGN, NOT ON FORMAT (PRD-PLATES §2.3): the mark is
498
+ the čl. 18 st. 2 mark, but the plate is a 180 mm square whose layout puts
499
+ the digits and letters on separate lines, which a renderer must model and
500
+ a one-line pattern cannot express. NN 130/2017 čl. 59 defers the motorcycle
501
+ form specifically — "članka 22. stavka 6. u dijelu kojim se propisuje
502
+ oblik i sadržaj obrasca registarskih pločica za motocikle i četverocikle"
503
+ enters into force on 20 May 2018, four and a half months after the rest —
504
+ but that deferral touches the BY-CHOICE motorcycle plate, not this one.
505
+
506
+ - id: hr-moped-2016
507
+ class: moped
508
+ categories: [moped]
509
+ period: { start: 2016 }
510
+ period_evidence: enacted-commencement
511
+ matching: strict
512
+ format:
513
+ pattern: "LL 9999-LL"
514
+ regex: '\A[A-ZČŠŽ]{2} ?\d{3,4}[- ][A-Z]{1,2}\z'
515
+ charset: { letters_excluded: [Q, W, X, Y] }
516
+ design:
517
+ plate: { note: "Obrazac 6; dimensions NOT legible in the published raster — recorded gap" }
518
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
519
+ foreground: "#000000"
520
+ foreground_hex_basis: observed
521
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed }
522
+ emblem: { present: true, rendered: placeholder }
523
+ region_encoding: "plates/_decode/hr-cities.yml"
524
+ sources:
525
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # čl. 18 st. 7 — mopeds and light quadricycles on Obrazac 6"
526
+ notes: >-
527
+ Separated from the motorcycle series ONLY because the pravilnik separates
528
+ the forms (Obrazac 6 against Obrazac 5) and therefore separates the plate.
529
+ Croatia does NOT give mopeds a distinct colour the way Slovenia did until
530
+ 2011 — čl. 18 st. 1's white ground is unqualified. The dimensions are the
531
+ recorded gap that keeps this entry thin.
532
+
533
+ # =========================================================================
534
+ # BY-CHOICE (VANITY) PLATES — the one genuinely different grammar.
535
+ # =========================================================================
536
+ - id: hr-personalized-2008
537
+ class: personalized
538
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
539
+ period: { start: 2008 }
540
+ period_evidence: enacted-commencement
541
+ matching: recall-only
542
+ format:
543
+ pattern: "LL LLLLLL"
544
+ regex: '\A[A-ZČŠŽ]{2} ?[A-Z0-9]{1,7}(?:-[A-Z0-9]{1,6})?\z'
545
+ charset:
546
+ letters_extra: [X, Y, W]
547
+ notes: "čl. 22 st. 3, verbatim: 'Registarski broj iz stavka 1. ovoga članka simetrično je otisnut te uključuje i strana slova X, Y i W.' The by-choice mark is the ONLY Croatian mark that may carry them."
548
+ grammar: >-
549
+ Čl. 22 NN 130/2017. St. 1: "najmanje tri do najviše sedam brojčanih ili
550
+ slovnih znakova ili od kombinacije brojčanih i slovnih znakova na dijelu
551
+ registarske pločice iza oznake registracijskog područja i grba Republike
552
+ Hrvatske". St. 2: "U slučaju izbora numeričkih znakova obvezno je
553
+ odabrati najmanje jedan slovni znak. Između brojčanih i slovnih oznaka
554
+ obvezna je crtica, a između slovnih oznaka može se odabrati crtica.
555
+ Crtica se računa kao jedan od znakova." St. 8: letters-only marks on
556
+ Obrazac 8, or on the 7+8 combination, are three to SIX characters.
557
+ why_recall_only: >-
558
+ The regex above is deliberately wider than the issuing grammar and a
559
+ match is a shape hit only (PRD-PLATES §2.7). It does not enforce the
560
+ "at least one letter if digits are chosen" rule, does not count the
561
+ hyphen against the seven-character budget, does not enforce the
562
+ three-character floor, and cannot express čl. 22 st. 7 at all — that
563
+ provision makes issuance turn on a MINISTERIAL JUDGMENT ("nije
564
+ provokativan, neetičan ili protivan pravnom poretku") which no regex
565
+ can carry. Per §2.7 a recall-only series ships no regex_strict.
566
+ design:
567
+ plate: { note: "Obrasci 7-10, one per body class; dimensions not legible" }
568
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
569
+ foreground: "#000000"
570
+ foreground_hex_basis: observed
571
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed, note: "from 2016-07-04 only; the 2008-2016 by-choice plate had no band, exactly as the standard series" }
572
+ emblem: { present: true, rendered: placeholder }
573
+ font_note: "čl. 19 st. 2 gives the by-choice plate its own glyph drawing — Obrazac 17, not the Obrazac 15 used by every other plate. Croatia prints vanity marks in a DIFFERENT typeface, which a renderer must model."
574
+ region_encoding: "plates/_decode/hr-cities.yml"
575
+ region_encoding_mechanism: "the area code and arms are retained and precede the chosen part (čl. 22 st. 1, 'na dijelu registarske pločice iza oznake registracijskog područja i grba Republike Hrvatske'), so the geographic decode is unaffected."
576
+ validity:
577
+ term_years: 5
578
+ statute: "Čl. 23: the right of use runs five years from registration, is renewable in five-year terms on payment, and lapsing it obliges the owner to deregister within 15 days and return the plates."
579
+ sources:
580
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 14 — the by-choice plate is introduced here (three to seven characters, X/Y/W admitted); čl. 15 the five-year term; čl. 55 in force on the eighth day after publication on 23.12.2008"
581
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 22 (the grammar, the mandatory hyphen, the ministerial refusal ground, the transliteration-duplication ground), čl. 19 st. 2 (Obrazac 17 glyphs), čl. 23 (term)"
582
+ notes: >-
583
+ The Croatian vanity plate keeps its geography: unlike a British or Dutch
584
+ personalised mark it cannot escape the area code. Two provisions here are
585
+ worth a consumer's attention beyond the grammar. Čl. 22 st. 7 refuses a
586
+ mark that could collide with another ON TRANSLITERATION — the regulation's
587
+ own acknowledgement of the diacritic problem this dataset records in
588
+ structural fact 5 — and it also refuses anything colliding with the
589
+ oldtimer PV pattern. Čl. 22 st. 9 forbids by-choice marks on diplomatic
590
+ and oldtimer plates entirely. period.start is 2008 because NN 151/2008
591
+ introduced the series; the 2016 band and the 2018 grammar refinements are
592
+ changes WITHIN it, and the 2016 design change is recorded on the band
593
+ entry rather than by splitting the series, because the choice grammar —
594
+ the thing that makes it its own series — did not change in 2016.
595
+
596
+ # =========================================================================
597
+ # OLDTIMERS — the one Croatian series with a LITERAL in the mark.
598
+ # =========================================================================
599
+ - id: hr-historic-2008
600
+ class: historic
601
+ categories: [car, van, truck, bus, motorcycle, moped, trailer]
602
+ period: { start: 2008 }
603
+ period_evidence: enacted-commencement
604
+ matching: strict
605
+ format:
606
+ pattern: "LL PV-999"
607
+ regex: '\A[A-ZČŠŽ]{2} ?PV[- ]\d{3,4}\z'
608
+ grammar: "Čl. 18 st. 8 NN 130/2017, verbatim: 'Broj registarskih pločica za oldtimere (starodobna vozila) sastoji se od slovne oznake PV i tri ili četiri numeričke oznake.' PV = povijesno vozilo. The area code and arms are retained; čl. 18 st. 9 applies the ordinary plate forms and glyph drawing to it."
609
+ design:
610
+ plate: { note: "čl. 18 st. 9 applies st. 5-7 — the same Obrasci 3-6 as the ordinary plate" }
611
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
612
+ foreground: "#000000"
613
+ foreground_hex_basis: observed
614
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed, note: "from 2016-07-04" }
615
+ emblem: { present: true, rendered: placeholder }
616
+ region_encoding: "plates/_decode/hr-cities.yml"
617
+ sources:
618
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 13 st. 8-9 — the PV mark is introduced here"
619
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 18 st. 8-9; čl. 22 st. 9 (no by-choice mark on an oldtimer); čl. 47 st. 7 (oldtimer plates are held 180 days after deregistration, twice the ordinary 90)"
620
+ notes: >-
621
+ PV IS A LITERAL, NOT A LETTER GROUP: the two characters are fixed, so this
622
+ series' regex is genuinely strict without a strict twin — the sourced
623
+ grammar IS the pattern (the PRD-PLATES §2.7 case where 29 of 31 L0 series
624
+ needed no twin). The oldtimer mark is protected from collision in two
625
+ directions: čl. 22 st. 7 refuses a by-choice mark that would coincide with
626
+ it, and čl. 22 st. 9 forbids choosing a mark for an oldtimer at all.
627
+
628
+ # =========================================================================
629
+ # TRANSFERABLE (TRADE) PLATES — bound to a business, not a vehicle.
630
+ # =========================================================================
631
+ - id: hr-dealer-2008
632
+ class: dealer
633
+ categories: [car, van, truck, bus, motorcycle, trailer]
634
+ period: { start: 2008 }
635
+ period_evidence: enacted-commencement
636
+ binding: business
637
+ matching: strict
638
+ format:
639
+ pattern: "LL PP-999"
640
+ regex: '\A[A-ZČŠŽ]{2} ?PP[- ]\d{3,4}\z'
641
+ grammar: "Čl. 39 st. 2 NN 130/2017: 'Broj prenosivih pločica sastoji se od slovne oznake PP i tri ili četiri numeričke oznake.' PP = prenosive pločice."
642
+ design:
643
+ plate: { note: "čl. 39 st. 3 applies čl. 18 st. 5-7 — the ordinary Obrasci" }
644
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
645
+ foreground: "#000000"
646
+ foreground_hex_basis: observed
647
+ emblem: { present: true, rendered: placeholder, note: "'Između oznake grada i broja prenosive pločice otisnut je grb Republike Hrvatske' — čl. 39 st. 1" }
648
+ band: { side: left, color: "#003399", content: eu-stars+HR, hex_basis: observed, note: "not separately prescribed for this series; inherited with the Obrasci replaced by NN 45/2016 čl. 9" }
649
+ region_encoding: "plates/_decode/hr-cities.yml"
650
+ region_encoding_note: >-
651
+ A WORDING CHANGE WORTH RECORDING. NN 151/2008 čl. 33 st. 1 said the plate
652
+ carries "oznaka registracijskog područja"; NN 130/2017 čl. 39 st. 1 says
653
+ it carries "oznaka GRADA" — the city. Whether the drafter meant a
654
+ different set of codes or was writing loosely is not resolvable from the
655
+ text, and Prilog 1 contains no separate city list. Decode with
656
+ hr-cities.yml, but flag transferable plates as lower confidence.
657
+ sources:
658
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 33 — prenosive pločice introduced, 'oznaka registracijskog područja'"
659
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 36-42 — the traffic licence and the certificate book, čl. 39 the plate itself, čl. 38 st. 3 each certificate valid at most 7 days"
660
+ notes: >-
661
+ Croatia's trade plate is a genuinely transferable registration: it comes
662
+ with a prometna dozvola and a bound book of fifty numbered certificates
663
+ (čl. 38), each issued for at most seven days, and the evidence of use is
664
+ part of the record. Issued and withdrawn by the POLICE (čl. 40, čl. 42),
665
+ not by the inspection stations that do ordinary registration — the only
666
+ civil series in this file with a different issuing authority.
667
+
668
+ # =========================================================================
669
+ # EXPORT — the only civil plate with no area code at all.
670
+ # =========================================================================
671
+ - id: hr-export-2008
672
+ class: export
673
+ categories: [car, van, truck, bus, motorcycle, trailer]
674
+ period: { start: 2008 }
675
+ period_evidence: enacted-commencement
676
+ matching: strict
677
+ format:
678
+ pattern: "RH 9999-LL"
679
+ regex: '\ARH ?\d{3,4}[- ][A-Z]{1,2}\z'
680
+ grammar: "Čl. 44 NN 130/2017: 'zelene su boje na kojima je žutim slovima otisnuta oznaka RH i broj izvozne pločice. Između oznake RH i broja izvozne pločice otisnut je grb Republike Hrvatske.' St. 2: 'Broj izvozne pločice sastoji se od tri ili četiri numeričke i jedne ili dvije slovne oznake.'"
681
+ design:
682
+ plate: { note: "čl. 44 st. 3 applies čl. 18 st. 5-7" }
683
+ background: { color: "#007A33", finish: retroreflective, hex_basis: observed, spec_note: "'zelene su boje' — a colour word; the hex is an observed reading and is NOT a spec claim" }
684
+ foreground: "#FFD100"
685
+ foreground_hex_basis: observed
686
+ band: { side: none }
687
+ band_note: "no EU band: the country identity is the literal RH in the mark itself, which is what makes this the only civil series whose prefix is not an area code."
688
+ emblem: { present: true, rendered: placeholder }
689
+ region_encoding: none
690
+ region_encoding_note: "RH is Republika Hrvatska, a national literal, NOT a row in hr-cities.yml. A parse API that looks it up there will get a miss, and should."
691
+ sources:
692
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 — izvozne pločice introduced with the RH literal and the green/yellow scheme"
693
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 43 (what the owner must produce), čl. 44 (the plate), čl. 46 (replacement)"
694
+ notes: >-
695
+ Green ground, yellow characters, the arms between RH and the number. The
696
+ export registration comes with its own traffic licence stamped "IZVOZNA"
697
+ (čl. 43 st. 2) and the evidence record names the destination state
698
+ (čl. 45 st. 2) — so unlike the ordinary series this one records where the
699
+ vehicle went. period.start 2008 follows NN 151/2008, which is where the
700
+ series first appears; no equivalent is in NN 12/1993.
701
+
702
+ # =========================================================================
703
+ # DIPLOMATIC — blue and yellow, and the numeric country code is its decode.
704
+ # =========================================================================
705
+ - id: hr-diplomatic-1993
706
+ class: diplomatic
707
+ categories: [car, van]
708
+ period: { start: 1993 }
709
+ period_evidence: enacted-commencement
710
+ matching: strict
711
+ format:
712
+ pattern: "999-A-999"
713
+ pattern_note: >-
714
+ The pattern prints the "A" (diplomatic) form as its canonical example
715
+ because the activity letter is a CLOSED set of three literals — A, C, M
716
+ — not a free letter position. Writing it as `L` would round-trip against
717
+ a regex that admits every letter, which would be a wider claim than
718
+ čl. 24 st. 2 makes. The regex carries the closed set.
719
+ regex: '\A\d{2,3}[- ][ACM][- ]\d{1,3}\z'
720
+ grammar: >-
721
+ Čl. 24 st. 1 NN 130/2017: the plate "sadrže: brojčanu oznaku zemlje iz
722
+ koje je predstavništvo, slovnu oznaku djelatnosti predstavništva,
723
+ odnosno statusa osobe u tim predstavništvima i registarski broj vozila"
724
+ — country number, activity letter, vehicle number, in that order.
725
+ St. 2 closes the letter set: "A" for diplomatic missions and staff with
726
+ diplomatic status, "C" for consular posts and staff with consular
727
+ status, "M" for foreign employees of those missions WITHOUT diplomatic
728
+ status.
729
+ widths_unspecified: >-
730
+ NEITHER the country-code width NOR the serial width is prescribed
731
+ anywhere in the pravilnik. The quantifiers above are a deliberate
732
+ widening to cover what the text leaves open, which is why this series
733
+ is the file's weakest format claim. It is kept `strict` rather than
734
+ `recall-only` because every LITERAL in it is sourced — the three-letter
735
+ set is closed by čl. 24 st. 2 — and the regex is narrower than the
736
+ (unbounded) statutory text rather than wider than the issued grammar.
737
+ design:
738
+ background: { color: "#003399", finish: retroreflective, hex_basis: observed, spec_note: "'plave su boje' — colour word only" }
739
+ foreground: "#FFD100"
740
+ foreground_hex_basis: observed
741
+ band: { side: none }
742
+ emblem: { present: false, note: "čl. 24 prescribes no arms on the diplomatic plate, unlike every other civil series" }
743
+ supplementary_plate: >-
744
+ Čl. 24 st. 3 adds a second, ELLIPTICAL plate in black with yellow
745
+ letters: "CMD" for the head of mission, "CD" for a person with
746
+ diplomatic status, "CC" for a consular officer (Obrazac 14). It is a
747
+ SEPARATE physical object carried alongside the registration plate, not
748
+ part of the mark, and is modelled here rather than as its own series
749
+ because it carries no serial.
750
+ region_encoding: inline
751
+ region_encoding_note: >-
752
+ The leading numeric group is a COUNTRY code assigned to each accredited
753
+ mission, not a geographic area code — hr-cities.yml must not be consulted
754
+ for it. The country-code table itself is NOT published in the pravilnik
755
+ and was not obtained from any primary in this pass: it is a RECORDED GAP,
756
+ and PRD-PLATES puts diplomatic decode tables at gate L4 in any case.
757
+ sources:
758
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/1993_02_12_185.html # NN 12/1993 čl. 19 — the blue/yellow plate with country number, activity letter and vehicle number, from the founding instrument"
759
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 čl. 16 — the A/C/M letter set stated in the modern wording, plus the CMD/CD/CC ellipse"
760
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 24 st. 1-3 (current), čl. 22 st. 9 (no by-choice mark on these plates)"
761
+ notes: >-
762
+ ONE SERIES ACROSS THIRTY-THREE YEARS, deliberately. The 1993, 2008 and
763
+ 2017 texts prescribe the same plate — blue ground, yellow characters,
764
+ country number then activity letter then serial — and the 2016 band
765
+ amendment did not touch čl. 16/24, so this series has no EU band and no
766
+ 2016 break. What DID change is invisible in the format: the 1993 text
767
+ lists the activity letters in a different place from the 2008 text. The
768
+ widths and the country-code table are the two recorded gaps, and they are
769
+ the reason a consumer should treat a Croatian diplomatic match as weak.
770
+
771
+ # =========================================================================
772
+ # TEST PLATES.
773
+ # =========================================================================
774
+ - id: hr-temporary-test-2008
775
+ class: temporary
776
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, tractor, machine]
777
+ period: { start: 2008 }
778
+ period_evidence: enacted-commencement
779
+ matching: recall-only
780
+ format:
781
+ pattern: "99999"
782
+ regex: '\A[A-Z0-9]{2,8}(?:[- ][A-Z0-9]{1,6})?\z'
783
+ grammar: >-
784
+ Čl. 34 NN 130/2017 gives the pokusna pločica its COLOURS and its forms
785
+ (Obrasci 18-19 for ordinary test use, 20-21 for technical inspection)
786
+ and says the plates are "izrađene … od retro-reflektivnog bijelog
787
+ laminata". IT PRESCRIBES NO SERIAL GRAMMAR AT ALL — no character count,
788
+ no arrangement, no alphabet.
789
+ why_recall_only: >-
790
+ Because there is nothing to be strict about. The regex is an admitted
791
+ catch-all: a match says only "this string has a shape a Croatian test
792
+ plate could have" and is emphatically not a validity claim
793
+ (PRD-PLATES §2.7). Shipping a confident pattern here would be inventing
794
+ one; the gap is recorded instead.
795
+ design:
796
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed, spec_note: "'bijele su boje' plus 'retro-reflektivnog bijelog laminata' (čl. 34 st. 3) — laminate, not the metal-and-foil construction of čl. 18" }
797
+ foreground: "#000000"
798
+ foreground_hex_basis: observed
799
+ emblem: { present: false, note: "not prescribed in čl. 34. NN 12/1993 čl. 25 DID put the arms on the test plate ('oznaka registracijskog područja, grb Republike Hrvatske i registarski broj'); the modern text dropped the mention. Recorded, not resolved." }
800
+ region_encoding: mechanism-only
801
+ region_encoding_note: "NN 12/1993 čl. 25 put an area code on the test plate; NN 130/2017 čl. 34 does not mention one. Whether the current test plate carries a code is NOT established from the primary — recorded gap."
802
+ sources:
803
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/1993_02_12_185.html # NN 12/1993 čl. 25 — the older, more specific test-plate description"
804
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 čl. 34 (colours, laminate, forms), čl. 35 (the register kept of them)"
805
+ notes: >-
806
+ THE THINNEST SERIES IN THE FILE, AND HONESTLY SO. Croatia's test plate is
807
+ prescribed by colour and by drawing and by nothing else; the two things a
808
+ parse API wants — the grammar and whether an area code is present — are
809
+ both absent from the current text, and the 1993 text answers only the
810
+ second, and differently. `matching: recall-only` and two recorded gaps are
811
+ the correct output here. A future pass should read Obrasci 18-21, which
812
+ were not legible in this one.
813
+
814
+ # =========================================================================
815
+ # MILITARY — a different pravilnik, and the file's only sourced colour.
816
+ # =========================================================================
817
+ - id: hr-military-2014
818
+ class: military
819
+ categories: [car, van, truck, bus, motorcycle, trailer, machine]
820
+ period: { start: 2014 }
821
+ period_evidence: enacted-commencement
822
+ matching: strict
823
+ format:
824
+ pattern: "HV 9999-LL"
825
+ regex: '\AHV ?\d{3,4}[- ][A-Z]{1,2}\z'
826
+ grammar: >-
827
+ NN 71/2018 čl. 23: "(2) Na registarskoj pločici otisnuta je slovna
828
+ oznaka 'HV' i registarski broj vozila. (3) Između oznake 'HV' i
829
+ registarskog broja otisnut je grb Republike Hrvatske propisnim bojama.
830
+ (4) Registarski broj vozila sastoji se od tri ili četiri brojčane i
831
+ jedne ili dvije slovne oznake." The civil grammar exactly, with HV
832
+ (Hrvatska vojska) standing where the area code stands.
833
+ design:
834
+ plate: { note: "Obrazac 5 of the military pravilnik — not the civil Obrazac 5" }
835
+ background: { color: "#F9A800", finish: non-retroreflective, hex_basis: ral-conversion, spec_note: "THE ONLY SOURCED COLOUR IN THIS FILE: čl. 23 st. 1, 'žute je boje broj 1003, prema RAL-ovu katalogu boja'. RAL 1003 Signalgelb is a physical colour standard; the hex is a conversion and is NOT part of the standard, which is why hex_basis says so. A renderer should prefer the RAL number." }
836
+ ral: "1003"
837
+ foreground: "#000000"
838
+ foreground_hex_basis: observed
839
+ band: { side: none }
840
+ emblem: { present: true, rendered: placeholder, note: "grb Republike Hrvatske 'propisnim bojama', čl. 23 st. 3" }
841
+ retroreflective: false
842
+ retroreflective_source: "čl. 23 st. 7, verbatim: 'Registarska pločica za vozila Ministarstva i Oružanih snaga nema reflektirajuća svojstva.' A deliberate NEGATIVE against the civil rule."
843
+ region_encoding: none
844
+ region_encoding_note: "HV is a national service literal. hr-cities.yml does not apply."
845
+ sources:
846
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2014_11_133_2505.html # NN 133/2014 (14.11.2014.) čl. 23 — the first of the two military pravilnici read here; identical plate spec"
847
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2018_08_71_1458.html # NN 71/2018 (4.8.2018.) čl. 23 (the plate, RAL 1003, non-reflective), čl. 25 (the painted mark for combat vehicles, RAL 9005)"
848
+ notes: >-
849
+ A SEPARATE REGULATORY UNIVERSE, like Italy's. Military registration is
850
+ done by the Ministry of Defence under its own pravilnik, and this series
851
+ is cut at 2014 because NN 133/2014 is the earliest military instrument
852
+ READ in this pass — not because it is the earliest that exists. NN 71/2018
853
+ re-enacts the identical plate specification, so no second series is cut.
854
+ Two facts have no civil analogue: the plate is expressly NOT
855
+ retroreflective, and combat vehicles get no plate at all but a mark
856
+ PAINTED on the vehicle in RAL 9005 black over the vehicle's own base
857
+ colour (čl. 25 st. 1) — a registration mark that is not a plate, which the
858
+ schema records here in prose rather than forcing into `design.plate`.
859
+ Wikipedia describes VP/MP suffix letters for military-police vehicles;
860
+ that is not in either pravilnik as read and is NOT asserted.