
:root {
  --blue-primary: #0a4f7f; /* Deep Trust Blue */
  --cyan-accent: #4DD0E1; /* Cyan Accent */
  --teal-secondary: #80CBC4; /* Warm Soft Teal */
  --charcoal-text: #333333; /* High-Contrast Text Dark Charcoal */
  --grey-bg: #f5f5f5; /* Light Muted Grey background */
  --card-bg: #ffffff;
  --border-color: #ddd;

  /* Homepage solution-tile palette, one pair per category (new skin) */
  --card-work-bg: #f0fdf4;
  --card-work-border: #bbf7d0;
  --card-work-text: #166534;
  --card-edu-bg: #f0f9ff;
  --card-edu-border: #bae6fd;
  --card-edu-text: #075985;
  --card-leisure-bg: #fefce8;
  --card-leisure-border: #fef08a;
  --card-leisure-text: #854d0e;
  --card-community-bg: #faf5ff;
  --card-community-border: #e9d5ff;
  --card-community-text: #6b21a8;
}

/* Real, recurring bug class (found live at least 5 times separately -
   header-notif-bell/count, session-nav, admin-preview-toolbar,
   region-picker, and now contact-supplier-categories-group/
   contact-subject-group, explicit ask 2026-09-23: "why regular user
   show supply name field why supplier shows subject" - each one its
   own per-selector [hidden] override below, never fixed at the root):
   ANY class rule setting its own `display` has the exact same
   specificity as the browser's default `[hidden] { display: none }` UA
   rule, and wins by later-in-cascade order - so `element.hidden = true`
   silently does nothing visible for every element whose class sets
   `display`. One real fix, permanently, instead of a 6th one-off patch
   the next time this bites a new element. */
[hidden] {
  display: none !important;
}

/* Israeli accessibility compliance (IS 5568 / WCAG2.0 AA) - a "skip to
   main content" link (WCAG 2.4.1 Bypass Blocks): visually hidden until
   focused, so keyboard/screen-reader users can jump past the header +
   nav on every page instead of tabbing through it every time. */
.skip-link {
  position: absolute;
  top: -999px;
  right: 1rem;
  z-index: 2147483000; /* above the accessibility widget, which covered Cancel on phones */
  background: var(--blue-primary);
  color: white;
  padding: 0.75rem 1.25rem;
  border-radius: 0 0 6px 6px;
  text-decoration: none;
  font-weight: bold;
}

.skip-link:focus {
  top: 0;
}

/* Screen-reader-only text: visually hidden but still announced (used to
   give icon-only / symbol-only content, like the star-rating glyphs, a
   real text alternative instead of relying on the glyphs alone). */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Visible keyboard-focus outline on every interactive element (none of
   the existing rules removed the browser default, but this makes it
   consistent and clearly visible against both the light page background
   and the dark header - WCAG 2.4.7 Focus Visible). */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
  outline: 3px solid var(--cyan-accent);
  outline-offset: 2px;
}

/* #main-content is focused programmatically on every route change (see
   app.js) purely so assistive tech announces the new page - it is not a
   real control, so it gets no visible ring of its own (which would
   otherwise draw a box around the entire page on every navigation). */
#main-content:focus-visible {
  outline: none;
}

/* overflow-x lives on <html>, not <body> - real bug found while chasing
   a sticky-title report: setting only overflow-x (not -y) on an element
   forces the browser to compute its overflow-y as "auto" too (a CSS
   overflow-spec quirk), which turned <body> into its own independent
   scroll container fighting the real viewport/document scroller. That
   desynced window.scrollY from the actual scroll position and made
   position:sticky (header, page titles) stick at the wrong offset or
   not at all depending on how far you'd scrolled. <html> IS the
   viewport's own scrolling box in standards mode, so the same rule
   there just clips horizontal overflow with no separate scroll context
   created. */
html {
  overflow-x: hidden;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  margin: 0;
  padding: 0;
  background-color: var(--grey-bg);
  color: var(--charcoal-text);
}

/* Sticky (explicit ask) - stays pinned to the top of the viewport on
   scroll instead of scrolling away with the page. z-index keeps it
   above the page content flowing underneath it; the hamburger dropdown
   (z-index 10, below) still layers correctly since it's a child of
   this same header, not a sibling competing for this stacking context. */
header {
  background-color: var(--blue-primary);
  color: white;
  padding: 1rem;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.25rem;
  position: sticky;
  top: 0;
  z-index: 20;
}

header h1 {
  margin: 0;
  font-size: clamp(1.3rem, 1rem + 3vw, 1.8rem);
  display: flex;
  align-items: center;
  position: relative;
}

.app-title-text {
  position: relative;
  z-index: 1;
}

/* "enlarge the logo w/o changing the title font size/pos" (explicit
   ask, 2026-09-23) - already decoupled by construction: position:
   absolute takes this fully out of the title text's own layout flow,
   so its size can change freely with zero effect on the text's own
   font-size or position (still driven entirely by header h1's own
   font-size, untouched here). */
.app-logo {
  position: absolute;
  right: 0;
  top: 50%;
  /* "there are top and bottom margins, enlarge it by 12% more" (explicit
     ask, 2026-09-23) - 2.6em * 1.12. */
  width: 2.912em;
  height: 2.912em;
  transform: translateY(-50%);
  opacity: 0.55;
  z-index: 0;
}

/* Always-visible primary actions (explicit ask: "only some buttons
   should migrate" into the hamburger) - home + job search stay right
   next to the title; everything else collapses behind the menu. */
.primary-nav-link {
  color: var(--blue-primary);
  text-decoration: none;
  background: white;
  padding: 0.4rem 0.9rem;
  border-radius: 999px;
  font-weight: bold;
  font-size: 0.9rem;
}

.primary-nav-link:hover {
  background: var(--grey-bg);
}

/* Icon-only header buttons (explicit ask: monochrome icon, not text/emoji) -
   square instead of a wide text pill, icon centered. Shared by the home,
   jobs (briefcase) and education (grad cap) shortcuts next to the logo -
   room left for a 4th (leisure/trips) once that area has a real screen. */
.icon-nav-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.3rem;
  width: clamp(1.6rem, 1.2rem + 2vw, 2.1rem);
  height: clamp(1.6rem, 1.2rem + 2vw, 2.1rem);
  box-sizing: border-box;
}

/* Jobs/education header shortcuts: icon + real text label on desktop
   (explicit ask: a bare icon there duplicated the old "משרות" pill) -
   collapses to the same icon-only square as the home button once
   mobile width makes room tight (see the max-width:640px block below). */
.nav-link-with-label {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

/* "Shade" for whichever of these header shortcuts matches the current
   route (explicit ask) - toggled by updateActiveIconNav() in
   app-nav.js on every route change. */
.primary-nav-link.active {
  background: var(--cyan-accent);
  color: var(--blue-primary);
}

nav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}

/* .build-info's own #595959 (below) is tuned for a light footer
   background - inside the dark blue nav dropdown that same dark grey
   text was nearly invisible against the dark background (real bug
   report). Both classes sit on the same element (class="build-info
   nav-build-info"), and single-class selectors tie on specificity, so
   a plain `.nav-build-info { color }` here lost to `.build-info`'s own
   rule (later in this file) instead of overriding it - qualified with
   both classes to actually win. */
.nav-build-info {
  flex-basis: 100%;
  opacity: 0.85;
  font-size: 0.85rem;
}

.build-info.nav-build-info {
  color: white;
}

/* "all those 4 zones should be under 1 sub menu - איזור ספקים" (explicit
   ask, 2026-09-22) - real nav-button links (unlike .legal-links below,
   these stay the normal white-pill look, they're real primary actions),
   just visually grouped under one small heading instead of run loose
   among every other menu item. */
.supplier-zone-links {
  flex-basis: 100%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.3rem;
}

.supplier-zone-heading {
  font-size: 0.75rem;
  font-weight: 600;
  color: white;
  opacity: 0.75;
  padding: 0.2rem 0;
}

/* Legal links (privacy / terms / accessibility) inside the main menu -
   explicit ask: reachable from the main menu, not just the footer.
   Left as plain `nav a` links (same white-pill/blue-text style as every
   other main-nav link) rather than overriding color - an override here
   previously left white text on the same links' own white background.
   Explicit follow-up ask: each of the 3 links should be its own row,
   not run inline in a single row. */
.legal-links {
  flex-basis: 100%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.3rem;
  padding-top: 0.25rem;
  border-top: 1px solid rgba(255, 255, 255, 0.25);
}

/* Plain, muted text links (not the white-pill nav-button look every
   other main-nav link uses) - explicit follow-up ask: the pill buttons
   made this row look like a broken/foreign chunk of the menu. */
.legal-links a {
  background: none;
  color: white;
  opacity: 0.85;
  text-decoration: underline;
  font-weight: normal;
  font-size: 0.8rem;
  padding: 0.2rem 0;
  border-radius: 0;
}

.legal-links a:hover {
  opacity: 1;
  background: none;
}

.statement-placeholder {
  background: #fff3cd;
  color: #664d03;
  padding: 0.1rem 0.4rem;
  border-radius: 4px;
  font-weight: bold;
}

/* Hamburger menu button (explicit ask) - hidden on wide screens where
   the nav already fits in one row; shown only at the mobile breakpoint
   below, where it collapses the whole nav (including login/session)
   into a toggleable dropdown instead of an overflowing row of buttons. */
.hamburger-btn {
  order: -1;
  flex-shrink: 0;
  margin-right: -1rem;
  display: inline-flex;
  align-items: center;
  background: none;
  border: 1px solid rgba(255, 255, 255, 0.6);
  border-radius: 6px;
  color: white;
  font-size: 1.3rem;
  line-height: 1;
  padding: 0.35rem 0.6rem;
  cursor: pointer;
}

/* Nav is always menu-driven behind the hamburger now, at every width -
   not just mobile (explicit bug report: on a wider screen the full nav
   row still showed inline next to the hamburger button). Explicit
   follow-up: it must look like a real dropdown rectangle anchored on
   the left, not a full-width strip stacked under the title. */
#main-nav {
  display: none;
}

#main-nav.open {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.5rem;
  position: absolute;
  top: 100%;
  right: 1rem;
  width: 320px;
  max-width: calc(100vw - 2rem);
  max-height: calc(100vh - 5rem);
  overflow-y: auto;
  margin-top: 0.5rem;
  background: var(--blue-primary);
  border-radius: 10px;
  padding: 0.75rem;
  box-shadow: 0 12px 28px rgba(0, 0, 0, 0.3);
  z-index: 10;
  box-sizing: border-box;
}

