Skip to content

Commit cb0cb2e

Browse files
camreevesclaude
andcommitted
Merge develop into test/e2e-workplace-settings
Brings in #654 (PPT-2872), #655 (PPT-2871) and the desk asset changes from #656, which the settings specs are updated for next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015VtrxAzu8XnqXeQG3QbRXt
2 parents a5a7651 + 6eb9460 commit cb0cb2e

947 files changed

Lines changed: 16406 additions & 41898 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.fallowrc.json‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
"libs/**/src/lib/**/*.ts",
1111
"libs/**/src/test-setup.ts",
1212
"libs/mocks/src/empty.ts",
13-
"libs/mocks/src/mocks.ts",
1413
"shared/assets/**",
1514
"shared/styles/**",
1615
"tools/**/*.js",

‎.github/scripts/generate-changelogs.sh‎

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
#!/usr/bin/env bash
22

3+
# Writes ${CHANGELOG_DIR}/<app>/CHANGELOG.md for each app in AFFECTED_APPS.
4+
#
5+
# git-cliff calculates diff statistics for each commit in the history, and this
6+
# is almost all of its run time. So git-cliff reads the history one time. Then
7+
# each changelog uses only the commits that change the app paths.
8+
39
set -euo pipefail
410

511
: "${AFFECTED_APPS:?AFFECTED_APPS must be set}"
@@ -11,29 +17,58 @@ if ! [[ "$max_parallel" =~ ^[1-9][0-9]*$ ]]; then
1117
exit 1
1218
fi
1319

