{"id":29,"date":"2026-06-28T07:59:34","date_gmt":"2026-06-28T07:59:34","guid":{"rendered":"https:\/\/uniqartkids.com\/?page_id=29"},"modified":"2026-08-11T13:17:46","modified_gmt":"2026-08-11T13:17:46","slug":"gallery","status":"publish","type":"page","link":"https:\/\/uniqartkids.com\/it\/gallery\/","title":{"rendered":"Gallery"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"29\" class=\"elementor elementor-29\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-befcff9 e-con e-atomic-element e-flexbox-base e-bf3dae1 \" data-id=\"befcff9\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"befcff9\" data-e-type=\"e-flexbox\" data-id=\"befcff9\">\n    \t\t<div class=\"elementor-element elementor-element-81b495d elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"81b495d\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Made by you<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72fd871 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"72fd871\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Your idea. Made unique.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9bafa7a elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"9bafa7a\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tPersonalized \u00b7 Handcrafted \u00b7 One of a kind\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78978d4 elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"78978d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Made from your ideas<br \/>Necklaces, bracelets, earrings, rings, brooches, keychains and more \u2014 each piece begins with something personal to you.<br \/>Here are just a few of the pieces we\u2019ve created.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-4e98c6e e-con e-atomic-element e-flexbox-base e-f0371d7 \" data-id=\"4e98c6e\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"4e98c6e\" data-e-type=\"e-flexbox\" data-id=\"4e98c6e\">\n    \t\t<div class=\"elementor-element elementor-element-6e138fe elementor-widget elementor-widget-circular_gallery\" data-id=\"6e138fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"circular_gallery.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t            <style>\n                .circular-gallery-container {\n                    width: 100%;\n                    position: relative;\n                    overflow: hidden;\n                    cursor: grab;\n                    touch-action: pan-y;\n                }\n                .circular-gallery-container:active { cursor: grabbing; }\n                .circular-gallery-container canvas {\n                    display: block;\n                    filter: drop-shadow(0px 8px 16px rgba(0, 0, 0, 0.05));\n                }\n                \n                \/* \u706f\u7bb1\u6837\u5f0f *\/\n                .circular-gallery-lightbox {\n                    position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;\n                    background: rgba(0, 0, 0, 0.85); z-index: 9999999;\n                    display: flex; justify-content: center; align-items: center;\n                    opacity: 0; pointer-events: none; transition: opacity 0.3s ease;\n                }\n                .circular-gallery-lightbox.active {\n                    opacity: 1; pointer-events: auto; cursor: zoom-out;\n                }\n                .circular-gallery-lightbox img {\n                    max-width: 90%; max-height: 90%; border-radius: 12px;\n                    box-shadow: 0 20px 40px rgba(0,0,0,0.5);\n                    transform: scale(0.9); transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n                    object-fit: contain;\n                }\n                .circular-gallery-lightbox.active img {\n                    transform: scale(1);\n                }\n                .circular-gallery-lightbox-close {\n                    position: absolute; top: 20px; right: 40px; color: white;\n                    font-size: 50px; cursor: pointer; user-select: none;\n                }\n            <\/style>\n            \n            <div class=\"circular-gallery-container\" data-settings='{&quot;items&quot;:[{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/cat.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/father.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/cat2.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/cat3.jpg&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/imgimgtupian_20260716222333_2434_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/imgimgtupian_20260716222329_2432_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/imgimgtupian_20260716222331_2433_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/imgimgtupian_20260808140752_2660_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/imgimgtupian_20260808140748_2659_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/imgimgtupian_20260808140800_2662_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/imgimgtupian_20260808140756_2661_5817.webp&quot;},{&quot;image&quot;:&quot;https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/imgimgtupian_20260808140804_2663_5817.webp&quot;}],&quot;bend&quot;:3,&quot;scrollSpeed&quot;:2,&quot;autoScrollSpeed&quot;:0.04,&quot;borderRadius&quot;:0.05}'><\/div>\n\n                            <script type=\"module\">\n                    jQuery(window).on('elementor\/frontend\/init', () => {\n                        elementorFrontend.hooks.addAction('frontend\/element_ready\/circular_gallery.default', function($scope) {\n                            const container = $scope.find('.circular-gallery-container')[0];\n                            if (!container) return;\n                            \n                            const settings = JSON.parse(container.getAttribute('data-settings'));\n\n                            import('https:\/\/cdn.jsdelivr.net\/npm\/ogl@0.0.117\/+esm').then((ogl) => {\n                                const { Camera, Mesh, Plane, Program, Renderer, Texture, Transform } = ogl;\n\n                                function debounce(func, wait) {\n                                    let timeout;\n                                    return function (...args) {\n                                        clearTimeout(timeout);\n                                        timeout = setTimeout(() => func.apply(this, args), wait);\n                                    };\n                                }\n                                function lerp(p1, p2, t) { return p1 + (p2 - p1) * t; }\n\n                                class Media {\n                                    constructor({ geometry, gl, image, index, length, scene, screen, viewport, bend, borderRadius }) {\n                                        this.extra = 0; this.geometry = geometry; this.gl = gl; this.image = image; this.index = index;\n                                        this.length = length; this.scene = scene; this.screen = screen; this.viewport = viewport;\n                                        this.bend = bend; this.borderRadius = borderRadius;\n                                        this.createShader(); this.createMesh(); this.onResize();\n                                    }\n                                    createShader() {\n                                        const texture = new Texture(this.gl, { generateMipmaps: true });\n                                        this.program = new Program(this.gl, {\n                                            depthTest: false, depthWrite: false,\n                                            vertex: `\n                                                precision highp float; attribute vec3 position; attribute vec2 uv;\n                                                uniform mat4 modelViewMatrix; uniform mat4 projectionMatrix;\n                                                uniform float uTime; uniform float uSpeed; varying vec2 vUv;\n                                                void main() {\n                                                    vUv = uv; vec3 p = position;\n                                                    p.z = (sin(p.x * 4.0 + uTime) * 1.5 + cos(p.y * 2.0 + uTime) * 1.5) * (0.1 + uSpeed * 0.5);\n                                                    gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 1.0);\n                                                }\n                                            `,\n                                            fragment: `\n                                                precision highp float; uniform vec2 uImageSizes; uniform vec2 uPlaneSizes;\n                                                uniform sampler2D tMap; uniform float uBorderRadius; varying vec2 vUv;\n                                                float roundedBoxSDF(vec2 p, vec2 b, float r) {\n                                                    vec2 d = abs(p) - b; return length(max(d, vec2(0.0))) + min(max(d.x, d.y), 0.0) - r;\n                                                }\n                                                void main() {\n                                                    vec2 ratio = vec2(\n                                                        min((uPlaneSizes.x \/ uPlaneSizes.y) \/ (uImageSizes.x \/ uImageSizes.y), 1.0),\n                                                        min((uPlaneSizes.y \/ uPlaneSizes.x) \/ (uImageSizes.y \/ uImageSizes.x), 1.0)\n                                                    );\n                                                    vec2 uv = vec2(vUv.x * ratio.x + (1.0 - ratio.x) * 0.5, vUv.y * ratio.y + (1.0 - ratio.y) * 0.5);\n                                                    vec4 color = texture2D(tMap, uv);\n                                                    float d = roundedBoxSDF(vUv - 0.5, vec2(0.5 - uBorderRadius), uBorderRadius);\n                                                    gl_FragColor = vec4(color.rgb, 1.0 - smoothstep(-0.002, 0.002, d));\n                                                }\n                                            `,\n                                            uniforms: {\n                                                tMap: { value: texture }, uPlaneSizes: { value: [0, 0] }, uImageSizes: { value: [0, 0] },\n                                                uSpeed: { value: 0 }, uTime: { value: 100 * Math.random() }, uBorderRadius: { value: this.borderRadius }\n                                            },\n                                            transparent: true\n                                        });\n                                        const img = new Image(); img.crossOrigin = 'anonymous'; img.src = this.image;\n                                        img.onload = () => { texture.image = img; this.program.uniforms.uImageSizes.value = [img.naturalWidth, img.naturalHeight]; };\n                                    }\n                                    createMesh() {\n                                        this.plane = new Mesh(this.gl, { geometry: this.geometry, program: this.program });\n                                        this.plane.setParent(this.scene);\n                                    }\n                                    update(scroll, direction) {\n                                        this.plane.position.x = this.x - scroll.current - this.extra;\n                                        const x = this.plane.position.x; const H = this.viewport.width \/ 2;\n                                        if (this.bend === 0) { this.plane.position.y = 0; this.plane.rotation.z = 0; } else {\n                                            const B = Math.abs(this.bend); const R = (H * H + B * B) \/ (2 * B);\n                                            const eX = Math.min(Math.abs(x), H); const arc = R - Math.sqrt(R * R - eX * eX);\n                                            this.plane.position.y = this.bend > 0 ? -arc : arc;\n                                            this.plane.rotation.z = (this.bend > 0 ? -1 : 1) * Math.sign(x) * Math.asin(eX \/ R);\n                                        }\n                                        this.speed = scroll.current - scroll.last; this.program.uniforms.uTime.value += 0.04; this.program.uniforms.uSpeed.value = this.speed;\n                                        const po = this.plane.scale.x \/ 2; const vo = this.viewport.width \/ 2;\n                                        this.isBefore = this.plane.position.x + po < -vo; this.isAfter = this.plane.position.x - po > vo;\n                                        if (direction === 'right' && this.isBefore) { this.extra -= this.widthTotal; this.isBefore = this.isAfter = false; }\n                                        if (direction === 'left' && this.isAfter) { this.extra += this.widthTotal; this.isBefore = this.isAfter = false; }\n                                    }\n                                    onResize({ screen, viewport } = {}) {\n                                        if (screen) this.screen = screen; if (viewport) this.viewport = viewport;\n                                        this.scale = this.screen.width < 768 ? (this.screen.width \/ 1000) : (this.screen.height \/ 1500);\n                                        this.plane.scale.y = (this.viewport.height * (900 * this.scale)) \/ this.screen.height;\n                                        this.plane.scale.x = (this.viewport.width * (700 * this.scale)) \/ this.screen.width;\n                                        this.plane.program.uniforms.uPlaneSizes.value = [this.plane.scale.x, this.plane.scale.y];\n                                        this.padding = 2; this.width = this.plane.scale.x + this.padding; this.widthTotal = this.width * this.length; this.x = this.width * this.index;\n                                    }\n                                }\n\n                                class App {\n                                    constructor(container, opts) {\n                                        this.container = container; this.scrollSpeed = opts.scrollSpeed;\n                                        this.autoScrollSpeed = opts.autoScrollSpeed || 0.02; \n                                        this.scroll = { ease: 0.05, current: 0, target: 0, last: 0 };\n                                        \n                                        this.isHovered = false;\n                                        this.isLightboxOpen = false;\n                                        this.isDragged = false;\n                                        this.ignoreMouseUntil = 0; \/\/ \u9632\u89e6\u6478\u7aef\u5e7d\u7075\u70b9\u51fb\n                                        \n                                        this.onCheckDebounce = debounce(this.onCheck.bind(this), 200);\n                                        this.renderer = new Renderer({ alpha: true, antialias: true, dpr: Math.min(window.devicePixelRatio || 1, 2) });\n                                        this.gl = this.renderer.gl; this.gl.clearColor(0, 0, 0, 0); this.container.appendChild(this.gl.canvas);\n                                        \n                                        this.camera = new Camera(this.gl); this.camera.fov = 45; this.camera.position.z = 20;\n                                        this.scene = new Transform();\n                                        this.planeGeometry = new Plane(this.gl, { heightSegments: 50, widthSegments: 100 });\n                                        \n                                        this.onResize();\n                                        \n                                        const gItems = opts.items.length ? opts.items : [{image:'https:\/\/picsum.photos\/800\/600'}];\n                                        this.mediasImages = gItems.concat(gItems);\n                                        this.medias = this.mediasImages.map((data, index) => new Media({\n                                            geometry: this.planeGeometry, gl: this.gl, image: data.image, index, length: this.mediasImages.length,\n                                            scene: this.scene, screen: this.screen, viewport: this.viewport,\n                                            bend: opts.bend, borderRadius: opts.borderRadius\n                                        }));\n\n                                        this.initLightbox();\n                                        this.update(); this.addEventListeners();\n                                    }\n\n                                    initLightbox() {\n                                        if (!document.getElementById('circular-gallery-lightbox')) {\n                                            const lb = document.createElement('div');\n                                            lb.id = 'circular-gallery-lightbox';\n                                            lb.className = 'circular-gallery-lightbox';\n                                            lb.innerHTML = '<div class=\"circular-gallery-lightbox-close\">&times;<\/div><img decoding=\"async\" src=\"\" alt=\"\" \/>';\n                                            document.body.appendChild(lb);\n                                            lb.addEventListener('click', () => {\n                                                lb.classList.remove('active');\n                                                window.dispatchEvent(new Event('galleryLightboxClosed'));\n                                            });\n                                        }\n                                    }\n                                    \n                                    onTouchDown(e) {\n                                        if (e.type === 'mousedown' && Date.now() < this.ignoreMouseUntil) return;\n                                        \n                                        this.isDown = true; \n                                        this.isDragged = false; \n                                        this.scroll.position = this.scroll.current; \n                                        this.startX = e.touches ? e.touches[0].clientX : e.clientX; \n                                        this.startY = e.touches ? e.touches[0].clientY : e.clientY; \n                                        this.isScrolling = null; \n                                    }\n                                    \n                                    onTouchMove(e) { \n                                        if (!this.isDown) return; \n                                        const x = e.touches ? e.touches[0].clientX : e.clientX; \n                                        const y = e.touches ? e.touches[0].clientY : e.clientY; \n\n                                        \/\/ \u9608\u503c\u52a0\u5927\u81f3 15px\uff0c\u5b8c\u7f8e\u9632\u6296\n                                        if (Math.abs(x - this.startX) > 15 || Math.abs(y - this.startY) > 15) {\n                                            this.isDragged = true;\n                                        }\n\n                                        if (this.isScrolling === null) {\n                                            const dx = Math.abs(x - this.startX);\n                                            const dy = Math.abs(y - this.startY);\n                                            if (dx > dy) { this.isScrolling = false; } else if (dy > dx) { this.isScrolling = true; }\n                                        }\n\n                                        if (this.isScrolling) return;\n\n                                        const distance = (this.startX - x) * (this.scrollSpeed * 0.025); \n                                        this.scroll.target = this.scroll.position + distance; \n                                    }\n                                    \n                                    onTouchUp(e) { \n                                        this.isDown = false;\n                                        if (e.type === 'touchend') this.ignoreMouseUntil = Date.now() + 300;\n                                        \n                                        \/\/ \u6838\u5fc3\u4fee\u590d\uff1a\u7eaf\u6570\u5b66\u6620\u5c04\u77e9\u9635\uff0c\u65e0\u9700\u4f9d\u8d56 3D Raycaster\n                                        if (!this.isDragged && !this.isLightboxOpen) {\n                                            const clientX = e.changedTouches ? e.changedTouches[0].clientX : (e.clientX || this.startX);\n                                            const clientY = e.changedTouches ? e.changedTouches[0].clientY : (e.clientY || this.startY);\n                                            \n                                            const rect = this.gl.canvas.getBoundingClientRect();\n                                            const cx = clientX - rect.left;\n                                            const cy = clientY - rect.top;\n                                            \n                                            \/\/ \u786e\u4fdd\u70b9\u51fb\u5728 canvas \u5185\u90e8\n                                            if (cx >= 0 && cx <= rect.width && cy >= 0 && cy <= rect.height) {\n                                                \/\/ \u6362\u7b97 NDC \u5750\u6807 (-1 \u5230 1)\n                                                const ndcX = (cx \/ rect.width) * 2.0 - 1.0;\n                                                const ndcY = 1.0 - (cy \/ rect.height) * 2.0;\n\n                                                \/\/ \u6362\u7b97\u5230\u76f8\u673a\u89c6\u53e3 3D \u4e16\u754c\u5750\u6807\n                                                const mouseWorldX = ndcX * (this.viewport.width \/ 2);\n                                                const mouseWorldY = ndcY * (this.viewport.height \/ 2);\n\n                                                let clickedMedia = null;\n\n                                                \/\/ \u7528\u6570\u5b66\u77e9\u9635\u68c0\u6d4b\u5750\u6807\u662f\u5426\u5728\u67d0\u5f20\u56fe\u7247\u8303\u56f4\u5185\n                                                this.medias.forEach(m => {\n                                                    const dx = mouseWorldX - m.plane.position.x;\n                                                    const dy = mouseWorldY - m.plane.position.y;\n                                                    \n                                                    \/\/ \u5c06\u4e16\u754c\u5750\u6807\u53cd\u5411\u65cb\u8f6c\uff0c\u8d34\u5408\u5361\u7247\u7684\u5f2f\u66f2\u89d2\u5ea6\n                                                    const cosR = Math.cos(-m.plane.rotation.z);\n                                                    const sinR = Math.sin(-m.plane.rotation.z);\n                                                    const localX = dx * cosR - dy * sinR;\n                                                    const localY = dx * sinR + dy * cosR;\n                                                    \n                                                    if (Math.abs(localX) <= m.plane.scale.x \/ 2 && Math.abs(localY) <= m.plane.scale.y \/ 2) {\n                                                        clickedMedia = m;\n                                                    }\n                                                });\n\n                                                if (clickedMedia) {\n                                                    this.isLightboxOpen = true; \n                                                    const lb = document.getElementById('circular-gallery-lightbox');\n                                                    lb.querySelector('img').src = clickedMedia.image;\n                                                    lb.classList.add('active');\n                                                }\n                                            }\n                                        }\n                                        this.onCheck(); \n                                    }\n                                    \n                                    onWheel(e) { \n                                        this.scroll.target += ((e.deltaY || e.wheelDelta || e.detail) > 0 ? this.scrollSpeed : -this.scrollSpeed) * 0.2; \n                                        this.onCheckDebounce(); \n                                    }\n                                    \n                                    onCheck() {\n                                        if (!this.medias || !this.medias[0]) return;\n                                        const w = this.medias[0].width; const item = w * Math.round(Math.abs(this.scroll.target) \/ w);\n                                        this.scroll.target = this.scroll.target < 0 ? -item : item;\n                                    }\n                                    \n                                    onResize() {\n                                        this.screen = { width: this.container.clientWidth, height: this.container.clientHeight };\n                                        this.renderer.setSize(this.screen.width, this.screen.height);\n                                        this.camera.perspective({ aspect: this.screen.width \/ this.screen.height });\n                                        const fov = (this.camera.fov * Math.PI) \/ 180; const height = 2 * Math.tan(fov \/ 2) * this.camera.position.z;\n                                        this.viewport = { width: height * this.camera.aspect, height };\n                                        if (this.medias) this.medias.forEach(m => m.onResize({ screen: this.screen, viewport: this.viewport }));\n                                    }\n                                    \n                                    update() {\n                                        if (!this.isHovered && !this.isDown && !this.isLightboxOpen) {\n                                            this.scroll.target -= this.autoScrollSpeed; \n                                        }\n\n                                        this.scroll.current = lerp(this.scroll.current, this.scroll.target, this.scroll.ease);\n                                        const dir = this.scroll.current > this.scroll.last ? 'right' : 'left';\n                                        if (this.medias) this.medias.forEach(m => m.update(this.scroll, dir));\n                                        this.renderer.render({ scene: this.scene, camera: this.camera });\n                                        this.scroll.last = this.scroll.current;\n                                        this.raf = window.requestAnimationFrame(this.update.bind(this));\n                                    }\n                                    \n                                    addEventListeners() {\n                                        this.bound = { \n                                            resize: this.onResize.bind(this), wheel: this.onWheel.bind(this), \n                                            down: this.onTouchDown.bind(this), move: this.onTouchMove.bind(this), up: this.onTouchUp.bind(this),\n                                            mouseenter: () => { this.isHovered = true; },\n                                            mouseleave: () => { this.isHovered = false; this.isDown = false; }, \n                                            lightboxClosed: () => { this.isLightboxOpen = false; }\n                                        };\n                                        window.addEventListener('resize', this.bound.resize); window.addEventListener('wheel', this.bound.wheel);\n                                        window.addEventListener('mousedown', this.bound.down); window.addEventListener('mousemove', this.bound.move); window.addEventListener('mouseup', this.bound.up);\n                                        window.addEventListener('touchstart', this.bound.down, { passive: true }); \n                                        window.addEventListener('touchmove', this.bound.move, { passive: true }); \n                                        window.addEventListener('touchend', this.bound.up);\n                                        \n                                        this.container.addEventListener('mouseenter', this.bound.mouseenter);\n                                        this.container.addEventListener('mouseleave', this.bound.mouseleave);\n                                        window.addEventListener('galleryLightboxClosed', this.bound.lightboxClosed);\n                                    }\n                                    \n                                    destroy() {\n                                        window.cancelAnimationFrame(this.raf);\n                                        window.removeEventListener('resize', this.bound.resize); window.removeEventListener('wheel', this.bound.wheel);\n                                        window.removeEventListener('mousedown', this.bound.down); window.removeEventListener('mousemove', this.bound.move); window.removeEventListener('mouseup', this.bound.up);\n                                        window.removeEventListener('touchstart', this.bound.down); window.removeEventListener('touchmove', this.bound.move); window.removeEventListener('touchend', this.bound.up);\n                                        \n                                        this.container.removeEventListener('mouseenter', this.bound.mouseenter);\n                                        this.container.removeEventListener('mouseleave', this.bound.mouseleave);\n                                        window.removeEventListener('galleryLightboxClosed', this.bound.lightboxClosed);\n                                        \n                                        if (this.gl && this.gl.canvas) this.gl.canvas.remove();\n                                    }\n                                }\n\n                                if (container.__galleryApp) { container.__galleryApp.destroy(); }\n                                container.__galleryApp = new App(container, settings);\n                            });\n                        });\n                    });\n                <\/script>\n                \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Made by you Your idea. Made unique. Personalized \u00b7 Handcrafted \u00b7 One of a kind Made from your ideasNecklaces, bracelets, earrings, rings, brooches, keychains and more \u2014 each piece begins with something personal to you.Here are just a few of the pieces we\u2019ve created.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-29","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gallery - uniqartkids.com<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gallery - uniqartkids.com\" \/>\n<meta property=\"og:description\" content=\"Made by you Your idea. Made unique. Personalized \u00b7 Handcrafted \u00b7 One of a kind Made from your ideasNecklaces, bracelets, earrings, rings, brooches, keychains and more \u2014 each piece begins with something personal to you.Here are just a few of the pieces we\u2019ve created.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uniqartkids.com\/it\/gallery\/\" \/>\n<meta property=\"og:site_name\" content=\"uniqartkids.com\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-11T13:17:46+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/gallery\\\/\",\"url\":\"https:\\\/\\\/uniqartkids.com\\\/gallery\\\/\",\"name\":\"Gallery - uniqartkids.com\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#website\"},\"datePublished\":\"2026-06-28T07:59:34+00:00\",\"dateModified\":\"2026-08-11T13:17:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/gallery\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/uniqartkids.com\\\/gallery\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/gallery\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/uniqartkids.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gallery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#website\",\"url\":\"https:\\\/\\\/uniqartkids.com\\\/\",\"name\":\"uniqartkids.com\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/uniqartkids.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#organization\",\"name\":\"uniqartkids.com\",\"url\":\"https:\\\/\\\/uniqartkids.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/Uniq-Art-Kids-logo\u8bbe\u8ba1-1-scaled-e1782908830843.png\",\"contentUrl\":\"https:\\\/\\\/uniqartkids.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/Uniq-Art-Kids-logo\u8bbe\u8ba1-1-scaled-e1782908830843.png\",\"width\":1655,\"height\":1092,\"caption\":\"uniqartkids.com\"},\"image\":{\"@id\":\"https:\\\/\\\/uniqartkids.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gallery - uniqartkids.com","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"it_IT","og_type":"article","og_title":"Gallery - uniqartkids.com","og_description":"Made by you Your idea. Made unique. Personalized \u00b7 Handcrafted \u00b7 One of a kind Made from your ideasNecklaces, bracelets, earrings, rings, brooches, keychains and more \u2014 each piece begins with something personal to you.Here are just a few of the pieces we\u2019ve created.","og_url":"https:\/\/uniqartkids.com\/it\/gallery\/","og_site_name":"uniqartkids.com","article_modified_time":"2026-08-11T13:17:46+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/uniqartkids.com\/gallery\/","url":"https:\/\/uniqartkids.com\/gallery\/","name":"Gallery - uniqartkids.com","isPartOf":{"@id":"https:\/\/uniqartkids.com\/#website"},"datePublished":"2026-06-28T07:59:34+00:00","dateModified":"2026-08-11T13:17:46+00:00","breadcrumb":{"@id":"https:\/\/uniqartkids.com\/gallery\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uniqartkids.com\/gallery\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/uniqartkids.com\/gallery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uniqartkids.com\/"},{"@type":"ListItem","position":2,"name":"Gallery"}]},{"@type":"WebSite","@id":"https:\/\/uniqartkids.com\/#website","url":"https:\/\/uniqartkids.com\/","name":"uniqartkids.com","description":"","publisher":{"@id":"https:\/\/uniqartkids.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uniqartkids.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/uniqartkids.com\/#organization","name":"uniqartkids.com","url":"https:\/\/uniqartkids.com\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/uniqartkids.com\/#\/schema\/logo\/image\/","url":"https:\/\/uniqartkids.com\/wp-content\/uploads\/2026\/06\/Uniq-Art-Kids-logo\u8bbe\u8ba1-1-scaled-e1782908830843.png","contentUrl":"https:\/\/uniqartkids.com\/wp-content\/uploads\/2026\/06\/Uniq-Art-Kids-logo\u8bbe\u8ba1-1-scaled-e1782908830843.png","width":1655,"height":1092,"caption":"uniqartkids.com"},"image":{"@id":"https:\/\/uniqartkids.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/pages\/29","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":60,"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/pages\/29\/revisions"}],"predecessor-version":[{"id":1171,"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/pages\/29\/revisions\/1171"}],"wp:attachment":[{"href":"https:\/\/uniqartkids.com\/it\/wp-json\/wp\/v2\/media?parent=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}