.notif-banner {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.notif-banner:hover {
  background: var(--grey-bg);
}

.notif-bell {
  font-size: 1.1rem;
}

/* "new alerts conter yellow bell + counter in main app title" (2026-09-
   20) - the always-visible header bell (index.html), separate from the
   older .notif-banner text link still inside the hamburger menu. A real
   icon (not the 🔔 emoji, whose own color can't be reliably overridden)
   tinted yellow via currentColor, same pattern the header's other icon
   links already use. */
.header-notif-bell {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  color: #ffd54f;
  padding: 0.4rem;
  border-radius: 999px;
}

.header-notif-bell:hover {
  background: rgba(255, 255, 255, 0.15);
}

.header-notif-count {
  background: #e53935;
  color: white;
  font-size: 0.7rem;
  font-weight: bold;
  min-width: 1.1rem;
  height: 1.1rem;
  line-height: 1.1rem;
  border-radius: 999px;
  display: inline-block;
  text-align: center;
  padding: 0 0.25rem;
  box-sizing: border-box;
}

nav {
  gap: 0.5rem;
  align-items: center;
}

nav a {
  color: white;
  text-decoration: none;
  padding: 0.4rem 0.9rem;
  font-weight: bold;
  font-size: 0.9rem;
}

nav a:hover {
  background: rgba(255, 255, 255, 0.15);
  border-radius: 6px;
}

/* Admin role/QA preview toolbar (explicit ask, corrected placement
   2026-09-20: "In menu, not anywhere else's" -- lives inside #main-nav
   now, like every other menu item; #main-nav.open is a column flex
   layout so this already gets its own full-width row for free, no
   flex-wrap trick needed here (unlike .nav-build-info's own, which is
   about THAT element's sizing, not positioning it within the column).
   Its own inner row (select + checkbox) still lays out horizontally. */
.admin-preview-toolbar {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-size: 0.8rem;
  background: rgba(255, 255, 255, 0.15);
  border-radius: 8px;
  padding: 0.35rem 0.6rem;
}

.admin-preview-field {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  color: white;
  font-weight: normal;
}

.admin-preview-field select {
  font-size: 0.8rem;
  padding: 0.15rem 0.4rem;
}

#session-nav {
  color: white;
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

/* #999 was below the 4.5:1 contrast ratio required text needs against
   --grey-bg at this size (WCAG 1.4.3 / IS 5568) - darkened to a shade
   that clears it while staying visually "muted". */
.build-info {
  text-align: center;
  padding: 0.75rem;
  font-size: 0.75rem;
  color: #595959;
}

.site-footer {
  text-align: center;
  padding: 0.5rem 0.75rem 0.75rem;
}

.accessibility-link {
  display: inline-block;
  color: var(--blue-primary);
  font-size: 0.85rem;
  text-decoration: underline;
}

main {
  padding: 1rem;
  max-width: 1100px;
  margin: 0 auto;
}

.page {
  display: none;
}

/* Basic styles for buttons and forms */
button, input, select, textarea {
    font-size: 1rem;
    padding: 0.5rem;
    border-radius: 4px;
    border: 1px solid #ccc;
    font-family: inherit;
}

button {
    cursor: pointer;
}

.primary-button {
    background-color: var(--cyan-accent);
    color: var(--charcoal-text);
    border: none;
    font-weight: bold;
    padding: 0.65rem 1.25rem;
}

.secondary-button {
    background-color: var(--card-bg);
    color: var(--blue-primary);
    border: 1px solid var(--blue-primary);
}

/* Landing page */
.hero {
  text-align: center;
  padding: 1rem 0 2rem;
}

/* Match the new skin's hero typography: a bold dark title with a
   smaller, muted, width-capped subtitle right under it - shared by
   every .hero section (landing + education) for consistency. */
.hero h2 {
  font-size: 1.75rem;
  color: #0f172a;
  margin: 0 0 0.5rem;
}

.hero > p {
  color: #64748b;
  font-size: 0.95rem;
  max-width: 600px;
  margin: 0 auto;
  line-height: 1.5;
}

.region-picker {
  margin-top: 1rem;
  display: inline-flex;
  gap: 0.5rem;
  align-items: center;
}

.solutions-hub {
  text-align: center;
  margin: 0 0 2rem;
}

.solutions-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.5rem;
  max-width: 680px;
  margin: 0 auto;
}

/* Colorful category cards (new skin, 4 tiles) - each .solution-tile-*
   modifier below sets the background/border/text triple; the base rule
   just handles shape, spacing and the hover lift shared by all four.
   A fixed (not min-) height keeps all 4 tiles the same size regardless
   of how much text each one has (explicit ask: "equal rectangles") -
   justify-content:center then centers whatever content a given tile
   has within that same-size box, both on the 2-col desktop grid and
   the single-column mobile stack. */
.solution-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 210px;
  box-sizing: border-box;
  background: var(--card-bg);
  border: 2px solid var(--border-color);
  border-radius: 16px;
  padding: 1.5rem 1rem;
  text-decoration: none;
  color: var(--charcoal-text);
  position: relative;
  text-align: center;
  transition: transform 0.2s, box-shadow 0.2s;
}

.solution-tile:hover {
  transform: translateY(-3px);
  box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08);
}

.solution-tile-icon {
  width: 40px;
  height: 40px;
  margin-bottom: 0.6rem;
  flex-shrink: 0;
}

.solution-tile h3 {
  color: inherit;
  margin: 0;
  font-size: 1.1rem;
}

.solution-tile-link {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
  text-decoration: none;
  color: inherit;
}

/* "icrease font to links in main page and make it even in all cubes" /
   "better, a bit larger" (owner, PR157, 2026-09-29) - ONE shared size and
   weight for every link inside a cube (the search CTA line, "ℹ מידע נוסף",
   and the work cube's "ℹ מפת דרכים להכוונה" in guidance-roadmap.css), so
   no cube's links are smaller than another's. Change the size here only. */
.solution-tile {
  --cube-link-font-size: 1rem;
  --cube-link-font-weight: 600;
}

.solution-tile-cta {
  display: block;
  margin-top: 0.5rem;
  font-size: var(--cube-link-font-size);
  font-weight: var(--cube-link-font-weight);
}

.solution-tile-work { background: var(--card-work-bg); border-color: var(--card-work-border); color: var(--card-work-text); }
.solution-tile-edu { background: var(--card-edu-bg); border-color: var(--card-edu-border); color: var(--card-edu-text); }
.solution-tile-leisure { background: var(--card-leisure-bg); border-color: var(--card-leisure-border); color: var(--card-leisure-text); }
.solution-tile-community { background: var(--card-community-bg); border-color: var(--card-community-border); color: var(--card-community-text); }

/* Small, subtle \"tell me more\" hint next to the Job/Education tiles and
   on the job results list - explicit ask: visible and clear, but not
   competing with the main action for attention. */
.tile-info-link {
  display: inline-block;
  margin-top: 0.5rem;
  font-size: 0.75rem;
  color: var(--blue-primary);
  text-decoration: none;
}

.solution-tile .tile-info-link {
  color: inherit;
  opacity: 0.8;
  font-size: var(--cube-link-font-size);
  font-weight: var(--cube-link-font-weight);
}

.tile-info-link:hover,
.tile-info-link:focus {
  text-decoration: underline;
}

/* Suggestion-box / contact-us button, below the 4 solution tiles
   (explicit ask: "icon of mail"). Plain outlined pill, not a colored
   card like the tiles above it - it isn't one of the 4 main solutions. */
.suggestion-box-link {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: 1.5rem;
  padding: 0.6rem 1.25rem;
  border: 1px solid var(--border-color);
  border-radius: 999px;
  background: var(--card-bg);
  color: var(--blue-primary);
  text-decoration: none;
  font-weight: 600;
  font-size: 0.9rem;
}

.suggestion-box-link:hover,
.suggestion-box-link:focus {
  text-decoration: underline;
}

.suggestion-box-icon {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
}

/* Same real pill look as .suggestion-box-link above (explicit ask,
   2026-09-23: newsletter/monthly-updates link) - a distinct "already
   subscribed" state (checkmark label, see newsletter.js) gets its own
   modifier instead of a second near-duplicate pill class. */
