[]
Paula Pasanen hurahti Thaimaassa asuessaan tuftaukseen ja nyt hänellä on Hämeenlinnassa oma studio | Paikalliset | Hämeen Sanomat { if (!Hyphenopoly.hyphenators) { return } Hyphenopoly.hyphenators[”HTML”].then((hyphenator) => { for (const itemSelector in Hyphenopoly.setup.selectors) { const containerNode = document.querySelector(containerSelector) const itemNodeList = containerNode.querySelectorAll(itemSelector) itemNodeList.forEach((itemNode) => { hyphenator(itemNode, itemSelector) }) } }) } ]]>
Ketkä pääsivät valtuustoon? Tulospalvelu kertoo, miten Suomessa äänestettiin.
Omat tiedot’); var logoutForm = stringToHTML(’ ”Joka päivä herään ja olen innoissani, kun pääsen tuftaamaan”, Paula Pasanen kertoo. Hän järjestää kursseja Hämeenlinnassa tuftausstudiossaan, joka sijaitsee Wetterhoffin kolmannessa kerroksessa (Klikkaa kuvakarusellia). Riku Hasari
Pasasen koti, suku ja ystävät ovat saaneet osansa tuftausvimmasta. Koska Pasanen haluaa jakaa samaa flow-tilaa muillekin, syntyi Ateljee Piccolo. Se on Suomessa harvinaisuus.
Kati Laitinen
6.4.2025 5:00
Hämeenlinnassa Ateljee Piccolossa voi osallistua käsityökurssille ilman aikaisempaa alan harrastuneisuutta. Vaarana vain on, että hommaan voi jäädä pahasti koukkuun.
Haluatko lukea koko jutun?
Tilaa digi ja pääset lukemaan kaikki Hämeen Sanomien sisällöt.
Tilaa 6 kk 6,90 €/kk Tilaa 2 kk 18 €/kk
- Hameensanomat.fi-verkkopalvelun rajaton käyttöoikeus vuoden jokaisena päivänä
- Näköislehti
- SUSU digilehti
- Mobiilisovelluksen käyttöoikeus (iOS ja Android)
- Lukuoikeus sinulle ja kolmelle perheenjäsenellesi
Mainos: Kiertokapula Oy
Mainos: Kiertokapula Oy
14.4.2025 0:00
1) { document.querySelector(’html’).classList.add(’diks-user-agent–ios’); } ]]> this.handleMouseDown(e)); this.slider.addEventListener(’mouseleave’, () => this.handleMouseLeave()); this.slider.addEventListener(’mouseup’, () => this.handleMouseUp()); this.slider.addEventListener(’mousemove’, (e) => this.handleMouseMove(e)); this.slider.addEventListener(’click’, (e) => this.handleClick(e)); } handleMouseDown(e) { this.isDown = true; this.slider.classList.add(’diks-navigation–draggable-active’); this.startX = e.pageX – this.slider.offsetLeft; this.scrollLeft = this.slider.scrollLeft; this.preventClick = false; } handleMouseLeave() { this.isDown = false; this.slider.classList.remove(’diks-navigation–draggable-active’); } handleMouseUp() { this.isDown = false; this.slider.classList.remove(’diks-navigation–draggable-active’); } handleMouseMove(e) { if (!this.isDown) return; e.preventDefault(); const x = e.pageX – this.slider.offsetLeft; const walk = (x – this.startX) * 3; //scroll-fast this.slider.scrollLeft = this.scrollLeft – walk; this.preventClick = true; } handleClick(e) { if (this.preventClick) { e.preventDefault(); } } } // Set the draggable navs (multiple) to handle their scrollbars let scrollableNavs = document.querySelectorAll(’.diks-navigation–draggable’); // Make draggable navigation draggable if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { new HorizontalScrollDragger(element); }); } // Handle has-scrollbars class adding and removing function handleScrollableNavScrollbars(scrollableNavElement) { // Debugging: console.log(”Scroll width: ” + scrollableNavElement.scrollWidth + ” & client width: ” + scrollableNavElement.clientWidth); // If scrollable area is wider (scrollWidth) than what’s visible (clientWidth) the element has scrollbars if ( scrollableNavElement.scrollWidth > scrollableNavElement.clientWidth ) { scrollableNavElement.classList.add(’diks-navigation–draggable-has-scrollbars’); scrollableNavElement.parentElement.classList.add(’diks-navigation-wrapper–has-scrollbars’); } // Remove the has-scrollbars class if it exists but shouldn’t (element does not have scrollbars) else if ( scrollableNavElement.classList.contains(’diks-navigation–draggable-has-scrollbars’) ) { scrollableNavElement.classList.remove(’diks-navigation–draggable-has-scrollbars’); scrollableNavElement.parentElement.classList.remove(’diks-navigation-wrapper–has-scrollbars’); } } // If scrollable nav exists add (or remove) necessary classes // ”DOMContentLoaded” does not wait for styles to load and styles affect the size of the scrollable nav directly so we have to use ”load” instead window.addEventListener(’load’, (event) => { if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { handleScrollableNavScrollbars(element); }); } }); // Check if scrollable nav has scrollbar window.addEventListener(’resize’, function(event){ if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { handleScrollableNavScrollbars(element); }); } }); ]]> 0) { // Set referrerIsSameDomain to true if referrer is in the same domain as current location hostname and referrer is not the same page as current page (window.location.href) if ( document.referrer.includes(document.location.hostname) && document.referrer != window.location.href ) { referrerIsSameDomain = true; } } // Overwrite link with history.go, as it also remembers scroll position but only if referrer is the same domain as current location hostname if (history.length > 1 && referrerIsSameDomain == true) { // Set referrer as back button href to enable visual cue & opening to a new window item.setAttribute(’href’, document.referrer); // Set back button text item.querySelector(’.diks-header__cta-text’).innerHTML = ”Takaisin”; var stepsToGoBack = -1; item.addEventListener(’click’, function(e) { e.preventDefault(); history.go(stepsToGoBack); }); } }); ]]> 1 ? true : false); // Initialize lightGallery(gallery, { autoplay: galleryHasMultipleImages, counter: galleryHasMultipleImages, download: false, exThumbImage: thumbnailSource, hideControlOnEnd: true, licenseKey: ”96BAAD7E-3BF04397-BBB55AE3-6D5A2C0B”, loop: false, plugins: [lgAutoplay, lgFullscreen, lgThumbnail, lgZoom], selector: ’.diks-gallery__link’, mobileSettings: { controls: true, showCloseIcon: true }, strings: { closeGallery: ’Sulje galleria’, toggleMaximize: ’Maksimointi’, previousSlide: ’Edellinen’, nextSlide: ’Seuraava’, download: ’Lataa’, playVideo: ’Katso video’, mediaLoadingFailed: ’Sisällön lataus epäonnistui’, }, autoplayPluginStrings: { toggleAutoplay: ’Automaattinen toisto’ }, fullscreenPluginStrings: { toggleFullscreen: ’Kokoruututila’ }, thumbnailPluginStrings: { toggleThumbnails: ’Pikkukuvat’ }, zoomPluginStrings: { zoomIn: ’Suurenna’, zoomOut: ’Pienennä’, viewActualSize: ’Näytä täysikokoisena’ } }); // After closing LightGallery return focus to the image link that opened the gallery gallery.addEventListener(’lgAfterClose’, () => { galleryImageLinks[0].focus(); }); }); ]]> { checkAudioElements(); }; ]]> { // Stash the event so it can be triggered later deferredPrompt = e; const enablePrompt = 0; if(!enablePrompt) { e.preventDefault(); } // Update the UI to notify the user they can install PWA pwaShowInstallationOption(); // Handle installation document.querySelectorAll(’.js-diks-apps-pwa-installation-button’).forEach(function(button) { button.addEventListener(’click’, (e) => { // Show the prompt deferredPrompt.prompt(); // Wait for user to respond deferredPrompt.userChoice.then((choiceResult) => { if (choiceResult.outcome === ’accepted’) { console.log(’PWA: Installed (prompt)’); dataLayer.push({ ’event’: ’PWA.installation’, ’eventData’: ’success’ }); } else { console.log(’PWA: User dismissed installation prompt’); dataLayer.push({ ’event’: ’PWA.installation’, ’eventData’: ’canceled’ }); } deferredPrompt = null; }); }); }); }); // iOS installation process (show instructions modal) if (!navigator.standalone) { var userAgent = navigator.userAgent.toLowerCase(); var iPhoneUser = (/iphone/.test(userAgent)); var iPadUser = (/ipad/.test(userAgent) || (/macintosh/.test(userAgent) && navigator.maxTouchPoints > 1)); var safariUser = (/^(?!.*(brave|chrome|crios|duckduckgo|edgeios|firefox|fxios|opios|ucbrowser|yabrowser)).*safari.*$/.test(userAgent)); if (safariUser && (iPhoneUser || iPadUser)) { // Update the UI to notify the user they can install PWA pwaShowInstallationOption(); // Instructions var modals = document.querySelectorAll(’.js-diks-apps-pwa-ios-instructions’).forEach(function(element) { // Position on screen based on device if (iPhoneUser) { element.classList.add(’diks-apps__pwa-ios-modal–bottom’); } else if (iPadUser) { element.classList.add(’diks-apps__pwa-ios-modal–top’); } }); // Handle modal instructions from installation button document.querySelectorAll(’.js-diks-apps-pwa-installation-button’).forEach(function(button) { button.addEventListener(’click’, (e) => { // Show first modal document.querySelector(’.js-diks-apps-pwa-ios-instructions’).classList.toggle(’diks-apps__pwa-ios-modal–is-visible’); dataLayer.push({ ’event’: ’PWA.instructions.shown’, ’eventData’: ’iOS’ }); }); }); } } ]]>Lähde