10 Sep
|
Ig Group
|
India
Skip to content
- Product
Job advertising
MultipostingCareers Page BuilderJob Description GeneratorSourcing ExtensionScreening
Applicant tracking system
Hiring PipelineInterview SchedulingCandidate CommunicationOffer ManagementAutomations
The platform
Everything you need to hire
See all features
- Solutions
Industries
StartupsHospitalityHealthcareProfessional servicesRetail
Use cases
First hireHigh-volume hiringReplace spreadsheetsCollaborative hiringFree job posting
Customer proof
See how teams hire with Join
Customer Stories
- Resources
Knowledge
BlogResearchGlossaryJob boards
Templates
Employment contractsJob guides
Free trial
Start your 14-day trial
Sign up
Product updates
See what's new in Join
Changelog
- Pricing
- Product
- Solutions
- Resources
- Pricing
Back
Job advertising
- Multiposting
- Careers Page Builder
- Job Description Generator
- Sourcing Extension
- Screening
Applicant tracking system
- Hiring Pipeline
- Interview Scheduling
- Candidate Communication
- Offer Management
- Automations
The platform
Everything you need to hire
See all features
Back
Industries
- Startups
- Hospitality
- Healthcare
- Professional services
- Retail
Use cases
- First hire
- High-volume hiring
- Replace spreadsheets
- Collaborative hiring
- Free job posting
Customer proof
See how teams hire with Join
Customer Stories
Back
Knowledge
- Blog
- Research
- Glossary
- Job boards
Templates
- Employment contracts
- Job guides
Free trial
Start your 14-day trial
Sign up
Product updates
See what's new in Join
Changelog
(function()const themeLight = #FFFFFF; const themeDark = #1F2124; (function () // ThemeToggle can render multiple times per page (e.g. footer + burger // drawer), so bind() queries *all* toggles each run and uses a per-element // `data-theme-toggle-bound` guard: it binds only the ones not yet bound. // Sync (icon + aria) runs every time and is idempotent, so all toggles // stay in lockstep. Without the guard,
a re-run would double-bind a // toggle and each click would fire twice → net no change. // // Rebind on `astro:page-load`, not at parse: with the View Transitions // router the incoming is swapped in wholesale, so every toggle is // a fresh node with no click handler. Parse-time binding (or // `data-astro-rerun`) is unreliable here — with two identical inline // scripts, the re-run fires before the whole recent body is in place and // misses the footer toggle. `astro:page-load` fires once, after the full // swap, so bind() sees and wires every toggle on the page. The event is // also emitted on the initial load, so this covers first paint too. function bind() const toggles = document.querySelectorAll([data-component=theme-toggle]); if (toggles.length === 0) return; const meta = document.querySelector(meta[name=theme-color]); function sync(theme) for (const t of toggles) const isDark = theme === dark; t.setAttribute(aria-pressed, String(isDark)); const label = isDark t.dataset.labelDark : t.dataset.labelLight; if (label) t.setAttribute(aria-label, label); if (meta) meta.content = theme === dark themeDark : themeLight; sync(document.documentElement.dataset.theme || light); for (const t of toggles) if (t.dataset.themeToggleBound === 1) continue; t.dataset.themeToggleBound = 1; t.addEventListener(click, () => const cur = document.documentElement.dataset.theme || light; const next = cur === dark light : dark; document.documentElement.dataset.theme = next; try localStorage.setItem(theme, next); catch sync(next); ); bind(); // Register the document-level listener once. `document` persists across // ClientRouter swaps, and this script re-executes per instance/navigation,
// so the window guard prevents stacking duplicate listeners. if (!window.__themeToggleRebind) window.__themeToggleRebind = true; document.addEventListener(astro:page-load, bind); )(); )();
EN
- Deutsch
- English
- Français
- Español
- Nederlands
(function()const LSW_LOCALES = [de,en,fr,es,nl]; const LSW_NAMES = de:Deutsch,en:English,fr:Français,es:Español,nl:Nederlands; const LSW_UNAVAILABLE = This page is not yet available in:; const LSW_LABEL = Language; (function () if (window.__lswitcherBound) return; window.__lswitcherBound = true; function readTargets() var t = ; document.querySelectorAll(link[rel=alternate][hreflang]).forEach(function (l) var hl = l.getAttribute(hreflang); if (!hl || hl === x-default) return; var code = hl.slice(0, 2).toLowerCase(); if (t[code]) return; // first match wins (handles region tags like de-CH) try var u = new URL(l.getAttribute(href), location.origin); t[code] = u.pathname + u.search + u.hash; catch (e) ); return t; function esc(s) return String(s).replace(/[&<>]/g, function (c) return &: &, <: <, >: >, : " [c]; ); function rebuild() var current = (document.documentElement.getAttribute(lang) || en).slice(0, 2).toLowerCase(); var targets = readTargets(); document.querySelectorAll([data-lswitcher]).forEach(function (root) var code = root.querySelector([data-lswitcher-code]); if (code) code.textContent = current.toUpperCase(); var btn = root.querySelector(.ds-menu-trigger); if (btn) btn.setAttribute( aria-label, current.toUpperCase() + , + LSW_LABEL + : + (LSW_NAMES[current] || current), ); var ul = root.querySelector(.ds-menu-list); if (!ul) return; var html = ; LSW_LOCALES.forEach(function (loc) var native = esc(LSW_NAMES[loc] || loc); if (loc === current) html +=
- + native +
; else if (targets[loc]) html +=
- + native +
; else html +=
- + native +
; ); ul.innerHTML = html; ); document.addEventListener(astro:page-load, rebuild); )(); )();
For Candidates
Log inSign upLog outDashboard
📌 Join: the ATS for SMB hiring (India)
🏢 Ig Group
📍 India