.newsletter-signup-link-active {
  color: var(--cyan-accent, #0aa);
  border-color: currentColor;
}

/* The same real flag's menu-checkbox entry point (newsletter.js) - own
   full-width row like .supplier-zone-links/.legal-links above, plain
   white text (a checkbox + label, not a nav-button link). */
.newsletter-menu-toggle {
  flex-basis: 100%;
  display: flex;
  align-items: center;
  gap: 0.4rem;
  color: white;
  font-weight: normal;
  font-size: 0.85rem;
  padding: 0.2rem 0;
}

.solution-tile-soon {
  opacity: 0.85;
}

.soon-badge {
  position: absolute;
  top: 12px;
  right: 12px;
  display: inline-block;
  font-size: 0.7rem;
  background: rgba(255, 255, 255, 0.6);
  color: inherit;
  border-radius: 999px;
  padding: 0.15rem 0.6rem;
}

/* Generic two-column screen layout (Employer Directory, Wizard, Employer Profile) */
.screen-content {
  display: flex;
  gap: 1.5rem;
  align-items: flex-start;
}

/* Info page (job placement types + higher-education blurb) - a plain,
   readable one-pager, not a two-column layout. */
.info-content {
  display: block;
  max-width: 640px;
  margin: 0 auto;
}

.info-section {
  margin-top: 1.5rem;
  line-height: 1.6;
}

.info-section h2 {
  color: var(--blue-primary);
  font-size: 1.1rem;
}

.info-section ul {
  padding-inline-start: 1.25rem;
}

.info-section li {
  margin-bottom: 0.6rem;
}

/* Real provider profile blurb on an info page (explicit ask, 2026-09-22:
   "to info page of חוויות [as] one of our providers") - one real
   organization's own description, separated visually as this grows
   beyond a single provider. */
.provider-profile {
  padding-top: 1rem;
  border-top: 1px solid var(--border-color, #ddd);
}
.provider-profile:first-of-type {
  border-top: none;
  padding-top: 0;
}
.provider-profile h4 {
  margin-bottom: 0.4rem;
}

.filters-panel, .side-panel {
  flex: 0 0 260px;
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 1rem;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

/* "wht's the top filter button, semms redundant with search" (2026-09-20)
   -- real bug: the collapsed-state summary bar (tap-to-re-expand, see the
   @media (max-width: 640px) block below) only ever got a `display: none`
   default INSIDE that mobile query, so on any wider viewport it fell back
   to a plain visible <button> with no collapse logic wired to it there --
   dead UI, redundant with both the "סינון" heading and the חיפוש button
   right below it. Base-hidden here, unconditionally; the mobile query
   below is the only place that ever reveals it again (and only once the
   panel is actually minimized). Education's own summary bar (added by
   "make search dialog same structure", 2026-09-20) gets the same
   base-hidden treatment from day one. */
#employer-directory-page .filters-summary-bar,
#education-page .filters-summary-bar,
#leisure-clubs-page .filters-summary-bar,
#experiences-page .filters-summary-bar {
  display: none;
}

.results-panel, .main-panel {
  flex: 1;
  min-width: 0;
}

.wizard-form {
  flex: 1;
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 1rem;
}

.form-section {
  border-bottom: 1px solid var(--border-color);
  padding-bottom: 1rem;
  margin-bottom: 1rem;
}

.form-section h3 {
  margin-top: 0;
  color: var(--blue-primary);
}

.form-row {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

.form-group {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  margin-bottom: 0.75rem;
  flex: 1;
  min-width: 180px;
}

/* Short-value fields (phone, year, small counts) shouldn't stretch to
   split the row 50/50 with their neighbor on wide desktop screens. */
.form-group.short {
  flex: 0 1 200px;
}

.form-group label {
  font-size: 0.9rem;
  font-weight: bold;
}

.required-mark {
  color: #d32f2f;
}

.login-hint {
  background: var(--grey-bg);
  border-radius: 6px;
  padding: 0.6rem 0.8rem;
  font-size: 0.85rem;
  color: #555;
}

/* Full-width, prominent button style - was .big-demo-button (the removed
   one-click demo-login buttons); reused as-is for the real Google button. */
.oauth-button {
  display: block;
  width: 100%;
  padding: 1rem;
  font-size: 1.05rem;
  margin-bottom: 0.75rem;
}

.oauth-divider {
  text-align: center;
  color: #666; /* was #888 - too low contrast on white (WCAG 1.4.3) */
  font-size: 0.85rem;
  margin: 0.5rem 0;
}

.form-group.has-error input,
.form-group.has-error select,
.form-group.has-error textarea,
/* "mandatory field missing sould be marked with red border" (explicit
   ask, 2026-09-23) - markFieldError's own real fallback for a field
   with no .form-group ancestor (every admin table's own inline edit
   row - a plain <td>, not a form page) is field.parentElement, i.e.
   the <td> itself; same real red-border/background, just a second
   selector since a table cell never carries the class="form-group"
   the wizard/registration forms use. */
td.has-error input,
td.has-error select,
td.has-error textarea {
  border: 2px solid #d32f2f;
  background: #fff5f5;
}

.field-error-msg {
  color: #d32f2f;
  font-size: 0.8rem;
  margin: 0.15rem 0 0;
}

.checkbox-group {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
}

.checkbox-group > div {
  display: flex;
  align-items: center;
  gap: 0.35rem;
}

.checkbox-group input {
  padding: 0;
}

/* Result / position / review cards */
.result-card {
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 1rem;
  margin-bottom: 1rem;
}

.result-card h4 {
  margin: 0 0 0.25rem;
  color: var(--blue-primary);
}

/* Job search results: one line per result instead of a multi-column
   card wall (explicit ask - 87 real results made the old grid a huge
   dense block) - a native <details>/<summary> per row needs no JS to
   expand/collapse, just click anywhere on the row. */
.results-grid {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.result-row {
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 0.25rem 1rem;
}

.result-row summary {
  padding: 0.6rem 0;
  cursor: pointer;
  list-style: none;
  /* One flowing text block (explicit follow-up ask) - title and meta
     are inline spans that wrap together, so a long one and a short one
     share the line naturally instead of leaving gaps or overflowing.
     No -webkit-line-clamp here on purpose: real bug found live - a
     name ending in a hyphen ("תייטק-") rendered as a single stray
     letter on screen with line-clamp active, even though the real DOM
     text was correct. Wraps freely instead - a couple of extra lines
     is far safer than silently misrendering real content. */
  overflow-wrap: break-word;
}

.result-row summary::-webkit-details-marker {
  display: none;
}

.result-row-title {
  font-weight: bold;
  font-size: 1rem;
  color: var(--blue-primary);
}

.result-row-meta {
  font-size: 0.85rem;
  color: var(--charcoal-text);
  opacity: 0.75;
}

/* Attachment clip (row-attachment.js, PR #149): a download link on the
   collapsed result row, after the meta text. */
.result-row-attachment {
  margin-inline-start: 0.4rem;
  font-size: 1.1rem;
  text-decoration: none;
}

/* Favorites star (favorites.js, 2026-09-28): hollow ☆ until the item is
   a favorite, then a yellow ★. Sits inside each result row's summary,
   so it must not look like part of the title text. */
.fav-star {
  background: none;
  border: 0;
  padding: 0 0.2rem;
  margin-inline-end: 0.35rem;
  font: inherit;
  font-size: 1.25rem;
  line-height: 1;
  vertical-align: middle;
  cursor: pointer;
  color: var(--charcoal-text);
  opacity: 0.55;
}

.fav-star:hover,
.fav-star:focus-visible {
  opacity: 1;
}

.fav-star.is-fav {
  color: #f5b301;
  opacity: 1;
}

.favorites-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 1.25rem;
  align-items: flex-end;
  margin-bottom: 0.75rem;
}

.favorites-toolbar .form-group {
  margin: 0;
}

.favorites-count {
  font-size: 0.9rem;
  color: var(--charcoal-text);
  opacity: 0.75;
}

.fav-added {
  font-size: 0.8rem;
  color: var(--charcoal-text);
  opacity: 0.7;
  margin-inline-start: 0.5rem;
  white-space: nowrap;
}

.fav-type-badge {
  display: inline-block;
  font-size: 0.75rem;
  color: var(--blue-primary);
  border: 1px solid var(--border-color);
  border-radius: 999px;
  padding: 0.05rem 0.5rem;
  margin: 0 0 0.2rem;
}

.result-row-body {
  padding: 0 0 0.75rem;
  border-top: 1px solid var(--border-color);
  padding-top: 0.6rem;
}

.result-row-body p {
  margin: 0 0 0.4rem;
}

.job-employer {
  font-weight: bold;
}

.tags {
  margin-top: 0.5rem;
}

.tag {
  display: inline-block;
  background: var(--teal-secondary);
  color: var(--charcoal-text);
  border-radius: 999px;
  padding: 0.15rem 0.6rem;
  font-size: 0.8rem;
  margin-inline-end: 0.35rem;
}

.review-score {
  color: #9c6b00; /* was #d99a00 - too low contrast on white (WCAG 1.4.3) */
  font-size: 1.1rem;
}

/* Candidate-child row + its slide-to-delete control (explicit ask:
   deletion needs a slider confirmation, not a plain confirm() dialog).
   The employer job-location list used to share this same row shape
   (.emp-location-row) - it's a real <table class="admin-table"> now
   ("rearrange it to look more like my job management", 2026-09-20),
   same table styling as admin-jobs.js's own list below. */
.cand-child-row,
.cand-search-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1rem;
  padding: 0.5rem 0;
  border-bottom: 1px solid var(--border-color);
}

/* "saved searches ... are two lines per search, I would like to see ...
   one line for search" (explicit ask, 2026-09-22) - .cand-search-row
   above still wraps by default (shared with .cand-child-row); this
   overrides it back to one line specifically for a saved search: the
   name truncates with an ellipsis instead of wrapping, and the actions
   (run + a "⋮" menu - see saved-search.js) stay a fixed-width group
   that never shrinks/wraps away. */
.cand-search-row {
  flex-wrap: nowrap;
  gap: 0.5rem;
}

.cand-search-name {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cand-search-row.is-active {
  background: #e3f2e9;
  border-radius: 8px;
  padding-inline: 0.5rem;
  box-shadow: inset 0 0 0 1px #9cc5aa;
}

.cand-search-row:has(.cand-search-rename) .cand-search-name {
  display: none;
}

.cand-search-rename {
  display: flex;
  align-items: center;
  gap: 0.2rem;
  flex: 1 1 auto;
  min-width: 0;
}

.cand-search-rename-input {
  flex: 1 1 auto;
  min-width: 0;
  font: inherit;
  padding: 0.2rem 0.4rem;
}

.app-confirm-overlay {
  position: fixed;
  inset: 0;
  z-index: 80;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1rem;
  background: rgba(10, 79, 127, 0.4);
}
.app-confirm-panel {
  background: #fff;
  border-radius: 16px;
  padding: 1.25rem 1.35rem 1rem;
  max-width: 22rem;
  width: 100%;
  box-shadow: 0 12px 40px rgba(15, 40, 60, 0.2);
  text-align: right;
}
.app-confirm-panel h3 {
  margin: 0 0 0.45rem;
  color: var(--blue-primary);
  font-size: 1.15rem;
}
.app-confirm-panel p {
  margin: 0 0 1rem;
  white-space: pre-line; /* #177: multi-line guidance text */
  color: var(--charcoal-text);
  line-height: 1.45;
}
.app-confirm-actions {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-start;
}

.cand-search-actions {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  gap: 0.1rem;
}

/* "three dotted menu button the shows delete or rename" (explicit ask,
   2026-09-22) - a real dropdown: .cand-search-menu is the positioning
   context for its own .cand-search-menu-popup (absolute, right-aligned
   under the "⋮" toggle - this app is RTL, so the popup's own natural
   edge is `left`, matching how it opens toward the row's empty space
   rather than off-screen). Closed by default (`hidden` attribute, see
   saved-search.js); toggled open/closed by the "⋮" button, and closed
   again by ensureMenuOutsideClickHandler on any outside click. */
.cand-search-menu {
  position: relative;
}

.cand-search-menu-popup {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 5;
  display: none;
  flex-direction: column;
  min-width: 8rem;
  margin-top: 0.25rem;
  background: var(--card-bg, #fff);
  border: 1px solid var(--border-color);
  border-radius: 6px;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.12);
  overflow: hidden;
}

.cand-search-menu-popup:not([hidden]) {
  display: flex;
}

.cand-search-menu-popup button {
  background: none;
  border: none;
  text-align: right;
  padding: 0.5rem 0.75rem;
  cursor: pointer;
  font: inherit;
  color: inherit;
}

.cand-search-menu-popup button:hover {
  background: var(--grey-bg);
}

.cand-search-menu-popup button.danger {
  color: #c0392b;
}

.cand-search-menu-popup button.danger:hover {
  background: #fdecea;
}

/* Real approval status - shown on the employer's own location list
   (explicit ask: "the one who suggested it will see it's pending my
   approval") and on the admin jobs table's own status column. */
.status-badge {
  display: inline-block;
  border-radius: 999px;
  padding: 0.1rem 0.6rem;
  font-size: 0.8rem;
  font-weight: bold;
}

.status-pending {
  background: #fff4e5;
  color: #9c6b00;
}

.status-approved {
  background: #e6f4ea;
  color: #1e7e34;
}

/* "showing if job has been approved be manager or declined" (2026-09-
   20) - the real third status alongside pending/approved. */
.status-declined {
  background: #fdecea;
  color: #b3261e;
}

/* Supplier-management table's own per-category "frozen" state
   (supplier-admin.js) - a real, reversible suspension, deliberately a
   different color from status-declined (frozen is not a rejection). */
.status-frozen {
  background: #eef1f5;
  color: #546070;
}

/* Contact Us's own supplier-request category list (contact-form.js) -
   "show me all details I have currently as grayed" (explicit ask,
   2026-09-23): a category the user already holds/has pending renders as
   a grayed, non-interactive line instead of a live checkbox. */
.contact-cat-existing {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.2rem 0;
  opacity: 0.6;
}

/* "when locked show like label" (explicit ask, 2026-09-23) - a locked
   (readonly) field (contact-form.js's own lockEmailToSession/
   renderContactSupplierCategories) reads as plain static text instead
   of an editable-looking box. */
.field-readonly-label {
  border: none;
  background: transparent;
  padding: 0.3rem 0;
  color: inherit;
}

/* Supplier-management table (#/supplier-admin) - one row per user
   email, one column per category, each cell a status badge plus its
   own approve/freeze/revoke action(s). */
.supplier-admin-table td, .supplier-admin-table th {
  text-align: center;
  vertical-align: middle;
}
.supplier-admin-table td:first-child, .supplier-admin-table th:first-child,
.supplier-admin-table td:nth-child(2), .supplier-admin-table th:nth-child(2) {
  text-align: start;
}
/* PR158 phone column - one line, never broken at the hyphen. */
.supplier-admin-table td[data-label="טלפון"] {
  white-space: nowrap;
}
/* "make all of these 1 liners" (explicit ask, 2026-09-23) - badge +
   icon actions side by side on one line, no more wrapping to a second
   row of full-width text buttons. */
/* "move the read check to top, in the same line as title not to take
   vertical space" (explicit ask, 2026-09-23, admin-alerts-page) - a
   title + one compact control on the same line, wraps on narrow
   screens instead of ever overlapping. */
.page-title-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
}
.page-title-row h2 {
  margin: 0;
}
.page-title-row .form-group {
  margin: 0;
}

.supplier-cell-line {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
}
.supplier-cell-actions {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 0.1rem;
}

/* "experiances may have multi location items" (explicit ask, 2026-09-
   23) - the location chip-picker (locationChipsHtml, admin-shared.js):
   already-added locations as small removable chips, plus a real
   address-autocomplete input below them for adding the next one. */
.locations-field .location-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
  margin-bottom: 0.3rem;
}

.location-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  background: #eef2f7;
  border-radius: 999px;
  padding: 0.1rem 0.4rem 0.1rem 0.6rem;
  font-size: 0.85rem;
}

