diff --git a/Readme.md b/Readme.md
index 454eaf4..dda8136 100644
--- a/Readme.md
+++ b/Readme.md
@@ -51,7 +51,7 @@ EVE provides building blocks for digital sovereignty, which we call Arxlets:
### Core Arxlets
-- [x] **Phora**: Threaded discussions and knowledge sharing
+- [x] **Arbor**: Threaded discussions and knowledge sharing
- [ ] **Nexus**: Central community hub
- [ ] **Whisper**: One-to-one and group messaging
- [ ] **Vault**: Secure file storage and sharing
diff --git a/Security.md b/Security.md
index aa3a90b..81335f4 100644
--- a/Security.md
+++ b/Security.md
@@ -73,7 +73,7 @@ This security policy applies to the following official EVE repositories and comp
- Main EVE application: https://git.arx-ccn.com/Arx/Eve
- EVE Relay: https://git.arx-ccn.com/Arx/Eve-Relay
-- All published Arxlets (Phora, Nexus, etc.)
+- All published Arxlets (Arbor, Nexus, etc.)
### Out of Scope
diff --git a/src/components/PhoraButton.ts b/src/components/Arbor/Button.ts
similarity index 94%
rename from src/components/PhoraButton.ts
rename to src/components/Arbor/Button.ts
index aa4cba9..596f301 100644
--- a/src/components/PhoraButton.ts
+++ b/src/components/Arbor/Button.ts
@@ -3,8 +3,8 @@ import { customElement, property } from 'lit/decorators.js';
import '@components/EveLink';
-@customElement('arx-phora-button')
-export class PhoraButton extends LitElement {
+@customElement('arx-arbor-button')
+export class ArborButton extends LitElement {
@property({ type: String }) href = '';
@property({ type: String }) target = '';
@property({ type: String }) rel = '';
@@ -18,13 +18,16 @@ export class PhoraButton extends LitElement {
static override styles = [
css`
arx-eve-link::part(link) {
+ color: white;
+ text-decoration: none;
+ }
+
+ arx-eve-link {
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--accent);
- color: white;
border: none;
- text-decoration: none;
padding: 0.75rem 0.75rem;
border-radius: 0.25rem;
text-decoration: none;
diff --git a/src/components/PhoraForumCategory.ts b/src/components/Arbor/ForumCategory.ts
similarity index 82%
rename from src/components/PhoraForumCategory.ts
rename to src/components/Arbor/ForumCategory.ts
index aed7324..f9dd5e3 100644
--- a/src/components/PhoraForumCategory.ts
+++ b/src/components/Arbor/ForumCategory.ts
@@ -1,8 +1,8 @@
import { LitElement, css, html } from 'lit';
import { customElement, property } from 'lit/decorators.js';
-@customElement('arx-phora-forum-category')
-export class PhoraForumCategory extends LitElement {
+@customElement('arx-arbor-forum-category')
+export class ArborForumCategory extends LitElement {
@property({ type: String }) override title = '';
@property({ type: String }) override id = '';
@@ -33,7 +33,9 @@ export class PhoraForumCategory extends LitElement {
-
-
-
-
- ${formatDateTime(this.date)}
-
-
-
-
alert('TODO')}
- class="disabled"
- >
-
- Reply
-
-
-
- Permalink
-
-
alert('TODO')}
- class="disabled"
- >
-
- Zap
-
-
alert('TODO')}
- class="disabled"
- >
-
- Downzap
-
-
-
-
- `;
- }
-}
diff --git a/src/components/Prompt.ts b/src/components/Prompt.ts
new file mode 100644
index 0000000..44b0bb3
--- /dev/null
+++ b/src/components/Prompt.ts
@@ -0,0 +1,261 @@
+import { LitElement, css, html } from 'lit';
+import { customElement, property, state } from 'lit/decorators.js';
+import { classMap } from 'lit/directives/class-map.js';
+
+@customElement('arx-prompt')
+export class EvePrompt extends LitElement {
+ @property({ type: String }) promptText = 'Please provide input';
+ @property({ type: String }) cancelText = 'Cancel';
+ @property({ type: String }) saveText = 'Save';
+ @property({ type: Boolean }) open = false;
+ @property({ type: Boolean }) showInput = false;
+ @property({ type: String }) placeholder = 'Enter your response';
+ @property({ type: String }) defaultValue = '';
+
+ @state() private _inputValue = '';
+ private _previousFocus: HTMLElement | null = null;
+
+ static override styles = css`
+ :host {
+ --prompt-primary: #3b82f6;
+ --prompt-primary-hover: #2563eb;
+ --prompt-bg: #ffffff;
+ --prompt-text: #1f2937;
+ --prompt-border: #e5e7eb;
+ --prompt-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
+ --prompt-cancel-bg: #f3f4f6;
+ --prompt-cancel-hover: #e5e7eb;
+ --prompt-overlay: rgba(15, 23, 42, 0.6);
+
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
+ sans-serif;
+ }
+
+ .overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: var(--prompt-overlay);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 9999;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s ease;
+ backdrop-filter: blur(4px);
+ }
+
+ .overlay.active {
+ opacity: 1;
+ pointer-events: all;
+ }
+
+ .prompt-container {
+ background-color: var(--prompt-bg);
+ border-radius: 12px;
+ box-shadow: var(--prompt-shadow);
+ width: 90%;
+ max-width: 420px;
+ padding: 28px;
+ transform: scale(0.95) translateY(10px);
+ transition: transform 0.25s cubic-bezier(0.1, 1, 0.2, 1);
+ color: var(--prompt-text);
+ }
+
+ .overlay.active .prompt-container {
+ transform: scale(1) translateY(0);
+ }
+
+ .prompt-header {
+ font-size: 18px;
+ font-weight: 600;
+ margin: 0 0 16px 0;
+ line-height: 1.4;
+ }
+
+ .input-container {
+ margin: 20px 0;
+ }
+
+ .input-field {
+ width: 100%;
+ padding: 12px 14px;
+ border-radius: 8px;
+ border: 1px solid var(--prompt-border);
+ font-size: 15px;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+ color: inherit;
+ background-color: transparent;
+ outline: none;
+ box-sizing: border-box;
+ }
+
+ .input-field:focus {
+ border-color: var(--prompt-primary);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
+ }
+
+ .buttons {
+ display: flex;
+ justify-content: flex-end;
+ gap: 12px;
+ margin-top: 24px;
+ }
+
+ button {
+ padding: 10px 18px;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ border: none;
+ outline: none;
+ }
+
+ button:focus-visible {
+ box-shadow: 0 0 0 2px var(--prompt-bg), 0 0 0 4px var(--prompt-primary);
+ }
+
+ .cancel-btn {
+ background-color: var(--prompt-cancel-bg);
+ color: var(--prompt-text);
+ }
+
+ .cancel-btn:hover {
+ background-color: var(--prompt-cancel-hover);
+ }
+
+ .save-btn {
+ background-color: var(--prompt-primary);
+ color: white;
+ }
+
+ .save-btn:hover {
+ background-color: var(--prompt-primary-hover);
+ }
+
+ @media (prefers-color-scheme: dark) {
+ :host {
+ --prompt-bg: #1e1e1e;
+ --prompt-text: #e5e7eb;
+ --prompt-border: #374151;
+ --prompt-cancel-bg: #374151;
+ --prompt-cancel-hover: #4b5563;
+ }
+ }
+ `;
+
+ constructor() {
+ super();
+ this._handleKeyDown = this._handleKeyDown.bind(this);
+ }
+
+ override connectedCallback() {
+ super.connectedCallback();
+ document.addEventListener('keydown', this._handleKeyDown);
+ }
+
+ override disconnectedCallback() {
+ super.disconnectedCallback();
+ document.removeEventListener('keydown', this._handleKeyDown);
+ }
+
+ override updated(changedProps: Map