IntraWeb 17 One
Crie a aplicação.
Chega de encanação
Crie uma única aplicação. O IntraWeb One separa o front-end e o back-end para você e os conecta automaticamente. Sem glue code. Sem camada de API. Sem trabalho chato de integração.





A CADEIA DE FERRAMENTAS
Chega de fadiga de ferramentas
O desenvolvimento web moderno hoje começa com árvores de dependências, pipelines de build e uma montanha de código de terceiros. O IntraWeb 17 FE corta o excesso, para que seu projeto comece pelo seu app.
- Totalmente integrado a um ambiente profissional: o VS Code
- Desenvolva 100% offline, sem depender da nuvem
- Depuração nativa profissional, sem malabarismo com sourcemaps
- O controle de versão GIT / SVN funciona exatamente como você espera
- Não é hospedagem nem SaaS: você é dono de cada byte gerado
A CADEIA DE FERRAMENTAS
Chega de fadiga de ferramentas
O desenvolvimento web moderno hoje começa com árvores de dependências, pipelines de build e uma montanha de código de terceiros. O IntraWeb 17 FE corta o excesso, para que seu projeto comece pelo seu app.
- Totalmente integrado a um ambiente profissional: o VS Code
- Desenvolva 100% offline, sem depender da nuvem
- Depuração nativa profissional, sem malabarismo com sourcemaps
- O controle de versão GIT / SVN funciona exatamente como você espera
- Não é hospedagem nem SaaS: você é dono de cada byte gerado
Veja com os próprios olhos
Como ele se diferencia das alternativas comuns

