export default async function ProjectsPage() { const projects = await getProjects(); return <ProjectGrid items={projects}/>;} export function useInView<T extends HTMLElement>(ref: RefObject<T | null>) { const [visible, setVisible] = useState(false); useEffect(() => { if (!ref.current) return; const observer = new IntersectionObserver(([entry]) => setVisible(entry.isIntersecting)); observer.observe(ref.current); return () => observer.disconnect(); }, [ref]); return visible;} export default async function ProjectsPage() { const projects = await getProjects(); return <ProjectGrid items={projects}/>;} export function useInView<T extends HTMLElement>(ref: RefObject<T | null>) { const [visible, setVisible] = useState(false); useEffect(() => { if (!ref.current) return; const observer = new IntersectionObserver(([entry]) => setVisible(entry.isIntersecting)); observer.observe(ref.current); return () => observer.disconnect(); }, [ref]); return visible;}
export default async function ProjectsPage() { const projects = await getProjects(); return <ProjectGrid items={projects}/>;} export function useInView<T extends HTMLElement>(ref: RefObject<T | null>) { const [visible, setVisible] = useState(false); useEffect(() => { if (!ref.current) return; const observer = new IntersectionObserver(([entry]) => setVisible(entry.isIntersecting)); observer.observe(ref.current); return () => observer.disconnect(); }, [ref]); return visible;} export default async function ProjectsPage() { const projects = await getProjects(); return <ProjectGrid items={projects}/>;} export function useInView<T extends HTMLElement>(ref: RefObject<T | null>) { const [visible, setVisible] = useState(false); useEffect(() => { if (!ref.current) return; const observer = new IntersectionObserver(([entry]) => setVisible(entry.isIntersecting)); observer.observe(ref.current); return () => observer.disconnect(); }, [ref]); return visible;}
Веб
Интерфейсы, сайты и веб-приложения. Фронтенд — моя основная работа.
export function SetRow({ set, onDone }: SetRowProps) { return ( <Pressable onPress={onDone} className="flex-row items-center gap-3 py-3"> <Text className="text-lg font-medium">{set.weight} кг × {set.reps}</Text> {set.done && <Check size={18} />} </Pressable> );} const { data: workouts } = useQuery({ queryKey: ['workouts', athleteId], queryFn: () => api.workouts.list(athleteId),}); export function SetRow({ set, onDone }: SetRowProps) { return ( <Pressable onPress={onDone} className="flex-row items-center gap-3 py-3"> <Text className="text-lg font-medium">{set.weight} кг × {set.reps}</Text> {set.done && <Check size={18} />} </Pressable> );} const { data: workouts } = useQuery({ queryKey: ['workouts', athleteId], queryFn: () => api.workouts.list(athleteId),});
export function SetRow({ set, onDone }: SetRowProps) { return ( <Pressable onPress={onDone} className="flex-row items-center gap-3 py-3"> <Text className="text-lg font-medium">{set.weight} кг × {set.reps}</Text> {set.done && <Check size={18} />} </Pressable> );} const { data: workouts } = useQuery({ queryKey: ['workouts', athleteId], queryFn: () => api.workouts.list(athleteId),}); export function SetRow({ set, onDone }: SetRowProps) { return ( <Pressable onPress={onDone} className="flex-row items-center gap-3 py-3"> <Text className="text-lg font-medium">{set.weight} кг × {set.reps}</Text> {set.done && <Check size={18} />} </Pressable> );} const { data: workouts } = useQuery({ queryKey: ['workouts', athleteId], queryFn: () => api.workouts.list(athleteId),});
Мобильные приложения
Приложения на React Native вместе с бэкендом и синхронизацией данных.
- React Native
- Expo
- NestJS
- PostgreSQL
(defun c:CHECKDIMS (/ ss i ent value) (setq ss (ssget '((0 . "DIMENSION")))) (if ss (repeat (setq i (sslength ss)) (setq ent (entget (ssname ss (setq i (1- i)))) value (cdr (assoc 42 ent))) (if (> (abs (- value (dim-design ent))) *tolerance*) (mark-deviation ent value)))) (princ)) (defun c:CHECKDIMS (/ ss i ent value) (setq ss (ssget '((0 . "DIMENSION")))) (if ss (repeat (setq i (sslength ss)) (setq ent (entget (ssname ss (setq i (1- i)))) value (cdr (assoc 42 ent))) (if (> (abs (- value (dim-design ent))) *tolerance*) (mark-deviation ent value)))) (princ))
(defun c:CHECKDIMS (/ ss i ent value) (setq ss (ssget '((0 . "DIMENSION")))) (if ss (repeat (setq i (sslength ss)) (setq ent (entget (ssname ss (setq i (1- i)))) value (cdr (assoc 42 ent))) (if (> (abs (- value (dim-design ent))) *tolerance*) (mark-deviation ent value)))) (princ)) (defun c:CHECKDIMS (/ ss i ent value) (setq ss (ssget '((0 . "DIMENSION")))) (if ss (repeat (setq i (sslength ss)) (setq ent (entget (ssname ss (setq i (1- i)))) value (cdr (assoc 42 ent))) (if (> (abs (- value (dim-design ent))) *tolerance*) (mark-deviation ent value)))) (princ))
Плагины для AutoCAD
Автоматизация чертежей: команды, расчёты и панели прямо внутри AutoCAD.
- AutoLISP
- C# / .NET
- WebView2
func _physics_process(delta: float) -> void: var input := Input.get_vector("left", "right", "up", "down") velocity = velocity.move_toward(input * speed, accel * delta) if Input.is_action_just_pressed("dash") and can_dash: _dash(input) move_and_slide() func _dash(direction: Vector2) -> void: can_dash = false velocity = direction * dash_speed await get_tree().create_timer(dash_cooldown).timeout can_dash = true func _physics_process(delta: float) -> void: var input := Input.get_vector("left", "right", "up", "down") velocity = velocity.move_toward(input * speed, accel * delta) if Input.is_action_just_pressed("dash") and can_dash: _dash(input) move_and_slide() func _dash(direction: Vector2) -> void: can_dash = false velocity = direction * dash_speed await get_tree().create_timer(dash_cooldown).timeout can_dash = true
func _physics_process(delta: float) -> void: var input := Input.get_vector("left", "right", "up", "down") velocity = velocity.move_toward(input * speed, accel * delta) if Input.is_action_just_pressed("dash") and can_dash: _dash(input) move_and_slide() func _dash(direction: Vector2) -> void: can_dash = false velocity = direction * dash_speed await get_tree().create_timer(dash_cooldown).timeout can_dash = true func _physics_process(delta: float) -> void: var input := Input.get_vector("left", "right", "up", "down") velocity = velocity.move_toward(input * speed, accel * delta) if Input.is_action_just_pressed("dash") and can_dash: _dash(input) move_and_slide() func _dash(direction: Vector2) -> void: can_dash = false velocity = direction * dash_speed await get_tree().create_timer(dash_cooldown).timeout can_dash = true
Игры и прототипы
Игровые системы и прототипы — от дизайн-документа до играбельной сборки.
- Godot
- GDScript
- Unreal Engine