88.1 — Teste de Code Blocks

Página de teste para verificar syntax highlighting e o componente CodeSwitch.


JavaScript / TypeScript

// Funções e variáveis
const API_URL = 'https://api.example.com';

async function fetchUsers() {
  const response = await fetch(API_URL + '/users');
  const data = await response.json();
  return data.filter(user => user.active);
}

// Classes
class UserService {
  #cache = new Map();

  async getUser(id) {
    if (this.#cache.has(id)) return this.#cache.get(id);
    const user = await fetchUsers().then(u => u.find(x => x.id === id));
    this.#cache.set(id, user);
    return user;
  }
}
// Interfaces e tipos
interface User {
  id: number;
  name: string;
  email: string;
  active: boolean;
}

type UserFilter = (user: User) => boolean;

// Funções tipadas
const API_URL: string = 'https://api.example.com';

async function fetchUsers(): Promise<User[]> {
  const response = await fetch(API_URL + '/users');
  const data: User[] = await response.json();
  return data.filter((user: User) => user.active);
}

// Classes tipadas
class UserService {
  #cache = new Map<number, User>();

  async getUser(id: number): Promise<User | undefined> {
    if (this.#cache.has(id)) return this.#cache.get(id);
    const user = await fetchUsers().then(u => u.find(x => x.id === id));
    if (user) this.#cache.set(id, user);
    return user;
  }
}

Svelte

<script>
  let count = $state(0);
  let doubled = $derived(count * 2);

  function increment() {
    count++;
  }
</script>

<button onclick={increment}>
  Clicks: {count} (dobro: {doubled})
</button>

<style>
  button {
    background: var(--color-svelte);
    color: white;
    padding: 0.5rem 1rem;
    border-radius: 0.5rem;
  }
</style>

CSS

/* Variáveis e seletores */
:root {
  --primary: #ff3e00;
  --bg: oklch(18% 0.02 260);
}

.card {
  background: var(--bg);
  border: 1px solid oklch(25% 0.02 260);
  border-radius: 0.75rem;
  padding: 1.5rem;
  transition: transform 0.2s ease;
}

.card:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}

@media (max-width: 640px) {
  .card { padding: 1rem; }
}

HTML

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Meu App Svelte</title>
  <script type="module" src="/src/main.js"></script>
</head>
<body>
  <div id="app"></div>
</body>
</html>

JSON

{
  "name": "meu-projeto",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite dev",
    "build": "vite build"
  },
  "dependencies": {
    "svelte": "^5.0.0"
  }
}

Bash

# Criando projeto e instalando dependências
npm create vite@latest meu-app -- --template svelte
cd meu-app
npm install
npm run dev

Texto simples (diagramas)

src/
├── lib/
│   ├── components/
│   │   ├── Header.svelte
│   │   └── Footer.svelte
│   └── utils/
│       └── helpers.js
├── routes/
│   ├── +page.svelte
│   └── +layout.svelte
└── app.html

CodeSwitch — JS / TS Toggle

Exemplo do componente CodeSwitch que permite alternar entre JavaScript e TypeScript:

// JavaScript — sem tipos
const API_URL = 'https://api.example.com';

async function fetchUsers() {
  const response = await fetch(API_URL + '/users');
  const data = await response.json();
  return data.filter(user => user.active);
}

function greet(name) {
  return `Olá, ${name}!`;
}

export { fetchUsers, greet };
// TypeScript — com tipos
const API_URL: string = 'https://api.example.com';

interface User {
  id: number;
  name: string;
  active: boolean;
}

async function fetchUsers(): Promise<User[]> {
  const response = await fetch(API_URL + '/users');
  const data: User[] = await response.json();
  return data.filter((user: User) => user.active);
}

function greet(name: string): string {
  return `Olá, ${name}!`;
}

export { fetchUsers, greet };

Segundo exemplo — Classes

class Counter {
  #count = 0;

  increment() {
    this.#count++;
  }

  get value() {
    return this.#count;
  }
}
class Counter {
  #count: number = 0;

  increment(): void {
    this.#count++;
  }

  get value(): number {
    return this.#count;
  }
}

Tip e Question

Componentes de destaque para dicas e perguntas frequentes.

Tip — título padrão

Dica
Você pode usar `npm init` como atalho para `npm init -y` quando quiser aceitar todos os valores padrão do `package.json`.

Tip — título customizado

Atenção
Nunca commite seu arquivo `.env` no repositório. Adicione-o ao `.gitignore` antes do primeiro commit.
Performance
O Svelte compila seus componentes em JavaScript puro — sem Virtual DOM. Isso significa menos overhead em runtime e melhor performance.

Question — simples

O que é NPM?
NPM (Node Package Manager) é o gerenciador de pacotes padrão do Node.js. Ele permite instalar, compartilhar e gerenciar dependências de bibliotecas externas no seu projeto.

Question — com código inline

Qual a diferença entre let e const?
`let` permite reatribuição da variável, enquanto `const` cria uma referência que não pode ser reatribuída. Ambos têm escopo de bloco. Use `const` por padrão e `let` apenas quando precisar reatribuir.

Question — explicação mais longa

Como funciona a reatividade no Svelte 5?
No Svelte 5, a reatividade é baseada em **runes**. O `$state()` cria variáveis reativas, `$derived()` calcula valores derivados automaticamente, e `$effect()` executa side effects quando dependências mudam. Diferente do Svelte 4, as runes funcionam em qualquer arquivo `.svelte.js` ou `.svelte.ts`, não apenas dentro de componentes.