Skip to content

Commit 859ff4d

Browse files
Merge pull request #103 from CodandoTV/feature/add-craftd-image-clean
feat: add CraftDImage component for Android/KMP
2 parents 5be5c3e + 3c81ca1 commit 859ff4d

38 files changed

Lines changed: 903 additions & 199 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Android / KMP — Instruções de plataforma
2+
3+
> Leia este arquivo ao iniciar qualquer task Android/KMP. Ignore `ios/` e `flutter/`.
4+
5+
---
6+
7+
## Abstrações principais
8+
9+
| Classe | Papel |
10+
|---|---|
11+
| `CraftDBuilder` | Interface base para criar componentes |
12+
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
13+
| `CraftDynamic` | Composable principal que renderiza o SDUI |
14+
| `SimpleProperties` | Modelo base de dados (`key` + `value` JSON) |
15+
| `ActionProperties` | Dados de ação (deeplink + analytics) |
16+
| `CraftDComponentKey` | Enum com as chaves de componentes built-in |
17+
| `CraftDViewListener` | Callback de ações para o consumidor |
18+
19+
---
20+
21+
## Estrutura de pastas
22+
23+
### craftd-core (modelos e abstrações)
24+
```
25+
commonMain/
26+
data/
27+
model/
28+
base/ → SimpleProperties, SimplePropertiesResponse
29+
action/ → ActionProperties, AnalyticsProperties
30+
[name]/ → [Name]Properties.kt para cada componente
31+
domain/ → enums e sealed classes (CraftDAlign, CraftDTextStyle)
32+
presentation/ → CraftDViewListener, CraftDComponentKey
33+
extensions/ → funções de extensão
34+
```
35+
36+
### craftd-compose (implementação Compose/KMP)
37+
```
38+
commonMain/
39+
builder/ → CraftDBuilder.kt (interface), CraftDBuilderManager.kt
40+
ui/
41+
[name]/
42+
CraftD[Name].kt → o @Composable do componente
43+
CraftD[Name]Builder.kt → implementa CraftDBuilder
44+
extensions/ → funções utilitárias Compose
45+
```
46+
47+
### craftd-xml (implementação View System)
48+
```
49+
src/main/kotlin/.../
50+
ui/
51+
[name]/
52+
CraftD[Name]Component.kt → custom View
53+
CraftD[Name]ComponentRender.kt → implementa CraftDViewRenderer
54+
builder/
55+
CraftDBuilderManager.kt → getBuilderRenders()
56+
```
57+
58+
### Padrão por novo componente (exemplo: CraftDFoo)
59+
60+
1. `craftd-core/commonMain/data/model/foo/FooProperties.kt` — data class do modelo
61+
2. `craftd-compose/commonMain/ui/foo/CraftDFoo.kt` — composable
62+
3. `craftd-compose/commonMain/ui/foo/CraftDFooBuilder.kt` — builder
63+
4. `craftd-xml/src/main/kotlin/.../ui/foo/CraftDFooComponent.kt` — custom View
64+
5. `craftd-xml/src/main/kotlin/.../ui/foo/CraftDFooComponentRender.kt` — render
65+
6. Registrar no `CraftDBuilderManager` de cada módulo
66+
7. Adicionar ao `app-sample-android` (Compose + XML) e ao `dynamic.json`
67+
68+
---
69+
70+
## Princípios Compose
71+
72+
- Composables **stateless** — estado vem do caller (state hoisting)
73+
- Todo componente expõe `modifier: Modifier = Modifier`
74+
- Sem valores hardcoded de cor ou tipografia — usar `MaterialTheme.colorScheme` e `MaterialTheme.typography`
75+
- Todo componente interativo: touch target mínimo de 48x48dp
76+
77+
## Build
78+
79+
- Dependências sempre via `libs.versions.toml` — nunca versão hardcoded no `build.gradle.kts`
80+
- Configuração compartilhada entre módulos vai em convention plugin no `build-logic/`
81+
- Rodar `./gradlew build` em `android_kmp/` após cada task antes de marcar `[x]`
82+
83+
## Testes
84+
85+
- JUnit4 + MockK para testes Android
86+
- `kotlin("test")` + `kotlinx.serialization` + `compose.runtime` para commonTest
87+
- Nomenclatura em backtick: `` `given X when Y then Z` ``
88+
- Path espelha o source: `src/commonTest/kotlin/...`
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Flutter — Instruções de plataforma
2+
3+
> Leia este arquivo ao iniciar qualquer task Flutter. Ignore `android_kmp/` e `ios/`.
4+
5+
---
6+
7+
## Abstrações principais
8+
9+
| Classe | Papel |
10+
|---|---|
11+
| `CraftDynamic` | Widget principal que renderiza o SDUI |
12+
| `CraftDViewListener` | Callback de ações para o consumidor |
13+
| `SimpleProperties` | Modelo base de dados |
14+
| `ActionProperties` | Dados de ação (deeplink + analytics) |
15+
| `CraftDAlign` | Alinhamento de componentes |
16+
17+
---
18+
19+
## Estrutura de pastas
20+
21+
```
22+
flutter/craftd_widget/
23+
lib/
24+
src/
25+
builder/ → CraftDBuilder (abstract), CraftDBuilderManager
26+
ui/
27+
[name]/
28+
craftd_[name].dart → Widget do componente
29+
craftd_[name]_builder.dart → implementa CraftDBuilder
30+
model/
31+
[name]_properties.dart → classe do modelo
32+
```
33+
34+
## Padrão por novo componente (exemplo: CraftDFoo)
35+
36+
1. `lib/src/model/foo_properties.dart` — classe do modelo
37+
2. `lib/src/ui/foo/craftd_foo.dart` — Widget
38+
3. `lib/src/ui/foo/craftd_foo_builder.dart` — implementa CraftDBuilder
39+
4. Registrar no `CraftDBuilderManager`
40+
5. Adicionar ao sample app Flutter
41+
42+
## Convenções
43+
44+
- Nomes de arquivos em `snake_case`
45+
- Classes em `PascalCase` com prefixo `CraftD`
46+
- Dependências externas (ex: cached_network_image) injetadas via construtor, nunca acopladas no builder
47+
48+
## Referência
49+
50+
Consultar `CraftDButton` / `CraftDButtonBuilder` como padrão antes de criar algo novo.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# iOS / SwiftUI — Instruções de plataforma
2+
3+
> Leia este arquivo ao iniciar qualquer task iOS. Ignore `android_kmp/` e `flutter/`.
4+
5+
---
6+
7+
## Abstrações principais
8+
9+
| Classe | Papel |
10+
|---|---|
11+
| `CraftDBuilder` | Protocol base para criar componentes |
12+
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
13+
| `CraftDynamic` | View principal que renderiza o SDUI |
14+
| `SimpleProperties` | Modelo base de dados |
15+
| `ActionProperties` | Dados de ação (deeplink + analytics) |
16+
| `CraftDViewListener` | Callback de ações para o consumidor |
17+
18+
---
19+
20+
## Estrutura de pastas
21+
22+
```
23+
ios/craftd-swiftui/
24+
Sources/CraftD/
25+
builder/ → CraftDBuilder.swift (protocol), CraftDBuilderManager.swift
26+
ui/
27+
[name]/
28+
CraftD[Name].swift → SwiftUI View do componente
29+
CraftD[Name]Builder.swift → implementa CraftDBuilder
30+
model/
31+
[Name]Properties.swift → struct do modelo
32+
```
33+
34+
## Padrão por novo componente (exemplo: CraftDFoo)
35+
36+
1. `Sources/CraftD/model/FooProperties.swift` — struct do modelo
37+
2. `Sources/CraftD/ui/foo/CraftDFoo.swift` — SwiftUI View
38+
3. `Sources/CraftD/ui/foo/CraftDFooBuilder.swift` — implementa CraftDBuilder
39+
4. Registrar no `CraftDBuilderManager`
40+
5. Adicionar ao sample app iOS
41+
42+
## Referência
43+
44+
Consultar `CraftDButton` / `CraftDButtonBuilder` como padrão antes de criar algo novo.

.claude/skills/android-accessibility/SKILL.md

Lines changed: 0 additions & 34 deletions
This file was deleted.

.claude/skills/android-testing/SKILL.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ description: Testing strategies for Android/KMP. Use when creating or reviewing
1010
| Nível | Foco | Ferramentas |
1111
|---|---|---|
1212
| Unit | Lógica isolada (ViewModels, Repositories, Builders) | JUnit4, MockK |
13-
| Integration | Interação entre componentes | AndroidX Test, Hilt |
13+
| Integration | Interação entre componentes | AndroidX Test |
1414
| Screenshot | Verificação visual de UI | Roborazzi (roda na JVM, sem emulador) |
1515

1616
## Padrão no CraftD
@@ -62,12 +62,3 @@ androidUnitTest.dependencies {
6262
./gradlew recordRoborazziDebug # grava baseline
6363
./gradlew verifyRoborazziDebug # verifica regressão
6464
```
65-
66-
## Hilt em testes
67-
68-
```kotlin
69-
@HiltAndroidTest
70-
class MyTest {
71-
@get:Rule val hiltRule = HiltAndroidRule(this)
72-
}
73-
```

.claude/skills/compose-performance-audit/SKILL.md

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)