20+
work_dir="$(mktemp -d)"
21+
trap 'rm -rf "${work_dir}"' EXIT
22+
context="${work_dir}/context.json"
23+
app_paths="${work_dir}/paths.json"
24+
25+
applications=()
26+
while IFS= read -r application; do
27+
applications+=("${application}")
28+
done < <(jq -r '.[]' <<< "${AFFECTED_APPS}")
29+
if (( ${#applications[@]} == 0 )); then
30+
exit 0
31+
fi
32+
33+
# `previous` contains a copy of the earlier release. The template does not use
34+
# it, and it makes the context much larger.
35+
git-cliff --config cliff.toml --context | jq -c 'map(.previous = null)' > "${context}"
36+
node ./tools/get-changelog-paths.js "${applications[@]}" > "${app_paths}"
37+
1438
generate_changelog() {
1539
local application="$1"
1640
local output="${CHANGELOG_DIR}/${application}/CHANGELOG.md"
17-
local args=()
41+
local app_context="${work_dir}/${application}.json"
42+
local pathspecs=()
1843

1944
mkdir -p "$(dirname "${output}")"
2045
while IFS= read -r include_path; do
21-
args+=(--include-path "${include_path}")
22-
done < <(node ./tools/get-changelog-paths.js "${application}" | jq -r '.[]')
23-
git-cliff --config cliff.toml --output "${output}" "${args[@]}"
46+
pathspecs+=(":(glob)${include_path}")
47+
done < <(jq -r --arg app "${application}" '.[$app][]' "${app_paths}")
48+
49+
# --full-history selects the same commits as git-cliff --include-path.
50+
# Releases without app commits are removed.
51+
git log --format=%H --full-history HEAD -- "${pathspecs[@]}" |
52+
jq -R -s -c --slurpfile releases "${context}" '
53+
(split("\n") | map({ key: ., value: true }) | from_entries) as $ids
54+
| $releases[0]
55+
| map(.commits |= map(select($ids[.id])))
56+
| map(select(.commits | length > 0))
57+
' > "${app_context}"
58+
git-cliff --config cliff.toml --from-context "${app_context}" --output "${output}"
2459
}
2560

2661
mkdir -p "${CHANGELOG_DIR}"
2762
pids=()
28-
while IFS= read -r application; do
63+
for application in "${applications[@]}"; do
2964
generate_changelog "${application}" &
3065
pids+=("$!")
3166

3267
if (( ${#pids[@]} >= max_parallel )); then
3368
wait "${pids[0]}"
3469
pids=("${pids[@]:1}")
3570
fi
36-
done < <(jq -r '.[]' <<< "${AFFECTED_APPS}")
71+
done
3772

3873
for pid in "${pids[@]}"; do
3974
wait "${pid}"

‎.github/workflows/build.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
- name: Setup Node.js environment
3434
uses: actions/setup-node@v6
3535
with:
36-
node-version: '24'
36+
node-version: '26'
3737

3838
- name: Setup Bun
3939
uses: oven-sh/setup-bun@v2
@@ -169,7 +169,7 @@ jobs:
169169
- name: Setup Node.js environment
170170
uses: actions/setup-node@v6
171171
with:
172-
node-version: '24'
172+
node-version: '26'
173173

174174
- name: Setup Bun
175175
uses: oven-sh/setup-bun@v2

‎.github/workflows/e2e-advisory.yml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ jobs:
133133
# everything else combined.
134134
#
135135
# The toolchain is provisioned once on the machine instead:
136-
# brew install colima docker docker-compose node@24
136+
# brew install colima docker docker-compose node@26
137137
# See e2e/stack/SELF_HOSTED_RUNNER.md.
138138

139139
# Keep bun-version the same as build.yml and pull-request.yml: bun.lock
@@ -342,6 +342,7 @@ jobs:
342342
path: |
343343
dist/.playwright
344344
e2e-logs
345+
include-hidden-files: true
345346
retention-days: 14
346347
if-no-files-found: warn
347348

‎.github/workflows/mobile.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
- name: Setup Node.js environment
2828
uses: actions/setup-node@v6
2929
with:
30-
node-version: '24'
30+
node-version: '26'
3131

3232
- name: Setup Bun
3333
uses: oven-sh/setup-bun@v2
@@ -67,7 +67,7 @@ jobs:
6767
- name: Setup Node.js environment
6868
uses: actions/setup-node@v6
6969
with:
70-
node-version: '24'
70+
node-version: '26'
7171

7272
- name: Setup Bun
7373
uses: oven-sh/setup-bun@v2

‎.github/workflows/pull-request.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Setup Node.js environment
3030
uses: actions/setup-node@v6
3131
with:
32-
node-version: '24'
32+
node-version: '26'
3333

3434
- name: Setup Bun
3535
uses: oven-sh/setup-bun@v2

‎.nvmrc‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
26

‎apps/app-loader/project.json‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@
9191
"outputs": ["{workspaceRoot}/coverage/apps/app-loader"],
9292
"options": {
9393
"tsConfig": "apps/app-loader/tsconfig.spec.json",
94-
"setupFiles": ["apps/app-loader/src/test-setup.ts"],
94+
"setupFiles": [
95+
"libs/common/src/test-storage.ts",
96+
"shared/test-setup-base.ts"
97+
],
9598
"isolate": true,
9699
"watch": false,
97100
"buildTarget": "app-loader:test-build:development"

‎apps/app-loader/src/app/app.component.ts‎

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { Component, inject, OnInit, signal } from '@angular/core';
22
import {
33
current_user,
44
currentUser,
5+
firstTruthyValueFrom,
56
markInitialisationComplete,
67
SettingsService,
78
setupPlace,
89
storeApiKeyFromUrl,
910
withTimeout,
1011
} from '@placeos/common';
1112
import { authority, queryApplications, setAPI_Key } from '@placeos/ts-client';
12-
import { first, lastValueFrom } from 'rxjs';
1313

1414
import {
1515
appInitial,
@@ -51,7 +51,9 @@ import {
5151
<p>No applications configured for this domain.</p>
5252
</div>
5353
} @else {
54-
<div class="app-grid">
54+
<div
55+
class="app-grid grid grid-cols-[repeat(auto-fit,minmax(10rem,1fr))] gap-3"
56+
>
5557
@for (app of applications(); track app.id) {
5658
<a
5759
class="border-base-300 bg-base-200 text-base-content hover:border-primary focus-visible:border-primary flex flex-col items-center gap-3 rounded-xl border p-4 text-center no-underline transition hover:-translate-y-0.5 hover:shadow-md focus-visible:shadow-md focus-visible:outline-none"
@@ -72,15 +74,19 @@ import {
7274
<span>{{ appInitial(app.name) }}</span>
7375
}
7476
</div>
75-
<div class="app-name">{{ app.name }}</div>
77+
<div
78+
class="app-name line-clamp-2 text-center text-base/[1.35] font-semibold wrap-break-word"
79+
>
80+
{{ app.name }}
81+
</div>
7682
</a>
7783
}
7884
</div>
7985
}
8086
</section>
8187
</main>
8288
`,
83-
styles: [],
89+
host: { class: 'block min-h-full' },
8490
providers: [SettingsService],
8591
})
8692
export class AppComponent implements OnInit {
@@ -97,16 +103,14 @@ export class AppComponent implements OnInit {
97103
const api_key = params.get('x-api-key');
98104
if (api_key) setAPI_Key(api_key);
99105
try {
100-
await lastValueFrom(
101-
this._settings.initialised.pipe(first((_) => _)),
102-
);
106+
await firstTruthyValueFrom(this._settings.initialised);
103107
const settings = { ...(this._settings.get('composer') || {}) };
104108
settings.mock =
105109
!!this._settings.get('mock') ||
106110
location.origin.includes('demo.place.tech');
107111
await setupPlace(settings).finally(storeApiKeyFromUrl);
108112
await withTimeout(
109-
lastValueFrom(current_user.pipe(first((_) => !!_))),
113+
firstTruthyValueFrom(current_user),
110114
30_000,
111115
'Current user loading timed out.',
112116
);

‎apps/app-loader/src/styles.css‎

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -2,132 +2,6 @@
22
/* The app renders only its own templates, so scan only app sources. */
33
@source './';
44

5-
:root {
6-
/* Brand */
7-
--brand-100: hsl(336, 57%, 48%);
8-
--brand-200: hsl(217, 91%, 60%);
9-
--brand-300: hsl(200, 15%, 94%);
10-
--brand-400: hsl(336, 57%, 48%);
11-
--brand-500: hsl(336, 57%, 48%);
12-
--brand-600: hsl(336, 57%, 48%);
13-
--brand-content: hsl(0, 0%, 100%);
14-
15-
/* Primary */
16-
--primary: hsl(336, 57%, 48%);
17-
--primary-focus: hsl(336, 57%, 38%);
18-
--primary-content: hsl(0, 0%, 100%);
19-
20-
/* Secondary */
21-
--secondary: hsl(237, 37%, 20%);
22-
--secondary-focus: hsl(237, 37%, 10%);
23-
--secondary-content: hsl(0, 0%, 100%);
24-
25-
/* Ternary */
26-
--ternary: hsl(237, 37%, 20%);
27-
--ternary-focus: hsl(237, 37%, 10%);
28-
--ternary-content: hsl(0, 0%, 100%);
29-
30-
/* Accent */
31-
--accent: hsl(156, 57%, 48%);
32-
--accent-focus: hsl(156, 57%, 38%);
33-
--accent-content: hsl(0, 0%, 0%);
34-
35-
/* Neutral */
36-
--neutral: hsl(0, 0%, 50%);
37-
--neutral-focus: hsl(0, 0%, 40%);
38-
--neutral-content: hsl(0, 0%, 100%);
39-
40-
/* Base */
41-
--base-100: hsl(0, 0%, 98.5%);
42-
--base-200: hsl(49, 2%, 92%);
43-
--base-300: hsl(56, 5%, 71%);
44-
--base-400: hsl(58, 7%, 55%);
45-
--base-content: hsl(0, 0%, 0%);
46-
47-
/* Info */
48-
--info: hsl(217, 91%, 60%);
49-
--info-light: hsl(207, 89%, 94%);
50-
--info-content: hsl(214, 100%, 97%);
51-
52-
/* Warning */
53-
--warn: #ffa000;
54-
--warn-light: hsl(60, 100%, 95%);
55-
--warn-content: hsl(0, 0%, 0%);
56-
57-
/* Success */
58-
--success: hsl(118, 50%, 43%);
59-
--success-light: hsl(120, 39%, 94%);
60-
--success-content: hsl(152, 81%, 96%);
61-
62-
/* Error */
63-
--error: hsl(354, 75%, 53%);
64-
--error-light: hsl(350, 100%, 96%);
65-
--error-content: hsl(0, 0%, 100%);
66-
}
67-
68-
.theme-dark {
69-
/* Brand */
70-
--brand-100: hsl(336, 57%, 48%);
71-
--brand-200: hsl(217, 91%, 60%);
72-
--brand-300: hsl(232, 50%, 48%);
73-
--brand-400: hsl(336, 57%, 48%);
74-
--brand-500: hsl(336, 57%, 48%);
75-
--brand-600: hsl(336, 57%, 48%);
76-
--brand-content: hsl(0, 0%, 100%);
77-
78-
/* Primary */
79-
--primary: hsl(336, 57%, 48%);
80-
--primary-focus: hsl(336, 57%, 38%);
81-
--primary-content: hsl(0, 0%, 100%);
82-
83-
/* Secondary */
84-
--secondary: hsl(336, 57%, 48%);
85-
--secondary-focus: hsl(336, 57%, 38%);
86-
--secondary-content: hsl(0, 0%, 100%);
87-
88-
/* Ternary */
89-
--ternary: hsl(206, 23%, 30%);
90-
--ternary-focus: hsl(206, 23%, 24%);
91-
--ternary-content: hsl(0, 0%, 80%);
92-
93-
/* Accent */
94-
--accent: hsl(156, 57%, 28%);
95-
--accent-focus: hsl(158, 17%, 9%);
96-
--accent-content: hsl(0, 0%, 80%);
97-
98-
/* Neutral */
99-
--neutral: hsl(0, 0%, 20%);
100-
--neutral-focus: hsl(0, 0%, 15%);
101-
--neutral-content: hsl(0, 0%, 80%);
102-
103-
/* Base */
104-
--base-100: hsl(0, 0%, 10%);
105-
--base-200: hsl(0, 0%, 15%);
106-
--base-300: hsl(0, 0%, 20%);
107-
--base-400: hsl(0, 0%, 30%);
108-
--base-content: hsl(0, 0%, 80%);
109-
110-
/* Info */
111-
--info: hsl(211, 80%, 42%);
112-
--info-light: hsl(206, 90%, 61%);
113-
--info-content: hsl(0, 0%, 100%);
114-
115-
/* Warning */
116-
--warn: hsl(34, 100%, 50%);
117-
--warn-light: hsl(44, 100%, 65%);
118-
--warn-content: hsl(0, 0%, 0%);
119-
120-
/* Success */
121-
--success: hsl(122, 46%, 34%);
122-
--success-light: hsl(122, 39%, 57%);
123-
--success-content: hsl(0, 0%, 100%);
124-
125-
/* Error */
126-
--error: hsl(0, 66%, 47%);
127-
--error-light: hsl(4, 83%, 63%);
128-
--error-content: hsl(0, 0%, 100%);
129-
}
130-
1315
html,
1326
body {
1337
height: 100%;

0 commit comments

Comments
 (0)