namespace GuessTemplate {
export class Index extends IndexGen {
public Count = 0;
// Must init to a value so it has a type and exists.
public Guess = NaN;
public Msg = '';
protected MagicNo = Math.floor((Math.random() * 100)+ 1);
public WhenPageLoaded(): void {
const xMagicNo = this.Page.WebParam('MagicNo');
if (xMagicNo)this.MagicNo = parseInt(xMagicNo);
}
public WhenGuessButtonClicked(e: MouseEvent): void {
if (e && e.shiftKey){
IntraWeb.Dialogs.ShowMessage('The magic number is: ' + this.MagicNo);
return;
}
this.Msg = '';
if (isNaN(this.Guess)) {
// Need to retrieve value from Edit itself when its an invalid number.
this.Msg = this.GuessEdit.Text.Value + ' is not a valid number.';
}else if (this.Guess < 1 || this.Guess > 100) {
this.Msg = this.Guess + ' is not in the range of 1 to 100.';
}else {
this.Count++;
if (this.Guess < this.MagicNo) {
this.Msg = this.Guess + ' is too low.';
}else if (this.Guess > this.MagicNo) {
this.Msg = this.Guess + ' is too high.';
}else if (this.Guess === this.MagicNo) {
IntraWeb.Dialogs.ShowMessage('Congratulations! You guessed the magic number.');
this.GuessButton.Enabled.Value = false;
}
}
this.GuessEdit.Focus();
this.Guess = NaN;
}
}
}import { useState, useRef, useEffect } from 'react'
const logo = '/Logo.png'
function App() {
const [guess, setGuess] = useState('')
const [msg, setMsg] = useState('')
const [count, setCount] = useState(0)
const [disabled, setDisabled] = useState(false)
const magicNo = useRef(Math.floor(Math.random() * 100) + 1)
const inputRef = useRef(null)
useEffect(() => {
const params = new URLSearchParams(window.location.search)
const magic = params.get('MagicNo')
if (magic) magicNo.current = parseInt(magic)
inputRef.current?.focus()
}, [])
function handleGuess(e) {
if (e && e.shiftKey) {
alert('The magic number is: ' + magicNo.current)
return
}
const num = parseInt(guess)
if (isNaN(num)) {
setMsg(guess + ' is not a valid number.')
} else if (num < 1 || num > 100) {
setMsg(num + ' is not in the range of 1 to 100.')
} else {
setCount(c => c + 1)
if (num < magicNo.current) {
setMsg(num + ' is too low.')
} else if (num > magicNo.current) {
setMsg(num + ' is too high.')
} else {
alert('Congratulations! You guessed the magic number.')
setMsg('')
setDisabled(true)
}
}
setGuess('')
inputRef.current?.focus()
}
function handleKeyDown(e) {
if (e.key === 'Enter' && !disabled) {
handleGuess(e)
}
}
return (
<div className="Card">
<div className="Logo">
<img src={logo} alt="Logo" />
</div>
<h1>Guess the Number</h1>
<p>I'm thinking of a number between 1 and 100. Can you guess it?</p>
<div className="Input">
<input
ref={inputRef}
type="number"
placeholder="Enter your guess..."
value={guess}
onChange={e => setGuess(e.target.value)}
onKeyDown={handleKeyDown}
disabled={disabled}
/>
</div>
<div className="Button">
<button onClick={handleGuess} disabled={disabled}>
Guess
</button>
</div>
<div className="Msg">{msg}</div>
{count > 0 && <div className="Counter">Attempts: {count}</div>}
<div className="FrameworkBadge">React</div>
</div>
)
}
export default App
namespace GuessTemplate {
export class Index extends IndexGen {
public Count = 0;
// Must init to a value so it has a type and exists.
public Guess = NaN;
public Msg = '';
protected MagicNo = Math.floor((Math.random() * 100)+ 1);
public WhenPageLoaded(): void {
const xMagicNo = this.Page.WebParam('MagicNo');
if (xMagicNo)this.MagicNo = parseInt(xMagicNo);
}
public WhenGuessButtonClicked(e: MouseEvent): void {
if (e && e.shiftKey){
IntraWeb.Dialogs.ShowMessage('The magic number is: ' + this.MagicNo);
return;
}
this.Msg = '';
if (isNaN(this.Guess)) {
// Need to retrieve value from Edit itself when its an invalid number.
this.Msg = this.GuessEdit.Text.Value + ' is not a valid number.';
}else if (this.Guess < 1 || this.Guess > 100) {
this.Msg = this.Guess + ' is not in the range of 1 to 100.';
}else {
this.Count++;
if (this.Guess < this.MagicNo) {
this.Msg = this.Guess + ' is too low.';
}else if (this.Guess > this.MagicNo) {
this.Msg = this.Guess + ' is too high.';
}else if (this.Guess === this.MagicNo) {
IntraWeb.Dialogs.ShowMessage('Congratulations! You guessed the magic number.');
this.GuessButton.Enabled.Value = false;
}
}
this.GuessEdit.Focus();
this.Guess = NaN;
}
}
}<template>
<div class="Card">
<div class="Logo">
<img src="/Logo.png" alt="Logo" />
</div>
<h1>Guess the Number</h1>
<p>I'm thinking of a number between 1 and 100. Can you guess it?</p>
<div class="Input">
<input
ref="inputRef"
v-model="guess"
type="number"
placeholder="Enter your guess..."
:disabled="disabled"
@keydown.enter="handleGuess"
/>
</div>
<div class="Button">
<button @click="handleGuess" :disabled="disabled">Guess</button>
</div>
<div class="Msg">{{ msg }}</div>
<div v-if="count > 0" class="Counter">Attempts: {{ count }}</div>
<div class="FrameworkBadge">Vue</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const guess = ref('')
const msg = ref('')
const count = ref(0)
const disabled = ref(false)
const inputRef = ref(null)
const params = new URLSearchParams(window.location.search)
const magicNo = params.get('MagicNo')
? parseInt(params.get('MagicNo'))
: Math.floor(Math.random() * 100) + 1
onMounted(() => {
inputRef.value?.focus()
})
function handleGuess(e) {
if (e?.shiftKey) {
alert('The magic number is: ' + magicNo)
return
}
const num = parseInt(guess.value)
if (isNaN(num)) {
msg.value = guess.value + ' is not a valid number.'
} else if (num < 1 || num > 100) {
msg.value = num + ' is not in the range of 1 to 100.'
} else {
count.value++
if (num < magicNo) {
msg.value = num + ' is too low.'
} else if (num > magicNo) {
msg.value = num + ' is too high.'
} else {
alert('Congratulations! You guessed the magic number.')
msg.value = ''
disabled.value = true
}
}
guess.value = ''
inputRef.value?.focus()
}
</script>
namespace GuessTemplate {
export class Index extends IndexGen {
public Count = 0;
// Must init to a value so it has a type and exists.
public Guess = NaN;
public Msg = '';
protected MagicNo = Math.floor((Math.random() * 100)+ 1);
public WhenPageLoaded(): void {
const xMagicNo = this.Page.WebParam('MagicNo');
if (xMagicNo)this.MagicNo = parseInt(xMagicNo);
}
public WhenGuessButtonClicked(e: MouseEvent): void {
if (e && e.shiftKey){
IntraWeb.Dialogs.ShowMessage('The magic number is: ' + this.MagicNo);
return;
}
this.Msg = '';
if (isNaN(this.Guess)) {
// Need to retrieve value from Edit itself when its an invalid number.
this.Msg = this.GuessEdit.Text.Value + ' is not a valid number.';
}else if (this.Guess < 1 || this.Guess > 100) {
this.Msg = this.Guess + ' is not in the range of 1 to 100.';
}else {
this.Count++;
if (this.Guess < this.MagicNo) {
this.Msg = this.Guess + ' is too low.';
}else if (this.Guess > this.MagicNo) {
this.Msg = this.Guess + ' is too high.';
}else if (this.Guess === this.MagicNo) {
IntraWeb.Dialogs.ShowMessage('Congratulations! You guessed the magic number.');
this.GuessButton.Enabled.Value = false;
}
}
this.GuessEdit.Focus();
this.Guess = NaN;
}
}
}// app.html
<div class="Card">
<div class="Logo">
<img src="Logo.png" alt="Logo" />
</div>
<h1>Guess the Number</h1>
<p>I'm thinking of a number between 1 and 100. Can you guess it?</p>
<div class="Input">
<input
#inputRef
[ngModel]="guess()"
(ngModelChange)="guess.set($event)"
type="number"
placeholder="Enter your guess..."
[disabled]="disabled()"
(keydown.enter)="handleGuess($event)"
/>
</div>
<div class="Button">
<button (click)="handleGuess($event)" [disabled]="disabled()">Guess</button>
</div>
<div class="Msg">{{ msg() }}</div>
@if (count() > 0) {
<div class="Counter">Attempts: {{ count() }}</div>
}
<div class="FrameworkBadge">Angular</div>
</div>
// app.ts
import { Component, signal, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-root',
imports: [FormsModule],
templateUrl: './app.html',
styleUrl: './app.scss'
})
export class App implements AfterViewInit {
@ViewChild('inputRef') inputRef!: ElementRef<HTMLInputElement>;
readonly guess = signal('');
readonly msg = signal('');
readonly count = signal(0);
readonly disabled = signal(false);
private readonly magicNo: number;
constructor() {
const params = new URLSearchParams(window.location.search);
const fromQuery = params.get('MagicNo');
this.magicNo = fromQuery
? parseInt(fromQuery, 10)
: Math.floor(Math.random() * 100) + 1;
}
ngAfterViewInit(): void {
this.inputRef.nativeElement.focus();
}
handleGuess(event?: Event): void {
if ((event as KeyboardEvent | MouseEvent | undefined)?.shiftKey) {
alert('The magic number is: ' + this.magicNo);
return;
}
const raw = this.guess();
const num = parseInt(raw, 10);
if (isNaN(num)) {
this.msg.set(raw + ' is not a valid number.');
} else if (num < 1 || num > 100) {
this.msg.set(num + ' is not in the range of 1 to 100.');
} else {
this.count.update(c => c + 1);
if (num < this.magicNo) {
this.msg.set(num + ' is too low.');
} else if (num > this.magicNo) {
this.msg.set(num + ' is too high.');
} else {
alert('Congratulations! You guessed the magic number.');
this.msg.set('');
this.disabled.set(true);
}
}
this.guess.set('');
this.inputRef.nativeElement.focus();
}
}
Blocos
HTML personalizado
para WordPress
Uma das formas mais visuais de integrar o IntraWeb a um site WordPress existente: projete o bloco no IntraWeb, publique os arquivos gerados e coloque o app dentro do WordPress com o bloco nativo «HTML personalizado».
Do designer do IntraWeb a uma página WordPress ao vivo
Crie o bloco visualmente, publique os arquivos gerados e coloque o app IntraWeb em funcionamento dentro do WordPress com um bloco nativo «HTML personalizado».
Vamos mostrar com o exemplo de uma seção de reservasProjete e publique o bloco do IntraWeb
Construa a interface visualmente no designer do IntraWeb e publique no servidor os arquivos HTML, CSS, JavaScript e de configuração gerados. Neste exemplo, o bloco é um formulário de reserva que consegue salvar os dados enviados.
Designer do IntraWeb
Arquivos do projeto publicados
Adicione o HTML personalizado e conecte o app
No WordPress, adicione o bloco HTML personalizado nativo exatamente onde a aplicação IntraWeb deve aparecer. Depois cole um pequeno trecho que carrega o app publicado.
HTML personalizado do WordPress
Conecte o bloco
O formulário do IntraWeb já está no ar dentro do WordPress
O formulário aparece embutido como uma seção normal da página do WordPress. O WordPress controla o layout da página, enquanto o IntraWeb mantém a lógica da aplicação limpa, separada e sob o controle do desenvolvedor.
Mais de três décadas de engenharia web prática: das primeiras ferramentas comerciais ao IntraWeb de hoje
Atozed Software: O original pioneiro da web
Já estávamos aqui antes de
a Web virar moda
Em 1994, os navegadores eram primitivos e o JavaScript nem existia. Enquanto o mundo ainda aprendia a lidar com a conexão discada, Chad Z. já lançava as primeiras ferramentas comerciais de desenvolvimento web do mundo. Antes do ASP, antes do PHP e antes das guerras de frameworks, nós já ligávamos a lógica de negócio à internet.
Internet Application
Gateway
Esta captura de tela granulada é um pedaço da história. Ela mostra o nascimento do Internet Application Gateway (IAG), antecessor do IntraWeb. Numa época em que a maioria dos sistemas dinâmicos era código cru cuspindo strings de HTML, o IAG funcionava como uma camada de gateway entre a lógica de negócio e o HTTP.

