// Feature Toggles (1 = enabled, 0 = disabled)
// Automatically rename the text on the back button to show the panel name
// e.g., 'Back to Reviews' instead of the default 'Back'
const updateBackText = 1;
// Calculate header height for mobile menu top offset
const calcHeaderHeight = 1;
// Automatically open the current menu item's panel
const autoCurrentPosition = 1;
// Enable/disable the top bar and off-canvas menu
const enableTopBar = 0;
const enableOffCanvas = 0;
// Mobile and off-canvas breakpoints
const mq = window.matchMedia("(max-width: 1024px)");
const offCanvasBreakpoint = window.matchMedia("(max-width:10024px)");
// Off-canvas options
const offCanvasPushContent = 0; // Enable off-canvas content push (requires off-canvas to be enabled)
const fixedNavTrigger = 1; // Fix the toggle button when pushing content
// Dropdown behavior options
const openFirstDropDown = 0; // Open the first dropdown content on page load
const autoCloseDropdown = 1; // Automatically close the dropdown when it loses focus
// Sidebar and layout options
const overlaySidebar = 0; // Overlay the sidebar on a fullwidth page (requires off-canvas to be disabled)
const overlayTopBar = 0; // Overlay the top bar when using off-canvas
// RTL (Right-to-Left) layout support
const enableRTL = 0;
// Scrolling header reveal/hide effect
const enableHeadroom = 1;
/*
NOTES:
- Off-canvas or top bar must be enabled for headroom to work
- If you don't want off-canvas on desktop but want the headroom effect on mobile,
enable off-canvas and set the off-canvas breakpoint to match `mq` (e.g., 1024px)
*/
// Padding and offset options
const calcTopPadding = 1; // Adjust top padding of the first container when headroom is enabled
const offsetHashLinkScroll = 0; // Add offset when scrolling to hash links (useful for sticky headers)
// Offcanvas/Mobile menu behavior
const mobileMenuAboveHeader = 0; // Offcanvas/Mobile menu will overlap the top bar instead of displaying underneath
// COLLAPSE SIDEBAR OPTIONS
const enableCollapsibleSidebar = 0;
const collapseOnPageLoad = 0;
const saveCollapseState = 1; // Toggle whether to save the collapse state
const hoverToExpandSidebar = 1;
const collapseAutoWidth = 1;
const collapseWidth = 80; // manual width, when autowidth is off
const collapsecenterScrub = 0.85; // controls icons position on manual width
const offsetMultiplier = 3; //controls sidebar width on auto width
if (enableOffCanvas && offCanvasBreakpoint.matches) {
document.body.classList.add('dwc-offcanvas');
//console.log('offcanvas - 1')
}
if (enableTopBar && !enableOffCanvas) {
document.body.classList.add('dwc-topbar-enabled')
}
if (enableRTL) {
document.body.classList.add('dwc-rtl')
}
// we can remove !enableOffCanvas if on mobile only to have overlay on desktop + headroom on mobile.
if (overlaySidebar && !enableOffCanvas) {
document.body.classList.add('dwc-overlay-sidebar')
}
if (overlayTopBar && enableOffCanvas) {
document.body.classList.add('dwc-overlay-topbar')
}
if (mobileMenuAboveHeader == 1) {
document.body.classList.add('dwc-mobile-menu-over')
}
document.body.classList.add('show-nav')
//console.log('show nav')
//document.addEventListener('DOMContentLoaded', () => {
// COLLAPSE SIDEBAR startes
if (enableCollapsibleSidebar && !enableOffCanvas && !mq.matches) {
const collapseToggle = document.querySelector('.dwc-toggle-collapse');
const sidebarNav = document.querySelector('.dwc-sidebar__nav');
let removedByMouseEnter = false; // Track if class was removed by hover
document.body.classList.add('dwc-collapse-enabled');
if (collapseAutoWidth) {
document.body.classList.add('dwc-auto-width');
} else {
document.body.style.setProperty('--collapse-w', `${collapseWidth}px`);
document.body.style.setProperty('--center-scrub', `${collapsecenterScrub}`);
}
// Toggle collapse on button click
collapseToggle.addEventListener('click', function () {
document.body.classList.toggle('dwc-collapse-sidebar');
initCollapseContent(); goHome();
saveCollapseStatus(); // Save the updated state after toggling
});
// Hover functionality
if (hoverToExpandSidebar) {
sidebarNav.addEventListener('mouseenter', function () {
if (document.body.classList.contains('dwc-collapse-sidebar')) {
document.body.classList.remove('dwc-collapse-sidebar');
removedByMouseEnter = true; // Mark that we explicitly removed it
}
});
sidebarNav.addEventListener('mouseleave', function () {
if (removedByMouseEnter) {
document.body.classList.add('dwc-collapse-sidebar');
initCollapseContent(); goHome()
removedByMouseEnter = false; // Reset the flag after re-adding
}
});
}
// expand when links are focused
let removedByFocus = false;
let keepOpenOnEnter = false;
const focusableElements = sidebarNav.querySelectorAll('a, button, input, [tabindex]:not([tabindex="-1"])');
// Listen for 'keydown' on buttons within sidebarNav to detect Enter key presses
sidebarNav.addEventListener('keydown', function (event) {
if (event.key === 'Enter' && event.target.tagName === 'BUTTON') {
keepOpenOnEnter = true;
}
});
sidebarNav.addEventListener('focusin', function (event) {
if (document.body.classList.contains('dwc-collapse-sidebar')) {
document.body.classList.remove('dwc-collapse-sidebar');
removedByFocus = true; // Mark that we explicitly removed it
}
});
sidebarNav.addEventListener('focusout', function () {
setTimeout(function () {
const isFocusOutsideSidebar = [...focusableElements].every(el => !el.contains(document.activeElement));
if (isFocusOutsideSidebar && removedByFocus && !keepOpenOnEnter) {
document.body.classList.add('dwc-collapse-sidebar');
initCollapseContent();
goHome();
removedByFocus = false; // Reset the flag after re-adding
}
// Reset the Enter key flag after the check
keepOpenOnEnter = false;
}, 50);
});
// Run once on page load to apply the saved state
loadCollapseStatus();
//----- COLLAPSE ON PAGE LOAD
if (collapseOnPageLoad) {
document.body.classList.add('dwc-collapse-sidebar');
saveCollapseStatus(); // Save the updated state after toggling
}
// Call the function when needed
setCollapseOffset();
}
// COLLAPSE SIDEBAR FUNCTIONS
// // set offset variable
// function setCollapseOffset() {
// // Get the padding values of .dwc-nav__panel__inner
// const panelInner = document.querySelector('.dwc-nav__panel__inner');
// if (!panelInner) return; // Check if element exists
// const panelStyles = getComputedStyle(panelInner);
// const paddingLeft = parseFloat(panelStyles.paddingLeft);
// // Get the width of .dwc-nav__link__icon
// const iconElement = document.querySelector('.dwc-nav__link__icon');
// if (!iconElement) return; // Check if element exists
// const iconWidth = iconElement.offsetWidth;
// const iconWidthOffset = iconWidth / 2;
// // Sum the paddings and icon width
// const collapseOffset = (paddingLeft * offsetMultiplier) + iconWidth;
// // Set the CSS variables on the body
// document.body.style.setProperty('--collapse-offset', `${collapseOffset}px`);
// document.body.style.setProperty('--icon-width-offset', `${iconWidthOffset}px`);
// document.body.style.setProperty('--collapse-pad', `${paddingLeft}px`)
// }
// set offset variable
function setCollapseOffset() {
// Get the padding values of .dwc-nav__panel__inner
const panelInner = document.querySelector('.dwc-nav__panel__inner');
if (!panelInner) return; // Check if element exists
const panelStyles = getComputedStyle(panelInner);
const paddingLeft = parseFloat(panelStyles.paddingLeft);
// Get the width of .dwc-nav__link__icon
const iconElement = document.querySelector('.dwc-nav__link__icon');
if (!iconElement) return; // Check if element exists
// Use getBoundingClientRect() which works for both HTML and SVG elements
const iconRect = iconElement.getBoundingClientRect();
const iconWidth = iconRect.width;
const iconWidthOffset = iconWidth / 2;
// Sum the paddings and icon width
const collapseOffset = (paddingLeft * offsetMultiplier) + iconWidth;
// Set the CSS variables on the body
document.body.style.setProperty('--collapse-offset', `${collapseOffset}px`);
document.body.style.setProperty('--icon-width-offset', `${iconWidthOffset}px`);
document.body.style.setProperty('--collapse-pad', `${paddingLeft}px`);
}
//------ SAVE COLLAPASE STATE
function saveCollapseStatus() {
if (saveCollapseState === 1) {
const isCollapsed = document.body.classList.contains('dwc-collapse-sidebar');
// Save the current state to localStorage
localStorage.setItem('sidebarCollapsed', isCollapsed ? 'true' : 'false');
}
}
// RESTORE COLLAPSE STATE
function loadCollapseStatus() {
if (saveCollapseState === 1) {
const savedState = localStorage.getItem('sidebarCollapsed');
// If the state exists, apply the correct class to the body
if (savedState === 'true') {
document.body.classList.add('dwc-collapse-sidebar');
// initCollapseContent();
} else if (savedState === 'false') {
document.body.classList.remove('dwc-collapse-sidebar');
}
}
}
// FUNCTIONS END
// IF COLLAPSE SIDEBAR ENDS
// COLLAPSE SIDEBAR ENDS
// Select the element
const listItem = document.querySelector('.dwc-sidebar__nav__li');
if (listItem) {
// Get the computed height of the element
const listItemHeight = listItem.offsetHeight;
// Set the height as a CSS variable on the body
document.body.style.setProperty('--list-item-height', `${listItemHeight}px`);
}
const header = document.querySelector("header");
const sidebar = document.querySelector('.dwc-sidebar');
const navTrigger = document.querySelector(".dwc-nav-trigger");
const closeBtn = document.querySelector(".dwc-sidebar__nav-close-btn");
const mobileMenuOverlay = document.querySelector(".dwc-mobile-menu-overlay");
const body = document.body;
const nav = document.querySelector('.dwc-sidebar__nav');
const homePanel = document.querySelector('.dwc-sidebar__nav__panel--home');
const sidebarNavPanels = document.querySelectorAll(".dwc-sidebar__nav__panel");
const dropdownToggles = document.querySelectorAll('.dwc-sidebar__dropdown-toggle button');
const dropdownContents = document.querySelectorAll('.dwc-sidebar__dropdown-content');
const menuLinks = document.querySelectorAll('.dwc-sidebar__nav__li a');
const offCanvasMobileOnly = offCanvasBreakpoint.matches;
const savedState = localStorage.getItem('sidebarCollapsed');
const select = selector => document.querySelectorAll(selector);
const initInert = () => select('.dwc-sidebar__nav__panel').forEach(nPanel => {
if (!nPanel.classList.contains('dwc-sidebar__nav__panel--home')) {
nPanel.inert = true;
} else if (enableOffCanvas && offCanvasMobileOnly) {
nPanel.inert = true;
} else {
nPanel.inert = false;
}
});
//OPEN FIRST DROP DOWN
if (openFirstDropDown) {
setTimeout(function () {
dropdownToggles[0].click();
}, 600);
}
// Get DROPWDOWN LEVELS
if(dropdownContents){
dropdownContents.forEach(function (element) {
let level = 1;
let parent = element.parentElement.closest('.dwc-sidebar__dropdown-content');
// Calculate the level by checking the number of ancestors
while (parent) {
level++;
parent = parent.parentElement.closest('.dwc-sidebar__dropdown-content');
}
// Assign the appropriate level class to the dropdown content
element.classList.add(`level-${level}`);
// Find the previous sibling with the class .dwc-sidebar__dropdown-toggle
const previousToggle = element.previousElementSibling;
// Check if the previous sibling is a dropdown toggle and assign the level class
if (previousToggle && previousToggle.classList.contains('dwc-sidebar__dropdown-toggle')) {
previousToggle.classList.add(`level-${level}`);
}
});
}
// CURRENT MENU ITEM ****************
// Get the current page address without trailing slash
var currentPage = window.location.pathname.replace(/\/$/, '');
for (var i = 0; i < menuLinks.length; i++) {
var link = menuLinks[i];
// Extract the pathname from the link's href attribute without trailing slash
var linkPathname = link.href.replace(window.location.origin, '').replace(/\/$/, '');
// Check if the pathname matches the current page
if (linkPathname === currentPage) {
// Add the class 'dwc-current-menu-item' to the matching link
link.classList.add("dwc-current-menu-item");
// Break out of the loop since we found the matching link
break;
} else {
// Skip to the next iteration if the link doesn't match
continue;
}
}
setTimeout(function () {
if (enableCollapsibleSidebar && (collapseOnPageLoad || savedState === 'true')) { return }
const currentDropDownLink = document.querySelector('.dwc-current-menu-item.dwc-nav__link__text');
if (currentDropDownLink) {
const parent = currentDropDownLink.closest('.dwc-sidebar__dropdown-content');
if (parent) {
const toggle = parent.previousElementSibling.querySelector('button');
if (toggle) {
toggle.click();
}
}
setTimeout(function () {
currentDropDownLink.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
//console.log(currentDropDownLink);
}, 500);
}
}, 2000);
// CURRENT MENU ENDS **********
// CURRENT MENU CHECK - we'll be using this to determine if to reset panels on navTrigger click or not
var hasCurrentMenu = Array.from(document.querySelectorAll(".dwc-sidebar__nav__link.dwc-current-menu-item")).some(function (link) {
var parentPanel = link.closest(".dwc-sidebar__nav__panel");
return !parentPanel || !parentPanel.classList.contains("dwc-sidebar__nav__panel--home");
});
// CURRENT CHECK ENDS *********************
const goHome = () => select('.dwc-sidebar__nav__panel').forEach(nPanel => {
nPanel.classList.remove('dwc-slide-left');
if (!nPanel.classList.contains('dwc-sidebar__nav__panel--home')) {
nPanel.classList.add('dwc-slide-right');
nPanel.inert = true;
} else {
nPanel.inert = false;
if (header && !mq.matches) {
header.setAttribute('tabindex', 0);
header.focus()
}
}
select('.dwc-sidebar__nav__btn:not(.dwc-nav__back-btn)').forEach(sbtn => {
sbtn.setAttribute('aria-expanded', 'false');
})
mobileMenuIsClosed()
window.addEventListener("resize", mobileMenuIsClosed);
});
select('.dwc-nav__home-btn').forEach(hbtn => hbtn.addEventListener('click', goHome));
nav.addEventListener('keydown', event => {
if (nav.contains(event.target)) {
if (event.key === 'Escape') {
if (body.classList.contains('dwc-slide-nav-open')) {
if (navTrigger) {
navTrigger.click()
navTrigger.focus()
}
goHome();
} else {
goHome();
}
}
}
});
// for Bricks
const offCanvasBackdrop = document.querySelector('.brx-offcanvas-backdrop');
isBricks = body.classList.contains('bricks-is-frontend')
if (isBricks) {
if (offCanvasBackdrop) {
offCanvasBackdrop.addEventListener('click', event => {
if (body.classList.contains('dwc-slide-nav-open')) {
navTrigger.click()
goHome();
if (navTrigger) {
navTrigger.focus()
}
} else {
goHome();
}
});
}
}
// bricks end
select('.dwc-sidebar__nav__btn:not(.dwc-nav__back-btn)').forEach(sbtn => {
sbtn.setAttribute('aria-expanded', 'false');
sbtn.addEventListener('click', function (e) {
initCollapseContent();
dropdownToggles.forEach((togglebtn) => {
togglebtn.setAttribute('aria-expanded', 'false');
});
e.preventDefault();
e.stopPropagation();
const targetId = this.getAttribute('data-title');
const targetElement = document.querySelector(`.dwc-sidebar__nav__panel[data-title="${targetId}"]`);
const parentPanel = this.closest('.dwc-sidebar__nav__panel');
targetElement.classList.remove('dwc-slide-right');
targetElement.inert = false;
targetElement.setAttribute('tabindex', 0);
targetElement.focus();
ariaExpanded = !targetElement.classList.contains('dwc-slide-right');
sbtn.setAttribute('aria-expanded', ariaExpanded);
select('.dwc-nav__back-btn').forEach(bbtn => {
bbtn.addEventListener('click', function (e) {
ariaExpanded = !targetElement.classList.contains('dwc-slide-right');
sbtn.setAttribute('aria-expanded', ariaExpanded);
})
})
if (!parentPanel.classList.contains('dwc-slide-right')) {
parentPanel.classList.add('dwc-slide-left');
parentPanel.inert = true;
}
//handle back button data-title and back to feature
let bbtn = targetElement.querySelector('.dwc-nav__back-btn');
bbtnTitle = parentPanel.getAttribute('data-title');
bbtn.setAttribute('data-title', bbtnTitle);
bbtn.setAttribute('aria-label', 'Go back to ' + bbtnTitle + ' menu');
//console.log(bbtnTitle)
if (updateBackText) {
bbtn.querySelector('.dwc-nav__back__text').textContent = 'back to ' + bbtnTitle;
}
});
})
select('.dwc-nav__back-btn').forEach(bbtn => {
const btnTitle = bbtn.getAttribute('data-title');
bbtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const returnBtnAttr = this.getAttribute('data-title');
select('[data-title].dwc-sidebar__nav__panel').forEach(returnTarget => {
if (returnTarget.getAttribute('data-title') === returnBtnAttr) {
returnTarget.classList.remove('dwc-slide-left');
returnTarget.inert = false;
if (returnTarget.classList.contains('dwc-sidebar__nav__panel--home')) {
if (header) {
header.setAttribute('tabindex', 0);
header.focus()
}
} else {
returnTarget.setAttribute('tabindex', 0);
returnTarget.focus();
}
if (returnTarget.classList.contains('dwc-slide-right')) {
returnTarget.classList.remove('dwc-slide-right');
}
}
});
const parentPanel = this.closest('.dwc-sidebar__nav__panel');
parentPanel.classList.add('dwc-slide-right');
parentPanel.inert = true;
});
});
select('.dwc-sidebar__nav__panel').forEach(panel => {
const panelTitle = panel.getAttribute('data-title');
panel.setAttribute('aria-label', panelTitle + ' menu');
});
// mobile trigger
function mobileMenuIsClosed() {
const offCanvasMobileOnly = offCanvasBreakpoint.matches;
if (mq.matches || enableOffCanvas) {
const isNavOpen = body.classList.contains("dwc-slide-nav-open");
navTrigger.setAttribute("aria-expanded", isNavOpen);
// console.log(isNavOpen);
if (isNavOpen) {
if (!homePanel.classList.contains('dwc-slide-left')) {
homePanel.inert = false;
}
} else if (offCanvasMobileOnly && mq.matches) {
homePanel.inert = true; // Direct assignment for closed state
} else {
homePanel.inert = false;
}
} else {
homePanel.inert = false;
}
}
function setNoScroll() {
let noScrollTimeout;
let clickCount = 1;
let isNavOpen = body.classList.contains('dwc-slide-nav-open');
// Check if 'dwc-slide-nav-open' class is applied
if (isNavOpen) {
body.classList.add('dwc-no-scroll');
clickCount++;
} else {
clickCount = 0;
}
//console.log(clickCount)
// Toggle 'dwc-no-scroll' class on the body if clickCount is odd
if (clickCount == 0) {
// Set a timer to remove 'dwc-no-scroll' class after 0.8 seconds
noScrollTimeout = setTimeout(() => {
isNavOpen = body.classList.contains('dwc-slide-nav-open');
// console.log(isNavOpen)
if (!isNavOpen) {
body.classList.remove('dwc-no-scroll');
}
}, 900);
} else {
// If 'dwc-no-scroll' class is removed by clicking again, clear the timeout
clearTimeout(noScrollTimeout);
}
}
if (navTrigger) {
navTrigger.addEventListener("click", function () {
body.classList.toggle("dwc-slide-nav-open");
setNoScroll()
mobileMenuIsClosed()
if (!hasCurrentMenu && !autoCurrentPosition) {
initCollapseContent()
goHome();// watch out for this, could be problematic
}
dropdownToggles.forEach((togglebtn) => {
// togglebtn.setAttribute('aria-expanded', 'false');
});
});
}
if (mobileMenuOverlay) {
mobileMenuOverlay.addEventListener("click", function () {
body.classList.remove("dwc-slide-nav-open");
mobileMenuIsClosed()
setNoScroll()
if (!hasCurrentMenu && !autoCurrentPosition) {
initCollapseContent()
goHome()
}
});
}
if (closeBtn) {
closeBtn.addEventListener("click", function () {
body.classList.remove("dwc-slide-nav-open");
mobileMenuIsClosed()
setNoScroll()
navTrigger.focus();
if (!hasCurrentMenu && !autoCurrentPosition) {
initCollapseContent()
goHome()
}
});
}
//focus on mobile trigger when menu loses focus
mobileMenuOverlay.addEventListener('focusin', (event) => {
if (event.relatedTarget !== navTrigger) {
navTrigger.focus();
}
});
function updateSidebarPadding() {
if (!enableOffCanvas) {
// const headerHeight = header.clientHeight + 20;
setTimeout(() => {
const headerHeight = document.querySelector('.dwc-header-inner-wrap').clientHeight + 20;
// Your code to use headerHeight goes here
sidebarNavPanels.forEach(function (sidebarNavPanel) {
sidebarNavPanel.style.paddingTop = headerHeight + "px";
});
mobileMenuOverlay.style.marginTop = headerHeight - 20 + "px";
}, 50);
}
}
function resetPadding() {
setTimeout(() => {
sidebarNavPanels.forEach(function (sidebarNavPanel) {
sidebarNavPanel.style.paddingTop = null;
mobileMenuOverlay.style.marginTop = null;
});
}, 50);
}
function checkScreenSize() {
if (mq.matches) {
body.classList.add('dwc-mobile');
updateSidebarPadding();
//updateTopPadding()
} else {
body.classList.remove('dwc-mobile');
resetPadding();
// resetTopPadding()
}
}
// updateTopPadding()
if (calcHeaderHeight) {
checkScreenSize();
window.addEventListener("resize", function () {
resetTopPadding(); // Reset the top padding on resize
updateTopPadding()
checkScreenSize();
mobileMenuIsClosed();
});
}
initInert()
// ********* DROPDOWN TOGGLE FUNCNTIONALITY *******************
function eCollapseContent(el, btn) {
// Find the closest common ancestor, such as the <li> element
const btnParentLi = btn.closest('li');
dropdownContents.forEach((content) => {
// Find the closest <li> ancestor for the dropdown content
const contentParentLi = content.closest('li');
// Check if the content and the button are at the same level
const isSameLevel = btnParentLi && contentParentLi && btnParentLi.parentElement === contentParentLi.parentElement;
// Check if the content is an ancestor of the dropdown toggle being clicked
const isAncestor = btn && content.contains(btn);
// Collapse the dropdown if it's not an ancestor of the toggle and is on the same level
if (!isAncestor && isSameLevel) {
content.style.maxHeight = '0';
content.setAttribute('inert', 'true');
// Update the aria-expanded attribute of the corresponding toggle button
const correspondingToggle = content.previousElementSibling.querySelector('button');
if (correspondingToggle) {
correspondingToggle.setAttribute('aria-expanded', 'false');
}
}
});
}
function initCollapseContent(el, btn) {
dropdownContents.forEach((content) => {
content.style.maxHeight = '0';
content.setAttribute('inert', 'true');
});
dropdownToggles.forEach((toggle) => {
toggle.setAttribute('aria-expanded', 'false');
});
}
function collapseContent(el, btn) {
// Find the closest common ancestor, such as the <li> element
const btnParentLi = btn.closest('li');
dropdownContents.forEach((content) => {
// Find the closest <li> ancestor for the dropdown content
const contentParentLi = content.closest('li');
// Check if the content and the button are at the same level
const isSameLevel = btnParentLi && contentParentLi && btnParentLi.parentElement === contentParentLi.parentElement;
// Check if the content is an ancestor of the dropdown toggle being clicked
const isAncestor = btn && content.contains(btn);
// Collapse the dropdown if it's not an ancestor of the toggle and is on the same level
if (!isAncestor && isSameLevel) {
content.style.maxHeight = '0';
content.setAttribute('inert', 'true');
}
});
}
// Toggle the ARIA attributes for dropdown buttons
function toggleAriaExpanded(activeToggle) {
// If activeToggle is null, reset all buttons to 'false'
if (activeToggle === null) {
dropdownToggles.forEach((toggle) => {
toggle.setAttribute('aria-expanded', 'false');
});
return; // Exit the function early since there's nothing else to do
}
dropdownToggles.forEach((toggle) => {
if (toggle === activeToggle) {
// Toggle the aria-expanded attribute for the clicked button
const isOpen = toggle.getAttribute('aria-expanded') === 'true';
toggle.setAttribute('aria-expanded', isOpen ? 'false' : 'true');
} else {
// Check if the toggle's parent is a sibling to the activeToggle's parent
const toggleParent = toggle.closest('li');
const activeToggleParent = activeToggle.closest('li');
// console.log('toggle parent', toggleParent)
// console.log('active toggle parent', activeToggleParent)
if (toggleParent && activeToggleParent && toggleParent.parentElement === activeToggleParent.parentElement) {
// Set all other buttons' aria-expanded to false if their parent is a sibling to the activeToggle's parent
toggle.setAttribute('aria-expanded', 'false');
}
}
});
}
// Function to adjust the max-height of parent dropdowns when a nested dropdown is opened
function adjustDropdownHeight(dropdownContent) {
// Start with the nearest ancestor that is a dropdown content
let parent = dropdownContent.closest('.dwc-sidebar__dropdown-content');
while (parent) {
// Calculate the cumulative height of all open children
let totalHeight = Array.from(parent.children).reduce((total, child) => {
// Add the child scrollHeight to the total if it's open
total += child.scrollHeight;
return total;
}, 0);
// Move to the next ancestor that is a dropdown content
parent = parent.parentElement.closest('.dwc-sidebar__dropdown-content');
if (parent) {
parentHeight = parent.scrollHeight;
// Set the parent's max-height to the total calculated height
parent.style.maxHeight = `${totalHeight + parentHeight}px`;
// console.log('child: ', dropdownContent)
// console.log('parent: ', parent)
// console.log(`${totalHeight}px`)
parent.inert = false;
// console.log('parent new: ', parent)
const parentParent = parent.closest('li')
const toggle = parentParent.querySelector('.dwc-sidebar__dropdown-toggle button')
toggle.setAttribute('aria-expanded', 'true');
}
}
}
// Initialize dropdowns
function initializeDropdowns() {
if(dropdownToggles){
initCollapseContent();
dropdownToggles.forEach((toggle, index) => {
toggle.setAttribute('aria-expanded', 'false');
const dropdownContent = dropdownContents[index];
const parentDropdown = toggle.closest('.dwc-sidebar__dropdown');
const dropdownLink = parentDropdown.querySelector('.dwc-nav__link__text');
if(dropdownLink){
toggle.setAttribute('aria-label', `Toggle ${dropdownLink.textContent} dropdown`);
}
toggle.addEventListener('click', function () {
const isOpen = dropdownContent.style.maxHeight !== '0px';
collapseContent(dropdownContent, this);
if (!isOpen) {
dropdownContent.inert = false;
}
toggleAriaExpanded(this);
if (parentDropdown.contains(this)) {
dropdownContent.style.maxHeight = isOpen ? '0' : `${dropdownContent.scrollHeight}px`;
// Only adjust if opening the dropdown
if (!isOpen) {
adjustDropdownHeight(dropdownContent);
//console.log('other child', dropdownContent)
}
}
});
toggle.addEventListener('keydown', (event) => {
closeDropdownOnEscape(event, toggle);
});
});
}
}
// Close dropdowns on Escape key press
function closeDropdownOnEscape(event, el) {
if (event.key === 'Escape' && el.contains(event.target)) {
event.stopPropagation();
if (el.style.maxHeight !== '0px') {
const button = el.previousElementSibling.querySelector('button');
if (button) {
el.style.maxHeight = '0';
el.inert = true;
button.focus();
} else {
initCollapseContent();
el.focus();
}
toggleAriaExpanded(null); // Reset all buttons to 'false'
}
}
}
// Initialize dropdowns
initializeDropdowns();
dropdownContents.forEach((dropdownContent) => {
// Add event listeners for closing dropdowns on Escape key press
dropdownContent.addEventListener('keydown', (event) => {
closeDropdownOnEscape(event, dropdownContent);
});
// close dropdown on focus lost
if (autoCloseDropdown) {
const links = dropdownContent.querySelectorAll('a.dwc-nav__link__text');
links.forEach(link => {
const linkParent = link.closest('.dwc-sidebar__dropdown-content');
const dropDownButton = linkParent.previousElementSibling.querySelector('button')
link.addEventListener('blur', () => {
setTimeout(function () {
if ([...links].every(link => !document.activeElement.isSameNode(link))) {
eCollapseContent(dropdownContent, dropDownButton)
}
}, 50);
});
});
}
});
// AUTOMATIC MENU POSITION
function autoMenuPosition() {
if (enableCollapsibleSidebar && (collapseOnPageLoad || savedState === 'true')) { return }
// Select the current menu item
const currentMenuItem = document.querySelector('.dwc-current-menu-item');
// Select the parent panel of the current menu item
if (currentMenuItem) {
const parentPanel = currentMenuItem.closest('.dwc-sidebar__nav__panel');
const parentIsHome = parentPanel.classList.contains('dwc-sidebar__nav__panel--home')
// Check if the parent panel has the 'dwc-sidebar__nav__panel--home' class
if (!parentIsHome) {
// Select the back button in the current menu's parent panel
const backButton = parentPanel.querySelector('.dwc-nav__back-btn');
// Remove the class 'dwc-slide-right' from the current menu's parent panel
parentPanel.classList.remove('dwc-slide-right');
// Get the data-title attribute of the current menu's parent panel
// Loop through all panels with class .dwc-sidebar__nav__panel
const allPanels = document.querySelectorAll('.dwc-sidebar__nav__panel');
// Select all slide buttons .dwc-sidebar__nav__btn of each panel
const slideButtons = document.querySelectorAll('.dwc-sidebar__nav__btn:not(.dwc-nav__back-btn)');
slideButtons.forEach((slideButton) => {
allPanels.forEach((panel) => {
// Get the data-title attribute of the panel
const eachPanelTitle = panel.getAttribute('data-title');
// Get the back button in each of the panels
const panelBackButton = panel.querySelector('.dwc-nav__back-btn');
const slideTitle = slideButton.getAttribute('data-title')
if (slideTitle === eachPanelTitle) {
//get slide button parent
const slideParentPanel = slideButton.closest('.dwc-sidebar__nav__panel');
//get slide parent titlte attribute
const slideParentTitle = slideParentPanel.getAttribute('data-title')
// Set the back button data-title attribute to be equal to the data-title attribute of the slide parent panel
panelBackButton.setAttribute('data-title', slideParentTitle);
if(updateBackText){
panelBackButton.querySelector('.dwc-nav__back__text').textContent = 'back to ' + slideParentTitle
}
}
});
});
homePanel.classList.add('dwc-slide-left');
}
if (!parentIsHome) {
parentPanel.inert = false;
homePanel.inert = true;
}
repositionReturnTargets()
}
}
if (autoCurrentPosition) {
setTimeout(function () {
autoMenuPosition()
}, 1000);
}
//function to reposition the hidden slides after automatically moving to current menu item panel
// to put them in the right position to slide back to
function repositionReturnTargets() {
const panels = document.querySelectorAll('.dwc-sidebar__nav__panel:not(.dwc-sidebar__nav__panel--home)');
let activePanel;
// Find the first panel without 'dwc-slide-right' and 'dwc-slide-left' classes
for (const panel of panels) {
if (!panel.classList.contains('dwc-slide-right') && !panel.classList.contains('dwc-slide-left')) {
activePanel = panel;
break;
}
}
let returnTarget;
while (activePanel) {
// Get the data-title attribute of each panel
const panelTitles = Array.from(panels).map(panel => panel.getAttribute('data-title'));
// Select the active back button in the active panel
const activeBackButton = activePanel.querySelector('.dwc-nav__back-btn');
// Find the returnTarget panel
returnTarget = Array.from(panels).find(panel => panel.getAttribute('data-title') === activeBackButton.getAttribute('data-title'));
// Remove and add classes to the returnTarget
if (returnTarget) {
returnTarget.classList.remove('dwc-slide-right');
returnTarget.classList.add('dwc-slide-left');
}
// Update activePanel for the next iteration
activePanel = returnTarget;
}
}
// *********AUTOMATIC ENDS************
// **************OFFCANVAS *****************
document.addEventListener('DOMContentLoaded', () => {
if (offCanvasPushContent) {
// Create a new div element with the class "site-wrapper"
var siteWrapper = document.createElement('div');
siteWrapper.className = 'dwc-site-wrapper';
// Move everything within the body tag into the "site-wrapper" div
while (document.body.firstChild) {
siteWrapper.appendChild(document.body.firstChild);
}
// Add the "site-wrapper" div back to the body
document.body.appendChild(siteWrapper);
}
})
function offCanvasInit() {
if (enableOffCanvas && offCanvasBreakpoint.matches) {
document.body.classList.add('dwc-offcanvas');
// console.log('offcanvas - 2')
if (offCanvasPushContent) {
document.body.classList.add('dwc-push-content');
if (fixedNavTrigger && !mq.matches) {
document.body.classList.add('dwc-nav-trigger-is-fixed');
} else {
document.body.classList.remove('dwc-nav-trigger-is-fixed');
}
}
// Function to check if header element is focusable
function isFocusable(element) {
const focusableTags = ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'AREA'];
return (
focusableTags.includes(element.tagName) ||
element.hasAttribute('tabindex') ||
element.hasAttribute('contenteditable')
);
}
// Function to set inert attribute for focusable elements
function setInertForFocusableElements(inertValue) {
const allElements = document.querySelectorAll('.dwc-header-inner-wrap *');
const focusableElements = Array.from(allElements).filter(element => {
return isFocusable(element) && !element.classList.contains('dwc-nav-trigger');
});
focusableElements.forEach(element => {
if (element) {
element.inert = inertValue;
}
});
}
// Click event listener for the 'nav-trigger'
header.addEventListener('click', function () {
const isNavOpen = document.body.classList.contains('dwc-slide-nav-open');
// Check if the body contains the class 'dwc-slide-nav-open'
if (isNavOpen) {
// Condition is true, set inert=true
setInertForFocusableElements(isNavOpen);
} else {
// Condition is false, set inert=false
setInertForFocusableElements(isNavOpen);
}
});
} else {
document.body.classList.remove('dwc-push-content');
document.body.classList.remove('dwc-offcanvas');
}
}
offCanvasInit()
window.addEventListener("resize", offCanvasInit);
//close offcanvas when haslink is clicked
if (enableOffCanvas) {
const sidebarLinks = document.querySelectorAll('a.dwc-sidebar__nav__link');
// Filter links with hash in the href attribute
const hashLinks = Array.from(sidebarLinks).filter(link => link.getAttribute('href').includes('#'));
// Add click event listener to each hash link
hashLinks.forEach(link => {
link.addEventListener('click', function (event) {
// event.preventDefault(); // Prevent the default behavior of the link (e.g., navigating to the hash)
// Perform a click action on the navTrigger button
if (navTrigger) {
navTrigger.click();
}
});
});
}
// headroom:
// headroom:
function initializeHeadroom() {
if (enableHeadroom && (enableOffCanvas || enableTopBar)) {
if (offCanvasPushContent) return; // Early exit if offCanvasPushContent is true
document.body.classList.add('dwc-headroom');
const scrollUp = "scroll-up";
const scrollDown = "scroll-down";
let lastScroll = 0;
// Check for scroll action
window.addEventListener('scroll', () => {
// Hide and reveal header
const currentScroll = window.pageYOffset;
if (currentScroll <= 200) {
document.body.classList.remove(scrollUp);
return;
}
if (currentScroll > lastScroll && !document.body.classList.contains(scrollDown)) {
// Down
document.body.classList.remove(scrollUp);
document.body.classList.add(scrollDown);
} else if (currentScroll < lastScroll && document.body.classList.contains(scrollDown)) {
// Up
document.body.classList.remove(scrollDown);
document.body.classList.add(scrollUp);
}
lastScroll = currentScroll;
});
}
}
// Call the function to initialize headroom functionality
initializeHeadroom();
// End scroll action
//top Padding on first containers
function updateTopPadding() {
// Run the function if offCanvas is enabled or both topBar and headroom are enabled
if (!enableOffCanvas && !(enableTopBar && enableHeadroom)) {
return; // Exit early if neither condition is met
}
// Check if the media query strings for mq and offCanvasBreakpoint are the same
if (mq.media === offCanvasBreakpoint.media) {
// If the breakpoints are the same, run the function only if we're within the breakpoint
if (mq.matches) {
// Ensure the feature should run based on the configuration flags
if (calcTopPadding && (enableHeadroom || enableTopBar)) {
// Check if the sidebar exists
if (sidebar) {
const header = document.querySelector('.dwc-header-inner-wrap');
if (header) {
const offsetPadding = header.clientHeight;
// Update padding for each sidebar panel
sidebarNavPanels.forEach(function (sidebarNavPanel) {
sidebarNavPanel.style.paddingTop = offsetPadding + "px";
});
// Adjust the top padding for the first child of the main container
const mainFirstChild = document.querySelector('main')?.firstElementChild;
if (mainFirstChild) {
const initialPadding = parseInt(window.getComputedStyle(mainFirstChild).paddingBottom) || 0;
if(!offCanvasPushContent){
mainFirstChild.style.paddingTop = (offsetPadding + initialPadding) + 'px';
}
}
} else {
console.warn('.dwc-header-inner-wrap not found.');
}
} else {
console.warn('Sidebar not found.');
}
}
}
} else {
// If the breakpoints are different, run the function as originally intended
if (calcTopPadding && (enableHeadroom || enableTopBar)) {
// Check if the sidebar exists
if (sidebar) {
const header = document.querySelector('.dwc-header-inner-wrap');
if (header) {
const offsetPadding = header.clientHeight;
// Update padding for each sidebar panel
sidebarNavPanels.forEach(function (sidebarNavPanel) {
sidebarNavPanel.style.paddingTop = offsetPadding + "px";
});
// Adjust the top padding for the first child of the main container
const mainFirstChild = document.querySelector('main')?.firstElementChild;
if (mainFirstChild) {
const initialPadding = parseInt(window.getComputedStyle(mainFirstChild).paddingBottom) || 0;
if(!offCanvasPushContent){
mainFirstChild.style.paddingTop = (offsetPadding + initialPadding) + 'px';
}
}
} else {
console.warn('.dwc-header-inner-wrap not found.');
}
} else {
console.warn('Sidebar not found.');
}
}
}
}
function resetTopPadding() {
if (calcTopPadding && enableHeadroom) {
sidebarNavPanels.forEach(function (sidebarNavPanel) {
sidebarNavPanel.style.paddingTop = null;
});
const mainFirstChild = document.querySelector('main').firstElementChild;
if (mainFirstChild) {
mainFirstChild.style.paddingTop = null;
// Reset the paddingTop using the stored initialPadding
const initialPadding = parseInt(window.getComputedStyle(mainFirstChild).paddingBottom);
mainFirstChild.style.paddingTop = null;
}
}
}
//---top padding end
// Disable / Enable collapse on screen size change
let removedByMQ = false; // Track if the class was removed by the media query
function updateCollapseStatus() {
const currentlyCollapsed = document.body.classList.contains('dwc-collapse-sidebar'); // Check the current state
if (mq.matches) {
// If media query matches (max-width: 1024px), remove the class
if (currentlyCollapsed) {
document.body.classList.remove('dwc-collapse-sidebar');
removedByMQ = true; // Remember that MQ logic removed the class
saveCollapseStatus(); // Save the updated state after toggling
}
} else {
// If media query doesn't match, only add back if it was removed by this MQ logic
if (removedByMQ) {
document.body.classList.add('dwc-collapse-sidebar');
removedByMQ = false; // Reset the flag after re-adding
saveCollapseStatus(); // Save the updated state after toggling
}
}
}
//Document loaded end
//});
// --- ADD HEADER HEIGHT VARIABLE TO BODY ----
function debounce(func, delay) {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
// Your existing code for adding the 'hasHeaderHeight' class
function addHeaderHeightClass() {
if (!document.body) {
// Body doesn't exist, keep checking
setTimeout(addHeaderHeightClass, 0);
return;
}
let hasHeaderHeight = document.body.classList.contains('hasHeaderHeight');
let header = document.querySelector('header');
if (!hasHeaderHeight && header) {
// Header exists, add the 'hasHeaderHeight' class
document.body.classList.add('hasHeaderHeight');
// Get the initial header height
updateHeaderHeight();
} else if (!hasHeaderHeight && !header) {
// Header doesn't exist, keep checking
setTimeout(addHeaderHeightClass, 0);
}
}
// Function to update header height and set the CSS variable
function updateHeaderHeight() {
let sidebar = document.querySelector('.dwc-header-inner-wrap');
if (document.body) {
let headerHeight = sidebar.offsetHeight;
document.body.style.setProperty('--dwc-header-height', `${headerHeight}px`);
}
}
// Add the 'hasHeaderHeight' class and set initial header height
addHeaderHeightClass();
// Attach the debounced update function to the window resize event
function onResize() {
updateHeaderHeight();
updateCollapseStatus();
// Add more functions here
}
window.addEventListener('resize', debounce(onResize, 50));
document.addEventListener('DOMContentLoaded', () => {
updateHeaderHeight();
updateTopPadding()
})
// -------HEADER HEIGHT ENDS -------------
// Smooth scroll to hashlink with an offset
function smoothScroll(target, offset) {
const targetElement = document.querySelector(target);
if (targetElement) {
const targetPosition = targetElement.getBoundingClientRect().top -
document.body.getBoundingClientRect().top -
offset;
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});
}
}
// Listen for hash link clicks
if (offsetHashLinkScroll) {
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
var headerElement = document.querySelector('.dwc-header-inner-wrap');
var offset = headerElement.offsetHeight;
e.preventDefault();
event.stopPropagation();
const href = this.getAttribute('href');
smoothScroll(href, offset);
});
});
}
De School voor systemische opleidingen organiseert jaarlijks opnieuw een specialistische cursus Narratieve systeemtherapie.
Deze cursus is een verplicht onderdeel van de opleiding tot systeemtherapeut, maar kan ook worden gevolgd als bij- en nascholing door reeds erkende systeemtherapeuten. Tevens staat de cursus open voor gz-psychologen, psychotherapeuten, klinisch psychologen , psychiaters, pedagogen, basispsychologen, kind- en jeugdwerkers, ambulante gezinswerkers, en andere hulpverleners in het werkveld die zich willen verdiepen in de narratieve psychotherapie.
Algemeen
In deze cursus wordt de narratieve psychotherapie behandeld zoals die zich, vanuit het denken van Erickson en Bateson, via Anderson en Goolishen en White en Epston heeft ontwikkeld binnen de systeemtherapie.
Doelgroep
Deze cursus is interessant voor GZ-psychologen (i.o.), psychotherapeuten (i.o.), klinisch psychologen (i.o.), psychiaters (i.o.), artsen, pedagogen, basispsychologen. Met andere woorden; een relevante Master als vooropleiding. De doelgroep voor deze verdiepingscursus vormen systeemtherapeuten in opleiding die zelfstandig systeemtherapieën doen.
Duur van de cursus
7 dagen, van 9.30 tot 17.00
Achterliggende visie
Deze specialistische cursus bouwt voort op het gedachtegoed van Milton Erickson en Gregory Bateson, de voorvaderen van de narratieve psychotherapie die leefden en werkten aan het eind van de vorige eeuw. Erickson bracht in de wereld van de psychotherapie de verfijnde kunst van het invoegen, het helend taalgebruik, het vertellen van verhalen en het gebruik van metaforen en anekdotes. Hij zag symptomen als verhalen, die niet op een andere manier verteld konden worden. Voor hem was het onbewuste een bron van wijsheid, mogelijkheden en oplossingen. Al deze aspecten waren volstrekt nieuw in die tijd. Erickson legde de nadruk op de positieve rol van het onbewuste. Anders dan bij Freud was voor Erickson het onbewuste een onuitputtelijke bron van creatieve zelfheling. Uit het gedachtegoed van Erickson is de NLP voortgekomen, de oplossingsgerichte therapie en de narratieve psychotherapie. Bateson is de grondlegger van het systeemdenken binnen de sociale wetenschappen. Hij richtte de Palo Alto onderzoeksgroep op die communicatieprocessen ging bestuderen in de psychiatrie. Deze groep betrok voor het eerst gezinnen bij de behandeling en zij staat aan de wieg van de gezinstherapie. Bateson is bekend om zijn ecologisch denken, het denken over evenwichtsprocessen in grotere systemen en de wijsheid van het verbindend patroon in de ecologie, zijnde verwante (overeenkomstige) patronen in biologische en psychologische samenhangen. Bateson en Erickson zijn hun hele leven bevriend geweest en Bateson stuurde al zijn medewerkers naar Erickson om de kunst en de aesthetiek van psychotherapie te leren. Anderson en Goolishen beschreven familiesystemen als problem determined systems en later als linguistic systems waarmee zij een andere wijze van denken introduceerden in therapie en de rol van taal en de macht van het spreken hernieuwd accentueerden. Michel White en David Epston vervolgens brachten via Foucault de macht van het taalgebruik, het recht van spreken en het overheersende vertoog, de systeemtherapie binnen.
Opzet van de cursus
In deze cursus zal de narratieve psychotherapie zoals die zich heeft ontwikkeld binnen de systeemtherapie, worden behandeld aan de hand van de volgende onderwerpen:
- De historische situering van de narratieve psychotherapie/systeemtherapie in de overgang van het modernisme naar het postmodernisme.
- De verschillende stromingen binnen de narratieve psychotherapie/systeemtherapie zoals:
- De samenwerkende, collaboratieve benadering van bijvoorbeeld H. Anderson en B. Madsen
- De op taal en tekst gerichte benadering van Jan Olthof, die zich verbindt met de wereld van poëzie, literatuur, film, theater, kunst en sport
- De dialogische benadering van o.a. Seikkula, gericht op het creëren van een spreekgemeenschap.
Leren door theorie, oefening en reflectie
Werkvormen & leerervaring
De opleiding combineert theoretische verdieping met veel praktijkgerichte werkvormen. Je leert via colleges, filmfragmenten, groepsopdrachten en persoonlijke reflectie, zodat kennis, houding en vaardigheden elkaar versterken.
Theoretische inleidingen door docenten
Bestuderen van filmfragmenten en kunstafbeeldingen
Intensieve oefeningen met de hele groep rondom invoegen
Oefeningen in de methodiek van het werken met baboushka’s
Bekijken en bespreken van ingebrachte filmopnames
Literatuurbespreking
Oefeningen met de hele groep rondom het creëren van een therapeutische context
Oefeningen rondom enactment
Oefeningen in het maken van een behandelkader
Oefenen aan de hand van de filmfragmenten en kunstafbeeldingen
Wie je begeleidt
Docenten
Onze docenten zijn ervaren systeemtherapeuten en praktijkdocenten die theorie en praktijk naadloos verbinden. Zij zorgen voor een veilige, inspirerende leeromgeving en dagen je uit om te groeien – professioneel én persoonlijk.
Mariëlle Gelissen
Mededocent
Mariëlle Gelissen MSc. is psychologe en erkend als relatie-en gezinstherapeute door de Nederlandse Vereniging voor relatie-en gezinstherapie (NVRG). Mariëlle is werkzaam als vrijgevestigde en als systeemtherapeute verbonden aan de praktijk van Jan Olthof te Bunde (Zuid Limburg, Nederland). Zij is mede-oprichtster van de School voor Systemische opleidingen. Mariëlle leidt een aantal werkplaatsen en is mede-opleider en coördinator van de School.
Mariëlle Gelissen
Mededocent
Mariëlle Gelissen MSc. is psychologe en erkend als relatie-en gezinstherapeute door de Nederlandse Vereniging voor relatie-en gezinstherapie (NVRG). Mariëlle is werkzaam als vrijgevestigde en als systeemtherapeute verbonden aan de praktijk van Jan Olthof te Bunde (Zuid Limburg, Nederland). Zij is mede-oprichtster van de School voor Systemische opleidingen. Mariëlle leidt een aantal werkplaatsen en is mede-opleider en coördinator van de School.
Jan Olthof
HOOFDDOCENT
Hoofddocent van de opleiding is Drs. Jan Olthof. Jan Olthof is psychotherapeut, supervisor en leertherapeut bij de NVRG. Hij is oprichter van de School voor systemische opleidingen te Bunde en is als psychotherapeut zelfstandig gevestigd in psychotherapiepraktijk "Het verbindend patroon" te Bunde. Hij was gedurende ruim 30 jaar als consulent behandeling verbonden aan de afdeling Gezinspsychiatrie van GGZ-instelling Yulius in Barendrecht. Naast het boek De mens als verhaal (1994), dat hij samen met Eric Vermetten schreef, is Jan Olthof auteur van het Handboek Narratieve psychotherapie (2012), waarvan de Engelse vertaling recent is verschenen bij uitgeverij Karnac.
Jan Olthof
HOOFDDOCENT
Hoofddocent van de opleiding is Drs. Jan Olthof. Jan Olthof is psychotherapeut, supervisor en leertherapeut bij de NVRG. Hij is oprichter van de School voor systemische opleidingen te Bunde en is als psychotherapeut zelfstandig gevestigd in psychotherapiepraktijk "Het verbindend patroon" te Bunde. Hij was gedurende ruim 30 jaar als consulent behandeling verbonden aan de afdeling Gezinspsychiatrie van GGZ-instelling Yulius in Barendrecht. Naast het boek De mens als verhaal (1994), dat hij samen met Eric Vermetten schreef, is Jan Olthof auteur van het Handboek Narratieve psychotherapie (2012), waarvan de Engelse vertaling recent is verschenen bij uitgeverij Karnac.
Wat je kunt verwachten
Inhoud, leerdoelen en toetsing
Inhoud
In de cursus zal veel aandacht gegeven worden aan meerstemmigheid en meervoudigheid en het bestaan van meerdere-soms conflicterende- verhalen naast elkaar. Allereerst zullen de cursisten geholpen worden een verdere gevoeligheid te ontwikkelen voor taal,tekst en betekenis en voor metaforisch taalgebruik in het bijzonder. Vervolgens zal de kunst en de techniek van het invoegen binnen meerstemmigheid verder verfijnd worden. Filmfragmenten die kunnen helpen om de gevoeligheid voor meervoudige perspectieven verder te ontwikkelen, zullen worden aangeboden. Aan de hand van deze filmfragmenten zal intensief geoefend worden. De sociale context zal uitgebreid aan bod komen: gesitueerdheid van uitspraken, kennis en waarheid; historiciteit, klasse, gender en economische positie. Sensitiviteit voor de sociale context zal verder ontwikkeld worden ten einde de vaardigheden te leren om een therapeutische context te creëren -binnen een hiërarchie van betekenis zoals de cliënten die aangeven – waarin het probleemverhaal verruimd, genuanceerd en gedeconstrueerd kan worden. Het leren maken van een behandelkader is de volgende fase in de cursus. In een therapeutisch behandelkader is er plaats voor alle leden van de spreekgemeenschap, voor alle deelnemende stemmen en is er tot een samenwerking gekomen met alle betrokkenen van het therapeutisch systeem dat de cliënten samen met de therapeut vormen. Het gebruik van de zogenaamde narratieve ruimte, de derde ruimte die nodig is om nieuwe verhalen te laten ontstaan zal een belangrijk onderdeel zijn van de cursus. De zogenaamde narratieve cirkel omvat de verfijnde vaardigheden om in te voegen, weet de verschillende stemmen en perspectieven in de context te laten spreken en komt dan tot een door de dialoog en samenwerking overeengekomen behandelkader.
De leerweg in deze cursus zal ervaringsgericht zijn. Binnen een veilige en vrije ruimte zullen de deelnemers geholpen worden uitgebreid te experimenteren en te oefenen met verschillende werkvormen. Het begrip enactment van Minuchin is hierbij belangrijk: cursisten worden geholpen om situaties te ensceneren, in scene te zetten, tot actie te komen met de gezinnen ten einde een creatieve spanning te laten ontstaan die er voor zorgt dat er ook echt iets gebeurt in de sessie. Enscenering is de techniek of eigenlijk de manier van werken waarbij de therapeut de het gezin uitnodigt met hem of haar samen in actie te komen.
Leerdoelen
Aan het einde van de cursus zal de cursist:
- Gevoelig geworden zijn voor taal en tekst en metaforisch taalgebruik
- Vaardigheden ontwikkeld hebben om met meerstemmigheid en meervoudige perspectieven om te gaan
- In staat zijn om een therapeutische context te organiseren en een op samenwerking gerichte therapeutische relatie te ontwikkelen met het hele gezins-en familiesysteem
- Zich bewust zijn van de eigen gesitueerdheid als systeemtherapeut en de ervaringen van de cliënten te situeren in een maatschappelijk en historisch perspectief.
Iedere cursist zal een filmopname van een sessie laten zien waarin zijn of haar ontwikkelde vaardigheden rondom narratieve therapie zichtbaar worden gemaakt.
Toetsing
De cursisten zullen aan het einde van de opleiding een video-opname laten zien met een sessie uit hun werkveld waarin het geleerde zichtbaar wordt gemaakt. Tevens zal er een reflectieverslag worden gevraagd op het behandelproces en een verbatim van een essentieel deel van de sessie.
Een reflectieverslag van de ontwikkeling die de cursist heeft doorgemaakt tijdens de opleiding rondt de opleiding af.
Planning, prijs & inschrijving
Deelname aan de specialistische cursus Narratieve Psychotherapie-Systeemtherapie kost € 1800.
Vragen of inhoudelijke informatie over de opleiding? Liever direct contact? Bel dan naar Mariëlle Gelissen: +31 (0) 6 18 05 08 55
Dagindeling
09.30 – 17.00 uur — 6,25 opleidingsuren per dag
Pauzes
11.15 – 11.25 uur & 15.30 – 15.40 uur
Lunch
13.00 – 13.45 uur
Narratieve systeemtherapie
€ 1800
Gelieve het cursusgeld na inschrijving en bevestiging van deelname over te maken naar: IBAN NL93 ABNA 0438168062 t.n.v. School voor Systemische Opleidingen te Bunde.
NVRG
Erkenningen
Deze specialistische module ‘narratieve systeemtherapie’ is door de Nederlandse Vereniging voor Relatie- en Gezinstherapie (NVRG) erkend als onderdeel van de opleiding tot geregistreerd systeemtherapeut. Het draaiboek staat bij de NVRG geregistreerd onder nr. D25011. De erkenning is toegekend voor 5 jaar van 23-06-2025 tot 23-06-2030.
Nascholing opleiding narratieve psychotherapie (ID nummer: 565194) Deze opleiding is ook als nascholing geaccrediteerd door: Nederlandse Vereniging voor Relatie- en Gezinstherapie (NVRG) tot 08-12-2027.
Aanmelding
Praktische informatie
Aanmelden voor workshops en opleidingen kan door het invullen van jouw contactgegevens in het onderstaande formulier.
Voor inhoudelijke informatie over opleidingen of anderszins kun je contact opnemen met Mariëlle Gelissen (psycholoog / systeemtherapeut / opleider / supervisor en coördinator School voor Systemische Opleidingen) via de onderstaande mogelijkheden.
Email
Wilt u graag meer informatie? Stuur ons dan een e-mail naar:
Noodzakelijke cookies maken essentiële functies van de site mogelijk, zoals veilig login en het aanpassen van voorkeuren. Ze slaan geen persoonsgegevens op.
Geen
►
Functionele cookies ondersteunen functies zoals het delen van inhoud op sociale media, het verzamelen van feedback en het inschakelen van gereedschappen van derden.
Geen
►
Analytische cookies volgen interacties van bezoekers en geven inzicht in statistieken zoals het aantal bezoekers, bouncepercentage en verkeersbronnen.
Geen
►
Advertentiecookies leveren gepersonaliseerde advertenties op basis van je eerdere bezoeken en analyseren de effectiviteit van advertentiecampagnes.
Geen
►
Niet-geclassificeerde cookies zijn cookies die we aan het classificeren zijn, samen met de aanbieders van individuele cookies.