@ibgib/web-gib 0.0.52 → 0.0.55
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/CHANGELOG.md +7 -0
- package/dist/AUTO-GENERATED-version.d.mts +1 -1
- package/dist/AUTO-GENERATED-version.mjs +1 -1
- package/dist/api/commands/chat/hello-world.mjs.map +1 -1
- package/dist/api/commands/command-constants.d.mts +4 -4
- package/dist/api/commands/command-constants.d.mts.map +1 -1
- package/dist/api/commands/command-service-v1.d.mts.map +1 -1
- package/dist/api/commands/command-service-v1.mjs.map +1 -1
- package/dist/api/commands/ibgib/get-ibgibs.d.mts.map +1 -1
- package/dist/api/commands/ibgib/get-ibgibs.mjs.map +1 -1
- package/dist/api/ibgib-api-bridge.d.mts +81 -0
- package/dist/api/ibgib-api-bridge.d.mts.map +1 -0
- package/dist/api/ibgib-api-bridge.mjs +259 -0
- package/dist/api/ibgib-api-bridge.mjs.map +1 -0
- package/dist/app-bootstrap/init-orchestration.d.mts +1 -1
- package/dist/app-bootstrap/init-orchestration.d.mts.map +1 -1
- package/dist/app-bootstrap/init-orchestration.mjs +17 -3
- package/dist/app-bootstrap/init-orchestration.mjs.map +1 -1
- package/dist/assets/fullscreen-dialog.html +18 -0
- package/dist/assumptions.respec.mjs.map +1 -1
- package/dist/common/settings/settings-constants.d.mts.map +1 -1
- package/dist/helpers.d.mts.map +1 -1
- package/dist/helpers.mjs.map +1 -1
- package/dist/helpers.web.d.mts.map +1 -1
- package/dist/helpers.web.mjs.map +1 -1
- package/dist/helpers.web.respec.mjs.map +1 -1
- package/dist/identity/keystone-sync-service.d.mts +37 -0
- package/dist/identity/keystone-sync-service.d.mts.map +1 -0
- package/dist/identity/keystone-sync-service.mjs +211 -0
- package/dist/identity/keystone-sync-service.mjs.map +1 -0
- package/dist/identity/sso/sso-custodian-service.d.mts.map +1 -1
- package/dist/identity/sso/sso-custodian-service.mjs.map +1 -1
- package/dist/identity/sso/sso-custodian-service.respec.mjs.map +1 -1
- package/dist/index.d.mts +17 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +21 -26
- package/dist/index.mjs.map +1 -1
- package/dist/storage/storage-helpers.web.mjs.map +1 -1
- package/dist/ui/component/common-component-styles.css +270 -0
- package/dist/ui/component/ibgib-component-service.d.mts.map +1 -1
- package/dist/ui/component/ibgib-dynamic-component-bases.d.mts.map +1 -1
- package/dist/ui/component/ibgib-dynamic-component-bases.mjs.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.css +133 -0
- package/dist/ui/component/identity/add-device/add-device.d.mts +49 -0
- package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -0
- package/dist/ui/component/identity/add-device/add-device.html +52 -0
- package/dist/ui/component/identity/add-device/add-device.mjs +321 -0
- package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -0
- package/dist/ui/component/identity/identity-header/identity-header.css +317 -0
- package/dist/ui/component/identity/identity-header/identity-header.d.mts +85 -0
- package/dist/ui/component/identity/identity-header/identity-header.d.mts.map +1 -0
- package/dist/ui/component/identity/identity-header/identity-header.html +72 -0
- package/dist/ui/component/identity/identity-header/identity-header.mjs +546 -0
- package/dist/ui/component/identity/identity-header/identity-header.mjs.map +1 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.css +178 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.d.mts +76 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.d.mts.map +1 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.html +19 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.mjs +591 -0
- package/dist/ui/component/identity/identity-manager/identity-manager.mjs.map +1 -0
- package/dist/ui/component/identity/index.d.mts +17 -0
- package/dist/ui/component/identity/index.d.mts.map +1 -0
- package/dist/ui/component/identity/index.mjs +34 -0
- package/dist/ui/component/identity/index.mjs.map +1 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.css +97 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +58 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.html +51 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +410 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.css +621 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +98 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.html +154 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs +1377 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.css +46 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.d.mts +64 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.d.mts.map +1 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.html +15 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.mjs +300 -0
- package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.mjs.map +1 -0
- package/dist/ui/component/identity/remove-device/remove-device.css +118 -0
- package/dist/ui/component/identity/remove-device/remove-device.d.mts +50 -0
- package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -0
- package/dist/ui/component/identity/remove-device/remove-device.html +31 -0
- package/dist/ui/component/identity/remove-device/remove-device.mjs +188 -0
- package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -0
- package/dist/ui/ui-constants.d.mts +1 -0
- package/dist/ui/ui-constants.d.mts.map +1 -1
- package/dist/ui/ui-constants.mjs +1 -0
- package/dist/ui/ui-constants.mjs.map +1 -1
- package/dist/ui/ui-types.d.mts +7 -0
- package/dist/ui/ui-types.d.mts.map +1 -1
- package/dist/witness/agent/agent-constants.d.mts.map +1 -1
- package/dist/witness/agent/agent-helpers.mjs.map +1 -1
- package/dist/witness/agent/agent-one-file.d.mts.map +1 -1
- package/dist/witness/agent/agent-one-file.mjs.map +1 -1
- package/dist/witness/agent/agents-service-v1.d.mts.map +1 -1
- package/dist/witness/agent/agents-service-v1.mjs.map +1 -1
- package/dist/witness/agent/gemini/agent-witness-gemini-v1.d.mts.map +1 -1
- package/dist/witness/agent/gemini/gemini-agent-factory.d.mts.map +1 -1
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.d.mts.map +1 -1
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.mjs.map +1 -1
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.mjs.map +1 -1
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts +4 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts.map +1 -1
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs +40 -1
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs.map +1 -1
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.d.mts.map +1 -1
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.d.mts.map +1 -1
- package/package.json +2 -2
- package/src/AUTO-GENERATED-version.mts +1 -1
- package/src/api/ibgib-api-bridge.mts +292 -0
- package/src/app-bootstrap/init-orchestration.mts +17 -6
- package/src/custom.d.ts +11 -0
- package/src/identity/keystone-sync-service.mts +257 -0
- package/src/index.mts +24 -25
- package/src/ui/component/README.md +82 -5
- package/src/ui/component/common-component-styles.css +270 -0
- package/src/ui/component/identity/add-device/add-device.css +133 -0
- package/src/ui/component/identity/add-device/add-device.html +52 -0
- package/src/ui/component/identity/add-device/add-device.mts +397 -0
- package/src/ui/component/identity/identity-header/IMPLEMENTATION.md +45 -0
- package/src/ui/component/identity/identity-header/identity-header.css +317 -0
- package/src/ui/component/identity/identity-header/identity-header.html +72 -0
- package/src/ui/component/identity/identity-header/identity-header.mts +651 -0
- package/src/ui/component/identity/identity-manager/IMPLEMENTATION.md +100 -0
- package/src/ui/component/identity/identity-manager/identity-manager.css +178 -0
- package/src/ui/component/identity/identity-manager/identity-manager.html +19 -0
- package/src/ui/component/identity/identity-manager/identity-manager.mts +675 -0
- package/src/ui/component/identity/index.mts +36 -0
- package/src/ui/component/identity/keystone-creator/keystone-creator.css +97 -0
- package/src/ui/component/identity/keystone-creator/keystone-creator.html +51 -0
- package/src/ui/component/identity/keystone-creator/keystone-creator.mts +497 -0
- package/src/ui/component/identity/keystone-details/keystone-details.css +621 -0
- package/src/ui/component/identity/keystone-details/keystone-details.html +154 -0
- package/src/ui/component/identity/keystone-details/keystone-details.mts +1506 -0
- package/src/ui/component/identity/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +33 -0
- package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.css +46 -0
- package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.html +15 -0
- package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.mts +355 -0
- package/src/ui/component/identity/remove-device/remove-device.css +118 -0
- package/src/ui/component/identity/remove-device/remove-device.html +31 -0
- package/src/ui/component/identity/remove-device/remove-device.mts +247 -0
- package/src/ui/ui-constants.mts +1 -0
- package/src/ui/ui-types.mts +8 -0
- package/src/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mts +42 -1
- package/tools/auto-generated-agent-skills/skills/ibgib-dependency-graph/SKILL.md +209 -0
- package/tools/auto-generated-agent-skills/skills/ibgib-implementation-plan/SKILL.md +102 -0
|
@@ -26,6 +26,76 @@ The protocol itself is a universe-sized address spacetime that allows truly dist
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
+
## 📦 Built-In Component Suites
|
|
30
|
+
|
|
31
|
+
`@ibgib/web-gib` exports standard, pre-built web component suites that downstream applications can register and consume out-of-the-box.
|
|
32
|
+
|
|
33
|
+
### 🔑 Keystone Identity Component Suite
|
|
34
|
+
|
|
35
|
+
The Keystone Identity suite provides a complete, decentralized identity management interface powered by ibgib's unique keystone architecture (domain keys, sync delegate keys, KDF genesis, and timeline verification).
|
|
36
|
+
|
|
37
|
+
| Component Tag Name | Class | Description |
|
|
38
|
+
| :--- | :--- | :--- |
|
|
39
|
+
| **`ibgib-identity-header`** | `IdentityHeaderComponentMeta` / `Instance` | Compact header bar widget displaying active identity avatar, username, dropdown selection, and quick-access management buttons. |
|
|
40
|
+
| **`ibgib-identity-manager`** | `IdentityManagerComponentMeta` / `Instance` | Full tab-based identity management panel with settings persistence (`Settings_IdentityManager`), identity tabs, and creation/import triggers. |
|
|
41
|
+
| **`ibgib-keystone-creator`** | `KeystoneCreatorComponentMeta` / `Instance` | Interactive form for local KDF key derivation, domain keystone genesis, and sync delegate generation. |
|
|
42
|
+
| **`ibgib-keystone-details`** | `KeystoneDetailsComponentMeta` / `Instance` | Deep-dive inspector for individual keystones, showing pool configs, SSO provider linkage, secret reveal, and timeline scrubber. |
|
|
43
|
+
| **`ibgib-keystone-scrubber`** | `KeystoneScrubberComponentMeta` / `Instance` | Timeline scrubber control permitting step-by-step navigation across historical keystone evolution frames. |
|
|
44
|
+
|
|
45
|
+
### Downstream Suite Registration
|
|
46
|
+
|
|
47
|
+
Downstream applications can register all 5 Keystone Identity components with a single convenience call during app shell bootstrap:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { registerStandardIdentityComponents } from '@ibgib/web-gib/dist/ui/component/identity/index.mjs';
|
|
51
|
+
|
|
52
|
+
// Inside app initialization (e.g. ShellService.registerComponents):
|
|
53
|
+
await registerStandardIdentityComponents();
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 🛠️ Downstream Integration Patterns & API Bridge
|
|
59
|
+
|
|
60
|
+
### 1. REST API Bridge Abstraction (`IbGibApiBridge`)
|
|
61
|
+
|
|
62
|
+
Components in `@ibgib/web-gib` that make REST API requests (e.g., identity creation, SSO login, keystone evolution sync) interact through an abstracted `IbGibApiBridge` interface rather than hardcoding endpoint URLs.
|
|
63
|
+
|
|
64
|
+
Downstream apps can extend `IbGibApiBridge` to customize API routing or authentication, registering their bridge instance on startup:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import { IbGibApiBridge, setApiBridge } from '@ibgib/web-gib/dist/api/ibgib-api-bridge.mjs';
|
|
68
|
+
|
|
69
|
+
export class MyAppApiBridge extends IbGibApiBridge {
|
|
70
|
+
// Override base REST methods or base URLs as needed
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Register on app startup:
|
|
74
|
+
setApiBridge(new MyAppApiBridge());
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. Common Component Design System (`common-component-styles.css`)
|
|
78
|
+
|
|
79
|
+
Because Web Components use Shadow DOM encapsulation, shared button, tab, form, and tag styles are housed in `libs/web-gib/src/ui/component/common-component-styles.css`.
|
|
80
|
+
|
|
81
|
+
When implementing custom components, import `commonComponentStylesCss` and include it in your component's `css` initialization array so your controls automatically inherit standard `@ibgib` aesthetics (`.action-btn`, `.secondary`, `.tab-btn`, `.text-input`, `.status-msg`, `.address-code`):
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
import thisCss from "./my-component.css";
|
|
85
|
+
import thisHtml from "./my-component.html";
|
|
86
|
+
import commonComponentStylesCss from "../common-component-styles.css";
|
|
87
|
+
|
|
88
|
+
// Inside Meta.createInstance():
|
|
89
|
+
await component.initialize({
|
|
90
|
+
ibGibAddr,
|
|
91
|
+
meta: this,
|
|
92
|
+
html: thisHtml,
|
|
93
|
+
css: [commonComponentStylesCss, thisCss],
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
29
99
|
## 🛠️ How to Create an IbGib UI Component
|
|
30
100
|
|
|
31
101
|
### 1. Registering your Component Metadata
|
|
@@ -33,7 +103,7 @@ To register your component with the shell router, extend `IbGibDynamicComponentM
|
|
|
33
103
|
|
|
34
104
|
```typescript
|
|
35
105
|
import { IbGibDynamicComponentMetaBase } from '@ibgib/web-gib/dist/ui/component/ibgib-dynamic-component-bases.mjs';
|
|
36
|
-
import {
|
|
106
|
+
import { getComponentSvc } from '@ibgib/web-gib/dist/ui/component/ibgib-component-service.mjs';
|
|
37
107
|
|
|
38
108
|
export const MY_COMPONENT_NAME = 'my-custom-component';
|
|
39
109
|
|
|
@@ -41,13 +111,21 @@ export class MyComponentMeta extends IbGibDynamicComponentMetaBase {
|
|
|
41
111
|
routeRegExp = new RegExp(`^${MY_COMPONENT_NAME}$`);
|
|
42
112
|
componentName = MY_COMPONENT_NAME;
|
|
43
113
|
|
|
44
|
-
createInstance(opts) {
|
|
45
|
-
|
|
114
|
+
async createInstance(opts) {
|
|
115
|
+
const component = document.createElement(this.componentName);
|
|
116
|
+
await component.initialize({
|
|
117
|
+
ibGibAddr: opts.ibGibAddr,
|
|
118
|
+
meta: this,
|
|
119
|
+
html: thisHtml,
|
|
120
|
+
css: [commonComponentStylesCss, thisCss],
|
|
121
|
+
});
|
|
122
|
+
return component;
|
|
46
123
|
}
|
|
47
124
|
}
|
|
48
125
|
|
|
49
126
|
// Register with central service
|
|
50
|
-
componentSvc
|
|
127
|
+
const componentSvc = await getComponentSvc();
|
|
128
|
+
await componentSvc.registerComponentMeta(new MyComponentMeta());
|
|
51
129
|
```
|
|
52
130
|
|
|
53
131
|
### 2. Implementing the Component Instance
|
|
@@ -250,4 +328,3 @@ For complex views that act as shells containing other interactive component tabs
|
|
|
250
328
|
}));
|
|
251
329
|
```
|
|
252
330
|
The parent component listens to this event in `created()` and triggers `activateIbGib({ addr })` to dynamically open and activate the sub-tab.
|
|
253
|
-
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
@ibgib/web-gib — Common Web Component Stylesheet
|
|
3
|
+
Shared Shadow DOM styles for buttons, tabs, inputs, cards, and status tags.
|
|
4
|
+
========================================================================= */
|
|
5
|
+
|
|
6
|
+
:host {
|
|
7
|
+
--clr-bg-deep: #05080f;
|
|
8
|
+
--clr-bg-surface: #0b1120;
|
|
9
|
+
--clr-bg-glass: rgba(11, 17, 32, 0.7);
|
|
10
|
+
--clr-border: rgba(120, 248, 126, 0.12);
|
|
11
|
+
--clr-border-hover: rgba(120, 248, 126, 0.32);
|
|
12
|
+
|
|
13
|
+
--clr-accent: #78f87e;
|
|
14
|
+
--clr-accent-dim: rgba(120, 248, 126, 0.35);
|
|
15
|
+
--clr-accent-glow: rgba(120, 248, 126, 0.15);
|
|
16
|
+
|
|
17
|
+
--clr-text-primary: #e8f0e8;
|
|
18
|
+
--clr-text-secondary: #8fa08f;
|
|
19
|
+
--clr-text-muted: #4a604a;
|
|
20
|
+
|
|
21
|
+
--clr-danger: #ff5b5b;
|
|
22
|
+
--clr-warn: #ffcc44;
|
|
23
|
+
--clr-info: #44aaff;
|
|
24
|
+
|
|
25
|
+
--font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
26
|
+
--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
|
|
27
|
+
|
|
28
|
+
--radius-sm: 6px;
|
|
29
|
+
--radius-md: 12px;
|
|
30
|
+
--radius-lg: 20px;
|
|
31
|
+
|
|
32
|
+
--t-fast: 120ms ease;
|
|
33
|
+
--t-med: 240ms ease;
|
|
34
|
+
|
|
35
|
+
--tab-padding: 0.55rem 1.25rem;
|
|
36
|
+
--tab-background-color: rgba(255, 255, 255, 0.03);
|
|
37
|
+
--tab-background-color-hover: rgba(255, 255, 255, 0.08);
|
|
38
|
+
--tab-background-color-active: rgba(120, 248, 126, 0.1);
|
|
39
|
+
--tab-border-radius: var(--radius-sm) var(--radius-sm) 0 0;
|
|
40
|
+
--tab-border-width: 1px;
|
|
41
|
+
--tab-border-color: rgba(255, 255, 255, 0.05);
|
|
42
|
+
--tab-border-color-active: var(--clr-accent-dim);
|
|
43
|
+
--tab-text-color: var(--clr-text-secondary);
|
|
44
|
+
--tab-text-color-active: var(--clr-accent);
|
|
45
|
+
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
*, *::before, *::after {
|
|
50
|
+
box-sizing: border-box;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.hidden {
|
|
54
|
+
display: none !important;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* ── Container ── */
|
|
58
|
+
.component-container {
|
|
59
|
+
padding: 2rem;
|
|
60
|
+
background: var(--clr-bg-glass);
|
|
61
|
+
backdrop-filter: blur(16px);
|
|
62
|
+
border-radius: var(--radius-lg);
|
|
63
|
+
border: 1px solid var(--clr-border);
|
|
64
|
+
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5), 0 0 0 1px var(--clr-border);
|
|
65
|
+
color: var(--clr-text-primary);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* ── Action Row & Action Buttons ── */
|
|
69
|
+
.action-row {
|
|
70
|
+
display: flex;
|
|
71
|
+
gap: 1rem;
|
|
72
|
+
margin-top: 0.5rem;
|
|
73
|
+
align-items: center;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.action-btn {
|
|
77
|
+
padding: 0.75rem 1.5rem;
|
|
78
|
+
background: var(--clr-accent);
|
|
79
|
+
color: var(--clr-bg-deep);
|
|
80
|
+
border: 1px solid transparent;
|
|
81
|
+
border-radius: var(--radius-md);
|
|
82
|
+
font-family: var(--font-sans);
|
|
83
|
+
font-weight: 600;
|
|
84
|
+
font-size: 0.9rem;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
transition: all var(--t-fast);
|
|
87
|
+
display: inline-flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
outline: none;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.action-btn:hover:not(:disabled) {
|
|
94
|
+
background: #9fffa5;
|
|
95
|
+
color: var(--clr-bg-deep);
|
|
96
|
+
border-color: transparent;
|
|
97
|
+
transform: translateY(-1px);
|
|
98
|
+
box-shadow: 0 4px 12px var(--clr-accent-glow);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.action-btn:active:not(:disabled) {
|
|
102
|
+
transform: translateY(0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.action-btn.secondary {
|
|
106
|
+
background: transparent;
|
|
107
|
+
border-color: rgba(255, 255, 255, 0.2);
|
|
108
|
+
color: var(--clr-text-primary);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.action-btn.secondary:hover:not(:disabled) {
|
|
112
|
+
background: rgba(255, 255, 255, 0.05);
|
|
113
|
+
border-color: rgba(255, 255, 255, 0.4);
|
|
114
|
+
color: var(--clr-text-primary);
|
|
115
|
+
box-shadow: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.action-btn:disabled {
|
|
119
|
+
opacity: 0.5;
|
|
120
|
+
cursor: not-allowed;
|
|
121
|
+
background: var(--clr-border) !important;
|
|
122
|
+
color: var(--clr-text-muted) !important;
|
|
123
|
+
border-color: transparent !important;
|
|
124
|
+
box-shadow: none !important;
|
|
125
|
+
transform: none !important;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.action-btn.active-primary:disabled {
|
|
129
|
+
opacity: 0.85;
|
|
130
|
+
background: rgba(120, 248, 126, 0.15) !important;
|
|
131
|
+
color: var(--clr-accent) !important;
|
|
132
|
+
border: 1px solid var(--clr-accent) !important;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* ── Tabs ── */
|
|
136
|
+
.tabs-row {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: 0.5rem;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.tabs-list {
|
|
143
|
+
display: flex;
|
|
144
|
+
gap: 0.25rem;
|
|
145
|
+
overflow-x: auto;
|
|
146
|
+
flex-grow: 1;
|
|
147
|
+
padding-bottom: 5px;
|
|
148
|
+
margin-bottom: -5px;
|
|
149
|
+
scrollbar-width: thin;
|
|
150
|
+
scrollbar-color: var(--clr-accent-dim) transparent;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.tabs-list::-webkit-scrollbar {
|
|
154
|
+
height: 5px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.tabs-list::-webkit-scrollbar-track {
|
|
158
|
+
background: transparent;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.tabs-list::-webkit-scrollbar-thumb {
|
|
162
|
+
background: var(--clr-accent-dim);
|
|
163
|
+
border-radius: var(--radius-sm);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.tab-btn,
|
|
167
|
+
.panel-tab-button {
|
|
168
|
+
padding: var(--tab-padding);
|
|
169
|
+
background: var(--tab-background-color);
|
|
170
|
+
border-radius: var(--tab-border-radius);
|
|
171
|
+
border: var(--tab-border-width) solid var(--tab-border-color);
|
|
172
|
+
border-bottom: none;
|
|
173
|
+
color: var(--tab-text-color);
|
|
174
|
+
font-family: var(--font-sans);
|
|
175
|
+
font-size: 0.85rem;
|
|
176
|
+
font-weight: 500;
|
|
177
|
+
cursor: pointer;
|
|
178
|
+
white-space: nowrap;
|
|
179
|
+
transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast);
|
|
180
|
+
outline: none;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.tab-btn:hover,
|
|
184
|
+
.panel-tab-button:hover {
|
|
185
|
+
background: var(--tab-background-color-hover);
|
|
186
|
+
color: var(--clr-text-primary);
|
|
187
|
+
border-color: var(--clr-border-hover);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.tab-btn.active,
|
|
191
|
+
.panel-tab-button.active {
|
|
192
|
+
background: var(--tab-background-color-active);
|
|
193
|
+
color: var(--tab-text-color-active);
|
|
194
|
+
border-color: var(--tab-border-color-active);
|
|
195
|
+
border-bottom: var(--tab-border-width) solid transparent;
|
|
196
|
+
font-weight: 600;
|
|
197
|
+
box-shadow: inset 0 2px 0 0 var(--clr-accent);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.tab-btn.global-active::after {
|
|
201
|
+
content: " •";
|
|
202
|
+
color: var(--clr-accent);
|
|
203
|
+
font-size: 1.2rem;
|
|
204
|
+
line-height: 0;
|
|
205
|
+
vertical-align: middle;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* ── Inputs ── */
|
|
209
|
+
.text-input,
|
|
210
|
+
.secret-input {
|
|
211
|
+
flex-grow: 1;
|
|
212
|
+
padding: 0.75rem;
|
|
213
|
+
background: rgba(0, 0, 0, 0.25);
|
|
214
|
+
color: var(--clr-text-primary);
|
|
215
|
+
border: 1px solid var(--clr-border);
|
|
216
|
+
border-radius: var(--radius-sm);
|
|
217
|
+
font-size: 0.9rem;
|
|
218
|
+
font-family: var(--font-mono);
|
|
219
|
+
transition: border-color var(--t-fast);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.text-input:focus,
|
|
223
|
+
.secret-input:focus {
|
|
224
|
+
outline: none;
|
|
225
|
+
border-color: var(--clr-accent);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.text-input.invalid,
|
|
229
|
+
.secret-input.invalid {
|
|
230
|
+
border-color: var(--clr-danger);
|
|
231
|
+
box-shadow: 0 0 0 2px rgba(255, 91, 91, 0.2);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* ── Status Messages & Code Formatting ── */
|
|
235
|
+
.status-msg {
|
|
236
|
+
padding: 0.75rem 1rem;
|
|
237
|
+
border-radius: var(--radius-sm);
|
|
238
|
+
font-size: 0.85rem;
|
|
239
|
+
margin: 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.status-msg.success {
|
|
243
|
+
background: rgba(120, 248, 126, 0.08);
|
|
244
|
+
border: 1px solid var(--clr-border);
|
|
245
|
+
color: var(--clr-accent);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.status-msg.error {
|
|
249
|
+
background: rgba(255, 91, 91, 0.08);
|
|
250
|
+
border: 1px solid rgba(255, 91, 91, 0.2);
|
|
251
|
+
color: var(--clr-danger);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.status-msg.info {
|
|
255
|
+
background: rgba(255, 255, 255, 0.03);
|
|
256
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
257
|
+
color: var(--clr-text-secondary);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.address-code,
|
|
261
|
+
.keystone-addr {
|
|
262
|
+
display: block;
|
|
263
|
+
padding: 0.75rem;
|
|
264
|
+
background: rgba(0, 0, 0, 0.3);
|
|
265
|
+
border-radius: var(--radius-sm);
|
|
266
|
+
font-family: var(--font-mono);
|
|
267
|
+
font-size: 0.85rem;
|
|
268
|
+
word-break: break-all;
|
|
269
|
+
color: var(--clr-accent);
|
|
270
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
width: 100%;
|
|
4
|
+
margin: 1rem auto;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.component-container {
|
|
8
|
+
padding: 1.5rem;
|
|
9
|
+
background: var(--ibgib-bg-surface, #1e1e2e);
|
|
10
|
+
color: var(--ibgib-text-primary, #cdd6f4);
|
|
11
|
+
border-radius: 12px;
|
|
12
|
+
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.input-group {
|
|
16
|
+
margin-bottom: 1.2rem;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
gap: 0.4rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.input-group label {
|
|
23
|
+
font-size: 0.95rem;
|
|
24
|
+
font-weight: 500;
|
|
25
|
+
color: var(--ibgib-text-secondary, #a6adc8);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.text-input,
|
|
29
|
+
.secret-input {
|
|
30
|
+
padding: 0.75rem 1rem;
|
|
31
|
+
border-radius: 8px;
|
|
32
|
+
border: 1px solid var(--ibgib-border-color, #45475a);
|
|
33
|
+
background: var(--ibgib-bg-input, #11111b);
|
|
34
|
+
color: var(--ibgib-text-primary, #cdd6f4);
|
|
35
|
+
font-size: 1rem;
|
|
36
|
+
outline: none;
|
|
37
|
+
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.text-input:focus,
|
|
41
|
+
.secret-input:focus {
|
|
42
|
+
border-color: var(--ibgib-accent-color, #89b4fa);
|
|
43
|
+
box-shadow: 0 0 0 2px rgba(137, 180, 250, 0.2);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.text-input.invalid,
|
|
47
|
+
.secret-input.invalid {
|
|
48
|
+
border-color: #f38ba8;
|
|
49
|
+
box-shadow: 0 0 0 2px rgba(243, 139, 168, 0.2);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.action-row {
|
|
53
|
+
margin-top: 1.5rem;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.action-btn {
|
|
57
|
+
width: 100%;
|
|
58
|
+
padding: 0.85rem 1.5rem;
|
|
59
|
+
border: none;
|
|
60
|
+
border-radius: 8px;
|
|
61
|
+
background: linear-gradient(135deg, #50fa7b, #40c767);
|
|
62
|
+
color: #11111b;
|
|
63
|
+
font-size: 1rem;
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
transition: transform 0.15s ease, opacity 0.15s ease;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.action-btn:hover {
|
|
70
|
+
transform: translateY(-1px);
|
|
71
|
+
opacity: 0.95;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.action-btn:active {
|
|
75
|
+
transform: translateY(0);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.status-area {
|
|
79
|
+
margin-top: 1.2rem;
|
|
80
|
+
padding: 1rem;
|
|
81
|
+
border-radius: 8px;
|
|
82
|
+
font-size: 0.95rem;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.status-area.info {
|
|
86
|
+
background: rgba(137, 180, 250, 0.15);
|
|
87
|
+
border: 1px solid #89b4fa;
|
|
88
|
+
color: #89b4fa;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.status-area.error {
|
|
92
|
+
background: rgba(243, 139, 168, 0.15);
|
|
93
|
+
border: 1px solid #f38ba8;
|
|
94
|
+
color: #f38ba8;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.status-area.success {
|
|
98
|
+
background: rgba(166, 227, 161, 0.15);
|
|
99
|
+
border: 1px solid #a6e3a1;
|
|
100
|
+
color: #a6e3a1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.hidden {
|
|
104
|
+
display: none !important;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.collapsed {
|
|
108
|
+
display: none !important;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.result-area {
|
|
112
|
+
margin-top: 1.5rem;
|
|
113
|
+
padding: 1.2rem;
|
|
114
|
+
border-radius: 8px;
|
|
115
|
+
background: rgba(166, 227, 161, 0.1);
|
|
116
|
+
border: 1px solid #a6e3a1;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.result-area h3 {
|
|
120
|
+
margin-top: 0;
|
|
121
|
+
color: #a6e3a1;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.keystone-addr {
|
|
125
|
+
display: block;
|
|
126
|
+
word-break: break-all;
|
|
127
|
+
padding: 0.6rem;
|
|
128
|
+
background: #11111b;
|
|
129
|
+
border-radius: 6px;
|
|
130
|
+
font-family: monospace;
|
|
131
|
+
font-size: 0.85rem;
|
|
132
|
+
color: #89b4fa;
|
|
133
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<div id="container" class="component-container">
|
|
2
|
+
<h2 id="title">Add New Device (Pairing)</h2>
|
|
3
|
+
<div class="content">
|
|
4
|
+
<p>Pair this device to your existing primary identity timeline.</p>
|
|
5
|
+
|
|
6
|
+
<div class="input-group">
|
|
7
|
+
<label for="input-identifier">Username or Email</label>
|
|
8
|
+
<input type="text" id="input-identifier" placeholder="Enter registered username or email..."
|
|
9
|
+
class="text-input">
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="input-group">
|
|
13
|
+
<label for="input-device-tag">Device Tag / Name *</label>
|
|
14
|
+
<input type="text" id="input-device-tag" placeholder="e.g. laptop, phone, living-room..."
|
|
15
|
+
class="text-input">
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="input-group">
|
|
19
|
+
<label for="input-passphrase">Master Passphrase</label>
|
|
20
|
+
<input type="password" id="input-passphrase" placeholder="Enter your master passphrase..."
|
|
21
|
+
class="secret-input">
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="checkbox-group" style="margin-bottom: 1.5rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
25
|
+
<input type="checkbox" id="checkbox-make-active" checked
|
|
26
|
+
style="cursor: pointer; width: 1rem; height: 1rem;">
|
|
27
|
+
<label for="checkbox-make-active" style="cursor: pointer; font-size: 0.9rem; user-select: none;">Set as
|
|
28
|
+
active device on this browser</label>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="action-row">
|
|
32
|
+
<button id="btn-add-device" class="action-btn">Pair & Add Device</button>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="switch-workflow" style="margin-top: 1.2rem; text-align: center; font-size: 0.9rem; color: #a6adc8;">
|
|
36
|
+
Need a new identity? <button id="btn-switch-create-account" class="link-btn"
|
|
37
|
+
style="background: none; border: none; color: #89b4fa; font-weight: 600; cursor: pointer; text-decoration: underline; padding: 0; font-size: 0.9rem;">Create
|
|
38
|
+
Account</button>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div id="status-area" class="status-area hidden">
|
|
42
|
+
<p id="status-text" class="status-msg"></p>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div id="result-area" class="result-area collapsed">
|
|
46
|
+
<h3>Device Paired Successfully!</h3>
|
|
47
|
+
<p class="address-label">New Device Delegate Address:</p>
|
|
48
|
+
<code id="delegate-addr" class="keystone-addr"></code>
|
|
49
|
+
<p class="warning">✅ This device is now authorized to sync with your primary identity.</p>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|