hoomanjs 1.47.0 → 1.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -18
- package/dist/acp/acp-agent.d.ts +3 -3
- package/dist/acp/acp-agent.js +16 -11
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.js +11 -10
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/browser.d.ts +9 -0
- package/dist/acp/browser.js +23 -0
- package/dist/acp/browser.js.map +1 -0
- package/dist/acp/meta/vscode.d.ts +8 -7
- package/dist/acp/meta/vscode.js +10 -11
- package/dist/acp/meta/vscode.js.map +1 -1
- package/dist/acp/sessions/store.d.ts +3 -3
- package/dist/acp/utils/tool-kind.js +6 -6
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/chat/app.js +16 -9
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/approvals.js +3 -0
- package/dist/chat/approvals.js.map +1 -1
- package/dist/chat/components/ApprovalPrompt.js +11 -22
- package/dist/chat/components/ApprovalPrompt.js.map +1 -1
- package/dist/chat/components/StatusBar.js +3 -0
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/chat/types.d.ts +3 -0
- package/dist/cli.js +162 -44
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +46 -29
- package/dist/configure/app.js.map +1 -1
- package/dist/core/agent/default-retry-strategy.js +46 -12
- package/dist/core/agent/default-retry-strategy.js.map +1 -1
- package/dist/core/agent/gitignore-guard-plugin.js +17 -2
- package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
- package/dist/core/agent/index.js +37 -7
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/approvals/allowlist.js +1 -0
- package/dist/core/approvals/allowlist.js.map +1 -1
- package/dist/core/approvals/intervention.d.ts +10 -2
- package/dist/core/approvals/intervention.js +46 -8
- package/dist/core/approvals/intervention.js.map +1 -1
- package/dist/core/config.d.ts +9 -2
- package/dist/core/config.js +8 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/mcp/oauth/service.js +2 -2
- package/dist/core/mcp/oauth/service.js.map +1 -1
- package/dist/core/models/bedrock.js +6 -0
- package/dist/core/models/bedrock.js.map +1 -1
- package/dist/core/models/groq.js +34 -14
- package/dist/core/models/groq.js.map +1 -1
- package/dist/core/models/minimax.js +1 -1
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/types.d.ts +10 -2
- package/dist/core/models/types.js +1 -0
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/modes/definitions.d.ts +4 -2
- package/dist/core/modes/definitions.js +73 -9
- package/dist/core/modes/definitions.js.map +1 -1
- package/dist/core/modes/index.d.ts +1 -1
- package/dist/core/modes/index.js +1 -1
- package/dist/core/modes/index.js.map +1 -1
- package/dist/core/modes/registry.js +4 -9
- package/dist/core/modes/registry.js.map +1 -1
- package/dist/core/modes/schema.d.ts +1 -1
- package/dist/core/modes/schema.js +1 -1
- package/dist/core/modes/schema.js.map +1 -1
- package/dist/core/prompts/agents/{review.md → code-review.md} +2 -2
- package/dist/core/prompts/agents/design-review.md +35 -0
- package/dist/core/prompts/agents/{test-investigator.md → quality-analyst.md} +2 -2
- package/dist/core/prompts/modes/agent.md +2 -0
- package/dist/core/prompts/modes/ask.md +2 -2
- package/dist/core/prompts/modes/design.md +37 -0
- package/dist/core/prompts/modes/plan.md +5 -5
- package/dist/core/prompts/{runtime.js → runtime/agents.js} +2 -2
- package/dist/core/prompts/runtime/agents.js.map +1 -0
- package/dist/core/prompts/runtime/design.d.ts +11 -0
- package/dist/core/prompts/runtime/design.js +78 -0
- package/dist/core/prompts/runtime/design.js.map +1 -0
- package/dist/core/prompts/{session-mode-appendix.js → session-mode.js} +1 -1
- package/dist/core/prompts/session-mode.js.map +1 -0
- package/dist/core/prompts/static/ask-user.md +3 -2
- package/dist/core/prompts/static/fetch.md +2 -1
- package/dist/core/prompts/static/filesystem.md +2 -1
- package/dist/core/prompts/static/subagents.md +2 -1
- package/dist/core/prompts/static/switch-mode.md +10 -0
- package/dist/core/prompts/system.d.ts +1 -0
- package/dist/core/prompts/system.js +11 -3
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/shell/index.d.ts +1 -1
- package/dist/core/shell/index.js +1 -1
- package/dist/core/shell/{shell.js → tools.js} +1 -1
- package/dist/core/shell/{shell.js.map → tools.js.map} +1 -1
- package/dist/core/skills/built-in/hooman-config/SKILL.md +30 -35
- package/dist/core/skills/built-in/hooman-config/search.md +5 -3
- package/dist/core/skills/built-in/hooman-design/SKILL.md +97 -0
- package/dist/core/skills/built-in/hooman-design/assets/article-shell.html +87 -0
- package/dist/core/skills/built-in/hooman-design/assets/auth-shell.html +143 -0
- package/dist/core/skills/built-in/hooman-design/assets/business-card-shell.html +112 -0
- package/dist/core/skills/built-in/hooman-design/assets/contact-shell.html +181 -0
- package/dist/core/skills/built-in/hooman-design/assets/dashboard-shell.html +90 -0
- package/dist/core/skills/built-in/hooman-design/assets/data-table-shell.html +114 -0
- package/dist/core/skills/built-in/hooman-design/assets/deck-shell.html +187 -0
- package/dist/core/skills/built-in/hooman-design/assets/dialog-shell.html +98 -0
- package/dist/core/skills/built-in/hooman-design/assets/email-shell.html +101 -0
- package/dist/core/skills/built-in/hooman-design/assets/empty-state-shell.html +92 -0
- package/dist/core/skills/built-in/hooman-design/assets/flyer-shell.html +168 -0
- package/dist/core/skills/built-in/hooman-design/assets/invite-shell.html +167 -0
- package/dist/core/skills/built-in/hooman-design/assets/landing-shell.html +184 -0
- package/dist/core/skills/built-in/hooman-design/assets/mobile-frame-shell.html +109 -0
- package/dist/core/skills/built-in/hooman-design/assets/newsletter-shell.html +141 -0
- package/dist/core/skills/built-in/hooman-design/assets/onboarding-shell.html +131 -0
- package/dist/core/skills/built-in/hooman-design/assets/pricing-shell.html +160 -0
- package/dist/core/skills/built-in/hooman-design/assets/prototype-shell.html +83 -0
- package/dist/core/skills/built-in/hooman-design/assets/resume-shell.html +228 -0
- package/dist/core/skills/built-in/hooman-design/assets/settings-shell.html +196 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/botanical-calm.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/copper-ledger.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/editorial-ink.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/fintech-clear.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/harbor-navy.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/midnight-editorial.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/night-console.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/paper-mono.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/signal-mono.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/soft-product.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/swiss-grid.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/warm-atelier.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/waitlist-shell.html +139 -0
- package/dist/core/skills/built-in/hooman-design/craft/accessibility-baseline.md +32 -0
- package/dist/core/skills/built-in/hooman-design/craft/anti-ai-slop.md +27 -0
- package/dist/core/skills/built-in/hooman-design/craft/color-surfaces.md +45 -0
- package/dist/core/skills/built-in/hooman-design/craft/data-viz.md +24 -0
- package/dist/core/skills/built-in/hooman-design/craft/deck-slides.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/forms-validation.md +35 -0
- package/dist/core/skills/built-in/hooman-design/craft/iconography.md +19 -0
- package/dist/core/skills/built-in/hooman-design/craft/layout-overflow.md +31 -0
- package/dist/core/skills/built-in/hooman-design/craft/motion.md +41 -0
- package/dist/core/skills/built-in/hooman-design/craft/print.md +37 -0
- package/dist/core/skills/built-in/hooman-design/craft/responsive.md +30 -0
- package/dist/core/skills/built-in/hooman-design/craft/spacing-density.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/state-coverage.md +21 -0
- package/dist/core/skills/built-in/hooman-design/craft/typography.md +73 -0
- package/dist/core/skills/built-in/hooman-design/directions.md +115 -0
- package/dist/core/skills/built-in/hooman-design/references/artifact-layout.md +15 -0
- package/dist/core/skills/built-in/hooman-design/references/export.md +47 -0
- package/dist/core/skills/built-in/hooman-design/references/workflow.md +80 -0
- package/dist/core/skills/built-in/hooman-mcp/SKILL.md +2 -2
- package/dist/core/state/llm-modality.d.ts +13 -0
- package/dist/core/state/llm-modality.js +19 -0
- package/dist/core/state/llm-modality.js.map +1 -0
- package/dist/core/state/plan.d.ts +1 -1
- package/dist/core/state/plan.js +1 -1
- package/dist/core/state/tool-approvals.d.ts +12 -9
- package/dist/core/state/tool-approvals.js +91 -52
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/state/turn-boundaries.d.ts +1 -1
- package/dist/core/state/turn-boundaries.js +1 -1
- package/dist/core/subagents/index.d.ts +1 -1
- package/dist/core/subagents/index.js +1 -1
- package/dist/core/subagents/registry.js +15 -6
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/tool.d.ts +8 -2
- package/dist/core/subagents/tool.js +93 -44
- package/dist/core/subagents/tool.js.map +1 -1
- package/dist/core/tools/ask-user.d.ts +1 -1
- package/dist/core/tools/ask-user.js +1 -1
- package/dist/core/tools/export.d.ts +8 -0
- package/dist/core/tools/export.js +202 -0
- package/dist/core/tools/export.js.map +1 -0
- package/dist/core/tools/fetch.d.ts +2 -0
- package/dist/core/tools/fetch.js +92 -55
- package/dist/core/tools/fetch.js.map +1 -1
- package/dist/core/tools/filesystem.d.ts +2 -1
- package/dist/core/tools/filesystem.js +38 -4
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/index.d.ts +3 -1
- package/dist/core/tools/index.js +3 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/preview.d.ts +10 -0
- package/dist/core/tools/preview.js +147 -0
- package/dist/core/tools/preview.js.map +1 -0
- package/dist/core/tools/switch-mode.d.ts +6 -0
- package/dist/core/tools/switch-mode.js +188 -0
- package/dist/core/tools/switch-mode.js.map +1 -0
- package/dist/core/tools/web-search.js +176 -0
- package/dist/core/tools/web-search.js.map +1 -1
- package/dist/core/utils/browser.d.ts +8 -1
- package/dist/core/utils/browser.js +17 -1
- package/dist/core/utils/browser.js.map +1 -1
- package/dist/core/utils/export-design.d.ts +40 -0
- package/dist/core/utils/export-design.js +188 -0
- package/dist/core/utils/export-design.js.map +1 -0
- package/dist/core/utils/export-figma.d.ts +17 -0
- package/dist/core/utils/export-figma.js +189 -0
- package/dist/core/utils/export-figma.js.map +1 -0
- package/dist/core/utils/export-sketch.d.ts +11 -0
- package/dist/core/utils/export-sketch.js +456 -0
- package/dist/core/utils/export-sketch.js.map +1 -0
- package/dist/core/utils/fig-archive.d.ts +47 -0
- package/dist/core/utils/fig-archive.js +181 -0
- package/dist/core/utils/fig-archive.js.map +1 -0
- package/dist/core/utils/metadata.d.ts +30 -0
- package/dist/core/utils/metadata.js +122 -0
- package/dist/core/utils/metadata.js.map +1 -1
- package/dist/core/utils/models-prefetch.d.ts +53 -0
- package/dist/core/utils/models-prefetch.js +469 -0
- package/dist/core/utils/models-prefetch.js.map +1 -0
- package/dist/core/utils/onboarding-config.d.ts +48 -0
- package/dist/core/utils/onboarding-config.js +373 -0
- package/dist/core/utils/onboarding-config.js.map +1 -0
- package/dist/core/utils/paths.d.ts +9 -7
- package/dist/core/utils/paths.js +12 -10
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/core/utils/preview-server.d.ts +20 -0
- package/dist/core/utils/preview-server.js +212 -0
- package/dist/core/utils/preview-server.js.map +1 -0
- package/dist/core/utils/search-probe.d.ts +19 -0
- package/dist/core/utils/search-probe.js +165 -0
- package/dist/core/utils/search-probe.js.map +1 -0
- package/dist/core/utils/seeds/empty-slides.deck +0 -0
- package/dist/core/utils/url-safety.d.ts +2 -0
- package/dist/core/utils/url-safety.js +47 -0
- package/dist/core/utils/url-safety.js.map +1 -0
- package/dist/core/utils/zstd.d.ts +6 -0
- package/dist/core/utils/zstd.js +39 -0
- package/dist/core/utils/zstd.js.map +1 -0
- package/dist/exec/approvals.js +5 -5
- package/dist/exec/approvals.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/onboarding/app.d.ts +5 -0
- package/dist/onboarding/app.js +255 -0
- package/dist/onboarding/app.js.map +1 -0
- package/dist/onboarding/index.d.ts +5 -0
- package/dist/onboarding/index.js +27 -0
- package/dist/onboarding/index.js.map +1 -0
- package/package.json +16 -3
- package/dist/core/prompts/runtime.js.map +0 -1
- package/dist/core/prompts/session-mode-appendix.js.map +0 -1
- package/dist/core/prompts/static/planning.md +0 -3
- package/dist/core/tools/plan.d.ts +0 -5
- package/dist/core/tools/plan.js +0 -150
- package/dist/core/tools/plan.js.map +0 -1
- /package/dist/core/prompts/{runtime.d.ts → runtime/agents.d.ts} +0 -0
- /package/dist/core/prompts/{session-mode-appendix.d.ts → session-mode.d.ts} +0 -0
- /package/dist/core/shell/{shell.d.ts → tools.d.ts} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hooman-config
|
|
3
|
-
description: Read and update Hooman's own ~/.hooman/config.json and instructions.md. Use when the user asks about Hooman's config, custom instructions, agent name, model providers, LLMs/models, API keys, reasoning options, global reasoning display, web search settings, tool or prompt toggles, or
|
|
3
|
+
description: Read and update Hooman's own ~/.hooman/config.json and instructions.md. Use when the user asks about Hooman's config, custom instructions, agent name, model providers, LLMs/models, API keys, reasoning options, global reasoning display, web search settings, tool or prompt toggles, compaction, or first-run setup (`hooman setup`). Not for MCP servers (use hooman-mcp), channel integrations (hooman-channels), or installed skills (hooman-skills).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Hooman Config
|
|
@@ -23,10 +23,17 @@ Read these files (next to this SKILL.md) only when the task needs the details th
|
|
|
23
23
|
|
|
24
24
|
## Effective Runtime View
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
the
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
When `~/.hooman/config.json` is missing, the CLI (`hooman` / `hooman setup`) and
|
|
27
|
+
the VS Code chat panel run a first-run **setup** wizard: pick inference + search,
|
|
28
|
+
validate credentials, then write `config.json` with that provider's chat LLMs.
|
|
29
|
+
Do not invent a dual llama.cpp+MLX file as "what setup wrote" — setup writes
|
|
30
|
+
only the chosen provider (and the chosen search block).
|
|
31
|
+
|
|
32
|
+
Use `hooman config` to open the interactive configuration UI (same as chat
|
|
33
|
+
`/config`). Pass `hooman config --debug` (or `-d`) to dump the merged runtime
|
|
34
|
+
`config.json` for the current working directory (home config plus repo-local
|
|
35
|
+
`.hooman/config.json` overlays walked from git root to the current directory)
|
|
36
|
+
with credential-like values redacted.
|
|
30
37
|
|
|
31
38
|
## Read/Write Rules
|
|
32
39
|
|
|
@@ -35,12 +42,15 @@ overlays walked from git root to the current directory). The command prints full
|
|
|
35
42
|
3. `name`, `providers`, and `llms` are required. `providers` stores shared credentials/config, and `llms` must be a **non-empty array** of entries that reference provider names (see `providers.md`). `search`, `prompts`, `tools`, `compaction`, and top-level `reasoning` are optional in input, but Hooman expands them with defaults when loading.
|
|
36
43
|
4. Unknown keys are unsupported and may be dropped when Hooman parses and persists the config.
|
|
37
44
|
5. `tools` only manages built-in runtime toggles exposed in `config.json`.
|
|
38
|
-
6. Any change to `config.json` or `instructions.md` requires restarting the running Hooman agent/session before it takes effect.
|
|
45
|
+
6. Any change to `config.json` or `instructions.md` requires restarting the running Hooman agent/session before it takes effect. Running `hooman config` or chat `/config` applies this automatically when you return to an interactive session: chat reloads config and re-bootstraps on exit.
|
|
39
46
|
7. When editing `providers` or `llms`, preserve unrelated entries and API keys unless the user asks to remove or replace them.
|
|
40
47
|
|
|
41
48
|
## Full Config Shape
|
|
42
49
|
|
|
43
|
-
|
|
50
|
+
Example of what **first-run setup** writes when the user picks llama.cpp +
|
|
51
|
+
DuckDuckGo (hosted providers look the same with that provider's credentials and
|
|
52
|
+
prefetched `llms`; MLX is the same shape with `provider: "mlx"` and MLX model
|
|
53
|
+
ids). Preferred model is `default: true`; other listed chat LLMs follow:
|
|
44
54
|
|
|
45
55
|
```json
|
|
46
56
|
{
|
|
@@ -50,11 +60,6 @@ This is the default shape Hooman writes when `~/.hooman/config.json` is missing:
|
|
|
50
60
|
"name": "llama.cpp",
|
|
51
61
|
"provider": "llama-cpp",
|
|
52
62
|
"options": {}
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"name": "mlx",
|
|
56
|
-
"provider": "mlx",
|
|
57
|
-
"options": { "promptCache": {} }
|
|
58
63
|
}
|
|
59
64
|
],
|
|
60
65
|
"llms": [
|
|
@@ -65,7 +70,8 @@ This is the default shape Hooman writes when `~/.hooman/config.json` is missing:
|
|
|
65
70
|
"model": "unsloth/gemma-4-E2B-it-GGUF:Q4_K_M",
|
|
66
71
|
"context": 131072
|
|
67
72
|
},
|
|
68
|
-
"
|
|
73
|
+
"metadata": { "name": "unsloth/gemma-4-E2B-it-GGUF:Q4_K_M" },
|
|
74
|
+
"default": true
|
|
69
75
|
},
|
|
70
76
|
{
|
|
71
77
|
"name": "Qwen3.5 2B (llama.cpp)",
|
|
@@ -74,31 +80,15 @@ This is the default shape Hooman writes when `~/.hooman/config.json` is missing:
|
|
|
74
80
|
"model": "unsloth/Qwen3.5-2B-MTP-GGUF:Q4_K_M",
|
|
75
81
|
"context": 262144
|
|
76
82
|
},
|
|
77
|
-
"
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"name": "Gemma 4 E2B (MLX)",
|
|
81
|
-
"provider": "mlx",
|
|
82
|
-
"options": {
|
|
83
|
-
"model": "mlx-community/gemma-4-e2b-it-OptiQ-4bit",
|
|
84
|
-
"context": 131072
|
|
85
|
-
},
|
|
86
|
-
"default": false
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
"name": "Qwen3.5 2B (MLX)",
|
|
90
|
-
"provider": "mlx",
|
|
91
|
-
"options": {
|
|
92
|
-
"model": "mlx-community/Qwen3.5-2B-OptiQ-4bit",
|
|
93
|
-
"context": 262144
|
|
94
|
-
},
|
|
83
|
+
"metadata": { "name": "unsloth/Qwen3.5-2B-MTP-GGUF:Q4_K_M" },
|
|
95
84
|
"default": false
|
|
96
85
|
}
|
|
97
86
|
],
|
|
98
87
|
"search": {
|
|
99
|
-
"enabled":
|
|
100
|
-
"provider": "
|
|
88
|
+
"enabled": true,
|
|
89
|
+
"provider": "duckduckgo",
|
|
101
90
|
"brave": {},
|
|
91
|
+
"duckduckgo": {},
|
|
102
92
|
"exa": {},
|
|
103
93
|
"firecrawl": {},
|
|
104
94
|
"litellm": {},
|
|
@@ -117,7 +107,7 @@ This is the default shape Hooman writes when `~/.hooman/config.json` is missing:
|
|
|
117
107
|
"filesystem": { "enabled": true },
|
|
118
108
|
"shell": { "enabled": true },
|
|
119
109
|
"sleep": { "enabled": true },
|
|
120
|
-
"browser": { "enabled":
|
|
110
|
+
"browser": { "enabled": true },
|
|
121
111
|
"subagents": { "enabled": true }
|
|
122
112
|
},
|
|
123
113
|
"compaction": {
|
|
@@ -128,6 +118,11 @@ This is the default shape Hooman writes when `~/.hooman/config.json` is missing:
|
|
|
128
118
|
}
|
|
129
119
|
```
|
|
130
120
|
|
|
121
|
+
If config is loaded or scaffolded without going through setup (e.g. Open
|
|
122
|
+
Settings before the wizard), the in-memory default still includes **both**
|
|
123
|
+
llama.cpp and MLX provider/LLM presets, with `tools.browser.enabled` defaulting
|
|
124
|
+
to `false`. Prefer reading the user's actual file over assuming either shape.
|
|
125
|
+
|
|
131
126
|
Hooman fills all optional sections with defaults on load and persist, so a minimal valid config is just `name`, `providers`, and `llms`.
|
|
132
127
|
|
|
133
128
|
## Top-Level Options
|
|
@@ -135,7 +130,7 @@ Hooman fills all optional sections with defaults on load and persist, so a minim
|
|
|
135
130
|
- `name`: non-empty display name for the agent.
|
|
136
131
|
- `providers`: required reusable provider definitions. Each entry has `name`, runtime `provider`, and provider-specific `options`. Supported runtime providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `llama-cpp`, `minimax`, `mlx`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai` — details in `providers.md`.
|
|
137
132
|
- `llms`: required non-empty list of named LLM configs. Each entry has `name`, provider reference `provider`, model `options` (`model`, optional `temperature`, optional `topP`, optional `maxTokens`, optional `context` — local llama-cpp/mlx providers only), optional `metadata`, and `default` (mark exactly one entry `true`). Details in `providers.md`.
|
|
138
|
-
- `search`: optional web search config; defaults to
|
|
133
|
+
- `search`: optional web search config; defaults to enabled DuckDuckGo (no API key). Details in `search.md`.
|
|
139
134
|
- `prompts`: optional built-in static prompt toggles; omitted fields default to `true`. Custom user instructions live in `~/.hooman/instructions.md`.
|
|
140
135
|
- `tools`: optional tool toggles and tool-specific settings.
|
|
141
136
|
- `compaction`: optional context compaction settings. `ratio` must be `0..1`; `keep` must be a non-negative integer.
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
# Hooman Search Config Reference
|
|
2
2
|
|
|
3
|
-
`search.provider` must be `"brave"`, `"exa"`, `"firecrawl"`, `"litellm"`, `"serper"`, or `"tavily"`.
|
|
3
|
+
`search.provider` must be `"brave"`, `"duckduckgo"`, `"exa"`, `"firecrawl"`, `"litellm"`, `"serper"`, or `"tavily"`.
|
|
4
4
|
|
|
5
5
|
```json
|
|
6
6
|
{
|
|
7
7
|
"search": {
|
|
8
8
|
"enabled": true,
|
|
9
|
-
"provider": "
|
|
9
|
+
"provider": "duckduckgo",
|
|
10
10
|
"brave": {
|
|
11
11
|
"apiKey": "..."
|
|
12
12
|
},
|
|
13
|
+
"duckduckgo": {},
|
|
13
14
|
"exa": {
|
|
14
15
|
"apiKey": "..."
|
|
15
16
|
},
|
|
@@ -33,7 +34,8 @@
|
|
|
33
34
|
|
|
34
35
|
Notes:
|
|
35
36
|
|
|
37
|
+
- Hooman calls DuckDuckGo by fetching the HTML results page (`https://html.duckduckgo.com/html/`) and parsing it with **cheerio**. No API key is required. `freshness` maps to `df`, `country` to `kl` when known, and `safe_search` to `kp`. `start_date`/`end_date` are not supported.
|
|
36
38
|
- Hooman calls Exa through the official **`exa-js`** SDK ([Exa search API](https://exa.ai/docs/reference/search-api-guide-for-coding-agents)).
|
|
37
39
|
- Hooman calls Firecrawl through **`@mendable/firecrawl-js`** ([Firecrawl search API](https://docs.firecrawl.dev/api-reference/endpoint/search)).
|
|
38
40
|
- The `litellm` provider calls a [LiteLLM](https://docs.litellm.ai/docs/search/) proxy's Perplexity-compatible `POST {baseURL}/v1/search/{tool}` endpoint using the virtual key as `apiKey`. It requires `baseURL`, `apiKey`, and `tool` (the `search_tool_name` registered on the proxy). The actual upstream search provider (perplexity, tavily, exa, brave, etc.) is chosen by the proxy config, so no provider API key is stored in Hooman.
|
|
39
|
-
- Defaults: `enabled:
|
|
41
|
+
- Defaults: `enabled: true`, `provider: "duckduckgo"`, all provider API keys unset.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hooman-design
|
|
3
|
+
description: Required playbook for design work — activate in design mode (or whenever producing HTML prototypes, dashboards, or decks). Covers the strict discovery→template→theme→build→preview→QA→human review→export workflow, DESIGN.md / directions, craft rules, artifact layout under .hooman/design, and delivery export (PDF/PPTX/screenshot-backed .fig/.deck/.sketch).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hooman Design
|
|
7
|
+
|
|
8
|
+
Act like a senior product designer who ships real CSS: clear hierarchy, intentional type, brand-faithful color, and no AI-slop defaults.
|
|
9
|
+
|
|
10
|
+
## Strict workflow
|
|
11
|
+
|
|
12
|
+
**Follow `references/workflow.md` in order for every new brief.** Summary:
|
|
13
|
+
|
|
14
|
+
| Phase | Do | Gate |
|
|
15
|
+
| ----- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
16
|
+
| 0 | Activate this skill | Before any write |
|
|
17
|
+
| 1 | Intake via `ask_user` (brand notes / fresh / reference images / other); honor injected `DESIGN.md` when present | Brief known |
|
|
18
|
+
| 2 | Clarify audience, surface, content, constraints | Enough to pick a shell |
|
|
19
|
+
| 3 | Offer **5 best-fit shells** + **Other / custom** | Shell chosen; read its HTML |
|
|
20
|
+
| 4 | Theme: use `DESIGN.md`, else **5 best-fit directions** + **Other / custom** | Tokens bound |
|
|
21
|
+
| 5 | Build under `.hooman/design/<slug>/` | Meaningful `index.html` |
|
|
22
|
+
| 6 | `preview_design` (keep open) → images → `design-review` → fix (≤2–3 rounds) | Must-fix empty or capped |
|
|
23
|
+
| 7 | Ask user to review the live preview | User accepts or requests changes |
|
|
24
|
+
| 8 | Ask export format → `export_design` delivery formats | Files under `export/` |
|
|
25
|
+
| 9 | `stop_design_preview` | **Only after** export (or user declines / ends) |
|
|
26
|
+
|
|
27
|
+
Do **not** write HTML before phases 1–4. Do **not** stop preview before phase 9.
|
|
28
|
+
|
|
29
|
+
## Before the first write
|
|
30
|
+
|
|
31
|
+
1. Confirm this skill is active.
|
|
32
|
+
2. Run phases 1–4 with `ask_user` (see `references/workflow.md`). One question per call; ≤6 options; recommended first; free-text always allowed for custom.
|
|
33
|
+
3. Read craft siblings that apply (at least):
|
|
34
|
+
- `craft/anti-ai-slop.md`
|
|
35
|
+
- `craft/typography.md`
|
|
36
|
+
- `craft/layout-overflow.md` — **required for decks / fixed frames**
|
|
37
|
+
- `craft/deck-slides.md` — **required for `[data-slide]` work**
|
|
38
|
+
- `craft/spacing-density.md`
|
|
39
|
+
- `craft/color-surfaces.md`
|
|
40
|
+
- `craft/state-coverage.md`
|
|
41
|
+
- `craft/accessibility-baseline.md`
|
|
42
|
+
- plus forms / data-viz / responsive / print / motion / iconography when relevant
|
|
43
|
+
4. Brand: injected `DESIGN.md` wins. Else use the direction chosen in phase 4 and copy `assets/tokens/<direction>.css` into the artifact `:root`.
|
|
44
|
+
5. Read the chosen shell under `assets/` before inventing structure.
|
|
45
|
+
6. Read `references/artifact-layout.md` for the on-disk contract.
|
|
46
|
+
|
|
47
|
+
## Shells (`assets/`)
|
|
48
|
+
|
|
49
|
+
| File | Use when |
|
|
50
|
+
| -------------------------- | ---------------------------------------------------- |
|
|
51
|
+
| `prototype-shell.html` | Generic marketing / one-pager starting point |
|
|
52
|
+
| `landing-shell.html` | Nav + hero + feature grid + footer |
|
|
53
|
+
| `pricing-shell.html` | 2–3 plan comparison |
|
|
54
|
+
| `auth-shell.html` | Sign-in / sign-up form (include error slots) |
|
|
55
|
+
| `contact-shell.html` | Contact / inquiry form (name, email, topic, message) |
|
|
56
|
+
| `newsletter-shell.html` | Email subscribe strip / card |
|
|
57
|
+
| `waitlist-shell.html` | Early-access waitlist capture |
|
|
58
|
+
| `settings-shell.html` | Side nav + settings panel |
|
|
59
|
+
| `dashboard-shell.html` | Ops / metrics console |
|
|
60
|
+
| `deck-shell.html` | Slide deck with safe chrome bands (`[data-slide]`) |
|
|
61
|
+
| `email-shell.html` | Transactional email (~600px) |
|
|
62
|
+
| `empty-state-shell.html` | Zero-data panel with primary CTA |
|
|
63
|
+
| `onboarding-shell.html` | Multi-step wizard |
|
|
64
|
+
| `article-shell.html` | Long-form editorial / blog |
|
|
65
|
+
| `data-table-shell.html` | Dense tabular ops UI |
|
|
66
|
+
| `dialog-shell.html` | Modal confirm / destructive action |
|
|
67
|
+
| `mobile-frame-shell.html` | Phone-width app chrome |
|
|
68
|
+
| `resume-shell.html` | One-page CV / resume (print-friendly) |
|
|
69
|
+
| `business-card-shell.html` | Digital business card (compact contact face) |
|
|
70
|
+
| `invite-shell.html` | Event invite with when/where + RSVP |
|
|
71
|
+
| `flyer-shell.html` | Single-sheet promo flyer / handout |
|
|
72
|
+
|
|
73
|
+
Direction token CSS: `assets/tokens/<id>.css` (`editorial-ink`, `swiss-grid`, `night-console`, `warm-atelier`, `fintech-clear`, `signal-mono`, `soft-product`, `harbor-navy`, `paper-mono`, `botanical-calm`, `midnight-editorial`, `copper-ledger`). See `directions.md` for posture + good-shell hints when ranking the top 5.
|
|
74
|
+
|
|
75
|
+
## Build
|
|
76
|
+
|
|
77
|
+
- Write only under `.hooman/design/<slug>/index.html` (+ optional `assets/`).
|
|
78
|
+
- Prefer semantic HTML + CSS variables from `DESIGN.md` / the chosen direction tokens.
|
|
79
|
+
- For decks, mark each slide with `data-slide` and follow `craft/deck-slides.md` + `craft/layout-overflow.md`.
|
|
80
|
+
- After a meaningful write, run the **full** visual QA loop — capture without review is incomplete:
|
|
81
|
+
1. `preview_design` (localhost **hot-reload**; keep running through human review + export)
|
|
82
|
+
2. `export_design` with `format: "images"` (writes `reviews/`)
|
|
83
|
+
3. **Required next tool call:** `launch_subagent` with `kind: "design-review"` whose `query` lists every shot path and says to `read_file` each with `binary: true`
|
|
84
|
+
4. Fix Must-fix (overflow / overlap / clipping first)
|
|
85
|
+
5. Re-capture → re-review (max 2–3 rounds)
|
|
86
|
+
- Then **ask the user** to review the live preview (phase 7) before any delivery export.
|
|
87
|
+
|
|
88
|
+
## Figma / Sketch / PPTX
|
|
89
|
+
|
|
90
|
+
- **Export** — after visual QA **and** user acceptance, `export_design` with `format: "figma"`, `"figma-deck"`, `"sketch"`, or `"pptx"`.
|
|
91
|
+
- These formats are **screenshot-backed** (same path as PPTX): one image frame/slide/artboard per page. They are not native editable layer trees. See `references/export.md`.
|
|
92
|
+
|
|
93
|
+
## Export
|
|
94
|
+
|
|
95
|
+
- Ask which format they want (phase 8), then follow `references/export.md`.
|
|
96
|
+
- Delivery formats (`pdf` / `images-to-pdf` / `pptx` / `figma` / `figma-deck` / `sketch`) only after internal QA + human go-ahead.
|
|
97
|
+
- Call `stop_design_preview` **only after** delivery export (or the user declines export / ends the session).
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Article</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #f7f5f2;
|
|
10
|
+
--ink: #1a1a1a;
|
|
11
|
+
--muted: #5c5c5c;
|
|
12
|
+
--accent: #0f6b6b;
|
|
13
|
+
--border: #e8e4dc;
|
|
14
|
+
--font-display: Georgia, "Times New Roman", ui-serif, serif;
|
|
15
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
16
|
+
}
|
|
17
|
+
* {
|
|
18
|
+
box-sizing: border-box;
|
|
19
|
+
}
|
|
20
|
+
body {
|
|
21
|
+
margin: 0;
|
|
22
|
+
font-family: var(--font-body);
|
|
23
|
+
background: var(--bg);
|
|
24
|
+
color: var(--ink);
|
|
25
|
+
line-height: 1.6;
|
|
26
|
+
}
|
|
27
|
+
article {
|
|
28
|
+
max-width: 40rem;
|
|
29
|
+
margin: 0 auto;
|
|
30
|
+
padding: 3rem 1.5rem 4rem;
|
|
31
|
+
}
|
|
32
|
+
.meta {
|
|
33
|
+
font-size: 0.8125rem;
|
|
34
|
+
letter-spacing: 0.06em;
|
|
35
|
+
text-transform: uppercase;
|
|
36
|
+
color: var(--muted);
|
|
37
|
+
margin-bottom: 0.75rem;
|
|
38
|
+
}
|
|
39
|
+
h1 {
|
|
40
|
+
font-family: var(--font-display);
|
|
41
|
+
font-size: clamp(2rem, 4vw, 2.75rem);
|
|
42
|
+
line-height: 1.15;
|
|
43
|
+
letter-spacing: -0.02em;
|
|
44
|
+
margin: 0 0 1rem;
|
|
45
|
+
}
|
|
46
|
+
.lede {
|
|
47
|
+
font-size: 1.125rem;
|
|
48
|
+
color: var(--muted);
|
|
49
|
+
margin: 0 0 2rem;
|
|
50
|
+
}
|
|
51
|
+
h2 {
|
|
52
|
+
font-family: var(--font-display);
|
|
53
|
+
font-size: 1.35rem;
|
|
54
|
+
margin: 2rem 0 0.75rem;
|
|
55
|
+
}
|
|
56
|
+
p {
|
|
57
|
+
margin: 0 0 1rem;
|
|
58
|
+
}
|
|
59
|
+
a {
|
|
60
|
+
color: var(--accent);
|
|
61
|
+
}
|
|
62
|
+
hr {
|
|
63
|
+
border: 0;
|
|
64
|
+
border-top: 1px solid var(--border);
|
|
65
|
+
margin: 2rem 0;
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
68
|
+
</head>
|
|
69
|
+
<body>
|
|
70
|
+
<article>
|
|
71
|
+
<p class="meta">Essay · 6 min</p>
|
|
72
|
+
<h1>Title that earns the scroll</h1>
|
|
73
|
+
<p class="lede">One-sentence thesis. No lorem.</p>
|
|
74
|
+
<p>
|
|
75
|
+
Body copy with real sentences. Prefer short paragraphs and concrete
|
|
76
|
+
nouns.
|
|
77
|
+
</p>
|
|
78
|
+
<h2>Section</h2>
|
|
79
|
+
<p>
|
|
80
|
+
Continue the argument. Link out
|
|
81
|
+
<a href="#">sparingly</a>.
|
|
82
|
+
</p>
|
|
83
|
+
<hr />
|
|
84
|
+
<p class="meta">Author name · Date</p>
|
|
85
|
+
</article>
|
|
86
|
+
</body>
|
|
87
|
+
</html>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Sign in</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #f7f5f2;
|
|
10
|
+
--ink: #1a1a1a;
|
|
11
|
+
--muted: #5c5c5c;
|
|
12
|
+
--accent: #0f6b6b;
|
|
13
|
+
--surface: #ffffff;
|
|
14
|
+
--border: #e8e4dc;
|
|
15
|
+
--danger: #b42318;
|
|
16
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
17
|
+
--space-3: 0.75rem;
|
|
18
|
+
--space-4: 1rem;
|
|
19
|
+
--space-5: 1.5rem;
|
|
20
|
+
--space-6: 2rem;
|
|
21
|
+
}
|
|
22
|
+
* {
|
|
23
|
+
box-sizing: border-box;
|
|
24
|
+
}
|
|
25
|
+
body {
|
|
26
|
+
margin: 0;
|
|
27
|
+
min-height: 100vh;
|
|
28
|
+
display: grid;
|
|
29
|
+
place-items: center;
|
|
30
|
+
font-family: var(--font-body);
|
|
31
|
+
background: var(--bg);
|
|
32
|
+
color: var(--ink);
|
|
33
|
+
line-height: 1.5;
|
|
34
|
+
padding: var(--space-5);
|
|
35
|
+
}
|
|
36
|
+
.card {
|
|
37
|
+
width: min(100%, 24rem);
|
|
38
|
+
background: var(--surface);
|
|
39
|
+
border: 1px solid var(--border);
|
|
40
|
+
border-radius: 0.375rem;
|
|
41
|
+
padding: var(--space-6);
|
|
42
|
+
}
|
|
43
|
+
h1 {
|
|
44
|
+
margin: 0 0 0.25rem;
|
|
45
|
+
font-size: 1.375rem;
|
|
46
|
+
letter-spacing: -0.02em;
|
|
47
|
+
}
|
|
48
|
+
.lede {
|
|
49
|
+
margin: 0 0 var(--space-5);
|
|
50
|
+
color: var(--muted);
|
|
51
|
+
font-size: 0.9375rem;
|
|
52
|
+
}
|
|
53
|
+
form {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
gap: var(--space-4);
|
|
57
|
+
}
|
|
58
|
+
label {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-direction: column;
|
|
61
|
+
gap: 0.35rem;
|
|
62
|
+
font-size: 0.8125rem;
|
|
63
|
+
font-weight: 600;
|
|
64
|
+
}
|
|
65
|
+
input {
|
|
66
|
+
font: inherit;
|
|
67
|
+
padding: 0.6rem 0.75rem;
|
|
68
|
+
border: 1px solid var(--border);
|
|
69
|
+
border-radius: 0.375rem;
|
|
70
|
+
background: #fff;
|
|
71
|
+
color: var(--ink);
|
|
72
|
+
}
|
|
73
|
+
input:focus-visible {
|
|
74
|
+
outline: 2px solid var(--accent);
|
|
75
|
+
outline-offset: 1px;
|
|
76
|
+
}
|
|
77
|
+
.error {
|
|
78
|
+
color: var(--danger);
|
|
79
|
+
font-size: 0.8125rem;
|
|
80
|
+
font-weight: 400;
|
|
81
|
+
}
|
|
82
|
+
.btn {
|
|
83
|
+
margin-top: var(--space-3);
|
|
84
|
+
padding: 0.7rem 1rem;
|
|
85
|
+
border: 0;
|
|
86
|
+
border-radius: 0.375rem;
|
|
87
|
+
background: var(--accent);
|
|
88
|
+
color: #fff;
|
|
89
|
+
font: inherit;
|
|
90
|
+
font-weight: 600;
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
}
|
|
93
|
+
.btn:focus-visible {
|
|
94
|
+
outline: 2px solid var(--ink);
|
|
95
|
+
outline-offset: 2px;
|
|
96
|
+
}
|
|
97
|
+
.btn:disabled {
|
|
98
|
+
opacity: 0.6;
|
|
99
|
+
cursor: not-allowed;
|
|
100
|
+
}
|
|
101
|
+
.meta {
|
|
102
|
+
margin-top: var(--space-5);
|
|
103
|
+
font-size: 0.875rem;
|
|
104
|
+
color: var(--muted);
|
|
105
|
+
text-align: center;
|
|
106
|
+
}
|
|
107
|
+
.meta a {
|
|
108
|
+
color: var(--accent);
|
|
109
|
+
}
|
|
110
|
+
/* Show empty / error / pending by toggling [hidden] in prototypes */
|
|
111
|
+
[hidden] {
|
|
112
|
+
display: none !important;
|
|
113
|
+
}
|
|
114
|
+
</style>
|
|
115
|
+
</head>
|
|
116
|
+
<body>
|
|
117
|
+
<main class="card">
|
|
118
|
+
<h1>Sign in</h1>
|
|
119
|
+
<p class="lede">Use your work email.</p>
|
|
120
|
+
<form>
|
|
121
|
+
<label>
|
|
122
|
+
Email
|
|
123
|
+
<input type="email" name="email" autocomplete="username" required />
|
|
124
|
+
<span class="error" hidden>Enter a valid email.</span>
|
|
125
|
+
</label>
|
|
126
|
+
<label>
|
|
127
|
+
Password
|
|
128
|
+
<input
|
|
129
|
+
type="password"
|
|
130
|
+
name="password"
|
|
131
|
+
autocomplete="current-password"
|
|
132
|
+
required
|
|
133
|
+
/>
|
|
134
|
+
<span class="error" hidden>Password is required.</span>
|
|
135
|
+
</label>
|
|
136
|
+
<button class="btn" type="submit">Continue</button>
|
|
137
|
+
</form>
|
|
138
|
+
<p class="meta">
|
|
139
|
+
<a href="#">Forgot password?</a> · <a href="#">Create account</a>
|
|
140
|
+
</p>
|
|
141
|
+
</main>
|
|
142
|
+
</body>
|
|
143
|
+
</html>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Digital business card</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #0c0c0c;
|
|
10
|
+
--ink: #fafafa;
|
|
11
|
+
--muted: #a1a1aa;
|
|
12
|
+
--accent: #fbbf24;
|
|
13
|
+
--surface: #171717;
|
|
14
|
+
--border: #27272a;
|
|
15
|
+
--font-display:
|
|
16
|
+
"Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
|
|
17
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
18
|
+
--font-mono: ui-monospace, "SF Mono", Menlo, monospace;
|
|
19
|
+
}
|
|
20
|
+
* {
|
|
21
|
+
box-sizing: border-box;
|
|
22
|
+
}
|
|
23
|
+
body {
|
|
24
|
+
margin: 0;
|
|
25
|
+
min-height: 100vh;
|
|
26
|
+
display: grid;
|
|
27
|
+
place-items: center;
|
|
28
|
+
font-family: var(--font-body);
|
|
29
|
+
background: var(--bg);
|
|
30
|
+
color: var(--ink);
|
|
31
|
+
padding: 1.5rem;
|
|
32
|
+
}
|
|
33
|
+
.card {
|
|
34
|
+
width: min(100%, 22rem);
|
|
35
|
+
aspect-ratio: 1.75 / 1;
|
|
36
|
+
background: var(--surface);
|
|
37
|
+
border: 1px solid var(--border);
|
|
38
|
+
border-radius: 0.375rem;
|
|
39
|
+
padding: 1.35rem 1.4rem;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
justify-content: space-between;
|
|
43
|
+
position: relative;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
}
|
|
46
|
+
.card::before {
|
|
47
|
+
content: "";
|
|
48
|
+
position: absolute;
|
|
49
|
+
inset: 0 auto 0 0;
|
|
50
|
+
width: 3px;
|
|
51
|
+
background: var(--accent);
|
|
52
|
+
}
|
|
53
|
+
.kicker {
|
|
54
|
+
margin: 0;
|
|
55
|
+
font-family: var(--font-mono);
|
|
56
|
+
font-size: 0.625rem;
|
|
57
|
+
letter-spacing: 0.12em;
|
|
58
|
+
text-transform: uppercase;
|
|
59
|
+
color: var(--muted);
|
|
60
|
+
}
|
|
61
|
+
.name {
|
|
62
|
+
margin: 0.35rem 0 0.15rem;
|
|
63
|
+
font-family: var(--font-display);
|
|
64
|
+
font-size: 1.5rem;
|
|
65
|
+
letter-spacing: -0.02em;
|
|
66
|
+
line-height: 1.1;
|
|
67
|
+
}
|
|
68
|
+
.title {
|
|
69
|
+
margin: 0;
|
|
70
|
+
font-size: 0.8125rem;
|
|
71
|
+
color: var(--muted);
|
|
72
|
+
}
|
|
73
|
+
.footer {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-wrap: wrap;
|
|
76
|
+
justify-content: space-between;
|
|
77
|
+
gap: 0.5rem 1rem;
|
|
78
|
+
font-size: 0.75rem;
|
|
79
|
+
}
|
|
80
|
+
.footer a {
|
|
81
|
+
color: var(--ink);
|
|
82
|
+
text-decoration: none;
|
|
83
|
+
}
|
|
84
|
+
.footer a:hover {
|
|
85
|
+
color: var(--accent);
|
|
86
|
+
}
|
|
87
|
+
.footer span {
|
|
88
|
+
color: var(--muted);
|
|
89
|
+
}
|
|
90
|
+
@media (max-width: 380px) {
|
|
91
|
+
.card {
|
|
92
|
+
aspect-ratio: auto;
|
|
93
|
+
min-height: 11rem;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
97
|
+
</head>
|
|
98
|
+
<body>
|
|
99
|
+
<article class="card" aria-label="Digital business card">
|
|
100
|
+
<header>
|
|
101
|
+
<p class="kicker">Northwind · Design</p>
|
|
102
|
+
<h1 class="name">Alex Rivera</h1>
|
|
103
|
+
<p class="title">Product designer</p>
|
|
104
|
+
</header>
|
|
105
|
+
<footer class="footer">
|
|
106
|
+
<a href="mailto:alex@example.com">alex@example.com</a>
|
|
107
|
+
<a href="https://example.com">example.com</a>
|
|
108
|
+
<span>+1 555 0100</span>
|
|
109
|
+
</footer>
|
|
110
|
+
</article>
|
|
111
|
+
</body>
|
|
112
|
+
</html>
|