Финансовое планирование
и инвестиции
Как научиться

ГРАМОТНО
инвестировать
Нажимая на кнопку, вы соглашаетесь c обработкой персональных данных, политикой и офертой
html, body { margin: 0; } canvas { position: fixed; width: 100%; height: 100%; } function App() { const conf = { el: 'canvas', fov: 75, cameraZ: 400, background: 0x00001a, numPoints: 50000, }; let renderer, scene, camera, cameraCtrl, startTime; let width, height; let points; const mouse = new THREE.Vector2(0.2, 0.2); const { randFloat: rnd, randFloatSpread: rndFS } = THREE.Math; init(); function init() { renderer = new THREE.WebGLRenderer({ canvas: document.getElementById(conf.el) }); camera = new THREE.PerspectiveCamera(conf.fov); camera.far = 10000; camera.position.z = conf.cameraZ; cameraCtrl = new THREE.OrbitControls(camera, renderer.domElement); cameraCtrl.enableKeys = false; cameraCtrl.enableDamping = true; cameraCtrl.dampingFactor = 0.1; cameraCtrl.rotateSpeed = 0.1; updateSize(); window.addEventListener('resize', updateSize, false); renderer.domElement.addEventListener('mousemove', e => { mouse.x = (e.clientX / width) * 2 - 1; mouse.y = -(e.clientY / height) * 2 + 1; }); startTime = Date.now(); initScene(); animate(); } function initScene() { scene = new THREE.Scene(); if (conf.background) scene.background = new THREE.Color(conf.background); const cscale = chroma.scale([0x00b9e0, 0xff880a, 0x5f1b90, 0x7ec08d]); const positions = new Float32Array(conf.numPoints * 3); const colors = new Float32Array(conf.numPoints * 3); const sizes = new Float32Array(conf.numPoints); const rotations = new Float32Array(conf.numPoints); const sCoef = new Float32Array(conf.numPoints); const position = new THREE.Vector3(); let color; for (let i = 0; i < conf.numPoints; i++) { position.set(rndFS(1000), rndFS(1000), rndFS(2000)); position.toArray(positions, i * 3); color = new THREE.Color(cscale(rnd(0, 1)).hex()); color.toArray(colors, i * 3); sizes[i] = rnd(5, 100); sCoef[i] = rnd(0.0005, 0.005); rotations[i] = rnd(0, Math.PI); } const geometry = new THREE.BufferGeometry(); geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3)); geometry.addAttribute('color', new THREE.BufferAttribute(colors, 3)); geometry.addAttribute('size', new THREE.BufferAttribute(sizes, 1)); geometry.addAttribute('rotation', new THREE.BufferAttribute(rotations, 1)); geometry.addAttribute('sCoef', new THREE.BufferAttribute(sCoef, 1)); const material = new THREE.ShaderMaterial({ uniforms: { uTime: { value: 0 }, uMouse: { value: mouse }, uTexture: { value: new THREE.TextureLoader().load('https://klevron.github.io/codepen/misc/star.png') }, }, vertexShader: ` uniform float uTime; uniform vec2 uMouse; attribute vec3 color; attribute float size; attribute float rotation; attribute float sCoef; varying vec4 vColor; varying float vRotation; void main() { vColor = vec4(color, 1.); vRotation = rotation; vec3 p = vec3(position); p.z = -1000. + mod(position.z + uTime*(sCoef*50.*uMouse.y), 2000.); p.x = -500. + mod(position.x - uTime*(sCoef*50.*uMouse.x), 1000.); vec4 mvPosition = modelViewMatrix * vec4(p, 1.); gl_Position = projectionMatrix * mvPosition; float psize = size * (200. / -mvPosition.z); gl_PointSize = psize * (1. + .5*sin(uTime*sCoef + position.x)); } `, fragmentShader: ` uniform sampler2D uTexture; varying vec4 vColor; varying float vRotation; void main() { vec2 v = gl_PointCoord - .5; float ca = cos(vRotation), sa = sin(vRotation); mat2 rmat = mat2(ca, -sa, sa, ca); gl_FragColor = vColor * texture2D(uTexture, v*rmat + .5); } `, blending: THREE.AdditiveBlending, depthTest: false, transparent: true, }); points = new THREE.Points(geometry, material); scene.add(points); renderer.domElement.addEventListener('mouseup', e => { randomColors(); }); } function randomColors() { startTime = Date.now(); const cscale = chroma.scale([chroma.random(), chroma.random(), chroma.random(), chroma.random()]); const colors = points.geometry.attributes.color.array; let j, color; for (let i = 0; i < conf.numPoints; i++) { j = i * 3; color = cscale(rnd(0, 1)); colors[j] = color.get('rgb.r') / 0xff; colors[j + 1] = color.get('rgb.g') / 0xff; colors[j + 2] = color.get('rgb.b') / 0xff; } points.geometry.attributes.color.needsUpdate = true; } function animate() { requestAnimationFrame(animate); const time = Date.now() - startTime; points.material.uniforms.uTime.value = time; points.rotation.z += -mouse.x * 0.03; if (cameraCtrl) cameraCtrl.update(); renderer.render(scene, camera); } function updateSize() { width = window.innerWidth; height = window.innerHeight; renderer.setSize(width, height); camera.aspect = width / height; camera.updateProjectionMatrix(); } } App();

