@ibgib/web-gib 0.0.52 → 0.0.56
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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Identity Manager Component - Implementation Spec
|
|
2
|
+
|
|
3
|
+
This document maps the implementation details for the reusable `identity-manager` component (`ibgib-identity-manager`). While developed initially inside `space-gib` as a reference implementation, it is designed to be highly decoupled and may eventually migrate down to `web-gib` for use in other downstream applications.
|
|
4
|
+
|
|
5
|
+
## Core Architecture (Separation of App and Data)
|
|
6
|
+
|
|
7
|
+
We advocate for a strict separation of **applications** and **data providers**:
|
|
8
|
+
- **Local-First & Sync-Based**: Applications run local-first, storing user data in a local space and syncing peer-to-peer with remote data spaces/hosts via the `sync-gib` protocol.
|
|
9
|
+
- **Auditable Keystone Identity**: Identity is represented by a **Domain Keystone ($I$)**—a verifiable, historical timeline of challenge-reveals. Authentication is performed by walking and verifying the evolution history of the keystone timeline.
|
|
10
|
+
- *Note on Pricing/Gas:* While the core identity protocol does not require transaction fees, downstream apps/hosts are free to implement pricing plans or gas-like charging mechanisms per node.
|
|
11
|
+
- **Verification Flexibility**: In V1, the verification strategy is strictly `hash-reveal-v1`. However, the keystone architecture is designed as a generic audit log. Future challenge types could wrap cryptographic certificates, witness testimonies, or simple/trivial challenges.
|
|
12
|
+
- **SSO & Custodian Delegation**: Integration with external OAuth2 providers (e.g., Google Sign-In) is a key requirement. This will likely involve delegating a "custodian status" to the hosting server/app node, allowing it to perform authorized managerial mutations on the identity timeline on behalf of the user. The cryptographic implementation details of this delegation are TBD and will be designed after the front-end is established.
|
|
13
|
+
- **Delegated Authority**: To sync data, the Domain Keystone is evolved once per session to delegate signing authority to a short-lived **Session Keystone ($S$)**. The Session Keystone targets the remote storage space, solving challenges to authorize specific read/write operations without exposing the root master secrets.
|
|
14
|
+
- **Backing Index & Coupling**: When initialized with a virtual address (`ROOT_ADDR`), the component manually retrieves and binds to the `"keystones"` special index `ibgib` from the local space. It also initializes and couples a local settings `ibgib` using `this.initSettings()`.
|
|
15
|
+
- **Settings-driven Active Selection:** The user's active identity address is stored inside the coupled settings `ibgib` under the `general` section (`SettingsType.general`). Tab switching updates this setting reactively. Since other components (like `<ibgib-identity-header>`) bind to the same `"keystones"` index and share its settings scope, they reactively adapt to updates on the settings timeline.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Component Role & Hierarchy
|
|
20
|
+
|
|
21
|
+
The `identity-manager` functions as a tabbed/list parent component (extending `IbGibDynamicComponentInstanceBase_ParentOfTabs` or `IbGibDynamicComponentInstanceBase_Parent`) that manages one or more Domain Identities:
|
|
22
|
+
|
|
23
|
+
1. **Identity List & Selection**:
|
|
24
|
+
- Renders a list of loaded/configured Domain Identities from the `"keystones"` index relation `"keystone"`.
|
|
25
|
+
- Leverages tab/list activation plumbing to switch between active identities.
|
|
26
|
+
- Saves and restores the active primary identity in the `general` settings section via `this.updateSettings()`.
|
|
27
|
+
2. **Identity Creator (Child Component)**:
|
|
28
|
+
- If no identity is loaded or created, it dynamically mounts the generic `ibgib-keystone-creator` component to generate a new Genesis Keystone or import one via a master secret.
|
|
29
|
+
3. **Identity Explorer / Raw Viewer**:
|
|
30
|
+
- For any selected identity, provides a "Raw View" tab/accordion.
|
|
31
|
+
- This embeds a raw explorer similar to the `ibgib-raw` component (`apps/blank-gib/src/components/common/raw/`) to display the raw JSON of the keystone frames and trace their evolutionary lineage.
|
|
32
|
+
4. **Active Sync & Replicas Control**:
|
|
33
|
+
- Displays the active primary sync channel and session delegation status.
|
|
34
|
+
- Provides options to register additional remote space URLs as replicas (structured similarly to how a package manager configures repositories). V1 focuses on a single active sync channel, with structural UI support for multiple future backup peers.
|
|
35
|
+
- *Investigation:* We will analyze whether and how to securely propagate/sync the identity itself to other providers using keystone evolution.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Component Structure
|
|
40
|
+
|
|
41
|
+
Following the custom `web-gib` Web Component microframework, the component consists of:
|
|
42
|
+
|
|
43
|
+
* **[identity-manager.mts](file:///c:/Users/billm/antigravity/ibgib/apps/space-gib/src/client/components/identity-manager/identity-manager.mts)**: Element definition, lifecycle hooks (`initialize`, `created`, `renderUI`), event bindings, settings management, and integration with `KeystoneService_V1`.
|
|
44
|
+
* **[identity-manager.html](file:///c:/Users/billm/antigravity/ibgib/apps/space-gib/src/client/components/identity-manager/identity-manager.html)**: Markup template for Shadow DOM injection.
|
|
45
|
+
* **[identity-manager.css](file:///c:/Users/billm/antigravity/ibgib/apps/space-gib/src/client/components/identity-manager/identity-manager.css)**: Glassmorphic dark styling.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Implementation Checklist
|
|
50
|
+
|
|
51
|
+
### Phase 1: Basic Scaffolding & Setup
|
|
52
|
+
- [x] Scaffold `identity-manager.mts`, `.html`, and `.css` files (Reference: [@.agents/skills/ibgib-create-component/SKILL.md](file:///c:/Users/billm/antigravity/ibgib/.agents/skills/ibgib-create-component/SKILL.md)).
|
|
53
|
+
- [x] Register `IdentityManagerComponentMeta` with `IbGibComponentService`.
|
|
54
|
+
- [x] Expose in `SpaceGibShellService` to load `<ibgib-identity-manager>`.
|
|
55
|
+
|
|
56
|
+
### Phase 2: Identity List & Settings Integration
|
|
57
|
+
- [x] Initialize the component settings to track loaded Domain Identity addresses.
|
|
58
|
+
- [x] Implement UI tabs for switching between identities.
|
|
59
|
+
- [x] Mount `ibgib-keystone-creator` as a child view if no identity exists.
|
|
60
|
+
|
|
61
|
+
### Phase 3: Raw Explorer Integration
|
|
62
|
+
- [x] Integrate a child details panel showing raw keystone JSON using patterns from the `ibgib-raw` component.
|
|
63
|
+
- [x] Add a "Verify Chain" button executing `validateKeystoneTimeline` and reporting status.
|
|
64
|
+
|
|
65
|
+
### Phase 4: Sync & Replication Setup
|
|
66
|
+
- [x] Implement inputs to configure remote sync repositories (URLs) (currently disabled for V1).
|
|
67
|
+
- [x] Add sync button triggering a delegation evolution and starting the sync sequence (currently disabled for V1).
|
|
68
|
+
- [x] Document the custom `web-gib` Web Component microframework (covering element lifecycles, routing, parent-child delegation, and settings/tabs state persistence).
|
|
69
|
+
|
|
70
|
+
### Phase 5: UI/UX Enhancements & Bugs
|
|
71
|
+
- [x] Center/align the `<ibgib-identity-manager>` component instead of having it shoved to the left (maxing out at ~66% width of the center-panel).
|
|
72
|
+
- [x] Adjust scrolling behavior so the entire manager or manager-content div scrolls, instead of limiting the scroll region to the accordion detail pre-tag.
|
|
73
|
+
- [x] Automatically select/activate the newly created identity keystone in the tab list upon creation.
|
|
74
|
+
|
|
75
|
+
### Phase 6: Detail Views (Pools & Keystone Metadata)
|
|
76
|
+
- [x] Add a details view for challenge pools on the keystone (`KeystoneData_V1.challengePools`).
|
|
77
|
+
- [x] Add display details for each of the main areas of the keystone included in `KeystoneData_V1` and core `IbGibData_V1` properties (e.g. `n`, `timestamp`, `uuid`, etc.).
|
|
78
|
+
- [x] Support human-readable profile details (such as name, email, contact info) stored in `frameDetails` and aggregated via `checkpointDetails`/`getAggregateDetails()`.
|
|
79
|
+
|
|
80
|
+
### Phase 7: Key-Value Details & History Scrubber
|
|
81
|
+
- [x] Expand component max-width to fill the center panel (remove/adjust `max-width: 800px` on `:host`).
|
|
82
|
+
- [x] Re-layout Domain Identity Details into an inverted key-value grid (Labels in Column 1, Values in Column 2).
|
|
83
|
+
- [x] Add dedicated key-value rows for "Name" and "Description" in the details list.
|
|
84
|
+
- [x] Add "Aggr. Details" displaying the aggregated details JSON in a formatted, scrollable pre-tag.
|
|
85
|
+
- [x] Add "Frame Details" displaying the current frame's `frameDetails` JSON in a formatted, scrollable pre-tag.
|
|
86
|
+
- [x] Implement history scrubber navigation (First, Back 10, Back 1, Next 1, Next 10, Latest) to traverse the keystone timeline.
|
|
87
|
+
|
|
88
|
+
### Phase 8: Active Identity Management
|
|
89
|
+
- [x] Define reusable event constants (`EVENT_IBGIB_IDENTITY_REQUEST_CHANGE` and `EVENT_IBGIB_IDENTITY_CHANGED`) in `libs/web-gib/src/ui/ui-constants.mts`.
|
|
90
|
+
- [x] Add checkbox in `<ibgib-keystone-creator>` to make the newly created identity the active one. Enforce/lock to checked if no identities exist yet.
|
|
91
|
+
- [x] If checked on creation, `<ibgib-keystone-creator>` dispatches `EVENT_IBGIB_IDENTITY_REQUEST_CHANGE` containing the new keystone address.
|
|
92
|
+
- [x] Add "Set as Active Identity" button to `<ibgib-identity-manager>` details view. When clicked, it dispatches `EVENT_IBGIB_IDENTITY_REQUEST_CHANGE` with the selected keystone address.
|
|
93
|
+
- [x] Decouple tab clicks in `<ibgib-identity-manager>` so they only browse details via `viewIdentityDetails(addr)` without setting active identity.
|
|
94
|
+
- [x] Update `<ibgib-identity-header>` to listen for `EVENT_IBGIB_IDENTITY_REQUEST_CHANGE`. On receipt, write the address to its settings timeline, update `ibGibGlobalThis.identity`, re-render, and dispatch `EVENT_IBGIB_IDENTITY_CHANGED`.
|
|
95
|
+
- [x] Set `ibGibGlobalThis.identity` on `<ibgib-identity-header>` initialization using settings.
|
|
96
|
+
- [x] Update `<ibgib-identity-manager>` to subscribe to `EVENT_IBGIB_IDENTITY_CHANGED` and re-render/update its "Set as Active" button state accordingly.
|
|
97
|
+
- [ ] TODO: Enhance the `<ibgib-identity-header>` component to support selecting/switching between loaded identities directly from a dropdown/dropdown-like UI inside the header.
|
|
98
|
+
|
|
99
|
+
### Testing Protocol
|
|
100
|
+
- [ ] **Manual Testing Only**: All interactive and visual validation will be performed manually by the user to avoid token overhead from screenshot/video processing.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
width: 100%;
|
|
4
|
+
max-width: 100%;
|
|
5
|
+
margin: 1rem auto;
|
|
6
|
+
font-family: var(--font-family-base, inherit);
|
|
7
|
+
font-size: var(--font-size-base, 1rem);
|
|
8
|
+
color: var(--text-color-base, var(--clr-text-primary, #ffffff));
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.component-container {
|
|
13
|
+
padding: 2rem;
|
|
14
|
+
background: var(--side-panel-tab-content-background-color, var(--clr-bg-glass, rgba(20, 20, 25, 0.6)));
|
|
15
|
+
backdrop-filter: blur(16px);
|
|
16
|
+
border-radius: var(--radius-lg, 12px);
|
|
17
|
+
border: var(--border-width-base, 1px) var(--border-style-base, solid) var(--border-color-base, var(--clr-border, rgba(255, 255, 255, 0.1)));
|
|
18
|
+
box-shadow: var(--shadow-card, 0 8px 32px 0 rgba(0, 0, 0, 0.37));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
header {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
gap: 1rem;
|
|
25
|
+
margin-bottom: 2rem;
|
|
26
|
+
border-bottom: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.1));
|
|
27
|
+
padding-bottom: 1rem;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
h2 {
|
|
31
|
+
margin: 0;
|
|
32
|
+
font-size: var(--h2-font-size, 1.5rem);
|
|
33
|
+
font-weight: var(--h2-font-weight, 600);
|
|
34
|
+
color: var(--clr-accent, #50fa7b);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.icon-btn {
|
|
38
|
+
width: 2.2rem;
|
|
39
|
+
height: 2.2rem;
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
background: var(--button-background-color-base, rgba(255, 255, 255, 0.05));
|
|
44
|
+
border: 1px solid var(--button-border-color-base, rgba(255, 255, 255, 0.1));
|
|
45
|
+
border-radius: var(--button-border-radius-base, 50%);
|
|
46
|
+
color: var(--button-text-color-base, #ffffff);
|
|
47
|
+
font-size: 1.2rem;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
transition: all 0.2s ease-in-out;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.icon-btn:hover {
|
|
53
|
+
background: var(--button-hover-background-color, var(--clr-accent, #50fa7b));
|
|
54
|
+
color: var(--button-hover-text-color, #1a1a24);
|
|
55
|
+
border-color: var(--button-hover-border-color, var(--clr-accent, #50fa7b));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.content {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-direction: column;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: 1.5rem;
|
|
63
|
+
width: 100%;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.content>* {
|
|
67
|
+
width: 100%;
|
|
68
|
+
margin: 0 auto;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.placeholder-view {
|
|
72
|
+
padding: 3rem 1rem;
|
|
73
|
+
text-align: center;
|
|
74
|
+
background: rgba(0, 0, 0, 0.15);
|
|
75
|
+
border-radius: var(--radius-md, 8px);
|
|
76
|
+
border: 1px dashed var(--border-color-base, rgba(255, 255, 255, 0.1));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.placeholder-view p {
|
|
80
|
+
color: var(--clr-text-secondary, #b3b3b3);
|
|
81
|
+
margin-bottom: 1.5rem;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.action-btn {
|
|
85
|
+
padding: 0.6rem 1.2rem;
|
|
86
|
+
background: var(--clr-accent, #50fa7b);
|
|
87
|
+
border: none;
|
|
88
|
+
border-radius: var(--radius-sm, 4px);
|
|
89
|
+
color: #1a1a24;
|
|
90
|
+
font-weight: 600;
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
transition: all 0.2s ease-in-out;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.action-btn:hover {
|
|
96
|
+
background: #40c767;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.hidden {
|
|
100
|
+
display: none !important;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Tab Buttons row */
|
|
104
|
+
.tabs-row {
|
|
105
|
+
display: flex;
|
|
106
|
+
justify-content: space-between;
|
|
107
|
+
align-items: center;
|
|
108
|
+
gap: 1rem;
|
|
109
|
+
margin-top: 0.5rem;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.tabs-list {
|
|
113
|
+
display: flex;
|
|
114
|
+
gap: 0.5rem;
|
|
115
|
+
overflow-x: auto;
|
|
116
|
+
scrollbar-width: none;
|
|
117
|
+
-ms-overflow-style: none;
|
|
118
|
+
padding-bottom: 0.25rem;
|
|
119
|
+
flex-grow: 1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.tabs-list::-webkit-scrollbar {
|
|
123
|
+
display: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.tab-btn {
|
|
127
|
+
padding: 0.55rem 1.25rem;
|
|
128
|
+
background: rgba(255, 255, 255, 0.03);
|
|
129
|
+
border: 1px solid rgba(255, 255, 255, 0.05);
|
|
130
|
+
border-radius: var(--radius-sm, 6px);
|
|
131
|
+
color: var(--clr-text-secondary, #8fa08f);
|
|
132
|
+
font-family: var(--font-sans, inherit);
|
|
133
|
+
font-size: 0.9rem;
|
|
134
|
+
font-weight: 500;
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
transition: all 0.2s ease-in-out;
|
|
137
|
+
white-space: nowrap;
|
|
138
|
+
display: inline-flex;
|
|
139
|
+
align-items: center;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.tab-btn:hover {
|
|
143
|
+
background: rgba(255, 255, 255, 0.08);
|
|
144
|
+
color: var(--clr-accent, #50fa7b);
|
|
145
|
+
border-color: rgba(120, 248, 126, 0.2);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.tab-btn.active {
|
|
149
|
+
background: rgba(80, 250, 123, 0.1);
|
|
150
|
+
color: var(--clr-accent, #50fa7b);
|
|
151
|
+
border-color: var(--clr-accent-dim, rgba(120, 248, 126, 0.35));
|
|
152
|
+
box-shadow: 0 0 10px rgba(120, 248, 126, 0.05);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.tab-btn.global-active {
|
|
156
|
+
border-style: double;
|
|
157
|
+
border-width: 3px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.tab-btn.global-active::after {
|
|
161
|
+
content: " (active)";
|
|
162
|
+
font-size: 0.75rem;
|
|
163
|
+
font-style: italic;
|
|
164
|
+
opacity: 0.8;
|
|
165
|
+
margin-left: 0.25rem;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.close-tab-button {
|
|
169
|
+
font-size: 0.85rem;
|
|
170
|
+
color: var(--clr-text-secondary, #8fa08f);
|
|
171
|
+
transition: color 0.2s ease-in-out;
|
|
172
|
+
margin-left: 0.5rem;
|
|
173
|
+
line-height: 1;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.close-tab-button:hover {
|
|
177
|
+
color: var(--clr-danger, #ff5555) !important;
|
|
178
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<div id="container" class="component-container">
|
|
2
|
+
<header id="identity-manager-header">
|
|
3
|
+
<h2 id="title">Identity Manager</h2>
|
|
4
|
+
<div class="tabs-row">
|
|
5
|
+
<div id="identity-tabs" class="tabs-list">
|
|
6
|
+
<!-- Tabs will be dynamically injected here -->
|
|
7
|
+
</div>
|
|
8
|
+
<button id="btn-add-identity" class="icon-btn" title="Create or Load Identity">+</button>
|
|
9
|
+
</div>
|
|
10
|
+
</header>
|
|
11
|
+
|
|
12
|
+
<div id="identity-manager-content" class="content">
|
|
13
|
+
<!-- Active child or keystone-creator gets injected here -->
|
|
14
|
+
<div id="no-identity-placeholder" class="placeholder-view">
|
|
15
|
+
<p>No Domain Identities loaded. Create or load one to begin.</p>
|
|
16
|
+
<button id="btn-create-placeholder" class="action-btn">Create/Load Identity</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|