Mais de 30 anos de tradição em engenharia
Do IAG em meados dos anos 90 e do Web Solution Builder em 1996 até o IntraWeb de hoje, nossa história é uma linha contínua de disciplina de engenharia. Não corremos atrás de modismos porque entendemos os fundamentos.
Mais de três décadas de engenharia web prática: das primeiras ferramentas comerciais ao IntraWeb de hoje
Atozed Software: O original pioneiro da web
Já estávamos aqui antes de a Web virar moda
Em 1994, os navegadores eram primitivos e o JavaScript nem existia. Enquanto o mundo ainda aprendia a lidar com a conexão discada, Chad Z. já lançava as primeiras ferramentas comerciais de desenvolvimento web do mundo. Antes do ASP, antes do PHP e antes das guerras de frameworks, nós já ligávamos a lógica de negócio à internet.
Internet Application Gateway
Esta captura de tela granulada é um pedaço da história. Ela mostra o nascimento do Internet Application Gateway (IAG), antecessor do IntraWeb. Numa época em que a maioria dos sistemas dinâmicos era código cru cuspindo strings de HTML, o IAG funcionava como uma camada de gateway entre a lógica de negócio e o HTTP.

Mais de 30 anos de tradição em engenharia
Do IAG em meados dos anos 90 e do Web Solution Builder em 1996 até o IntraWeb de hoje, nossa história é uma linha contínua de disciplina de engenharia.
Seja um dos primeiros a construir assim.
Participe da beta do IntraWeb 17 FE. Contato direto com a equipe de engenharia. Licença Studio gratuita no primeiro ano após o lançamento. Feedback sincero, sem NDAs.
ou simplesmente
Entre no nosso canal do Telegram