.location-chip-remove {
  background: none;
  border: none;
  cursor: pointer;
  font-size: 0.9rem;
  line-height: 1;
  padding: 0.1rem;
  color: #555;
}

/* "focused on the column showing the rejection/approval" (explicit ask,
   2026-09-21) - the inbox's own "go to job" button (job-search.js's
   notifItemHtml/goToOwnedJobRow) lands here after navigating; a real
   temporary background flash on top of the existing keyboard-focus
   ring ([tabindex]:focus-visible above already fires on the
   programmatic .focus() call), so the target status cell is obvious at
   a glance, not just theoretically focused. animation-iteration-count:1
   -- fades back to nothing on its own, no JS timer/cleanup needed. */
@keyframes inbox-focus-flash {
  from { background: #fff4c2; }
  to { background: transparent; }
}
.inbox-focus-highlight {
  animation: inbox-focus-flash 2s ease-out 1;
}

.checkbox-inline {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex: 0 0 auto;
}

.checkbox-inline input {
  width: auto;
}

.delete-slider {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 140px;
}

.delete-slider input[type="range"] {
  width: 100%;
  accent-color: #c0392b;
}

.delete-slider small {
  color: var(--charcoal-text);
  opacity: 0.7;
}

/* Admin CRUD tables (jobs + education admin redesign - explicit ask:
   "table like list, sort by list, icons per row, pencil for update and
   recycle bin for deletion, dialog approval for deletion"). Real
   confirm()-dialog deletion here on purpose, unlike the slide-to-delete
   control above - see admin-jobs.js/education-admin.js header comments. */
.table-hint {
  font-size: 0.85rem;
  color: var(--charcoal-text);
  opacity: 0.7;
  margin: 0.25rem 0 0.75rem;
}

/* Explicit ask (jobs admin): put the search filter and "add row" button
   on one line, with the hint text as its own 1-line caption below - NOT
   wrapped in .screen-content (that's a two-column flex layout meant
   for a filters-panel + results-panel pair; used here by mistake, it
   turned the filter/hint/button/table into four squeezed flex-row
   siblings instead of the table getting the page's real full width -
   the actual "almost double table width" bug this fixes). Generic (not
   jobs-specific) - also used by the categories admin page's own small
   domain-select + new-category form. */
.admin-toolbar {
  display: flex;
  align-items: flex-end;
  gap: 1rem;
  flex-wrap: wrap;
  margin-bottom: 0.25rem;
}

/* "I asked אזור מעסיק to look like admin jobs update, I see nothing
   changed" (2026-09-20) - the employee zone's own location table is now
   full-width and table-first (index.html), matching admin-jobs.js's own
   page; this just gives the add/edit form below it some real visual
   separation from the table above. */
#employer-admin-page .emp-form-heading,
#employer-admin-page .screen-content {
  display: none;
}
.emp-form-heading {
  margin-top: 2rem;
}

.admin-toolbar .form-group {
  flex: 1;
  min-width: 200px;
  margin-bottom: 0;
}

/* Both admin tables now carry every real field the data model has
   (explicit ask: "I want all [fields] to be editable... every one"),
   too many columns to fit one screen width on desktop any more - a
   horizontal scrollbar on the table's own container beats either
   truncating real data or shrinking every column illegibly. */
#admin-jobs-list, #edu-admin-rows-list, #emp-locations-list, #emp-jobs-list, #ws-admin-rows-list, #grp-admin-rows-list,
#leisure-clubs-admin-list, #experiences-admin-list, #events-admin-list, #shows-admin-list {
  overflow-x: auto;
}

/* "on desktop use wider table + 20% and add horizontal scroll where
   first 4 cols stay permanent, so all is visible" (2026-09-20) -- the
   horizontal scroll above already exists; this adds real breathing
   room beyond the table's bare auto-fit width, and pins the 4
   identifying columns (supplier/workplace/address/team-size --
   JOB_TABLE_COLUMNS' own first 4 entries, admin-jobs.js) so they stay
   in view while scrolling through the rest of the (now many) columns.
   Fixed pixel widths on just these 4 are what make a predictable
   sticky `right` offset possible (RTL: the first column is the
   RIGHTMOST one, so sticky columns pin from the right, not the left,
   matching reading order) -- every other column keeps its normal
   auto-sized width. Desktop only (min-width matches the mobile
   stacked-card breakpoint below, max-width: 640px) -- that layout
   already turns every <td> into a block-stacked label/value line,
   where a sticky column has no meaning. Scoped to #admin-jobs-list
   only (not #edu-admin-rows-list) -- this was reported against the
   jobs table specifically; education's own first columns aren't
   necessarily the right identifying set to freeze. */
@media (min-width: 641px) {
  /* "on desktop extent the total width by 20%, many unused space"
     (2026-09-20) -- `main` (base stylesheet) caps every page at
     max-width: 1100px, centered via margin: 0 auto -- widening the
     table's OWN min-width below just gave it more room to
     horizontal-scroll inside that narrow centered column, leaving the
     real empty margins on either side of the page untouched (the
     "unused space" in the screenshot).
     First attempt at this used a 100vw-relative breakout (width:
     calc(100vw - 2rem) + negative vw margins) directly on
     #admin-jobs-page - broken, because #admin-jobs-page's containing
     block for that math is `main`'s own (already-narrow) content box,
     not the viewport, so the vw-based numbers didn't cancel out the
     way that trick assumes and the page ended up shoved flush to one
     side instead of centered ("instead of centered and larger, now
     it's only aligned to right"). Toggling `main`'s OWN max-width
     instead (via this class, set by app.js's route handler) reuses
     `main`'s existing `margin: 0 auto` - guaranteed correctly centered,
     no viewport math needed at all. Same +20% math: 1100 * 1.2 =
     1320px. */
  main.wide-page {
    max-width: 1320px;
  }

  /* "the scroll bar is at the bottom, on long lists not practicable, I
     want the scroll to be in screen bottom, with vertical scroll too"
     (2026-09-20) -- with no height cap, the table just grows as tall as
     its row count, so its own horizontal scrollbar (at the table's
     bottom edge) ends up however far down the page that is -- on a long
     list, scrolled well past the visible screen. Capping the
     container's own height and giving IT the scrollbars (both axes)
     keeps them within the viewport, always reachable, regardless of row
     count -- same reasoning the header row below gets `position: sticky`
     for (stays visible while scrolling vertically through rows), not
     just the already-sticky first 4 COLUMNS (horizontal).
     max-height itself is no longer a hand-guessed constant here - see
     admin-shared.js's fitListToViewport, the one shared definition
     every admin-table screen calls after its own render (explicit ask,
     2026-09-23: "derived from the same definition, not fine tune each
     manually"). This rule now only owns the scrollbar behavior. */
  #admin-jobs-list, #emp-jobs-list {
    overflow-y: auto;
  }

  /* "on desktop extent the total width by 20%, many unused space"
     (2026-09-20) -- was 140% (itself 120% +20 points before that);
     this is a further +20 points on top, not a reset. "why do employee
     jobs table has less columns than admin's one?" (2026-09-21) -- it
     never had fewer real columns (admin-jobs-owned.js reuses the exact
     same renderAdminJobsPage/JOB_TABLE_COLUMNS) - #emp-jobs-list just
     never got this same breathing-room width, so its columns squeezed
     down illegibly instead of scrolling. Same treatment here now (not
     the sticky-frozen-4-columns block below, though - that one's exact
     pixel math is tuned to admin-jobs-list's own known column order;
     #emp-jobs-list still scrolls fine without it, just without frozen
     columns). */
  #admin-jobs-list .admin-table, #emp-jobs-list .admin-table {
    min-width: 160%;
  }

  #admin-jobs-list .admin-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
  }

  /* "improve auto-width distribution on the non-frozen columns - also
     for the frozen" (2026-09-20) -- a STICKY column still needs a
     predictable fixed width (its own `right` offset math depends on
     it), so "auto" there really means "sized to realistic content"
     rather than left to the browser -- these 4 widths were re-picked
     for the post-merge columns (locationName+address is now one column
     holding two stacked lines, needs more room than a single short
     value did). Every OTHER (non-frozen) column already auto-sizes via
     the browser's own table layout; the widths below are min/max hints
     on the ones that were either too cramped (a real description) or
     needlessly wide (a short badge/date), targeted by data-label -
     same real attribute every <td> already carries for the mobile
     layout, so this never drifts out of sync if a column is ever
     reordered (unlike counting nth-child by position). */
  #admin-jobs-list .admin-table td[data-label="תיאור עבודה"] { min-width: 220px; }
  #admin-jobs-list .admin-table td[data-label="הערות"] { min-width: 160px; }
  /* "auto width" (explicit ask, 2026-09-21) - these two now hold a
     collapsed checkbox-dropdown (multiCheckboxHtml), not a native
     <select>, so no min/max-width pin here any more - the column just
     sizes to its own small <summary> content, same as every other
     naturally-auto-sizing column.
     "adjusted to the width of the longest value" (explicit ask,
     2026-09-22) - the READ-ONLY row (tagLabelsLinesHtml) has no
     <summary> to size against; it is plain text with a real <br>
     between each selected label (no clamp/ellipsis, already fixed
     2026-09-21), but without a nowrap rule the browser still wraps a
     long SINGLE label across several lines once the column is
     narrower than that label - exactly the garbled multi-line text
     the screenshot showed. nowrap keeps each label on its own one
     line, so the column has to auto-widen to fit whichever real label
     is actually longest, matching the edit-mode summary above (which
     already had its own nowrap). */
  #admin-jobs-list .admin-table td[data-label="התאמות נכות"],
  #admin-jobs-list .admin-table td[data-label="התאמות נדרשות"],
  #emp-jobs-list .admin-table td[data-label="התאמות נכות"],
  #emp-jobs-list .admin-table td[data-label="התאמות נדרשות"] {
    white-space: nowrap;
  }
  #admin-jobs-list .admin-table td[data-label="איש קשר"] { min-width: 140px; }
  #admin-jobs-list .admin-table td[data-label="סוג העסקה"] { min-width: 110px; }
  #admin-jobs-list .admin-table td[data-label="מחוז"] { min-width: 70px; max-width: 90px; }

  #admin-jobs-list .admin-table td[data-label="סטטוס"],
  #emp-jobs-list .admin-table td[data-label="סטטוס"] { min-width: 150px; }
  #admin-jobs-list .admin-table td[data-label="עודכן"],
  #emp-jobs-list .admin-table td[data-label="עודכן"] { min-width: 85px; max-width: 100px; }

  #admin-jobs-list .admin-table th:nth-child(-n+4),
  #admin-jobs-list .admin-table td:nth-child(-n+4) {
    position: sticky;
    background: var(--card-bg);
  }
  #admin-jobs-list .admin-table thead th:nth-child(-n+4) {
    background: var(--grey-bg);
    /* The frozen corner: sticky on BOTH axes at once (top AND right),
       so it has to out-rank every other sticky cell in both directions. */
    z-index: 4;
  }
  #admin-jobs-list .admin-table tbody td:nth-child(-n+4) {
    z-index: 1;
  }
  #admin-jobs-list .admin-table th:nth-child(1),
  #admin-jobs-list .admin-table td:nth-child(1) {
    right: 0;
    width: 100px; min-width: 100px; max-width: 100px;
  }
  #admin-jobs-list .admin-table th:nth-child(2),
  #admin-jobs-list .admin-table td:nth-child(2) {
    right: 100px;
    width: 150px; min-width: 150px; max-width: 150px;
  }
  /* #190 (owner: "fields collide, address is covered by another"): this column (מקום עבודה = workplace name +
     address, stacked) was 75px, but its two inputs are 12rem wide (owner's earlier "make these wider ... same
     sizes also for admin screen"), so they spilled under the frozen גודל צוות column. 215px fits them. */
  #admin-jobs-list .admin-table th:nth-child(3),
  #admin-jobs-list .admin-table td:nth-child(3) {
    right: 250px;
    width: 215px; min-width: 215px; max-width: 215px;
  }
  #admin-jobs-list .admin-table th:nth-child(4),
  #admin-jobs-list .admin-table td:nth-child(4) {
    right: 465px;
    width: 85px; min-width: 85px; max-width: 85px;
    /* Visual boundary where the frozen columns end and the
       horizontally-scrolling ones begin -- RTL, so that's this
       column's LEFT edge (negative x-offset), not its right. */
    box-shadow: -2px 0 4px -2px rgba(0, 0, 0, 0.25);
  }
}