Алеся

Made with love and only the CSS.

the beautiful aurora

Made with love and only the CSS.

@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;800&display=swap"); :root { --bg: #000000; --clr-1: #00c2ff; --clr-2: #33ff8c; --clr-3: #ffc640; --clr-4: #e54cff; --blur: 1rem; --fs: clamp(3rem, 8vw, 7rem); --ls: clamp(-1.75px, -0.25vw, -3.5px); } body { min-height: 100vh; display: grid; place-items: center; background-color: var(--bg); color: #fff; font-family: "Inter", "DM Sans", Arial, sans-serif; } *, *::before, *::after { font-family: inherit; box-sizing: border-box; } .content { text-align: center; } .title { font-size: var(--fs); font-weight: 800; letter-spacing: var(--ls); position: relative; overflow: hidden; background: var(--bg); margin: 0; } .subtitle { } .aurora { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 2; mix-blend-mode: darken; pointer-events: none; } .aurora__item { overflow: hidden; position: absolute; width: 60vw; height: 60vw; background-color: var(--clr-1); border-radius: 37% 29% 27% 27% / 28% 25% 41% 37%; filter: blur(var(--blur)); mix-blend-mode: overlay; } .aurora__item:nth-of-type(1) { top: -50%; animation: aurora-border 6s ease-in-out infinite, aurora-1 12s ease-in-out infinite alternate; } .aurora__item:nth-of-type(2) { background-color: var(--clr-3); right: 0; top: 0; animation: aurora-border 6s ease-in-out infinite, aurora-2 12s ease-in-out infinite alternate; } .aurora__item:nth-of-type(3) { background-color: var(--clr-2); left: 0; bottom: 0; animation: aurora-border 6s ease-in-out infinite, aurora-3 8s ease-in-out infinite alternate; } .aurora__item:nth-of-type(4) { background-color: var(--clr-4); right: 0; bottom: -50%; animation: aurora-border 6s ease-in-out infinite, aurora-4 24s ease-in-out infinite alternate; } @keyframes aurora-1 { 0% { top: 0; right: 0; } 50% { top: 100%; right: 75%; } 75% { top: 100%; right: 25%; } 100% { top: 0; right: 0; } } @keyframes aurora-2 { 0% { top: -50%; left: 0%; } 60% { top: 100%; left: 75%; } 85% { top: 100%; left: 25%; } 100% { top: -50%; left: 0%; } } @keyframes aurora-3 { 0% { bottom: 0; left: 0; } 40% { bottom: 100%; left: 75%; } 65% { bottom: 40%; left: 50%; } 100% { bottom: 0; left: 0; } } @keyframes aurora-4 { 0% { bottom: -50%; right: 0; } 50% { bottom: 0%; right: 40%; } 90% { bottom: 50%; right: 25%; } 100% { bottom: -50%; right: 0; } } @keyframes aurora-border { 0% { border-radius: 37% 29% 27% 27% / 28% 25% 41% 37%; } 25% { border-radius: 47% 29% 39% 49% / 61% 19% 66% 26%; } 50% { border-radius: 57% 23% 47% 72% / 63% 17% 66% 33%; } 75% { border-radius: 28% 49% 29% 100% / 93% 20% 64% 25%; } 100% { border-radius: 37% 29% 27% 27% / 28% 25% 41% 37%; } }
ПОЧЕМУ
ИНВЕСТИЦИОННЫЙ СОВЕТНИК?


Tilda Publishing
Tilda Publishing

Комплексный личный финансовый план

Стоимость от 70 000 ₽
Стоимость от 10 000 ₽

Аналитика по ценным бумагам

УСЛУГИ

Курс "Технический анализ для инвестора"

Научитесь выбирать растущие акции и активы с помощью технического анализа
24 700 ₽
Стоимость

Курс "Фьючерсы. Хеджирование и инвестиции"

Научитесь использовать фьючерс как альтернативу ETF или для хеджирования своего инвестиционного портфеля
9 990 ₽
Стоимость

ОБУЧЕНИЕ

МАСТЕР-КЛАСС «РИСК-МЕНЕДЖМЕНТ»

Для трейдеров и инвесторов
2990 ₽
Стоимость

ОБУЧЕНИЕ

ИНВЕСТИЦИОННЫЙ СОВЕТНИК?

ПОЧЕМУ
Инвестиционный советник (реестр ЦБ РФ)
Экономист, финансовый менеджер
Аттестованный специалист финансового рынка по брокерской деятельности, дилерской деятельности, деятельности по управлению ценными бумагами
Автор и куратор обучающих программ по финансовому планированию от ведущих брокеров РФ
Более 11 лет опыта в области финансов в банковской сфере, корпоративных финансах, инвестициях, в прошлом ведущий финансовый советник компании
Квалифицированный инвестор
ОБО МНЕ

КОНОШЕВСКАЯ ОЛЬГА

Нажимая на кнопку, вы соглашаетесь c обработкой персональных данных, политикой и офертой
Инвестиционный советник (реестр ЦБ РФ)
@konoshevskaya_olga
Коношевская Ольга

КОНТАКТЫ