cache-bust local assets; narrow the language facet to scores >= 3

Part 1 — asset versioning: every local <script src> and <link rel=stylesheet> on the
tracked pages now carries ?v=<sha256-of-the-file> (10 hex), computed at BUILD time from
the file's bytes by work/build-asset-versions.py — never hand-typed, and idempotent
(re-running with no file change rewrites nothing). This is what makes an edited
focus-rule.js / photo-upload.js a new URL instead of a stale cache hit.

Part 2 — language facet: a language now counts for the Language filter only when its
0-5 self-assessment is >= LANG_FACET_MIN (3 = 'works in it'). The constant sits beside
the 15-point rule in the page script and its mirror in build-directory.py. Nothing
stored changes; the card's languages chart still prints every language above 0, the
search box is unchanged, and the facet stays an exact membership test against the
card's value. A '1' language no longer offers the person under that language.
This commit is contained in:
webmaster committed 2026-11-03 21:26:58 +00:00
1 parent c83186f809
commit bd0881f882
51 files changed
+138 -118

No files matched your search

+2 -2
View File
@@ -28,7 +28,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
/* ---- Australia landing page (page-scoped; additive) ---- */ /* ---- Australia landing page (page-scoped; additive) ---- */
.cmp-sr-only { .cmp-sr-only {
@@ -391,7 +391,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
+2 -2
View File
@@ -33,7 +33,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -325,6 +325,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
+2 -2
View File
@@ -36,7 +36,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
.blog-header { .blog-header {
padding: 2rem 0; padding: 2rem 0;
@@ -275,6 +275,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
+1 -1
View File
@@ -31,7 +31,7 @@
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
rel="stylesheet" rel="stylesheet"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
/* Blog post specific overrides — matching homepage light theme */ /* Blog post specific overrides — matching homepage light theme */
body { body {
+2 -2
View File
@@ -36,7 +36,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -277,6 +277,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -36,7 +36,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -296,6 +296,6 @@ Admin credentials: sent via email</code></pre>
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -35,7 +35,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -263,7 +263,7 @@
</main> </main>
<script <script
defer defer
src="/static/agent-odoo4projects/agent.js" src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"
></script> ></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -36,7 +36,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
* { * {
box-sizing: border-box; box-sizing: border-box;
@@ -263,7 +263,7 @@
</main> </main>
<script <script
defer defer
src="/static/agent-odoo4projects/agent.js" src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"
></script> ></script>
</body> </body>
</html> </html>
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
@@ -34,7 +34,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -175,6 +175,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
@@ -17,7 +17,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
@@ -16,7 +16,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
body { background: #0d1b2e; } body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; } .blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
+2 -2
View File
@@ -35,7 +35,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
/* Blog post specific styles — leverages CSS vars from style.css */ /* Blog post specific styles — leverages CSS vars from style.css */
:root { :root {
@@ -311,6 +311,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -35,7 +35,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
.container { .container {
width: 80%; width: 80%;
@@ -250,6 +250,6 @@ Odoo &gt; Settings &gt; Technical &gt; Scheduled Actions &gt; backup job</code><
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -35,7 +35,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -267,6 +267,6 @@ Password: (check your email)</code></pre>
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
@@ -34,7 +34,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="../../style.css" /> <link rel="stylesheet" href="../../style.css?v=3332fbba93" />
<style> <style>
:root { :root {
--primary: #714b67; --primary: #714b67;
@@ -165,6 +165,6 @@
</div> </div>
</div> </div>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -220,14 +220,14 @@
#customQuoteModal .biz-success p{color:var(--midnight)} #customQuoteModal .biz-success p{color:var(--midnight)}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}} @media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}}
</style> </style>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<!-- Privacy-friendly analytics by Plausible --> <!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script> <script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script>
<script> <script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- <!--
@@ -672,7 +672,7 @@
</footer> </footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="/script.js"></script> <script src="/script.js?v=d2046e3469"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -38,7 +38,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */ /* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */
.oc-sr-only { .oc-sr-only {
@@ -479,7 +479,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+5 -5
View File
@@ -33,7 +33,7 @@
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" />
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" />
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */ /* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-sr-only { .bc-sr-only {
@@ -1018,9 +1018,9 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/buy.js"></script> <script defer src="/static/buy.js?v=31314de600"></script>
<script defer src="/static/bootcamp-availability.js"></script> <script defer src="/static/bootcamp-availability.js?v=94dfd8cd7c"></script>
<script defer src="/static/bootcamp-waitlist.js"></script> <script defer src="/static/bootcamp-waitlist.js?v=6c2e2fbd33"></script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -31,7 +31,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */ /* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */
.cmp-sr-only { .cmp-sr-only {
@@ -559,7 +559,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+3 -3
View File
@@ -29,7 +29,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right. /* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */ Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
@@ -274,7 +274,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<main> <main>
@@ -586,6 +586,6 @@
</script> </script>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -220,14 +220,14 @@
#customQuoteModal .biz-success p{color:var(--midnight)} #customQuoteModal .biz-success p{color:var(--midnight)}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}} @media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}}
</style> </style>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<!-- Privacy-friendly analytics by Plausible --> <!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script> <script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script>
<script> <script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- <!--
@@ -672,7 +672,7 @@
</footer> </footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="/script.js"></script> <script src="/script.js?v=d2046e3469"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -38,7 +38,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */ /* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */
.oc-sr-only { .oc-sr-only {
@@ -479,7 +479,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+5 -5
View File
@@ -33,7 +33,7 @@
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" />
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" />
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */ /* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-sr-only { .bc-sr-only {
@@ -1018,9 +1018,9 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/buy.js"></script> <script defer src="/static/buy.js?v=31314de600"></script>
<script defer src="/static/bootcamp-availability.js"></script> <script defer src="/static/bootcamp-availability.js?v=94dfd8cd7c"></script>
<script defer src="/static/bootcamp-waitlist.js"></script> <script defer src="/static/bootcamp-waitlist.js?v=6c2e2fbd33"></script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -31,7 +31,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */ /* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */
.cmp-sr-only { .cmp-sr-only {
@@ -559,7 +559,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+3 -3
View File
@@ -29,7 +29,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right. /* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */ Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
@@ -274,7 +274,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<main> <main>
@@ -586,6 +586,6 @@
</script> </script>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+1 -1
View File
@@ -28,7 +28,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* Utility page, same shell as /freelancer-edit/ and the top bar of /* Utility page, same shell as /freelancer-edit/ and the top bar of
+1 -1
View File
@@ -24,7 +24,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* Utility page. Deliberately small: no hero, no footer, no site chrome beyond a /* Utility page. Deliberately small: no hero, no footer, no site chrome beyond a
+3 -3
View File
@@ -28,7 +28,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* Utility page. Deliberately small: no hero, no footer, no site chrome beyond a brand /* Utility page. Deliberately small: no hero, no footer, no site chrome beyond a brand
@@ -147,8 +147,8 @@
</style> </style>
<!-- The 15-point rule, in ONE copy for both forms (this one and the application form). --> <!-- The 15-point rule, in ONE copy for both forms (this one and the application form). -->
<script src="/static/focus-rule.js"></script> <script src="/static/focus-rule.js?v=22ac72a8f0"></script>
<script src="/static/photo-upload.js"></script> <script src="/static/photo-upload.js?v=c17638457b"></script>
<!-- 1) Read the credential, then take it OUT of the address bar. <!-- 1) Read the credential, then take it OUT of the address bar.
The hash arrives as ?has=... or ?hash=... (both spellings accepted, 'has' first — the The hash arrives as ?has=... or ?hash=... (both spellings accepted, 'has' first — the
+4 -4
View File
@@ -230,14 +230,14 @@
.bf-topbar-cta{color:var(--brass);white-space:nowrap} .bf-topbar-cta{color:var(--brass);white-space:nowrap}
.bf-topbar:hover .bf-topbar-cta,.bf-topbar:focus-visible .bf-topbar-cta{color:var(--brass-bright)} .bf-topbar:hover .bf-topbar-cta,.bf-topbar:focus-visible .bf-topbar-cta{color:var(--brass-bright)}
</style> </style>
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<!-- Privacy-friendly analytics by Plausible --> <!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script> <script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script>
<script> <script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- <!--
@@ -701,7 +701,7 @@
</footer> </footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="script.js"></script> <script src="script.js?v=d2046e3469"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -25,7 +25,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
.legal-hero { .legal-hero {
padding: 4rem 0 2.5rem; padding: 4rem 0 2.5rem;
@@ -204,6 +204,6 @@
</section> </section>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -43,7 +43,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /></noscript> <noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Black Friday 2026 page (page-scoped; additive) ---- */ /* ---- Odoo Black Friday 2026 page (page-scoped; additive) ---- */
.bf-sr-only { .bf-sr-only {
@@ -744,7 +744,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Hero — copied from the homepage (index.html): same component, same behaviour. On load the <!-- Hero — copied from the homepage (index.html): same component, same behaviour. On load the
@@ -1275,7 +1275,7 @@
</div> </div>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script> <script defer src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script defer src="/static/black-friday.js"></script> <script defer src="/static/black-friday.js?v=df1f299dc5"></script>
<script defer src="/static/ads-consent.js"></script> <script defer src="/static/ads-consent.js?v=0cc2bfb809"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -23,7 +23,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- "Odoo Community + AI agent" page (page-scoped; additive). /* ---- "Odoo Community + AI agent" page (page-scoped; additive).
Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already
@@ -937,6 +937,6 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+1 -1
View File
@@ -21,7 +21,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Freelancer records — admin (page-scoped). Internal page, never linked. ---- */ /* ---- Freelancer records — admin (page-scoped). Internal page, never linked. ---- */
.adm-bar { .adm-bar {
+26 -6
View File
@@ -29,7 +29,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- "Odoo Community developers" directory (page-scoped; additive). /* ---- "Odoo Community developers" directory (page-scoped; additive).
Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already
@@ -2039,9 +2039,9 @@
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
<script src="/static/focus-rule.js"></script> <script src="/static/focus-rule.js?v=22ac72a8f0"></script>
<script src="/static/photo-upload.js"></script> <script src="/static/photo-upload.js?v=c17638457b"></script>
<script> <script>
/* ============================================================================ /* ============================================================================
Odoo freelancer directory — page script. Odoo freelancer directory — page script.
@@ -2089,6 +2089,14 @@
var FOCUS_AXES = ["functional", "system", "modules", "integration", "ai"]; var FOCUS_AXES = ["functional", "system", "modules", "integration", "ai"];
var FOCUS_TOTAL = O4PFocus.TOTAL; // the shared rule (static/focus-rule.js) var FOCUS_TOTAL = O4PFocus.TOTAL; // the shared rule (static/focus-rule.js)
var FOCUS_MAX = O4PFocus.MAX; var FOCUS_MAX = O4PFocus.MAX;
// THE FACET THRESHOLD — sits beside the 15-point rule. Mirrored verbatim in
// work/build-directory.py (`LANG_FACET_MIN`). A language counts for the Language
// FILTER only when its 0-5 self-assessment is >= this (3 = "works in it",
// 5 = native). It is OUR reading, not the freelancer's: it changes nothing stored
// and nothing the card shows (the chain below still prints every language above 0).
// Without it, a "1" offered the person under that language and the facet could not
// narrow. Do not change any stored score.
var LANG_FACET_MIN = 3;
var FOCUS_AXIS_LABELS = { var FOCUS_AXIS_LABELS = {
functional: "Functional", system: "System", modules: "Modules", functional: "Functional", system: "System", modules: "Modules",
integration: "Integration", ai: "AI" integration: "Integration", ai: "AI"
@@ -2368,6 +2376,18 @@
return out; return out;
} }
/* The languages the Language FILTER matches on — score >= LANG_FACET_MIN. Separate
from liveLangsDeclared(): the facet is narrower than the card's list, so a "1"
language is still shown on the card but no longer offers the person under it.
This feeds ONLY the facet attribute + the filter options, never the card. */
function liveLangsFacet(rec) {
var scores = liveLangScores(rec), out = [];
LANG_FIELDS.forEach(function (p) {
if (scores[p[1]] >= LANG_FACET_MIN) out.push(p[1]);
});
return out;
}
function liveAxisRows(rec) { function liveAxisRows(rec) {
var rows = []; var rows = [];
FOCUS_AXES.forEach(function (axis) { FOCUS_AXES.forEach(function (axis) {
@@ -2426,7 +2446,7 @@
return (isNaN(n) || n <= 0) ? "" : "yes"; return (isNaN(n) || n <= 0) ? "" : "yes";
} }
if (kind === "oca") return liveOcaLink(rec) ? "1" : ""; if (kind === "oca") return liveOcaLink(rec) ? "1" : "";
if (kind === "langnum") return liveLangsDeclared(rec).map(fold).join("|"); if (kind === "langnum") return liveLangsFacet(rec).map(fold).join("|");
return liveValues(rec, field).map(fold).join("|"); return liveValues(rec, field).map(fold).join("|");
} }
@@ -2592,7 +2612,7 @@
} else if (kind === "langnum") { } else if (kind === "langnum") {
var seenL = []; var seenL = [];
records.forEach(function (r) { records.forEach(function (r) {
liveLangsDeclared(r).forEach(function (v) { liveLangsFacet(r).forEach(function (v) {
if (!seenL.some(function (s) { return fold(s) === fold(v); })) seenL.push(v); if (!seenL.some(function (s) { return fold(s) === fold(v); })) seenL.push(v);
}); });
}); });
+2 -2
View File
@@ -38,7 +38,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */ /* ---- Odoo Community Upgrade page (page-scoped; additive) ---- */
.oc-sr-only { .oc-sr-only {
@@ -479,7 +479,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+5 -5
View File
@@ -33,7 +33,7 @@
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-mobile-900.webp" media="(max-width: 640px)" fetchpriority="high" />
<link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" /> <link rel="preload" as="image" href="/images/hero/bootcamp-hero-desktop-1920.webp" media="(min-width: 641px)" fetchpriority="high" />
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */ /* ---- ODOO ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-sr-only { .bc-sr-only {
@@ -1039,9 +1039,9 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/buy.js"></script> <script defer src="/static/buy.js?v=31314de600"></script>
<script defer src="/static/bootcamp-availability.js"></script> <script defer src="/static/bootcamp-availability.js?v=94dfd8cd7c"></script>
<script defer src="/static/bootcamp-waitlist.js"></script> <script defer src="/static/bootcamp-waitlist.js?v=6c2e2fbd33"></script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -31,7 +31,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */ /* ---- Odoo Hosting 2027 landing page (page-scoped; additive) ---- */
.cmp-sr-only { .cmp-sr-only {
@@ -559,7 +559,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+2 -2
View File
@@ -35,7 +35,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Odoo Hosting Offers (evergreen hub) page (page-scoped; additive) ---- */ /* ---- Odoo Hosting Offers (evergreen hub) page (page-scoped; additive) ---- */
.of-sr-only { .of-sr-only {
@@ -449,7 +449,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. --> <!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
+3 -3
View File
@@ -27,7 +27,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- ODOO x N8N Masterclass landing page (page-scoped; additive). /* ---- ODOO x N8N Masterclass landing page (page-scoped; additive).
The block below is the bootcamp page's page-scoped CSS, reused so the two The block below is the bootcamp page's page-scoped CSS, reused so the two
@@ -831,7 +831,7 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/buy.js"></script> <script defer src="/static/buy.js?v=31314de600"></script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -29,7 +29,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- "Odoo staging environment" guide page (page-scoped; additive). /* ---- "Odoo staging environment" guide page (page-scoped; additive).
Reuses the top bar, band rhythm, hero and FAQ treatment already shipped on Reuses the top bar, band rhythm, hero and FAQ treatment already shipped on
@@ -822,6 +822,6 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -27,8 +27,8 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" media="print" onload="this.media='all'" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" media="print" onload="this.media='all'" />
<noscript><link rel="stylesheet" href="/style.css" /></noscript> <noscript><link rel="stylesheet" href="/style.css?v=3332fbba93" /></noscript>
<style> <style>
/* ---- Partner briefing for Andrew (page-scoped; additive) ---- */ /* ---- Partner briefing for Andrew (page-scoped; additive) ---- */
.andrew-sr-only { .andrew-sr-only {
@@ -700,6 +700,6 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -25,7 +25,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
.legal-hero { .legal-hero {
padding: 4rem 0 2.5rem; padding: 4rem 0 2.5rem;
@@ -205,6 +205,6 @@
</section> </section>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -29,7 +29,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right. /* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */ Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
@@ -274,7 +274,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</head> </head>
<body> <body>
<main> <main>
@@ -590,6 +590,6 @@
</script> </script>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -25,7 +25,7 @@
rel="stylesheet" rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/> />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css?v=3332fbba93" />
<style> <style>
.legal-hero { .legal-hero {
padding: 4rem 0 2.5rem; padding: 4rem 0 2.5rem;
@@ -195,6 +195,6 @@
</section> </section>
</main> </main>
<script defer src="/static/agent-odoo4projects/agent.js"></script> <script defer src="/static/agent-odoo4projects/agent.js?v=c3bb0cee2b"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -27,7 +27,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- "What Can I Use Odoo For?" guide page (page-scoped; additive). /* ---- "What Can I Use Odoo For?" guide page (page-scoped; additive).
The block below is odoo-community-upgrade.html's page-scoped CSS, reused so The block below is odoo-community-upgrade.html's page-scoped CSS, reused so
@@ -952,6 +952,6 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -27,7 +27,7 @@
onload="this.media='all'" onload="this.media='all'"
/> />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link rel="stylesheet" href="/style.css" /> <link rel="stylesheet" href="/style.css?v=3332fbba93" />
<style> <style>
/* ---- Workshops and Classes hub page (page-scoped; additive). /* ---- Workshops and Classes hub page (page-scoped; additive).
The block below is the bootcamp page's page-scoped CSS, reused so the two The block below is the bootcamp page's page-scoped CSS, reused so the two
@@ -788,6 +788,6 @@
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div> <div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div> </div>
</footer> </footer>
<script defer src="/static/lang.js"></script> <script defer src="/static/lang.js?v=3ec49a7e62"></script>
</body> </body>
</html> </html>