/* #190: on tablets (641-1023px) four frozen columns (550px) would leave almost no room to scroll the rest -
   only actions + ספק stay frozen there; מקום עבודה and גודל צוות scroll with the table, so nothing can overlap. */
@media (min-width: 641px) and (max-width: 1023px) {
  #admin-jobs-list .admin-table th:nth-child(3), #admin-jobs-list .admin-table td:nth-child(3),
  #admin-jobs-list .admin-table th:nth-child(4), #admin-jobs-list .admin-table td:nth-child(4) {
    position: static; width: auto; max-width: none; box-shadow: none;
  }
  #admin-jobs-list .admin-table th:nth-child(2), #admin-jobs-list .admin-table td:nth-child(2) {
    box-shadow: -2px 0 4px -2px rgba(0, 0, 0, 0.25);
  }
}

/* "make all the new screens be usable since now they are not" (explicit
   ask, 2026-09-23) - leisure-clubs-admin/experiences-admin never got
   ANY of admin-jobs-list's own desktop treatment above (vertical
   scroll capped to viewport height, sticky header, wide table, frozen
   first columns); education-admin-list only ever got the MOBILE
   stacking below, never this desktop half. Same real mechanism as
   admin-jobs-list, ported rather than reinvented - see that block's
   own header for the full history of each individual piece. Frozen
   columns here are ספק/תוכנית/the entity's own name (first 3, real
   first-3 order per entityColumns/EDU_TABLE_COLUMNS) - "the meaningful
   cols first and frozen (activity or program name)" (2026-09-23) -
   rather than jobs' own frozen-4, since these tables' own identifying
   columns are only 3 wide. */
@media (min-width: 641px) {
  /* "I asked jobs and all other [screens] to be derived from the same
     definition, not for you to fine tune each manually" (explicit ask,
     2026-09-23) - two separate hand-guessed constants here already
     landed wrong once (tuned against a local dev server that didn't
     match real production). max-height is no longer guessed per screen
     at all - see admin-shared.js's fitListToViewport, the one shared
     function every admin-table screen (jobs included) now calls after
     its own render. This rule only owns the scrollbar behavior. */
  #leisure-clubs-admin-list, #experiences-admin-list, #events-admin-list, #shows-admin-list, #edu-admin-rows-list, #ws-admin-rows-list, #grp-admin-rows-list {
    overflow-y: auto;
  }

  #leisure-clubs-admin-list .admin-table, #experiences-admin-list .admin-table, #events-admin-list .admin-table, #shows-admin-list .admin-table,
  #edu-admin-rows-list .admin-table, #ws-admin-rows-list .admin-table, #grp-admin-rows-list .admin-table {
    min-width: 160%;
  }

  #leisure-clubs-admin-list .admin-table thead th, #experiences-admin-list .admin-table thead th, #events-admin-list .admin-table thead th, #shows-admin-list .admin-table thead th,
  #edu-admin-rows-list .admin-table thead th, #ws-admin-rows-list .admin-table thead th, #grp-admin-rows-list .admin-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
  }

  /* "url width that takes 20% of screen width doesn't make sense ...
     what good does the actual URL text give me, is it readable"
     (explicit ask, 2026-09-23) - a CSS-only truncation still leaves an
     unreadable clipped fragment; the real fix is listing-admin.js's
     sourceUrlLinkHtml (a short "🔗 קישור" link, not the raw address) -
     this just stops that now-short link from stretching to fill
     whatever width the browser's auto table layout would otherwise
     hand it. */
  #leisure-clubs-admin-list .admin-table td[data-label="קישור למקור"],
  #experiences-admin-list .admin-table td[data-label="קישור למקור"], #events-admin-list .admin-table td[data-label="קישור למקור"], #shows-admin-list .admin-table td[data-label="קישור למקור"] {
    width: 90px;
  }

  /* Frozen columns: "ספק" (converged, 2026-09-23) + the entity's own
     name/college -- only 2 real identifying columns now, not 3, since
     the separate read-only ספק column was merged into the editable one. */
  #leisure-clubs-admin-list .admin-table th:nth-child(-n+2),
  #leisure-clubs-admin-list .admin-table td:nth-child(-n+2),
  #experiences-admin-list .admin-table th:nth-child(-n+2), #events-admin-list .admin-table th:nth-child(-n+2), #shows-admin-list .admin-table th:nth-child(-n+2),
  #experiences-admin-list .admin-table td:nth-child(-n+2), #events-admin-list .admin-table td:nth-child(-n+2), #shows-admin-list .admin-table td:nth-child(-n+2),
  #edu-admin-rows-list .admin-table th:nth-child(-n+2), #ws-admin-rows-list .admin-table th:nth-child(-n+2), #grp-admin-rows-list .admin-table th:nth-child(-n+2),
  #edu-admin-rows-list .admin-table td:nth-child(-n+2), #ws-admin-rows-list .admin-table td:nth-child(-n+2), #grp-admin-rows-list .admin-table td:nth-child(-n+2) {
    position: sticky;
    background: var(--card-bg);
  }
  #leisure-clubs-admin-list .admin-table thead th:nth-child(-n+2),
  #experiences-admin-list .admin-table thead th:nth-child(-n+2), #events-admin-list .admin-table thead th:nth-child(-n+2), #shows-admin-list .admin-table thead th:nth-child(-n+2),
  #edu-admin-rows-list .admin-table thead th:nth-child(-n+2), #ws-admin-rows-list .admin-table thead th:nth-child(-n+2), #grp-admin-rows-list .admin-table thead th:nth-child(-n+2) {
    background: var(--grey-bg);
    z-index: 4;
  }
  #leisure-clubs-admin-list .admin-table tbody td:nth-child(-n+2),
  #experiences-admin-list .admin-table tbody td:nth-child(-n+2), #events-admin-list .admin-table tbody td:nth-child(-n+2), #shows-admin-list .admin-table tbody td:nth-child(-n+2),
  #edu-admin-rows-list .admin-table tbody td:nth-child(-n+2), #ws-admin-rows-list .admin-table tbody td:nth-child(-n+2), #grp-admin-rows-list .admin-table tbody td:nth-child(-n+2) {
    z-index: 1;
  }
  #leisure-clubs-admin-list .admin-table th:nth-child(1), #leisure-clubs-admin-list .admin-table td:nth-child(1),
  #experiences-admin-list .admin-table th:nth-child(1), #events-admin-list .admin-table th:nth-child(1), #shows-admin-list .admin-table th:nth-child(1), #experiences-admin-list .admin-table td:nth-child(1), #events-admin-list .admin-table td:nth-child(1), #shows-admin-list .admin-table td:nth-child(1),
  #edu-admin-rows-list .admin-table th:nth-child(1), #edu-admin-rows-list .admin-table td:nth-child(1), #ws-admin-rows-list .admin-table th:nth-child(1), #grp-admin-rows-list .admin-table th:nth-child(1), #ws-admin-rows-list .admin-table td:nth-child(1), #grp-admin-rows-list .admin-table td:nth-child(1) {
    right: 0;
    width: 150px; min-width: 150px; max-width: 150px;
  }
  #leisure-clubs-admin-list .admin-table th:nth-child(2), #leisure-clubs-admin-list .admin-table td:nth-child(2),
  #experiences-admin-list .admin-table th:nth-child(2), #events-admin-list .admin-table th:nth-child(2), #shows-admin-list .admin-table th:nth-child(2), #experiences-admin-list .admin-table td:nth-child(2), #events-admin-list .admin-table td:nth-child(2), #shows-admin-list .admin-table td:nth-child(2),
  #edu-admin-rows-list .admin-table th:nth-child(2), #edu-admin-rows-list .admin-table td:nth-child(2), #ws-admin-rows-list .admin-table th:nth-child(2), #grp-admin-rows-list .admin-table th:nth-child(2), #ws-admin-rows-list .admin-table td:nth-child(2), #grp-admin-rows-list .admin-table td:nth-child(2) {
    right: 150px;
    width: 160px; min-width: 160px; max-width: 160px;
    box-shadow: -2px 0 4px -2px rgba(0, 0, 0, 0.25);
  }
}

/* "contact name and phone, can be 1 below the other, same for workname
   and address" (2026-09-20) -- one column's worth of content, two
   stacked lines (or two stacked inputs, in edit mode) instead of two
   side-by-side columns. Not scoped to the desktop media query above --
   works the same (and is just as useful) in the mobile stacked "label:
   value" layout, where this now shows as one label with two lines
   underneath instead of two separate label:value rows. */
.cell-stack {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}
.cell-stack-sub {
  color: var(--charcoal-text);
  opacity: 0.7;
  font-size: 0.85em;
}
.cell-stack input {
  width: 100%;
  box-sizing: border-box;
}

.admin-table {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: 1rem;
}

.admin-table th,
.admin-table td {
  text-align: right;
  padding: 0.5rem 0.6rem;
  border-bottom: 1px solid var(--border-color);
}

.admin-table thead th {
  background: var(--grey-bg);
  font-weight: bold;
}

/* "job history to be below job line using 4 last cols width" (explicit
   ask, 2026-09-21) - jobHistoryRowHtml (admin-jobs.js) renders history
   as a second <tr> right under the job's own row instead of its own
   column; the filler cell just occupies the other columns so the real
   content lands under the same last-4-columns width group history used
   to share with סטטוס/עודכן/actions (see the width rules above). */
.admin-table tr.job-history-row td {
  padding-top: 0;
}
.admin-table td.job-history-filler {
  border-bottom: none;
}

/* "when people apply, it shows apply indicator, and view applied lists"
   (2026-09-20) - the employer-admin location list's own per-job
   applicants column (employer-candidate-forms.js's applicantsCellHtml). */
.applicants-details summary {
  cursor: pointer;
  font-weight: bold;
}

.applicants-list {
  margin: 0.4rem 0 0;
  padding-inline-start: 1.1rem;
  font-size: 0.85rem;
}

/* "auto width, max 2 lines height, dropdown with multi select" (explicit
   ask, 2026-09-21) - disabilityTags/adaptations (admin-shared.js's own
   multiCheckboxHtml) as a checkbox-list popover instead of a native
   <select multiple>, which can never wrap a long label onto two lines.
   Collapsed (the default), this is just its own <summary> line - real
   "auto width" comes from letting it size to its own content instead of
   being pinned to the surrounding table cell's min/max-width. */
