{"id":25,"date":"2015-12-24T17:15:56","date_gmt":"2015-12-24T16:15:56","guid":{"rendered":"http:\/\/beta.grandcercle.org\/?page_id=25"},"modified":"2026-09-13T20:49:09","modified_gmt":"2026-09-13T18:49:09","slug":"clubs-assos","status":"publish","type":"page","link":"https:\/\/www.grandcercle.org\/en\/clubs-assos\/","title":{"rendered":"Clubs &amp; Associations"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"25\" class=\"elementor elementor-25\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0205159 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0205159\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b8ff4c4\" data-id=\"b8ff4c4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3a32486 elementor-widget elementor-widget-html\" data-id=\"3a32486\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"gc-section\">\n  <p>La vie associative \u00e0 Grenoble INP \u2013 UGA est particuli\u00e8rement d\u00e9velopp\u00e9e : une trentaine de clubs et associations, communs \u00e0 l'INP ou propres \u00e0 chaque \u00e9cole, port\u00e9s par des \u00e9tudiants engag\u00e9s.<\/p>\n  <p>Adh\u00e9rent, responsable ou simplement curieux : il y a sans doute une association faite pour toi.<\/p>\n<p style=\"text-align:center;\"><b>Envie de cr\u00e9er ton club ou besoin d'un accompagnement ? <a href=\"mailto:contact@grandcercle.org\">\u00c9cris nous<\/a>.<\/b><\/p>\n<\/section>\n\n<div class=\"gc-directory-toolbar\">\n  <input type=\"search\" id=\"gc-asso-search\" class=\"gc-search-input\" placeholder=\"Rechercher une association\u2026\" \/>\n<\/div>\n<div class=\"gc-directory-filters\" id=\"gc-school-filters\">\n  <button type=\"button\" id=\"gc-clear-filters\" class=\"gc-clear-btn\" style=\"display:none;\" aria-label=\"Effacer le filtre\">\u2715<\/button>\n<\/div>\n\n<div id=\"gc-asso-state\" class=\"gc-directory-state\">Chargement de l'annuaire\u2026<\/div>\n<div id=\"gc-asso-grid\" class=\"gc-card-grid\" style=\"display:none;\"><\/div>\n\n<div class=\"gc-sheet-backdrop\" id=\"gc-sheet-backdrop\"><\/div>\n<div class=\"gc-sheet\" id=\"gc-sheet\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"gc-sheet-topbar\">\n    <div class=\"gc-sheet-topbar-title\" id=\"gc-sheet-title\"><\/div>\n    <button class=\"gc-sheet-close\" id=\"gc-sheet-close\" aria-label=\"Fermer\">\u2715<\/button>\n  <\/div>\n  <div class=\"gc-sheet-body\" id=\"gc-sheet-body\"><\/div>\n<\/div>\n\n<script type=\"module\">\n  import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-app.js\";\n  import { getFirestore, collection, query, where, getDocs }\n    from \"https:\/\/www.gstatic.com\/firebasejs\/10.14.1\/firebase-firestore.js\";\n\n  const firebaseConfig = {\n    apiKey: \"AIzaSyBvrGB5uRgTZ2stBLsq_RAHbJ0f5Pdj2GQ\",\n    authDomain: \"gc-app-v1-pn9e05.firebaseapp.com\",\n    projectId: \"gc-app-v1-pn9e05\",\n    storageBucket: \"gc-app-v1-pn9e05.firebasestorage.app\",\n    messagingSenderId: \"591252529310\",\n    appId: \"1:591252529310:web:06f69c621f1c8d05ea5b8f\"\n  };\n  const app = initializeApp(firebaseConfig);\n  const db = getFirestore(app);\n\n  \/\/ GCDirectory : biblioth\u00e8que partag\u00e9e par les 3 annuaires (escapeHtml, normalize, slugify,\n  \/\/ buildSocialLinks, verrouillage du scroll, m\u00e9canique de fiche d\u00e9tail) \u2014 d\u00e9finie une seule fois dans\n  \/\/ le snippet global \"Header & footer\" (Phase 2). Si ce message appara\u00eet, recopie ce snippet en entier.\n  if (!window.GCDirectory) {\n    console.error('GC: window.GCDirectory absent \u2014 recopie le snippet global \"Header & footer\" (Phase 2), il a \u00e9t\u00e9 mis \u00e0 jour.');\n  }\n  const { escapeHtml, normalize, slugify, buildSocialLinks, initEntitySheetNav } = window.GCDirectory;\n  \/\/ Repli si le snippet \u00ab Header & footer \u00bb n'est pas encore \u00e0 jour : les deux se\n  \/\/ collent s\u00e9par\u00e9ment, il existe donc toujours une fen\u00eatre o\u00f9 la page est en\n  \/\/ avance sur le snippet. Sans ce repli, `gcChipStyle` vaut `undefined`, l'appel\n  \/\/ l\u00e8ve, et l'annuaire entier dispara\u00eet derri\u00e8re un message de panne r\u00e9seau.\n  const chipStyle = window.GCDirectory.gcChipStyle ||\n    function (bg) { return 'background:' + bg; };\n\n\n  const SUPER_ENTITY_ID = 'vZyMJ9EqdfUfrraVeB4n';\n  const INP_SCHOOL_ID = 'YywQ0UGJtawRIx03tenk';\n  \/\/ Nom du param\u00e8tre URL du filtre \u00e9cole \u2014 change-le ici si besoin, tout le reste s'adapte.\n  const SCHOOL_PARAM = 'ecole';\n\n  let allEntities = [];   \/\/ { id, data, slug }\n  let schoolsById = {};   \/\/ id -> { shortName, color }\n  let selectedSchoolIds = new Set();\n  let searchText = '';\n\n  function renderSheetContent(item) {\n    const data = item.data;\n    const images = data.imagesEntity || [];\n    const banner = images[0] || data.coverUrl || '';\n    const avatar = data.imageUrl || '';\n    const extraImages = images.slice(1);\n    const school = data.ecole && schoolsById[data.ecole.id];\n\n    document.getElementById('gc-sheet-title').textContent = data.name || '';\n\n    let bodyHtml = '';\n    if (banner) {\n      bodyHtml += '<img decoding=\"async\" class=\"gc-sheet-banner\" src=\"' + escapeHtml(banner) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(banner) + '\" \/>';\n    }\n\n    bodyHtml += '<div class=\"gc-sheet-pad\">';\n    bodyHtml +=\n      '<div class=\"gc-sheet-hero-row\">' +\n        (avatar ? '<img decoding=\"async\" class=\"gc-sheet-avatar\" src=\"' + escapeHtml(avatar) + '\" alt=\"\" data-lightbox-src=\"' + escapeHtml(avatar) + '\" \/>' : '<div class=\"gc-sheet-avatar\"><\/div>') +\n        '<div class=\"gc-sheet-hero-text\">' +\n          (data.description ? '<p>' + escapeHtml(data.description) + '<\/p>' : '') +\n          (school ? '<div class=\"gc-chip-row\"><span class=\"gc-chip\" style=\"' + chipStyle(school.color || '#57636C') + '\">' + escapeHtml(school.shortName) + '<\/span><\/div>' : '') +\n        '<\/div>' +\n      '<\/div>' +\n      buildSocialLinks(data);\n\n    if (extraImages.length > 0) {\n      bodyHtml += '<div class=\"gc-sheet-gallery\">' + extraImages.map(function (src) {\n        return '<img decoding=\"async\" src=\"' + escapeHtml(src) + '\" alt=\"\" loading=\"lazy\" data-lightbox-src=\"' + escapeHtml(src) + '\" \/>';\n      }).join('') + '<\/div>';\n    }\n\n    \/\/ htmlDetails est du HTML de confiance saisi par les gestionnaires d'entit\u00e9 dans l'appli \u2014 inject\u00e9 tel quel, non \u00e9chapp\u00e9, comme le fait l'appli elle-m\u00eame.\n    if (data.htmlDetails) {\n      bodyHtml += '<h4 style=\"margin-top:22px;font-family:\\'Roboto Condensed\\',sans-serif;color:var(--gc-primary);\">Pr\u00e9sentation<\/h4>' +\n        '<div class=\"gc-sheet-details\" id=\"gc-sheet-details\">' + data.htmlDetails + '<\/div>';\n    }\n\n    bodyHtml += '<a href=\"https:\/\/app.grandcercle.org\/entities\/' + escapeHtml(item.id) + '\" class=\"gc-btn gc-btn-primary gc-mobile-only gc-sheet-app-cta\" style=\"margin-top:16px;\">Voir dans l\u2019application<\/a>';\n    bodyHtml += '<\/div>';\n\n    document.getElementById('gc-sheet-body').innerHTML = bodyHtml;\n\n    const detailsEl = document.getElementById('gc-sheet-details');\n    if (detailsEl && window.gcMakeExpandable) window.gcMakeExpandable(detailsEl, '160px');\n  }\n\n  \/\/ C\u00e2ble toute la m\u00e9canique de fiche d\u00e9tail (ouverture\/fermeture, historique navigateur, lightbox,\n  \/\/ verrouillage du scroll) via GCDirectory \u2014 voir Phase 2 pour le d\u00e9tail de ce qui est mutualis\u00e9.\n  const { openEntity } = initEntitySheetNav({\n    basePath: '\/clubs-assos\/',\n    findItem: function (slug) { return allEntities.find(function (e) { return e.slug === slug; }); },\n    render: renderSheetContent\n  });\n\n  \/* ---------- Recherche + filtre \u00e9coles + tri Grand Cercle en premier ---------- *\/\n  function computeVisible() {\n    return allEntities\n      .filter(function (e) {\n        const q = normalize(searchText);\n        const nameMatch = q === '' ||\n          normalize(e.data.name).indexOf(q) !== -1 ||\n          normalize(e.data.shortName).indexOf(q) !== -1;\n        const schoolMatch = selectedSchoolIds.size === 0 || (e.data.ecole && selectedSchoolIds.has(e.data.ecole.id));\n        return nameMatch && schoolMatch;\n      })\n      .sort(function (a, b) {\n        if (a.id === SUPER_ENTITY_ID) return -1;\n        if (b.id === SUPER_ENTITY_ID) return 1;\n        return a.data.name.localeCompare(b.data.name, 'fr');\n      });\n  }\n\n  function renderGrid() {\n    const grid = document.getElementById('gc-asso-grid');\n    const state = document.getElementById('gc-asso-state');\n    const visible = computeVisible();\n    grid.innerHTML = '';\n    if (visible.length === 0) {\n      grid.style.display = 'none';\n      state.style.display = 'block';\n      state.textContent = 'Aucune association trouv\u00e9e.';\n      return;\n    }\n    state.style.display = 'none';\n    visible.forEach(function (item) {\n      const data = item.data;\n      const school = data.ecole && schoolsById[data.ecole.id];\n      const img = data.imageUrl || '';\n      const card = document.createElement('button');\n      card.type = 'button';\n      card.className = 'gc-card gc-dir-card';\n      card.innerHTML =\n        '<div class=\"gc-dir-card-row\">' +\n          (img ? '<img decoding=\"async\" class=\"gc-dir-avatar\" src=\"' + img + '\" alt=\"\" loading=\"lazy\" \/>' : '<div class=\"gc-dir-avatar\"><\/div>') +\n          '<div class=\"gc-dir-card-head\">' +\n            '<p class=\"gc-card-title\">' + escapeHtml(data.name) + '<\/p>' +\n            (school ? '<span class=\"gc-chip\" style=\"' + chipStyle(school.color || '#57636C') + '\">' + escapeHtml(school.shortName) + '<\/span>' : '') +\n          '<\/div>' +\n        '<\/div>' +\n        '<p class=\"gc-card-desc\">' + escapeHtml(data.description || '') + '<\/p>';\n      card.addEventListener('click', function () { openEntity(item, true); });\n      grid.appendChild(card);\n    });\n    grid.style.display = 'grid';\n  }\n\n  document.getElementById('gc-asso-search').addEventListener('input', function (e) {\n    searchText = e.target.value;\n    renderGrid();\n  });\n\n  \/\/ Met \u00e0 jour ?ecole=... dans l'URL sans recharger la page \u2014 refl\u00e8te l'\u00e9tat courant du filtre.\n  \/\/ Avec plusieurs \u00e9coles s\u00e9lectionn\u00e9es, seule la premi\u00e8re est refl\u00e9t\u00e9e dans l'URL (cas rare, le clic reste la source de v\u00e9rit\u00e9).\n  function syncSchoolParam() {\n    const params = new URLSearchParams(location.search);\n    if (selectedSchoolIds.size === 0) {\n      params.delete(SCHOOL_PARAM);\n    } else {\n      const firstId = selectedSchoolIds.values().next().value;\n      const shortName = firstId === INP_SCHOOL_ID ? 'INP' : (schoolsById[firstId] && schoolsById[firstId].shortName) || '';\n      if (shortName) params.set(SCHOOL_PARAM, shortName); else params.delete(SCHOOL_PARAM);\n    }\n    const newUrl = location.pathname + (params.toString() ? '?' + params.toString() : '') + location.hash;\n    history.replaceState(history.state, '', newUrl);\n  }\n\n  function renderSchoolFilters(schoolsList) {\n    const wrap = document.getElementById('gc-school-filters');\n    const clearBtn = document.getElementById('gc-clear-filters');\n    const chipButtons = [];\n\n    function updateClearBtnVisibility() {\n      clearBtn.style.display = selectedSchoolIds.size > 0 ? 'flex' : 'none';\n    }\n    clearBtn.addEventListener('click', function () {\n      selectedSchoolIds.clear();\n      chipButtons.forEach(function (b) { b.classList.remove('active'); });\n      updateClearBtnVisibility();\n      syncSchoolParam();\n      renderGrid();\n    });\n\n    const inp = schoolsList.find(function (s) { return s.id === INP_SCHOOL_ID; });\n    const others = schoolsList\n      .filter(function (s) { return s.id !== INP_SCHOOL_ID; })\n      .sort(function (a, b) { return a.shortName.localeCompare(b.shortName, 'fr'); });\n    const orderedSchools = inp ? [inp].concat(others) : others;\n\n    \/\/ Pr\u00e9s\u00e9lection depuis l'URL (?ecole=INP ou ?ecole=Ense3, etc.) \u2014 \"INP\" matche sur l'ID wildcard, le reste sur shortName (insensible \u00e0 la casse\/accents).\n    const initialParam = new URLSearchParams(location.search).get(SCHOOL_PARAM);\n    if (initialParam) {\n      const normalizedParam = normalize(initialParam);\n      const match = orderedSchools.find(function (s) {\n        return (normalizedParam === 'inp' && s.id === INP_SCHOOL_ID) || normalize(s.shortName) === normalizedParam;\n      });\n      if (match) selectedSchoolIds.add(match.id);\n    }\n\n    orderedSchools.forEach(function (s) {\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.textContent = s.shortName;\n      if (selectedSchoolIds.has(s.id)) btn.classList.add('active');\n      btn.addEventListener('click', function () {\n        if (selectedSchoolIds.has(s.id)) { selectedSchoolIds.delete(s.id); btn.classList.remove('active'); }\n        else { selectedSchoolIds.add(s.id); btn.classList.add('active'); }\n        updateClearBtnVisibility();\n        syncSchoolParam();\n        renderGrid();\n      });\n      chipButtons.push(btn);\n      wrap.appendChild(btn);\n    });\n    updateClearBtnVisibility();\n    \/\/ Pas besoin de renderGrid() ici : le chargement des Entities (juste en dessous) l'appelle\n    \/\/ syst\u00e9matiquement une fois pr\u00eat, et lira selectedSchoolIds d\u00e9j\u00e0 pr\u00e9selectionn\u00e9 ci-dessus.\n  }\n\n  \/* ---------- Chargement des donn\u00e9es ---------- *\/\n  getDocs(collection(db, 'Schools')).then(function (snap) {\n    const schoolsList = [];\n    snap.forEach(function (docSnap) {\n      const data = docSnap.data();\n      schoolsById[docSnap.id] = { shortName: data.shortName, color: data.color };\n      if (data.selectable || docSnap.id === INP_SCHOOL_ID) {\n        schoolsList.push({ id: docSnap.id, shortName: data.shortName });\n      }\n    });\n    renderSchoolFilters(schoolsList);\n  }).catch(function (err) { console.error('GC \u00e9coles:', err); });\n\n  \/\/ \ud83d\udd34 `categories` (array-contains), PAS `type`. Ce dernier est un champ LEGACY,\n  \/\/ d\u00e9riv\u00e9 de `categories[0]` par double \u00e9criture : le jour o\u00f9 elle s'arr\u00eate, un\n  \/\/ annuaire qui l'interroge se vide en silence. Une entit\u00e9 peut d'ailleurs porter\n  \/\/ PLUSIEURS cat\u00e9gories (La Cafet' est association ET partenaire) \u2014 `type` n'en\n  \/\/ retenait qu'une, elle appara\u00eet maintenant dans les deux annuaires.\n  \/\/ Index (active ASC, categories CONTAINS) d\u00e9j\u00e0 d\u00e9clar\u00e9 dans firestore.indexes.json.\n  const q = query(collection(db, 'Entities'), where('active', '==', true), where('categories', 'array-contains', 'association'));\n\n  getDocs(q).then(function (snap) {\n    document.getElementById('gc-asso-state').style.display = 'none';\n    if (snap.empty) {\n      document.getElementById('gc-asso-state').style.display = 'block';\n      document.getElementById('gc-asso-state').textContent = 'Aucune association trouv\u00e9e.';\n      return;\n    }\n    snap.forEach(function (docSnap) {\n      const data = docSnap.data();\n      allEntities.push({ id: docSnap.id, data: data, slug: slugify(data.shortName || data.name) });\n    });\n\n    \/\/ \ud83d\udd34 Le rendu a son propre filet. Sans lui, une erreur d'AFFICHAGE remonte\n    \/\/ dans le .catch() de la requ\u00eate, qui annonce \u00ab impossible de charger \u00bb\n    \/\/ alors que les documents sont bien arriv\u00e9s \u2014 et l'on cherche la panne du\n    \/\/ c\u00f4t\u00e9 du r\u00e9seau ou des r\u00e8gles pendant qu'elle est dans le code. C'est ce\n    \/\/ qui s'est produit le 13\/09 : `gcChipStyle` manquait (snippet pas encore\n    \/\/ recoll\u00e9), et les deux annuaires annon\u00e7aient une panne r\u00e9seau.\n    try {\n      renderGrid();\n      const initialSlug = new URLSearchParams(location.search).get('entity');\n      const initialItem = initialSlug && allEntities.find(function (e) { return e.slug === initialSlug; });\n      if (initialItem) openEntity(initialItem, false);\n    } catch (err) {\n      const state = document.getElementById('gc-asso-state');\n      state.style.display = 'block';\n      state.textContent = 'L\u2019annuaire s\u2019est charg\u00e9 mais n\u2019a pas pu s\u2019afficher. Rechargez la page.';\n      console.error('GC annuaire clubs (RENDU, pas chargement) :', err);\n    }\n  }).catch(function (err) {\n    const state = document.getElementById('gc-asso-state');\n    state.style.display = 'block';\n    state.textContent = 'Impossible de charger l\u2019annuaire pour le moment.';\n    console.error('GC annuaire clubs (chargement) :', err);\n  });\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Dozens of clubs and associations at Grenoble INP \u2013 UGA: sport, culture, engagement.<br \/>\nFind the one that suits you.<\/p>","protected":false},"author":100,"featured_media":5691,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-25","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Clubs et associations \u00e9tudiantes \u2014 Grenoble INP \u2013 UGA<\/title>\n<meta name=\"description\" content=\"Retrouvez l&#039;annuaire complet des clubs et associations \u00e9tudiantes de Grenoble INP \u2013 UGA, class\u00e9s par \u00e9cole et par th\u00e9matique.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.grandcercle.org\/en\/clubs-assos\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clubs et associations \u00e9tudiantes \u2014 Grenoble INP \u2013 UGA\" \/>\n<meta property=\"og:description\" content=\"Retrouvez l&#039;annuaire complet des clubs et associations \u00e9tudiantes de Grenoble INP \u2013 UGA, class\u00e9s par \u00e9cole et par th\u00e9matique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.grandcercle.org\/en\/clubs-assos\/\" \/>\n<meta property=\"og:site_name\" content=\"Grand Cercle\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/grandcercle\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-13T18:49:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/03\/photo-MINP-street-view-2019.png\" \/>\n\t<meta property=\"og:image:width\" content=\"897\" \/>\n\t<meta property=\"og:image:height\" content=\"712\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/\",\"name\":\"Clubs et associations \u00e9tudiantes \u2014 Grenoble INP \u2013 UGA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/photo-MINP-street-view-2019.png\",\"datePublished\":\"2015-12-24T16:15:56+00:00\",\"dateModified\":\"2026-09-13T18:49:09+00:00\",\"description\":\"Retrouvez l'annuaire complet des clubs et associations \u00e9tudiantes de Grenoble INP \u2013 UGA, class\u00e9s par \u00e9cole et par th\u00e9matique.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/photo-MINP-street-view-2019.png\",\"contentUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/photo-MINP-street-view-2019.png\",\"width\":897,\"height\":712},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/clubs-assos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.grandcercle.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Clubs &#038; Associations\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#website\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/\",\"name\":\"Grand Cercle\",\"description\":\"Cercle des \u00e9l\u00e8ves de Grenoble INP - UGA\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.grandcercle.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#organization\",\"name\":\"Grand Cercle\",\"alternateName\":\"GC\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/cropped-Logo-GC-centree.png\",\"contentUrl\":\"https:\\\/\\\/www.grandcercle.org\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/cropped-Logo-GC-centree.png\",\"width\":512,\"height\":512,\"caption\":\"Grand Cercle\"},\"image\":{\"@id\":\"https:\\\/\\\/www.grandcercle.org\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/grandcercle\",\"https:\\\/\\\/www.instagram.com\\\/grand_cercle\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/grand-cercle-grenoble-inp\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/LeGrandCercle\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Student clubs and associations \u2014 Grenoble INP \u2013 UGA","description":"Find the complete directory of student clubs and associations at Grenoble INP \u2013 UGA, classified by school and by theme.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.grandcercle.org\/en\/clubs-assos\/","og_locale":"en_GB","og_type":"article","og_title":"Clubs et associations \u00e9tudiantes \u2014 Grenoble INP \u2013 UGA","og_description":"Retrouvez l'annuaire complet des clubs et associations \u00e9tudiantes de Grenoble INP \u2013 UGA, class\u00e9s par \u00e9cole et par th\u00e9matique.","og_url":"https:\/\/www.grandcercle.org\/en\/clubs-assos\/","og_site_name":"Grand Cercle","article_publisher":"https:\/\/www.facebook.com\/grandcercle","article_modified_time":"2026-09-13T18:49:09+00:00","og_image":[{"width":897,"height":712,"url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/03\/photo-MINP-street-view-2019.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.grandcercle.org\/clubs-assos\/","url":"https:\/\/www.grandcercle.org\/clubs-assos\/","name":"Student clubs and associations \u2014 Grenoble INP \u2013 UGA","isPartOf":{"@id":"https:\/\/www.grandcercle.org\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.grandcercle.org\/clubs-assos\/#primaryimage"},"image":{"@id":"https:\/\/www.grandcercle.org\/clubs-assos\/#primaryimage"},"thumbnailUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/03\/photo-MINP-street-view-2019.png","datePublished":"2015-12-24T16:15:56+00:00","dateModified":"2026-09-13T18:49:09+00:00","description":"Find the complete directory of student clubs and associations at Grenoble INP \u2013 UGA, classified by school and by theme.","breadcrumb":{"@id":"https:\/\/www.grandcercle.org\/clubs-assos\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.grandcercle.org\/clubs-assos\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.grandcercle.org\/clubs-assos\/#primaryimage","url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/03\/photo-MINP-street-view-2019.png","contentUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/03\/photo-MINP-street-view-2019.png","width":897,"height":712},{"@type":"BreadcrumbList","@id":"https:\/\/www.grandcercle.org\/clubs-assos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.grandcercle.org\/"},{"@type":"ListItem","position":2,"name":"Clubs &#038; Associations"}]},{"@type":"WebSite","@id":"https:\/\/www.grandcercle.org\/#website","url":"https:\/\/www.grandcercle.org\/","name":"Grand Circle","description":"Grenoble INP \u2013 UGA Student Union","publisher":{"@id":"https:\/\/www.grandcercle.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.grandcercle.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/www.grandcercle.org\/#organization","name":"Grand Circle","alternateName":"GC","url":"https:\/\/www.grandcercle.org\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.grandcercle.org\/#\/schema\/logo\/image\/","url":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/10\/cropped-Logo-GC-centree.png","contentUrl":"https:\/\/www.grandcercle.org\/wp-content\/uploads\/2024\/10\/cropped-Logo-GC-centree.png","width":512,"height":512,"caption":"Grand Cercle"},"image":{"@id":"https:\/\/www.grandcercle.org\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/grandcercle","https:\/\/www.instagram.com\/grand_cercle\/","https:\/\/www.linkedin.com\/company\/grand-cercle-grenoble-inp\/","https:\/\/www.youtube.com\/user\/LeGrandCercle"]}]}},"_links":{"self":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/25","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/comments?post=25"}],"version-history":[{"count":72,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/25\/revisions"}],"predecessor-version":[{"id":8704,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/pages\/25\/revisions\/8704"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/media\/5691"}],"wp:attachment":[{"href":"https:\/\/www.grandcercle.org\/en\/wp-json\/wp\/v2\/media?parent=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}