@jskit-ai/workspaces-web 0.1.157 → 0.1.158
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/package.json +8 -8
- package/patterns/workspace-surfaces/PATTERN.md +2 -0
- package/patterns/workspace-surfaces/example/src/components/WorkspaceNotFoundCard.vue +3 -14
- package/patterns/workspace-surfaces/example/src/pages/admin/workspace/settings/index.vue +0 -8
- package/patterns/workspace-surfaces/example/src/pages/admin/workspace/settings.vue +0 -14
- package/patterns/workspace-surfaces/example/src/surfaces/admin/index.vue +4 -31
- package/patterns/workspace-surfaces/example/src/surfaces/app/index.vue +0 -15
- package/test/settingsPlacementContract.test.js +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/workspaces-web",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.158",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test"
|
|
@@ -14,16 +14,16 @@
|
|
|
14
14
|
"./client/composables/useWorkspaceRouteContext": "./src/client/composables/useWorkspaceRouteContext.js"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@jskit-ai/users-core": "0.1.
|
|
18
|
-
"@jskit-ai/workspaces-core": "0.1.
|
|
17
|
+
"@jskit-ai/users-core": "0.1.192",
|
|
18
|
+
"@jskit-ai/workspaces-core": "0.1.157",
|
|
19
19
|
"@mdi/js": "^7.4.47"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@jskit-ai/auth-web": "0.1.
|
|
23
|
-
"@jskit-ai/http-web": "0.1.
|
|
24
|
-
"@jskit-ai/kernel": "0.1.
|
|
25
|
-
"@jskit-ai/shell-web": "0.1.
|
|
26
|
-
"@jskit-ai/users-web": "0.1.
|
|
22
|
+
"@jskit-ai/auth-web": "0.1.179",
|
|
23
|
+
"@jskit-ai/http-web": "0.1.24",
|
|
24
|
+
"@jskit-ai/kernel": "0.1.179",
|
|
25
|
+
"@jskit-ai/shell-web": "0.1.183",
|
|
26
|
+
"@jskit-ai/users-web": "0.1.197",
|
|
27
27
|
"@tanstack/vue-query": "^5.90.5",
|
|
28
28
|
"vue": "^3.5.13",
|
|
29
29
|
"vue-router": "^5.0.4",
|
|
@@ -32,6 +32,8 @@ Use the workspace client provider, components, and composables exported by
|
|
|
32
32
|
## Invariants
|
|
33
33
|
|
|
34
34
|
- Route workspace slug, selected workspace, and server scope stay synchronized.
|
|
35
|
+
- Route and surface pages do not add a page header or standalone heading by
|
|
36
|
+
default.
|
|
35
37
|
- Invitation acceptance is public only where the server contract permits it.
|
|
36
38
|
- Administrative UI visibility never substitutes for server authorization.
|
|
37
39
|
- Query and route state hydrate immediately on warm-cache navigation.
|
|
@@ -19,12 +19,9 @@ const normalizedMessage = computed(() => String(props.message || "").trim() || "
|
|
|
19
19
|
|
|
20
20
|
<template>
|
|
21
21
|
<v-sheet rounded="lg" border class="workspace-unavailable-panel">
|
|
22
|
-
<div class="workspace-unavailable-
|
|
22
|
+
<div class="workspace-unavailable-panel__status">
|
|
23
23
|
<v-icon :icon="mdiAlertCircleOutline" color="error" />
|
|
24
|
-
<
|
|
25
|
-
<h1 class="workspace-unavailable-panel__title">Unavailable</h1>
|
|
26
|
-
<p class="text-body-2 text-medium-emphasis mb-0">{{ normalizedSurfaceLabel }} surface.</p>
|
|
27
|
-
</div>
|
|
24
|
+
<p class="text-body-2 text-medium-emphasis mb-0">{{ normalizedSurfaceLabel }} surface unavailable.</p>
|
|
28
25
|
</div>
|
|
29
26
|
<p class="text-body-2 text-medium-emphasis mb-0">{{ normalizedMessage }}</p>
|
|
30
27
|
</v-sheet>
|
|
@@ -37,17 +34,9 @@ const normalizedMessage = computed(() => String(props.message || "").trim() || "
|
|
|
37
34
|
padding: 1rem;
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
.workspace-unavailable-
|
|
37
|
+
.workspace-unavailable-panel__status {
|
|
41
38
|
align-items: flex-start;
|
|
42
39
|
display: flex;
|
|
43
40
|
gap: 0.75rem;
|
|
44
41
|
}
|
|
45
|
-
|
|
46
|
-
.workspace-unavailable-panel__title {
|
|
47
|
-
font-size: clamp(1.35rem, 2vw, 1.85rem);
|
|
48
|
-
font-weight: 650;
|
|
49
|
-
letter-spacing: -0.02em;
|
|
50
|
-
line-height: 1.15;
|
|
51
|
-
margin: 0 0 0.25rem;
|
|
52
|
-
}
|
|
53
42
|
</style>
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<section class="workspace-settings-landing">
|
|
3
3
|
<v-sheet rounded="lg" border class="workspace-settings-landing__panel">
|
|
4
|
-
<h2 class="workspace-settings-landing__title">No settings sections yet</h2>
|
|
5
4
|
<p class="text-body-2 text-medium-emphasis mb-0">
|
|
6
5
|
This app has no workspace-level settings configured.
|
|
7
6
|
</p>
|
|
@@ -13,11 +12,4 @@
|
|
|
13
12
|
.workspace-settings-landing__panel {
|
|
14
13
|
padding: 1rem;
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
.workspace-settings-landing__title {
|
|
18
|
-
font-size: 1rem;
|
|
19
|
-
font-weight: 650;
|
|
20
|
-
line-height: 1.2;
|
|
21
|
-
margin: 0 0 0.25rem;
|
|
22
|
-
}
|
|
23
15
|
</style>
|
|
@@ -5,12 +5,6 @@ import { RouterView } from "vue-router";
|
|
|
5
5
|
|
|
6
6
|
<template>
|
|
7
7
|
<section class="settings-shell d-flex flex-column ga-4">
|
|
8
|
-
<header>
|
|
9
|
-
<p class="text-overline text-medium-emphasis mb-1">Settings</p>
|
|
10
|
-
<h1 class="settings-shell__title">Workspace settings</h1>
|
|
11
|
-
<p class="text-body-2 text-medium-emphasis mb-0">Configure the current workspace and its members.</p>
|
|
12
|
-
</header>
|
|
13
|
-
|
|
14
8
|
<v-sheet rounded="lg" border class="settings-shell__panel">
|
|
15
9
|
<nav class="settings-shell__nav" aria-label="Workspace settings sections">
|
|
16
10
|
<v-list nav density="compact" class="settings-shell__nav-list">
|
|
@@ -25,14 +19,6 @@ import { RouterView } from "vue-router";
|
|
|
25
19
|
</template>
|
|
26
20
|
|
|
27
21
|
<style scoped>
|
|
28
|
-
.settings-shell__title {
|
|
29
|
-
font-size: clamp(1.35rem, 2vw, 1.85rem);
|
|
30
|
-
font-weight: 650;
|
|
31
|
-
letter-spacing: -0.02em;
|
|
32
|
-
line-height: 1.15;
|
|
33
|
-
margin: 0 0 0.35rem;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
22
|
.settings-shell__panel {
|
|
37
23
|
display: grid;
|
|
38
24
|
gap: 1rem;
|
|
@@ -20,20 +20,12 @@ function adminChildPath(suffix = "") {
|
|
|
20
20
|
surface-label="Admin"
|
|
21
21
|
/>
|
|
22
22
|
<section v-else class="workspace-admin-screen d-flex flex-column ga-4">
|
|
23
|
-
<
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<p class="text-body-2 text-medium-emphasis mb-0">Manage members and workspace settings.</p>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="workspace-admin-screen__actions">
|
|
30
|
-
<v-btn color="primary" variant="flat" :to="adminChildPath('members')">Members</v-btn>
|
|
31
|
-
<v-btn color="primary" variant="tonal" :to="adminChildPath('workspace/settings')">Settings</v-btn>
|
|
32
|
-
</div>
|
|
33
|
-
</header>
|
|
23
|
+
<div class="workspace-admin-screen__actions">
|
|
24
|
+
<v-btn color="primary" variant="flat" :to="adminChildPath('members')">Members</v-btn>
|
|
25
|
+
<v-btn color="primary" variant="tonal" :to="adminChildPath('workspace/settings')">Settings</v-btn>
|
|
26
|
+
</div>
|
|
34
27
|
|
|
35
28
|
<v-sheet rounded="lg" border class="workspace-admin-screen__panel">
|
|
36
|
-
<h2 class="text-h6 mb-2">Admin tasks</h2>
|
|
37
29
|
<p class="text-body-2 text-medium-emphasis mb-0">
|
|
38
30
|
Review workspace access, members, and operational settings from this surface.
|
|
39
31
|
</p>
|
|
@@ -42,21 +34,6 @@ function adminChildPath(suffix = "") {
|
|
|
42
34
|
</template>
|
|
43
35
|
|
|
44
36
|
<style scoped>
|
|
45
|
-
.workspace-admin-screen__header {
|
|
46
|
-
align-items: flex-start;
|
|
47
|
-
display: flex;
|
|
48
|
-
gap: 1rem;
|
|
49
|
-
justify-content: space-between;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.workspace-admin-screen__title {
|
|
53
|
-
font-size: clamp(1.5rem, 2.5vw, 2.25rem);
|
|
54
|
-
font-weight: 700;
|
|
55
|
-
letter-spacing: -0.03em;
|
|
56
|
-
line-height: 1.1;
|
|
57
|
-
margin: 0 0 0.4rem;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
37
|
.workspace-admin-screen__actions {
|
|
61
38
|
display: flex;
|
|
62
39
|
flex-wrap: wrap;
|
|
@@ -69,10 +46,6 @@ function adminChildPath(suffix = "") {
|
|
|
69
46
|
}
|
|
70
47
|
|
|
71
48
|
@media (max-width: 640px) {
|
|
72
|
-
.workspace-admin-screen__header {
|
|
73
|
-
flex-direction: column;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
49
|
.workspace-admin-screen__actions {
|
|
77
50
|
width: 100%;
|
|
78
51
|
}
|
|
@@ -12,14 +12,7 @@ const { workspaceUnavailable, workspaceUnavailableMessage } = useWorkspaceNotFou
|
|
|
12
12
|
surface-label="App"
|
|
13
13
|
/>
|
|
14
14
|
<section v-else class="workspace-home-screen d-flex flex-column ga-4">
|
|
15
|
-
<header>
|
|
16
|
-
<p class="text-overline text-medium-emphasis mb-1">Workspace</p>
|
|
17
|
-
<h1 class="workspace-home-screen__title">Workspace Home</h1>
|
|
18
|
-
<p class="text-body-2 text-medium-emphasis mb-0">The current workspace is active.</p>
|
|
19
|
-
</header>
|
|
20
|
-
|
|
21
15
|
<v-sheet rounded="lg" border class="workspace-home-screen__panel">
|
|
22
|
-
<h2 class="text-h6 mb-2">No workspace activity yet</h2>
|
|
23
16
|
<p class="text-body-2 text-medium-emphasis mb-0">
|
|
24
17
|
Activity from workspace workflows will appear here.
|
|
25
18
|
</p>
|
|
@@ -28,14 +21,6 @@ const { workspaceUnavailable, workspaceUnavailableMessage } = useWorkspaceNotFou
|
|
|
28
21
|
</template>
|
|
29
22
|
|
|
30
23
|
<style scoped>
|
|
31
|
-
.workspace-home-screen__title {
|
|
32
|
-
font-size: clamp(1.5rem, 2.5vw, 2.25rem);
|
|
33
|
-
font-weight: 700;
|
|
34
|
-
letter-spacing: -0.03em;
|
|
35
|
-
line-height: 1.1;
|
|
36
|
-
margin: 0 0 0.4rem;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
24
|
.workspace-home-screen__panel {
|
|
40
25
|
margin-inline: auto;
|
|
41
26
|
max-width: 34rem;
|
|
@@ -99,9 +99,9 @@ test("workspace pattern includes pending-invite context and product-ready empty
|
|
|
99
99
|
assert.match(cue, /placementContext\.value\?\.pendingInvitesCount/);
|
|
100
100
|
assert.match(cue, /placementContext\.value\?\.workspaceInvitesEnabled/);
|
|
101
101
|
assert.doesNotMatch(cue, /\bfetch\s*\(|\buseQuery\b/);
|
|
102
|
-
assert.match(settingsLanding, /
|
|
103
|
-
assert.match(appSurface, /
|
|
104
|
-
assert.match(adminSurface, /
|
|
102
|
+
assert.match(settingsLanding, /This app has no workspace-level settings configured/);
|
|
103
|
+
assert.match(appSurface, /Activity from workspace workflows will appear here/);
|
|
104
|
+
assert.match(adminSurface, /Review workspace access, members, and operational settings/);
|
|
105
105
|
assert.doesNotMatch(appSurface, /Replace this page|Primary in-workspace surface/);
|
|
106
106
|
assert.doesNotMatch(adminSurface, /Use this area|Privileged workspace workflows/);
|
|
107
107
|
});
|