.multi-checkbox-dropdown summary {
  cursor: pointer;
  white-space: nowrap;
}
.multi-checkbox-dropdown .multi-checkbox-list {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  margin-top: 0.3rem;
  padding: 0.4rem;
  width: max-content;
  max-width: 220px;
  max-height: 180px;
  overflow-y: auto;
  background: var(--card-bg, #fff);
  border: 1px solid var(--border-color, #ddd);
  border-radius: 6px;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.12);
}
.multi-checkbox-option {
  display: flex;
  align-items: flex-start;
  gap: 0.35rem;
  font-size: 0.85rem;
  font-weight: normal;
  white-space: normal;
}

/* "adjusted to the width of the longest value... a scroll with all
   selected, each one on a new line, never overflowing" (explicit ask,
   2026-09-22, re-scoped to the RESULTS DISPLAY only, not the
   multi-select dropdown above, which is untouched here) - the
   disabilityTags/adaptations READ-ONLY cell (tagLabelsLinesHtml,
   admin-shared.js) wraps its real <br>-joined lines in this element.
   nowrap keeps every individual label on its own one line instead of
   wrapping mid-word once the column/value area is narrower than the
   label (the exact garbled multi-line text reported); inline-block
   lets that single-line width drive the column's own auto-sizing (the
   "longest value" width). max-height + overflow-y is the real scroll
   for a job with many tags, so the row itself never has to grow tall
   to show them all. Not scoped to a desktop media query - the mobile
   stacked "label: value" layout (style.css's own #admin-jobs-list
   .admin-table td rules further down) has the exact same value area,
   so this needs to apply there too, not just the wide desktop table. */
.tag-lines-scroll {
  display: inline-block;
  max-height: 4.2em;
  overflow-y: auto;
  white-space: nowrap;
}

.table-sort-btn {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  font-weight: bold;
  color: var(--charcoal-text);
  cursor: pointer;
}

.table-sort-btn:hover {
  color: var(--blue-primary);
}

.table-sort-btn .sort-tri {
  font-size: 0.75em;
  white-space: nowrap;
}

th[aria-sort="none"] .sort-tri {
  opacity: 0.45;
}

.admin-row-actions {
  white-space: nowrap;
}

.icon-btn {
  background: none;
  border: none;
  font-size: 1.1rem;
  line-height: 1;
  padding: 0.25rem 0.4rem;
  cursor: pointer;
  border-radius: 4px;
}

.icon-btn:hover {
  background: var(--grey-bg);
}

.icon-btn-delete:hover {
  background: #fdecea;
}

.icon-btn-save:hover {
  background: #e6f4ea;
}

.icon-btn-approve:hover {
  background: #e6f4ea;
}

.icon-btn-decline:hover {
  background: #fdecea;
}

/* Admin alerts' own "mark as read" action (unified-alerts.js) - a real
   WhatsApp-style blue double-checkmark ("in alerts screens, change the
   V to blue double V (whatsapp like)", explicit ask, 2026-09-23)
   instead of a plain single green ✓. */
.icon-btn-mark-read {
  color: #34b7f1;
  letter-spacing: -0.35em;
  padding-inline-end: 0.55em;
}
.icon-btn-mark-read:hover {
  background: #e8f6fd;
}

/* Supplier-management table's own freeze action (pause icon, ⏸) -
   reversible suspension, same neutral hover as the plain .icon-btn
   default (not a destructive color like delete/decline). */
.icon-btn-freeze:hover {
  background: var(--grey-bg);
}

/* Inline row editing (explicit ask: pencil turns a row's own cells into
   fields instead of a separate add/edit form) - compact inputs that
   stay inside the table's own row height. */
.admin-table td input,
.admin-table td select,
.admin-table td textarea {
  width: 100%;
  min-width: 6rem;
  padding: 0.3rem 0.4rem;
  border: 1px solid var(--border-color);
  border-radius: 4px;
  font: inherit;
  box-sizing: border-box;
}

/* "QA near the check not below" (explicit ask, 2026-09-21) - the
   generic input styling above (width:100%, min-width:6rem, its own
   border/padding) was meant for real text/number fields; applied to
   the QA flag's own checkbox too, it stretched that checkbox to the
   FULL status column width, forcing its own "QA" label text onto the
   next line. A checkbox stays its natural small inline size instead. */
.admin-table td input[type="checkbox"] {
  width: auto;
  min-width: 0;
  padding: 0;
  border: none;
}

.qa-job-flag {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  white-space: nowrap;
}

.admin-table td input[type="number"] {
  min-width: 4.5rem;
}

.admin-table td textarea {
  resize: vertical;
}

/* Explicit ask: "make these wider"/"triple this + 2 lines fixed
   height"/"double height, double width" - specific inline-edit fields
   widened (or, for the two free-text fields, turned into real 2-row
   textareas - see textAreaHtml, admin-shared.js). Targeted by the real
   data-field attribute (not a container id), so this applies
   identically wherever jobEditRowHtml renders - both the admin "ניהול
   משרות" table and the employee zone's own table (admin-jobs-owned.js
   reuses the exact same row markup), matching the explicit follow-up
   ask ("make same sizes also for admin screen"). */
.admin-table td [data-field="locationName"],
.admin-table td [data-field="address"] {
  min-width: 12rem;
}

.admin-table td [data-field="categoryId"] {
  min-width: 11rem;
}

.admin-table td [data-field="workDescription"] {
  min-width: 18rem;
}

.admin-table td [data-field="notes"] {
  min-width: 12rem;
}

/* Dashboard */
.stats-row {
  display: flex;
  gap: 1rem;
  margin-bottom: 1.5rem;
  flex-wrap: wrap;
}

.stat-tile {
  flex: 1;
  min-width: 140px;
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 1rem;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.stat-num {
  font-size: 1.8rem;
  font-weight: bold;
  color: var(--blue-primary);
}

.pipeline-board {
  display: flex;
  gap: 1rem;
  overflow-x: auto;
  margin-bottom: 1.5rem;
}

.pipeline-column {
  flex: 1 0 200px;
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 0.75rem;
}

.pipeline-column h4 {
  margin-top: 0;
  color: var(--blue-primary);
}

.pipeline-card {
  background: var(--grey-bg);
  border-radius: 6px;
  padding: 0.5rem;
  margin-bottom: 0.5rem;
  font-size: 0.9rem;
}

/* Inbox / mobile feed */
.inbox-list, .applications-list {
  margin-bottom: 1.5rem;
}

.inbox-item, .application-item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  background: var(--card-bg);
  border: 1px solid var(--border-color);
  border-radius: 8px;
  padding: 0.75rem 1rem;
  margin-bottom: 0.5rem;
}

.application-item {
  justify-content: space-between;
}

.inbox-icon {
  font-size: 1.4rem;
}

.inbox-title {
  margin: 0;
  font-weight: bold;
}

/* "read = not bolded" (explicit ask, 2026-09-23, real bug) -
   .inbox-item-unread was only ever wired to the blue accent bar below,
   never to font-weight - a "read" item's own title stayed bold forever
   regardless of the class. Shared by both real read/unread surfaces
   that use this same markup (the admin alerts screen and the personal
   inbox's own notifications, job-search.js's notifItemHtml). */
.inbox-item:not(.inbox-item-unread) .inbox-title {
  font-weight: normal;
}

.inbox-sub {
  margin: 0;
  font-size: 0.85rem;
  color: #666;
}

/* "also show message time locale short date time, first col" / "add
   marked as read and delete for notification (check and recycle bin
   icons)" (explicit ask, 2026-09-21). */
.inbox-time {
  font-size: 0.8rem;
  color: #666;
  white-space: nowrap;
  flex-shrink: 0;
}
.inbox-item-body {
  flex: 1;
  min-width: 0;
}
.inbox-item-actions {
  display: flex;
  gap: 0.2rem;
  flex-shrink: 0;
}
.inbox-item-unread {
  border-inline-start: 3px solid var(--blue-primary);
}
/* "make arrow be mirrored too" (explicit ask, 2026-09-23) - the ➜ glyph
   itself only ever points right; flipped so it visually points toward
   the real RTL "forward" direction (left) on the admin alerts screen's
   own goto button. */
.inbox-goto-icon {
  display: inline-block;
  transform: scaleX(-1);
}
time.inbox-time { cursor: help; }
/* #183: אונליין checkbox under a location field, and the "more than one location" warning (online-flag.js) */
.online-flag { display: inline-flex; align-items: center; gap: 0.3rem; margin-top: 0.3rem; font-size: 0.9rem; white-space: nowrap; }
/* #183 owner: "what is the missing icon on the button left to the search text box?" - the export buttons used the
   glyph ⭳, which Android fonts lack (an empty box once the phone hides the label). One drawn download icon instead,
   in the button's own text color, no font needed. */
/* #188: Google Maps pin on search results (map-pin.js) - a hollow drawn pin, no font glyph. */
.map-pin { display: inline-flex; align-items: center; justify-content: center; min-width: 1.6em; min-height: 1.6em; margin-inline-start: 0.15em; color: #0a4f7f; vertical-align: middle; border-radius: 6px; text-decoration: none; }
.map-pin:hover, .map-pin:focus-visible { background: rgba(77, 208, 225, 0.2); }
.icon-map-pin { display: inline-block; width: 1em; height: 1em; background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linejoin='round'%3E%3Cpath d='M12 22s-7-6.2-7-12a7 7 0 0 1 14 0c0 5.8-7 12-7 12z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linejoin='round'%3E%3Cpath d='M12 22s-7-6.2-7-12a7 7 0 0 1 14 0c0 5.8-7 12-7 12z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E") center / contain no-repeat; }
.icon-download {
  display: inline-block; width: 1em; height: 1em; vertical-align: -0.125em; background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12M6 10l6 6 6-6M4 20h16'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12M6 10l6 6 6-6M4 20h16'/%3E%3C/svg%3E") center / contain no-repeat;
}
/* #185 search line: tickets left / sold out (show-tickets.js) */
.tickets-left { color: #1b7f3b; font-weight: 600; }
.tickets-sold-out { color: #b3261e; font-weight: 700; }
.tickets-sold-out s { color: #666; font-weight: 400; }
.stacked-input-label { display: flex; align-items: center; gap: 0.3rem; font-size: 0.85rem; white-space: nowrap; }
.stacked-input-label input { width: 5rem; }
.field-warning { display: block; width: 100%; box-sizing: border-box; margin: 0.25rem 0 0; color: #8a5300; background: #fff4e0; border-radius: 6px; padding: 0.2rem 0.45rem; font-size: 0.85rem; }
/* #180 owner, alerts on mobile: "make better use of screen", "smaller margins around buttons" - the title gets
   the full width, the (relative) time sits on a small line under it, no bell icon, tighter card and buttons. */
@media (max-width: 600px) {
  .inbox-item {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas: "body actions" "time actions";
    gap: 0.1rem 0.35rem;
    padding: 0.5rem 0.6rem;
    align-items: center;
  }
  .inbox-item .inbox-icon { display: none; }
  .inbox-item .inbox-item-body { grid-area: body; }
  .inbox-item .inbox-time { grid-area: time; font-size: 0.75rem; }
  .inbox-item .inbox-item-actions { grid-area: actions; gap: 0; }
  .inbox-item .inbox-item-actions .icon-btn { padding: 0.2rem 0.25rem; }
  .inbox-item .inbox-title { font-size: 0.95rem; line-height: 1.35; }
}

/* Mobile breakpoint: stack every multi-column layout to one column */
@media (max-width: 640px) {
  /* Hamburger + collapsed nav now apply at every width (see base
     rules above) - nothing mobile-specific left to add here for them. */
  .solutions-grid {
    grid-template-columns: 1fr;
    gap: 0.5rem;
  }

  /* Mobile-only (explicit follow-up: "the last change was only for
     mobile, not desktop") - shrinks the hero title and the 4 homepage
     tiles so at least 3 are visible on screen without scrolling. Icon
     and font sizes are untouched, only the padding/margins around them
     shrink; desktop keeps the original larger sizing above. */
  .hero {
    padding: 0.5rem 0 0.75rem;
  }

  .hero h2 {
    margin: 0 0 0.35rem;
  }

  .solutions-hub {
    margin: 0 0 0.75rem;
  }

  /* 156px (was 120px): PR157's larger, even cube links need ~134px of
     content + 16px padding + 4px border in the work cube (it has 2 info
     links; measured on staging at 390px wide). Every cube keeps the same
     fixed height so the 4 cubes stay even on mobile too. */
  .solution-tile {
    height: 156px;
    padding: 0.5rem 1rem;
  }

  .solution-tile-icon {
    margin-bottom: 0.25rem;
  }

  .solution-tile-cta {
    margin-top: 0.15rem;
  }

  .solution-tile .tile-info-link {
    margin-top: 0.15rem;
  }

  /* Jobs/education header shortcuts collapse from a text+icon pill to
     the same bare icon square the home button already uses - explicit
     ask: text labels on desktop, icons only on mobile.
     "in every case[s] I wanted to stay one liner... the bill [bell]
     icon smaller... adjustments when screen is shrinking" (explicit
     asks, 2026-09-23) - real, careful redo on top of the restored
     baseline: ONE single rule for BOTH .icon-nav-link and
     .nav-link-with-label (never two separate declarations for the same
     selector again - that duplicate was the earlier bug), sized to
     genuinely fit one row alongside the title, verified by real
     computed scrollWidth/clientWidth before this ever ships, not
     forced via overflow-x:auto (the earlier regression - a real touch-
     device scroll/tap ambiguity, see git history) or flex-shrink
     squishing. */
  header {
    padding: 0.4rem;
    flex-wrap: nowrap;
    gap: 0.2rem;
  }

  /* .hamburger-btn's own margin-right: -1rem (base rule) is calibrated
     against the DESKTOP header's own 1rem padding, to sit flush at the
     corner ("Pot the menu on the right corner no margins", explicit
     ask) - real bug found here, live, before deploying: this mobile
     header's own padding just above is only 0.4rem, so that same -1rem
     pull was overshooting past the header's own edge, clipping the
     button partially off-screen. Matches THIS padding instead. */
  .hamburger-btn {
    margin-right: -0.4rem;
  }

  header h1 {
    gap: 0.25rem;
  }

  /* .icon-nav-link's own sizing already lives in its one base rule
     above (same clamp(), applies at every width including mobile) -
     this used to be a real, byte-identical duplicate declaration here,
     dead weight left over from this session's own header-sizing
     iteration. Only .nav-link-with-label genuinely needs a mobile-only
     override (its own base rule has no fixed size at all - icon+text
     pill on desktop, bare icon square only here). flex-shrink lives
     once, on the blanket `header > *` rule below - not repeated on
     every single one of these mobile overrides. */
  .nav-link-with-label {
    width: clamp(1.6rem, 1.2rem + 2vw, 2.1rem);
    height: clamp(1.6rem, 1.2rem + 2vw, 2.1rem);
    padding: 0.3rem;
    box-sizing: border-box;
    justify-content: center;
  }

  .nav-link-with-label .nav-link-label {
    display: none;
  }

  /* "the bill icon to be smaller" - the bell stays visually distinct
     (smaller than the 5 real nav shortcuts), count shrinks to match. */
  .header-notif-bell {
    gap: 0.1rem;
    padding: 0.2rem;
  }

  .header-notif-bell svg {
    width: 14px;
    height: 14px;
  }

  .header-notif-count {
    font-size: 0.6rem;
    min-width: 0.9rem;
    height: 0.9rem;
    line-height: 0.9rem;
  }

  header > * {
    flex-shrink: 0;
  }

  .screen-content {
    flex-direction: column;
  }

  .filters-panel, .side-panel, .wizard-form, .results-panel, .main-panel {
    flex: 1 1 auto;
    width: 100%;
    min-width: 0;
    box-sizing: border-box;
  }

  .pipeline-board {
    flex-direction: column;
    overflow-x: visible;
  }

  .stats-row {
    flex-direction: column;
  }

  /* Job/education search on mobile: pressing 'חיפוש' collapses the
     filter panel down to a one-line summary bar so the results are the
     main thing on screen, and tapping that bar re-expands it. The panel
     itself used to also cap at 50vh with its own internal scrollbar
     while expanded (explicit ask, since reverted: "when I don't expand
     the options I don't want to see any scroll within that search
     dialog" - a nested scroll area inside the panel fought with
     scrolling the page itself when a touch/swipe started over the
     filters). No max-height/overflow-y here now - the panel just grows
     with its content and the page scrolls normally. Was scoped to
     #employer-directory-page only; "make search dialog same structure"
     (2026-09-20) gave education the exact same summary-bar/minimize
     markup (index.html), so these rules apply to both now. */
  #employer-directory-page .filters-summary-bar,
  #education-page .filters-summary-bar,
  #leisure-clubs-page .filters-summary-bar,
  #experiences-page .filters-summary-bar {
    display: none;
  }

  #employer-directory-page .filters-panel.minimized,
  #education-page .filters-panel.minimized,
  #leisure-clubs-page .filters-panel.minimized,
  #experiences-page .filters-panel.minimized {
    max-height: none;
    overflow: visible;
    padding-block: 0.5rem;
  }

  #employer-directory-page .filters-panel.minimized > *:not(.filters-summary-bar),
  #education-page .filters-panel.minimized > *:not(.filters-summary-bar),
  #leisure-clubs-page .filters-panel.minimized > *:not(.filters-summary-bar),
  #experiences-page .filters-panel.minimized > *:not(.filters-summary-bar) {
    display: none;
  }

  #employer-directory-page .filters-panel.minimized .filters-summary-bar,
  #education-page .filters-panel.minimized .filters-summary-bar,
  #leisure-clubs-page .filters-panel.minimized .filters-summary-bar,
  #experiences-page .filters-panel.minimized .filters-summary-bar {
    display: flex;
    width: 100%;
    justify-content: space-between;
    align-items: center;
    background: none;
    border: none;
    font: inherit;
    color: inherit;
    cursor: pointer;
    padding: 0;
  }

  #employer-directory-page .filters-summary-bar span:last-child,
  #education-page .filters-summary-bar span:last-child,
  #leisure-clubs-page .filters-summary-bar span:last-child,
  #experiences-page .filters-summary-bar span:last-child {
    color: var(--blue-primary);
    font-weight: bold;
  }

  /* Explicit ask: "on mobile '+' is enough" - the add-row button's own
     text label collapses away, leaving just the "+" (and its normal
     button padding) so it doesn't crowd the search box on a narrow
     screen. Desktop keeps the full label. */
  .btn-full-label {
    display: none;
  }

  /* Explicit ask: "not all the fields are in the table, I want all to
     be editable... every one" - both admin tables grew from a handful
     of columns to every real field the data model carries, too many to
     lay out by hand-picked (row, column) position on a phone screen any
     more (the earlier nth-child-based grid this replaced needed
     updating every time a column was added/reordered). The classic
     "responsive table" pattern instead: each <tr> stacks its own <td>s
     as label/value lines, the label coming from a real data-label
     attribute every <td> already carries (see jobRowHtml/eduRowHtml and
     their own edit-mode counterparts) - adding a real column is now a
     JS-only change, no matching CSS update required. Scoped to
     #admin-jobs-list/#edu-admin-rows-list/#emp-locations-list
     specifically (the latter added when the employer-admin location
     list itself became a real .admin-table too - "rearrange it to look
     more like my job management", 2026-09-20) so this never affects any
     other .admin-table-using screen. */
  #admin-jobs-list .admin-table thead,
  #edu-admin-rows-list .admin-table thead, #ws-admin-rows-list .admin-table thead, #grp-admin-rows-list .admin-table thead,
  #emp-locations-list .admin-table thead, #emp-jobs-list .admin-table thead,
  #leisure-clubs-admin-list .admin-table thead, #experiences-admin-list .admin-table thead, #events-admin-list .admin-table thead, #shows-admin-list .admin-table thead,
  #supplier-admin-list .admin-table thead {
    display: none;
  }

  #admin-jobs-list .admin-table, #admin-jobs-list .admin-table tbody,
  #edu-admin-rows-list .admin-table, #edu-admin-rows-list .admin-table tbody, #ws-admin-rows-list .admin-table, #grp-admin-rows-list .admin-table, #ws-admin-rows-list .admin-table tbody, #grp-admin-rows-list .admin-table tbody,
  #emp-locations-list .admin-table, #emp-locations-list .admin-table tbody,
  #leisure-clubs-admin-list .admin-table, #leisure-clubs-admin-list .admin-table tbody,
  #experiences-admin-list .admin-table, #events-admin-list .admin-table, #shows-admin-list .admin-table, #experiences-admin-list .admin-table tbody, #events-admin-list .admin-table tbody, #shows-admin-list .admin-table tbody,
  #supplier-admin-list .admin-table, #supplier-admin-list .admin-table tbody {
    display: block;
    width: 100%;
  }

  #admin-jobs-list .admin-table tr,
  #edu-admin-rows-list .admin-table tr, #ws-admin-rows-list .admin-table tr, #grp-admin-rows-list .admin-table tr,
  #emp-locations-list .admin-table tr,
  #leisure-clubs-admin-list .admin-table tr, #experiences-admin-list .admin-table tr, #events-admin-list .admin-table tr, #shows-admin-list .admin-table tr,
  #supplier-admin-list .admin-table tr {
    display: block;
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--border-color);
  }

  #admin-jobs-list .admin-table td,
  #edu-admin-rows-list .admin-table td, #ws-admin-rows-list .admin-table td, #grp-admin-rows-list .admin-table td,
  #emp-locations-list .admin-table td,
  #leisure-clubs-admin-list .admin-table td, #experiences-admin-list .admin-table td, #events-admin-list .admin-table td, #shows-admin-list .admin-table td,
  #supplier-admin-list .admin-table td {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.15rem 0;
    border: none;
    font-size: 0.9rem;
  }

  #admin-jobs-list .admin-table td[data-label]::before,
  #edu-admin-rows-list .admin-table td[data-label]::before, #ws-admin-rows-list .admin-table td[data-label]::before, #grp-admin-rows-list .admin-table td[data-label]::before,
  #emp-locations-list .admin-table td[data-label]::before,
  #leisure-clubs-admin-list .admin-table td[data-label]::before, #experiences-admin-list .admin-table td[data-label]::before, #events-admin-list .admin-table td[data-label]::before, #shows-admin-list .admin-table td[data-label]::before,
  #supplier-admin-list .admin-table td[data-label]::before {
    content: attr(data-label);
    font-weight: bold;
    flex-shrink: 0;
    opacity: 0.7;
  }

  #admin-jobs-list .admin-table td.admin-row-actions,
  #edu-admin-rows-list .admin-table td.admin-row-actions, #ws-admin-rows-list .admin-table td.admin-row-actions, #grp-admin-rows-list .admin-table td.admin-row-actions,
  #emp-locations-list .admin-table td.admin-row-actions,
  #leisure-clubs-admin-list .admin-table td.admin-row-actions, #experiences-admin-list .admin-table td.admin-row-actions, #events-admin-list .admin-table td.admin-row-actions, #shows-admin-list .admin-table td.admin-row-actions {
    justify-content: flex-end;
    padding-top: 0.4rem;
  }

  /* The below-row history filler (job-history-row's own colspan hack
     for the desktop grid) means nothing once every <td> is a stacked
     block here - drop it so it doesn't show up as a blank line. */
  #admin-jobs-list .admin-table td.job-history-filler,
  #emp-jobs-list .admin-table td.job-history-filler,
  #leisure-clubs-admin-list .admin-table td.job-history-filler,
  #experiences-admin-list .admin-table td.job-history-filler, #events-admin-list .admin-table td.job-history-filler, #shows-admin-list .admin-table td.job-history-filler,
  #edu-admin-rows-list .admin-table td.job-history-filler, #ws-admin-rows-list .admin-table td.job-history-filler, #grp-admin-rows-list .admin-table td.job-history-filler {
    display: none;
  }
}

