{
  "lang": "en",
  "browserTitle": " Florida Photography - Steven Martine",
  "metaDescription": "Steven Martine, international award-winning photographer, specializing  in Florida Photography ",
  "metaKeywords": "Steven Martine,  florida photographer, florida lifestyle photographer, photographer, Florida,  florida commercial photographer,  travel photographer, tourism photographer, celebrity photographer,  music photographer, Florida portrait photographer, production photographer, florida architectural photographer, editorial photographer, photojournalist, documentary, photography, photojournalism, award winning, advertising photographer, lifestyle photographer.",
  "cdnSslUri": "/pf-media",
  "redirects": [],
  "blogSectionId": "36",
  "advancedSeo": true,
  "globalBrowserTitle": false,
  "facebookUseMeta": true,
  "enablePinterest": false,
  "siteHead": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": [\"Person\", \"LocalBusiness\"],\n  \"@id\": \"https://www.stevenmartine.com/#steven-martine\",\n  \"name\": \"Steven Martine\",\n  \"alternateName\": [\n    \"Steven Martine Photography\",\n    \"Steven Martine Photography Inc.\"\n  ],\n  \"description\": \"Steven Martine is an advertising and commercial photographer based in Stuart, Florida, specializing in lifestyle storytelling, portraiture, and emotionally driven imagery for hotels, resorts, healthcare systems, utilities, and global brands. With over 35 years of experience, his work blends editorial roots with high-production advertising to create authentic, narrative-driven images that evoke a sense of place and human connection.\",\n  \"url\": \"https://www.stevenmartine.com\",\n  \"image\": \"https://www.stevenmartine.com/path-to-hero-image.jpg\",\n  \"telephone\": \"\",\n  \"priceRange\": \"$$$$\",\n  \"founder\": {\n    \"@type\": \"Person\",\n    \"name\": \"Steven Martine\"\n  },\n  \"sameAs\": [\n    \"https://www.instagram.com/stevenmartine\",\n    \"https://www.linkedin.com/in/stevenmartine\"\n  ],\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"addressLocality\": \"Stuart\",\n    \"addressRegion\": \"FL\",\n    \"addressCountry\": \"US\"\n  },\n  \"areaServed\": [\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Florida\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Bahamas\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"East Coast United States\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Pacific Northwest\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Chicago, Illinois\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Texas\"\n    },\n    {\n      \"@type\": \"Place\",\n      \"name\": \"Worldwide\"\n    }\n  ],\n  \"knowsAbout\": [\n    \"Advertising photography\",\n    \"Commercial lifestyle photography\",\n    \"Editorial photography\",\n    \"Portrait photography\",\n    \"Visual storytelling\",\n    \"Narrative-driven imagery\",\n    \"Healthcare advertising photography\",\n    \"Hotel and resort photography\",\n    \"Brand campaigns\",\n    \"On-location photo production\"\n  ],\n  \"hasOccupation\": {\n    \"@type\": \"Occupation\",\n    \"name\": \"Advertising and Commercial Photographer\",\n    \"occupationLocation\": {\n      \"@type\": \"City\",\n      \"name\": \"Stuart, Florida\"\n    },\n    \"skills\": [\n      \"Storytelling through imagery\",\n      \"Lifestyle advertising photography\",\n      \"High-level portraiture\",\n      \"Creative problem solving on set\",\n      \"Large-scale production management\",\n      \"Editorial-style brand photography\"\n    ]\n  },\n  \"makesOffer\": {\n    \"@type\": \"Offer\",\n    \"itemOffered\": [\n      {\n        \"@type\": \"Service\",\n        \"name\": \"Advertising Lifestyle Photography\",\n        \"description\": \"Full-scale lifestyle photography productions for advertising campaigns, including multi-day, on-location shoots with professional crews, models, hair & makeup, and art direction.\"\n      },\n      {\n        \"@type\": \"Service\",\n        \"name\": \"Commercial Portrait Photography\",\n        \"description\": \"High-end portraiture for healthcare systems, business leaders, and organizations, focusing on authentic emotion and human connection.\"\n      },\n      {\n        \"@type\": \"Service\",\n        \"name\": \"Editorial Photography\",\n        \"description\": \"Editorial and magazine storytelling photography for regional, national, and international publications.\"\n      }\n    ]\n  },\n  \"client\": [\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"New York Mets\"\n    },\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"Walgreens\"\n    },\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"Cleveland Clinic\"\n    },\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"Associated Press\"\n    },\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"Scripps News\"\n    },\n    {\n      \"@type\": \"Organization\",\n      \"name\": \"US Sugar\"\n    }\n  ],\n  \"award\": \"Multiple press and photography awards over a 35+ year career\",\n  \"alumniOf\": [\n    {\n      \"@type\": \"CollegeOrUniversity\",\n      \"name\": \"Washington State University\"\n    },\n    {\n      \"@type\": \"CollegeOrUniversity\",\n      \"name\": \"University of Idaho\"\n    }\n  ],\n  \"teaches\": [\n    \"Photography\",\n    \"Visual storytelling\",\n    \"Business practices for creative professionals\"\n  ],\n  \"ethos\": \"Be a good human. Do good work. Be fair. Don't be an asshole.\",\n  \"slogan\": \"Stress-free lifestyle storytelling. Have fun. Make money.\"\n}\n</script>",
  "siteBody": "<script>\n(function () {\n\n  // ===== CONFIG =====\n  const SECTION_KEY = \"Slides\";\n  const SWITCH_MS = 1000;\n  const AUTO_ENTER_MS = 5000;\n  const ENTER_PATH = \"/OVERVIEW/thumbs\";\n\n  // Brand / colors\n  const ORANGE = \"#FBC145\";\n  const NAME = \"Steve Martine\";\n  const SUB = \"Photography\";\n\n  // UI-only fade overlay (does NOT edit image pixels)\n  const IMAGE_OPACITY = 0.55;\n\n  // Optional: lock to Steve’s CDN to prevent cross-client bleed\n  const EXPECTED_CDN = \"/pf-media\";\n  // ==================\n\n  // Must run inside DX site runtime\n  if (!window.DX_MODEL || !window.dx) {\n    console.warn(\"[Intro] Not in DX runtime yet. Put this in the site body/footer code (not a standalone intro file).\");\n    return;\n  }\n\n  const m = window.DX_MODEL;\n  const dxRef = window.dx;\n\n  // Build URLs from Slides section\n  const cdn = String(m?.settings?.cdnSslUri || \"\").replace(/\\/+$/, \"\");\n\n  if (EXPECTED_CDN && cdn !== EXPECTED_CDN) {\n    console.warn(\"[Intro] Wrong site context. Expected:\", EXPECTED_CDN, \"Got:\", cdn);\n    return;\n  }\n\n  const ids = m?.sections?.[SECTION_KEY]?.mediaItems || [];\n  const urls = ids\n    .map(id => m?.media?.[id]?.content)\n    .filter(Boolean)\n    .map(fn => cdn + \"/\" + String(fn).replace(/^\\/+/, \"\"));\n\n  if (!urls.length) {\n    console.warn(\"[Intro] No images found in DX_MODEL.sections.\" + SECTION_KEY + \".mediaItems\");\n    return;\n  }\n\n  // Prevent double-injection\n  if (document.getElementById(\"dxIntro\")) return;\n\n  // Inject font\n  const fontLink = document.createElement(\"link\");\n  fontLink.rel = \"stylesheet\";\n  fontLink.href = \"https://fonts.googleapis.com/css2?family=Montserrat:wght@700&display=swap\";\n  document.head.appendChild(fontLink);\n\n  // CSS: images untouched (no filters/blur/zoom/contrast). Adds cursor dot + removes bar.\n  const style = document.createElement(\"style\");\n  style.id = \"dxIntroStyle\";\n  style.textContent = `\n    #dxIntro{\n      position:fixed; inset:0;\n      background:#000;\n      z-index:99999;\n      overflow:hidden;\n      font-family: \"Montserrat\", system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n      font-weight:700;\n      letter-spacing:.1em;\n      cursor:none; /* we'll draw our own cursor dot */\n    }\n\n    /* Vignette layer ABOVE images (does not alter source image) */\n    #dxIntro::before{\n      content:\"\";\n      position:absolute; inset:0;\n      background:\n        radial-gradient(ellipse at center, rgba(0,0,0,0) 42%, rgba(0,0,0,.55) 100%),\n        linear-gradient(to bottom, rgba(0,0,0,.18), rgba(0,0,0,.34));\n      pointer-events:none;\n      z-index:3;\n    }\n\n    /* Subtle grain layer ABOVE images (pure overlay) */\n    #dxIntro::after{\n      content:\"\";\n      position:absolute; inset:-20%;\n      background:\n        repeating-linear-gradient(\n          0deg,\n          rgba(255,255,255,.015),\n          rgba(255,255,255,.015) 1px,\n          rgba(0,0,0,0) 2px,\n          rgba(0,0,0,0) 3px\n        );\n      opacity:.10;\n      pointer-events:none;\n      z-index:3;\n    }\n\n    #dxIntro .slides{\n      position:absolute; inset:0;\n      z-index:1;\n    }\n\n    /* Slides: only border + fade opacity. NO filters, NO transforms. */\n    #dxIntro .slides img{\n      position:absolute; inset:0;\n      width:100%; height:100%;\n      object-fit:cover;\n      box-sizing:border-box;\n      border:10px solid ${ORANGE};\n      opacity:0;\n      transition:opacity .65s ease;\n    }\n    #dxIntro .slides img.on{\n      opacity:${IMAGE_OPACITY};\n      z-index:1;\n    }\n\n    /* Brand block */\n    #dxIntro .brand{\n      position:absolute;\n      top:50%; left:50%;\n      transform:translate(-50%,-50%);\n      z-index:4;\n      text-align:center;\n      color:${ORANGE};\n      text-transform:uppercase;\n      line-height:1.05;\n\n      opacity:0;\n      animation: dxBrandIn .8s ease forwards;\n      animation-delay:.12s;\n      pointer-events:none;\n    }\n\n    #dxIntro .name{ font-size:64px; margin:0; }\n    #dxIntro .sub { font-size:26.5px; margin:10px 0 0 0; opacity:.95; }\n\n    @keyframes dxBrandIn{\n      from { opacity:0; transform:translate(-50%,-46%); }\n      to   { opacity:1; transform:translate(-50%,-50%); }\n    }\n\n    /* Enter button */\n    #dxIntro .enter{\n      position:absolute;\n      top:calc(50% + 122px); /* move down a touch to make room for timer above */\n      left:50%;\n      transform:translateX(-50%);\n      z-index:5;\n\n      padding:16px 28px;\n      font-size:22px;\n      font-family:inherit;\n      font-weight:700;\n      letter-spacing:.1em;\n      text-transform:uppercase;\n\n      color:${ORANGE};\n      background:rgba(0,0,0,.22);\n      border:2px solid ${ORANGE};\n      border-radius:0;\n      cursor:pointer;\n\n      backdrop-filter: blur(6px);\n      box-shadow: 0 14px 40px rgba(0,0,0,.35);\n      transition: transform .18s ease, box-shadow .18s ease, background .18s ease, color .18s ease;\n    }\n\n    #dxIntro .enter:hover{\n      background:${ORANGE};\n      color:#111;\n      box-shadow: 0 0 0 6px rgba(251,193,69,.12), 0 18px 50px rgba(0,0,0,.35);\n      transform: translateX(-50%) translateY(-1px);\n    }\n\n    #dxIntro .enter:active{\n      transform: translateX(-50%) translateY(1px);\n    }\n\n    /* Progress bar replaces the old divider bar */\n    #dxIntro .timer{\n      position:absolute;\n      left:50%;\n      top:calc(50% + 92px); /* sits between title and button */\n      transform:translateX(-50%);\n      width:min(360px, 72vw);\n      height:5px; /* thicker since it's replacing the divider */\n      background: rgba(251,193,69,.18);\n      z-index:4;\n      overflow:hidden;\n      pointer-events:none;\n    }\n\n    #dxIntro .timer span{\n      display:block;\n      height:100%;\n      width:0%;\n      background:${ORANGE};\n      animation: dxFill ${AUTO_ENTER_MS}ms linear forwards;\n    }\n\n    @keyframes dxFill{ to { width:100%; } }\n\n    /* Custom cursor dot */\n    #dxIntroCursor{\n      position:fixed;\n      width:14px;\n      height:14px;\n      border-radius:999px;\n      background:${ORANGE};\n      box-shadow: 0 0 0 6px rgba(251,193,69,.12), 0 10px 30px rgba(0,0,0,.35);\n      transform: translate(-50%, -50%);\n      z-index:100000;\n      pointer-events:none;\n      mix-blend-mode: normal;\n      opacity:.95;\n    }\n\n    /* Cursor “press” feedback */\n    #dxIntroCursor.isDown{\n      width:10px;\n      height:10px;\n      opacity:1;\n      box-shadow: 0 0 0 10px rgba(251,193,69,.10), 0 10px 30px rgba(0,0,0,.35);\n    }\n\n    /* On touch devices, show normal cursor behavior (and hide dot) */\n    @media (hover: none) and (pointer: coarse){\n      #dxIntro{ cursor:auto; }\n      #dxIntroCursor{ display:none; }\n    }\n\n    @media (max-width:800px){\n      #dxIntro .name{ font-size:44px; }\n      #dxIntro .sub { font-size:18px; }\n      #dxIntro .enter{ font-size:18px; }\n    }\n  `;\n  document.head.appendChild(style);\n\n  // Build overlay (bar removed, timer now takes that spot)\n  const wrap = document.createElement(\"div\");\n  wrap.id = \"dxIntro\";\n  wrap.innerHTML = `\n    <div class=\"slides\" aria-hidden=\"true\"></div>\n\n    <div class=\"brand\" aria-hidden=\"true\">\n      <p class=\"name\">${NAME}</p>\n      <p class=\"sub\">${SUB}</p>\n    </div>\n\n    <div class=\"timer\" aria-hidden=\"true\"><span></span></div>\n\n    <button class=\"enter\" type=\"button\">ENTER</button>\n  `;\n  document.body.appendChild(wrap);\n\n  // Cursor dot element\n  const cursor = document.createElement(\"div\");\n  cursor.id = \"dxIntroCursor\";\n  document.body.appendChild(cursor);\n\n  // Cursor tracking (smooth follow)\n  let mx = window.innerWidth / 2, my = window.innerHeight / 2;\n  let cx = mx, cy = my;\n  const FOLLOW = 0.22;\n\n  function raf(){\n    cx += (mx - cx) * FOLLOW;\n    cy += (my - cy) * FOLLOW;\n    cursor.style.left = cx + \"px\";\n    cursor.style.top  = cy + \"px\";\n    requestAnimationFrame(raf);\n  }\n  requestAnimationFrame(raf);\n\n  function onMove(e){\n    mx = e.clientX;\n    my = e.clientY;\n  }\n  function onDown(){ cursor.classList.add(\"isDown\"); }\n  function onUp(){ cursor.classList.remove(\"isDown\"); }\n\n  wrap.addEventListener(\"mousemove\", onMove);\n  wrap.addEventListener(\"mousedown\", onDown);\n  window.addEventListener(\"mouseup\", onUp);\n\n  // Preload + slideshow (random next; avoids same twice)\n  const slidesEl = wrap.querySelector(\".slides\");\n  const imgs = urls.map(u => {\n    const img = new Image();\n    img.src = u;\n    slidesEl.appendChild(img);\n    return img;\n  });\n\n  let last = -1;\n  function pickIdx(){\n    let idx = Math.floor(Math.random() * imgs.length);\n    if (imgs.length > 1) while (idx === last) idx = Math.floor(Math.random() * imgs.length);\n    last = idx;\n    return idx;\n  }\n\n  let cur = pickIdx();\n  imgs[cur].classList.add(\"on\");\n\n  const interval = setInterval(() => {\n    imgs[cur].classList.remove(\"on\");\n    cur = pickIdx();\n    imgs[cur].classList.add(\"on\");\n  }, SWITCH_MS);\n\n  // Enter behavior\n  let entered = false;\n\n  function cleanup(){\n    clearInterval(interval);\n    wrap.remove();\n    style.remove();\n    cursor.remove();\n    window.removeEventListener(\"mouseup\", onUp);\n  }\n\n  function enter(){\n    if (entered) return;\n    entered = true;\n\n    try { dxRef.site.events.dispatchEvent(\"introFadeOut\"); } catch(e){}\n\n    setTimeout(() => {\n      try { dxRef.address.setValue(ENTER_PATH); }\n      catch(e){ window.location.assign(ENTER_PATH); }\n      cleanup();\n    }, 600);\n  }\n\n  wrap.querySelector(\".enter\").addEventListener(\"click\", (e) => {\n    e.preventDefault();\n    enter();\n  });\n\n  setTimeout(enter, AUTO_ENTER_MS);\n\n})();\n</script>",
  "enableCookieBanner": false,
  "cookieBannerPosition": "bottom",
  "cookieBannerMessage": "By continuing to visit this site you agree to our use of cookies.",
  "localMasterVersion": "16.0",
  "dev": false,
  "filters": [
    "SEO IDEAS",
    "Slides",
    "contact",
    "logo"
  ],
  "betaProgramVisible": true,
  "useHTML": true,
  "allowAICrawlers": true,
  "adminLockout": false,
  "globalMasterVersion": "16.0",
  "searchLabels": true,
  "globalMediaSearch": true,
  "copyright": "©2026 Steven Martine Photography Inc.&nbsp;&nbsp;|&nbsp;&nbsp;<span>772.263.6814</span> &nbsp;&nbsp;|&nbsp;&nbsp;<span>steven@stevenmartine.com</span>&nbsp;&nbsp;<span>| Florida, Nashville & Chicago available globally</span>\n<img style=\"position: fixed; right: -132px; bottom: -18px; width: 80px;\" src=\"/pf-media/SMP_LogoMarkOnly_Web.png\" />",
  "betaProgramEnabled": false,
  "generalEmail": "steven@stevenmartine.com",
  "backgroundImages": [],
  "adminSortDefault": "dateAdded descending",
  "defaultEditorMode": "html",
  "logoHtml": "<center>Steven Martine<br>\n<small style=\"font-size: 26.5px; position: relative; top:-50px;\">Photography",
  "portfolioEmailMessage": "Check out this photograph:",
  "searchCaptions": true,
  "accountName": "stevenmartine",
  "inquiryInfo": "",
  "currentTemplate": 12,
  "revision": 0,
  "customFonts": [],
  "rsSslUri": "https://8226db1b59bb9f7ffaa7-500f337aa0b6853603c7915f49ca00df.ssl.cf1.rackcdn.com",
  "logoText": "Steven Martine<br>\nPhotography",
  "inquiryTitle": "",
  "globalBetaVersion": "16.1",
  "contactInfo": "Steven Martine\n\n772.263.6814",
  "socialLinks": [
    10664,
    10665,
    10666
  ],
  "podUseDesktop": false,
  "padUseDesktop": false
}