/* "use my location" busy state (explicit ask: hourglass animation on the
   button + disabled until current location returns or after refresh).
   Shared by every use-my-location button via location-button.js. */
.location-btn-busy {
  cursor: wait;
  opacity: 0.85;
}
.location-btn-busy::before {
  content: "\231B";
  display: inline-block;
  margin-inline-end: 0.4em;
  animation: location-hourglass-flip 1s steps(2) infinite;
}
@keyframes location-hourglass-flip {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(180deg); }
}

/* סורק שותפים groups pane (PR #153): list 3 rows tall (scrolls), add form beside it. */
.scanner-groups-pane { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-start; margin: 0.75rem 0; }
.scanner-groups-main { flex: 2 1 20rem; min-width: 0; }
.scanner-groups-main h3 { margin: 0 0 0.25rem; }
.scanner-groups-rows { max-height: 7.5rem; overflow-y: auto; margin: 0; padding: 0; list-style: none; border: 1px solid #ddd; border-radius: 6px; }
.scanner-group-row { display: flex; align-items: center; gap: 0.5rem; box-sizing: border-box; height: 2.5rem; padding: 0 0.5rem; white-space: nowrap; overflow: hidden; border-bottom: 1px solid #eee; }
.scanner-group-row > a, .scanner-group-row > .cell-stack-sub { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.scanner-add-group { flex: 1 1 14rem; display: flex; flex-direction: column; gap: 0.25rem; }

/* PR #149 פרטים (details): multi-line, 3x the standard 6rem input width, grows
   1 -> 3 rows with its content then scrolls (details-textarea.js). */
.admin-table td textarea.details-textarea {
  min-width: 18rem;
  width: 18rem;
  line-height: 1.4;
  min-height: calc(1.4em + 0.6rem + 2px);
  max-height: calc(3 * 1.4em + 0.6rem + 2px);
  overflow-y: auto;
  resize: vertical;
}
.details-text { display: inline-block; min-width: 18rem; white-space: pre-line; }
.result-row-body p.details-text-line { white-space: pre-line; }

/* PR159 - "סה"כ(X)" row counter above every management table
   (admin-table-view.js rowCountHtml). */
.admin-row-count {
  margin: 0.25rem 0 0.4rem;
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--charcoal-text);
}

/* PR175 - Rich-text formatting (bold, italic, underline, bullets).
   View mode: max 3 lines at all widths, overflow hidden, clickable to expand.
   Edit mode: full-screen overlay (mobile), side panel (desktop).
   read-only viewer: same layout as editor, no toolbar/contenteditable. */

.rich-text-view {
  white-space: normal;
  line-height: 1.5em;
  max-height: calc(3 * 1.5em);
  overflow: hidden;
  max-width: 100%;
  cursor: pointer;
}

.rich-text-view ul {
  margin: 0.5em 0 0.5em 1.5em;
  padding: 0;
}

.rich-text-view li {
  margin: 0;
  padding: 0;
}

/* Editor overlay: fixed full-viewport backdrop with flex column panel layout.
   Mobile: inset 8px, takes up remaining space after toolbar/buttons fixed sections.
   Desktop: 20vw width (min 320px) anchored at right (RTL start), full viewport height. */

.rich-editor-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  z-index: 1000;
  direction: rtl;
}

@media (max-width: 767px) {
  .rich-editor-overlay {
    padding: 8px;
    flex-direction: column;
  }

  .rich-editor-overlay > div {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
  }

  .rich-editor-toolbar {
    display: flex;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
    flex-shrink: 0;
    background: white;
    padding: 0.5rem;
    border-radius: 4px;
  }

  .rich-editor-area {
    flex: 1;
    overflow-y: auto;
    background: white;
    padding: 0.5rem;
    border-radius: 4px;
    border: 1px solid var(--border-color);
  }

  .rich-editor-buttons {
    display: flex;
    gap: 0.5rem;
    margin-top: 0.5rem;
    flex-shrink: 0;
  }

  .rich-editor-buttons button {
    flex: 1;
  }
}

@media (min-width: 768px) {
  .rich-editor-overlay {
    justify-content: flex-start;
    padding: 0;
  }

  .rich-editor-overlay > div {
    display: flex;
    flex-direction: column;
    width: 20vw;
    min-width: 320px;
    height: 100vh;
    background: white;
  }

  .rich-editor-toolbar {
    display: flex;
    gap: 0.5rem;
    padding: 0.5rem;
    flex-shrink: 0;
    border-bottom: 1px solid var(--border-color);
  }

  .rich-editor-area {
    flex: 1;
    overflow-y: auto;
    padding: 0.5rem;
    border: none;
    min-height: 0; /* fills the pane: 50 lines on a tall screen, else scrolls inside - Save/Cancel always visible */
    line-height: 1.5em;
  }

  .rich-editor-buttons {
    display: flex;
    gap: 0.5rem;
    padding: 0.5rem;
    flex-shrink: 0;
    border-top: 1px solid var(--border-color);
  }

  .rich-editor-buttons button {
    flex: 1;
  }
}

.rich-editor-toolbar-btn {
  padding: 0.5rem 1rem;
  border: 1px solid var(--border-color);
  background: white;
  cursor: pointer;
  border-radius: 4px;
  min-width: 44px;
  line-height: 1.2;
}

.rich-editor-toolbar-btn:hover {
  background: var(--grey-bg);
}

.rich-editor-toolbar-btn:active {
  background: var(--cyan-accent);
}

/* Read-only viewer: same layout as editor but without toolbar and contenteditable. */
.rich-editor-view-only {
  white-space: normal;
  word-wrap: break-word;
  user-select: text;
}

.rich-editor-view-only b,
.rich-editor-view-only i,
.rich-editor-view-only u {
  display: inline;
}

.rich-editor-view-only ul {
  margin: 0.5em 0 0.5em 1.5em;
  padding: 0;
}

.rich-editor-view-only li {
  margin: 0;
  padding: 0;
  list-style: disc;
}

/* PR175: the link dialog (link-field.js) - a compact pane, not the big editor pane. */
.rich-editor-overlay > .link-dialog { box-sizing: border-box; height: auto; width: min(420px, calc(100vw - 16px)); min-width: 0; margin: auto; background: #fff; padding: 1rem; border-radius: 8px; gap: 0.5rem; }
.link-dialog .link-dialog-field { display: flex; flex-direction: column; gap: 0.25rem; font-weight: 600; }
.link-dialog .link-dialog-field input { font-weight: normal; }
.link-field-btn { white-space: nowrap; max-width: 14rem; overflow: hidden; text-overflow: ellipsis; }

/* PR175: lists keep their bullets in the 3-line box, the editor and the read-only pane. */
.rich-text-view ul, .rich-editor-area ul { list-style: disc; padding-inline-start: 1.5em; margin: 0.25em 0; }
/* Text cut off at 3 lines says so: a fading "... show all" at the end of the last line. */
.rich-text-view.is-clamped { position: relative; }
.rich-text-view.is-clamped::after { content: "… הצג הכל"; position: absolute; bottom: 0; inset-inline-end: 0; padding-inline-start: 2.5em; line-height: 1.5em; color: var(--primary-color, #0b4f7c); font-weight: 600; background: linear-gradient(to left, var(--card-bg, #fff) 60%, transparent); }
/* #176: sign-up code step (signup-code.js). */
.register-code-step { display: flex; flex-direction: column; gap: 0.5rem; margin-top: 0.75rem; padding: 0.75rem; border: 1px solid #f2b705; border-radius: 8px; background: #fff8e1; }
.register-code-step p { margin: 0; }
.register-code-input { font-size: 1.6rem; letter-spacing: 0.4em; text-align: center; max-width: 12rem; font-variant-numeric: tabular-nums; }
.register-code-life { color: #555; font-variant-numeric: tabular-nums; }
/* #176 live password checklist under the sign-up password */
.password-rules { list-style: none; margin: 6px 0 0; padding: 0; font-size: 0.85rem; color: #b3261e; }
.password-rules li::before { content: '✗ '; }
.password-rules li.met { color: #1b7f3b; }
.password-rules li.met::before { content: '✓ '; }
/* #176 forgot-password by code (password-reset.js) */
#forgot-password-btn { background: none; border: 0; padding: 4px 0; margin: 2px 0; color: inherit; text-decoration: underline; cursor: pointer; font-size: 0.9em; }
.reset-done { color: #1b7f3b; font-weight: 600; }
#reset-code-step label { display: block; margin-top: 8px; font-weight: 600; }
/* #176 owner: password fields always right-aligned in Hebrew, so the show-password eye (left side) never hides
   the typed text - also while shown as text, and whatever a phone browser's own password styling says. */
html[dir="rtl"] input[type="password"],
html[dir="rtl"] .pw-wrap > input {
  direction: rtl !important;
  text-align: right !important;
  padding-left: 40px !important;
}

/* #177 first-time guidance: hint on the ☰ button and inside the menu (welcome-guide.js) */
.menu-hint-bubble { position: fixed; z-index: 90; max-width: 16rem; padding: 0.6rem 0.8rem; border-radius: 10px; background: #0a4f7f; color: #fff; font-size: 0.95rem; line-height: 1.4; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25); cursor: pointer; }
.menu-hint-bubble::before { content: ''; position: absolute; top: -8px; right: 14px; border: 8px solid transparent; border-top: 0; border-bottom-color: #0a4f7f; }
@keyframes ui-hint-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(77, 208, 225, 0.9); } 50% { box-shadow: 0 0 0 10px rgba(77, 208, 225, 0); } }
.ui-hint-pulse { animation: ui-hint-pulse 1.2s ease-in-out infinite; border-radius: 8px; }
.ui-hint-glow { outline: 3px solid #4dd0e1; outline-offset: 2px; border-radius: 6px; background: rgba(77, 208, 225, 0.22); }

/* PR174: SEO intro on /jobs, /workshops ... - sits under the page title, not over it. */
.seo-intro { margin: 0 0 1rem; }
.seo-intro summary { cursor: pointer; color: var(--text-secondary, #4a4a4a); }
.seo-intro .seo-intro-title { display: inline; font-size: 1rem; margin: 0; }
.seo-intro .seo-intro-teaser { font-size: 0.95rem; }
.seo-intro-more[open] .seo-intro-teaser { display: none; }
.seo-listing-links { margin: 0.5rem 0; padding-inline-start: 1.25rem; columns: 2 16rem; }
.seo-intro p { margin: 0.25rem 0; color: var(--text-secondary, #4a4a4a); }

/* #189 אודות: the page title above its three section titles (the legal pages only style h2). */
.about-content h2 { font-size: 1.35rem; }
.about-body { line-height: 1.6; }
.about-body b { color: var(--blue-primary); }
.about-edit-btn { margin: 0.2rem 0 0.6rem; }
