@terreno/mcp 57.7.0 → 57.9.0
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/dist/docs/resources/ui.md +5 -4
- package/dist/docs/upgrades/57.8.0.md +61 -0
- package/dist/docs/upgrades/57.9.0.md +28 -0
- package/dist/docs/versioned/next/explanation/charts.md +12 -0
- package/dist/docs/versioned/next/explanation/example-coverage.md +2 -1
- package/dist/docs/versioned/next/explanation/model-router-actions.md +1 -1
- package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +34 -0
- package/dist/docs/versioned/next/how-to/README.md +1 -1
- package/dist/docs/versioned/next/how-to/admin-import-prebuilt.md +1 -1
- package/dist/docs/versioned/next/how-to/charts-and-dashboards.md +5 -0
- package/dist/docs/versioned/next/how-to/circleci.md +30 -14
- package/dist/docs/versioned/next/how-to/compare-chart-rendered-snapshots.md +8 -0
- package/dist/docs/versioned/next/how-to/install-agent-skills.md +1 -1
- package/dist/docs/versioned/next/how-to/preview-demo.md +19 -0
- package/dist/docs/versioned/next/how-to/product-announcements.md +3 -0
- package/dist/docs/versioned/next/implementationPlans/ai-observability.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/b2b-platform-program.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/charts-and-dashboards.md +3 -2
- package/dist/docs/versioned/next/implementationPlans/dashboard-chart-parity.md +275 -0
- package/dist/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
- package/dist/docs/versioned/next/reference/ai.md +41 -10
- package/dist/docs/versioned/next/reference/announcement-release-packs.md +146 -0
- package/dist/docs/versioned/next/reference/announcements.md +7 -3
- package/dist/docs/versioned/next/reference/api.md +1 -0
- package/dist/docs/versioned/next/reference/environment-variables.md +2 -1
- package/dist/docs/versioned/next/reference/feature-flags.md +1 -1
- package/dist/docs/versioned/next/reference/ui.md +108 -17
- package/dist/docs/versioned/next/tasks/dashboard-chart-parity.md +145 -0
- package/dist/docs/versioned/next/tasks/demo-workshop.md +150 -0
- package/package.json +2 -2
- package/src/docs/resources/ui.md +5 -4
- package/src/docs/upgrades/57.8.0.md +61 -0
- package/src/docs/upgrades/57.9.0.md +28 -0
- package/src/docs/versioned/next/explanation/charts.md +12 -0
- package/src/docs/versioned/next/explanation/example-coverage.md +2 -1
- package/src/docs/versioned/next/explanation/model-router-actions.md +1 -1
- package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +34 -0
- package/src/docs/versioned/next/how-to/README.md +1 -1
- package/src/docs/versioned/next/how-to/admin-import-prebuilt.md +1 -1
- package/src/docs/versioned/next/how-to/charts-and-dashboards.md +5 -0
- package/src/docs/versioned/next/how-to/circleci.md +30 -14
- package/src/docs/versioned/next/how-to/compare-chart-rendered-snapshots.md +8 -0
- package/src/docs/versioned/next/how-to/install-agent-skills.md +1 -1
- package/src/docs/versioned/next/how-to/preview-demo.md +19 -0
- package/src/docs/versioned/next/how-to/product-announcements.md +3 -0
- package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -1
- package/src/docs/versioned/next/implementationPlans/b2b-platform-program.md +1 -1
- package/src/docs/versioned/next/implementationPlans/charts-and-dashboards.md +3 -2
- package/src/docs/versioned/next/implementationPlans/dashboard-chart-parity.md +275 -0
- package/src/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
- package/src/docs/versioned/next/reference/ai.md +41 -10
- package/src/docs/versioned/next/reference/announcement-release-packs.md +146 -0
- package/src/docs/versioned/next/reference/announcements.md +7 -3
- package/src/docs/versioned/next/reference/api.md +1 -0
- package/src/docs/versioned/next/reference/environment-variables.md +2 -1
- package/src/docs/versioned/next/reference/feature-flags.md +1 -1
- package/src/docs/versioned/next/reference/ui.md +108 -17
- package/src/docs/versioned/next/tasks/dashboard-chart-parity.md +145 -0
- package/src/docs/versioned/next/tasks/demo-workshop.md +150 -0
- package/dist/docs/ui-types-documentation.json +0 -33
- package/src/docs/ui-types-documentation.json +0 -33
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Task List: Demo workshop
|
|
2
|
+
|
|
3
|
+
See: [`docs/implementationPlans/demo-workshop.md`](../implementationPlans/demo-workshop.md)
|
|
4
|
+
|
|
5
|
+
**RTK deprecation flag:** None
|
|
6
|
+
|
|
7
|
+
## Instructions for the implementing agent
|
|
8
|
+
|
|
9
|
+
- Work the frontier: any task whose blockers are complete. The tracer is Task 1.1 (Button).
|
|
10
|
+
- Do not start iOS work, a translation catalog, or an addon API.
|
|
11
|
+
- Docs named on a task ship in that task. Use the `update-docs` skill.
|
|
12
|
+
- UI tasks also use `verify-ui-changes` and `terreno-ui`.
|
|
13
|
+
- Visual tasks use `review-chart-visuals` for the PNG diff workflow, then the new demo how-to.
|
|
14
|
+
- Run the task's verification command before handoff. `bun run lint` and `bun run demo:compile` on every demo task.
|
|
15
|
+
|
|
16
|
+
## Phase 1: Catalog, snippets, and preview bar
|
|
17
|
+
|
|
18
|
+
- [x] **Task 1.1**: Button catalog contract
|
|
19
|
+
- Delivers: Button has a copyable usage snippet, resolvable related links, stable stories, one declarative interaction list, and typed control defaults.
|
|
20
|
+
- Files: `demo/demoConfig.tsx`, `demo/story-config/Button.config.tsx`, `demo/stories/Button.stories.tsx`, `demo/collectRegisteredStoryRenders.ts`, `demo/app/demo/[component].tsx`, `demo/README.md`
|
|
21
|
+
- Blocked by: none
|
|
22
|
+
- Acceptance: a unit test fails when a related name does not resolve, when an excluded story has an empty reason, or when a boolean control defaults to `""`. Button's snippet renders and copies. `showInDemo: false` hides a Button story in demo mode and leaves it on the dev route.
|
|
23
|
+
- Verification: `bun test demo/collectRegisteredStoryRenders.ts demo/demoConfig` (or the new colocated test), `bun run demo:compile`, and a web demo pass that opens Button, copies the snippet, and follows one related link.
|
|
24
|
+
- Docs: `demo/README.md` catalog-contract section
|
|
25
|
+
- Skills: `update-docs`, `terreno-ui`, `verify-ui-changes`
|
|
26
|
+
|
|
27
|
+
- [x] **Task 1.2**: Search, categories, and related links
|
|
28
|
+
- Delivers: the home grid and dev index filter by text and category, and every component's related row is links.
|
|
29
|
+
- Files: `demo/components/DemoHomePage.tsx`, `demo/components/DevHomePage.tsx`, `demo/app/demo/[component].tsx`, story configs whose `related` strings do not resolve, `demo/README.md`
|
|
30
|
+
- Blocked by: Task 1.1
|
|
31
|
+
- Acceptance: searching "button" shows Button; choosing a category hides other categories; a broken related name fails the catalog test; the home grid still does not nest pressables (`demo/components/DemoCard.test.tsx`).
|
|
32
|
+
- Verification: catalog unit test, `demo/components/DemoCard.test.tsx`, and a web demo pass of search, category filter, and a related link.
|
|
33
|
+
- Docs: `demo/README.md`
|
|
34
|
+
- Skills: `update-docs`, `terreno-ui`, `verify-ui-changes`
|
|
35
|
+
|
|
36
|
+
- [x] **Task 1.3**: Usage snippet on every component
|
|
37
|
+
- Delivers: every registered story config has `usageExample`, and the component page can copy it.
|
|
38
|
+
- Files: `demo/story-config/*.config.tsx`, `demo/app/demo/[component].tsx`, `scripts/check-demo-coverage.ts` or a sibling check, `demo/README.md`
|
|
39
|
+
- Blocked by: Task 1.1
|
|
40
|
+
- Acceptance: `bun run check:demo-coverage` (or the new snippet check it calls) fails when any registered config lacks a non-empty `usageExample`. The Button page copy control still works.
|
|
41
|
+
- Verification: the check command, plus one web copy action on a second component (TextField).
|
|
42
|
+
- Docs: `demo/README.md`
|
|
43
|
+
- Skills: `update-docs`, `verify-ui-changes`
|
|
44
|
+
|
|
45
|
+
- [x] **Task 1.4**: Preview toolbar and URL state
|
|
46
|
+
- Delivers: demo and dev component routes change theme, viewport, background, locale, right-to-left, and reduced motion from the URL. Embeds apply that state and hide the bar.
|
|
47
|
+
- Files: `demo/components/DemoChrome.tsx`, `demo/app/_layout.tsx`, `demo/app/demo/_layout.tsx`, `demo/app/dev/_layout.tsx`, `demo/contexts/EmbedModeContext.tsx`, `docs/how-to/preview-demo.md`, `demo/README.md`
|
|
48
|
+
- Blocked by: Task 1.1
|
|
49
|
+
- Acceptance: Button at a documented query uses the dark remap and the 375 viewport. Consent or date stories that already read locale receive the toolbar locale. Embed hides the bar. Reloading keeps the query.
|
|
50
|
+
- Verification: a focused demo unit test for query parse/serialize, `bun run demo:compile`, and a web demo pass of the Button query plus one embed URL.
|
|
51
|
+
- Docs: `docs/how-to/preview-demo.md`, `demo/README.md`
|
|
52
|
+
- Skills: `update-docs`, `terreno-ui`, `verify-ui-changes`
|
|
53
|
+
|
|
54
|
+
## Phase 2: Web proof and health
|
|
55
|
+
|
|
56
|
+
- [ ] **Task 2.1**: Web interaction and axe for Button
|
|
57
|
+
- Delivers: Playwright runs Button's step list and axe against the Button stories.
|
|
58
|
+
- Files: `scripts/demo/runWebStoryChecks.ts`, `demo/story-config/Button.config.tsx`, root `package.json` (axe dependency if needed), `.circleci/config.yml`, `.circleci/continue-config.yml`, `docs/how-to/run-tests-locally.md`, `docs/reference/test.md`
|
|
59
|
+
- Blocked by: Task 1.1
|
|
60
|
+
- Acceptance: the Button interaction steps pass in Chromium. A serious axe violation fails the command. An excluded story with a reason is skipped. The job is required for `ui/**` and `demo/**` pull requests.
|
|
61
|
+
- Verification: `bun run demo:web-checks --only=Button` (the script this task adds) locally against demo web, then the CircleCI path-filter test if one exists beside `.circleci/`.
|
|
62
|
+
- Docs: `docs/how-to/run-tests-locally.md`, `docs/reference/test.md`
|
|
63
|
+
- Skills: `update-docs`, `verify-ui-changes`
|
|
64
|
+
|
|
65
|
+
- [ ] **Task 2.2**: Web visual harness for Button
|
|
66
|
+
- Delivers: one cropped web PNG baseline for each stable Button story, compared with the chart pixel matcher.
|
|
67
|
+
- Files: `scripts/demo/compareDemoSnapshots.ts`, `demo/rendered-snapshots/web/`, `scripts/charts/compareChartImages.ts` (reuse only), `docs/how-to/compare-demo-snapshots.md`, `docs/reference/ui.md`
|
|
68
|
+
- Blocked by: Task 1.1
|
|
69
|
+
- Acceptance: `bun run demo:snapshots:compare --only=Button` passes against the new goldens and fails when a golden is missing. Chart compare still passes for the existing chart fixtures.
|
|
70
|
+
- Verification: the new compare command and `bun run ui:charts:compare`.
|
|
71
|
+
- Docs: `docs/how-to/compare-demo-snapshots.md`, `docs/reference/ui.md`, `docs/how-to/compare-chart-rendered-snapshots.md` (pointer only)
|
|
72
|
+
- Skills: `update-docs`, `review-chart-visuals`
|
|
73
|
+
|
|
74
|
+
- [ ] **Task 2.3**: Web proof for every stable story
|
|
75
|
+
- Delivers: every stable story has interaction steps or an exclusion reason, an axe run, and a web PNG baseline.
|
|
76
|
+
- Files: `demo/story-config/*.config.tsx`, `demo/stories/*.stories.tsx`, `demo/rendered-snapshots/web/`, the web check and snapshot scripts
|
|
77
|
+
- Blocked by: Task 2.1, Task 2.2
|
|
78
|
+
- Acceptance: the web check and snapshot commands, with no `--only`, exit 0. Removing one stable story's golden or steps fails the matching command. Excluded stories name a reason.
|
|
79
|
+
- Verification: `bun run demo:web-checks` and `bun run demo:snapshots:compare`.
|
|
80
|
+
- Docs: `docs/how-to/compare-demo-snapshots.md`, `docs/reference/test.md`
|
|
81
|
+
- Skills: `update-docs`, `review-chart-visuals`
|
|
82
|
+
|
|
83
|
+
- [ ] **Task 2.4**: Story health and CI summary
|
|
84
|
+
- Delivers: the component page shows render, interaction, accessibility, and visual status from `demo/story-health.json`. CI stores that file and writes a check summary.
|
|
85
|
+
- Files: `demo/app/demo/[component].tsx`, `scripts/demo/writeStoryHealth.ts`, `.circleci/continue-config.yml`, `docs/reference/test.md`
|
|
86
|
+
- Blocked by: Task 2.3
|
|
87
|
+
- Acceptance: Button shows a pass row after the web commands. A forced failing story shows fail. A missing health file shows not-run. The CircleCI job summary lists failed story ids. The job does not call `gh pr comment`.
|
|
88
|
+
- Verification: unit test for health rendering, the web commands, and a CI config test or review that the job uploads artifacts and writes the summary.
|
|
89
|
+
- Docs: `docs/reference/test.md`, `demo/README.md`
|
|
90
|
+
- Skills: `update-docs`, `verify-ui-changes`
|
|
91
|
+
|
|
92
|
+
## Phase 3: Android
|
|
93
|
+
|
|
94
|
+
- [ ] **Task 3.1**: Android proof for Button
|
|
95
|
+
- Delivers: a CircleCI Android emulator job runs Button's steps, accessibility-tree assertions, and a cropped Android PNG.
|
|
96
|
+
- Files: `.circleci/config.yml`, `.circleci/continue-config.yml`, `scripts/demo/generateMaestroFlows.ts`, `.maestro/flows/demo/generated/`, `demo/rendered-snapshots/android/`, `docs/how-to/circleci.md`, `docs/how-to/run-tests-locally.md`
|
|
97
|
+
- Blocked by: Task 2.1
|
|
98
|
+
- Acceptance: Pixel 6 API 34 runs the generated Button flow. The job is required when `ui/**` or `demo/**` changes. A missing Android golden fails the job. Web axe is unchanged.
|
|
99
|
+
- Verification: the local Maestro command documented in the how-to, against an emulator, for the Button flow. Record the CircleCI job name.
|
|
100
|
+
- Docs: `docs/how-to/circleci.md`, `docs/how-to/run-tests-locally.md`, `docs/reference/test.md`
|
|
101
|
+
- Skills: `update-docs`, `verify-ui-changes`
|
|
102
|
+
|
|
103
|
+
- [ ] **Task 3.2**: Android proof for every stable story
|
|
104
|
+
- Delivers: every stable story has an Android flow, accessibility-tree check, and PNG, or an exclusion reason.
|
|
105
|
+
- Files: generated Maestro flows, `demo/rendered-snapshots/android/`, `demo/story-health.json` writer
|
|
106
|
+
- Blocked by: Task 3.1, Task 2.3
|
|
107
|
+
- Acceptance: the Android job without `--only` exits 0. Health on Button includes the Android columns. An excluded story is absent from the Android failure list and its reason is in the summary.
|
|
108
|
+
- Verification: the Android compare and Maestro commands across the stable catalog.
|
|
109
|
+
- Docs: `docs/how-to/compare-demo-snapshots.md`, `docs/reference/test.md`
|
|
110
|
+
- Skills: `update-docs`, `review-chart-visuals`
|
|
111
|
+
|
|
112
|
+
## Phase 4: Major versions
|
|
113
|
+
|
|
114
|
+
- [ ] **Task 4.1**: Version manifest and dropdown
|
|
115
|
+
- Delivers: production stays on the current major, `versions.json` lists released majors and a `preview/<major>` branch, and the top bar dropdown navigates there. The default is the highest released major.
|
|
116
|
+
- Files: `scripts/demo/publishDemoVersions.ts`, `scripts/ci/netlify-deploy.sh`, `demo/components/DemoChrome.tsx`, `docs/how-to/demo-versions.md`, `.circleci/continue-config.yml`
|
|
117
|
+
- Blocked by: Task 1.4
|
|
118
|
+
- Acceptance: a unit test of the manifest builder marks `preview/58` as preview and not current, marks 57 as current, and omits `pr-*` aliases. The dropdown on the home page shows those labels. `versions.json` on the production origin sends CORS headers the aliases can read.
|
|
119
|
+
- Verification: the manifest unit test, a deploy dry-run, and a web demo pass of the dropdown.
|
|
120
|
+
- Docs: `docs/how-to/demo-versions.md`, `demo/README.md`
|
|
121
|
+
- Skills: `update-docs`, `verify-ui-changes`
|
|
122
|
+
|
|
123
|
+
- [ ] **Task 4.2**: Freeze the previous major and backfill 56
|
|
124
|
+
- Delivers: moving master from 57 to a later major freezes 57 on alias `v57`. Alias `v56` serves the last master commit whose package major is 56.
|
|
125
|
+
- Files: `scripts/demo/publishDemoVersions.ts`, `.circleci/continue-config.yml`, `docs/how-to/demo-versions.md`
|
|
126
|
+
- Blocked by: Task 4.1
|
|
127
|
+
- Acceptance: a test with a fake deploy history freezes the previous production deploy when the major increases, and leaves 57 updating on ordinary master commits. The backfill command documents the git revision it deployed for 56.
|
|
128
|
+
- Verification: unit test of the freeze decision, plus the one-time 56 alias deploy recorded in the how-to.
|
|
129
|
+
- Docs: `docs/how-to/demo-versions.md`
|
|
130
|
+
- Skills: `update-docs`
|
|
131
|
+
|
|
132
|
+
- [ ] **Task 4.3**: Docs embeds follow the demo major
|
|
133
|
+
- Delivers: a 57 docs page embeds the 57 demo. The next docs version embeds the 58 preview when the manifest lists it.
|
|
134
|
+
- Files: `website/docusaurus.config.ts`, `website/src/components/ComponentDemo/index.tsx`, `docs/how-to/demo-versions.md`, the docs reference page that describes component embeds
|
|
135
|
+
- Blocked by: Task 4.1
|
|
136
|
+
- Acceptance: `ComponentDemo` for the 57 docs build requests the 57 demo URL with `?embed=1`. When the manifest has an unreleased preview, the next docs build uses that preview URL. A missing preview falls back to production.
|
|
137
|
+
- Verification: a website unit test or build-arg test for the URL choice, and `bun run website:build`.
|
|
138
|
+
- Docs: `docs/how-to/demo-versions.md` and the existing component-embed reference section
|
|
139
|
+
- Skills: `update-docs`
|
|
140
|
+
|
|
141
|
+
## Phase 5: MCP catalog
|
|
142
|
+
|
|
143
|
+
- [ ] **Task 5.1**: Public demo catalog tools
|
|
144
|
+
- Delivers: `terreno_list_demo_stories` and `terreno_get_demo_story` return Button's snippet, route, story ids, and the version manifest URL.
|
|
145
|
+
- Files: `demo/demo-catalog.json`, `demo/package.json`, `mcp-server/src/tools.ts`, MCP tests, `docs/reference/mcp-server.md`
|
|
146
|
+
- Blocked by: Task 1.3, Task 4.1
|
|
147
|
+
- Acceptance: `terreno_get_demo_story` for Button includes `usageExample` and a `/demo/Button` route. The list tool filters by category. The response points at production `versions.json`. A catalog drift test fails when a registered component is missing from the JSON.
|
|
148
|
+
- Verification: `cd mcp-server && bun test` for the new tool tests, and `bun run demo:catalog` followed by the drift check.
|
|
149
|
+
- Docs: `docs/reference/mcp-server.md`, `demo/README.md`
|
|
150
|
+
- Skills: `update-docs`
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"@modelcontextprotocol/node": "^2.0.0",
|
|
12
12
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
13
13
|
"@sentry/bun": "^10.39.0",
|
|
14
|
-
"@terreno/api": "57.
|
|
14
|
+
"@terreno/api": "57.9.0",
|
|
15
15
|
"express": "^5.2.1",
|
|
16
16
|
"luxon": "^3.7.2",
|
|
17
17
|
"minisearch": "^7.2.0",
|
|
@@ -104,5 +104,5 @@
|
|
|
104
104
|
"test:coverage": "bun run ../scripts/check-coverage.ts"
|
|
105
105
|
},
|
|
106
106
|
"type": "module",
|
|
107
|
-
"version": "57.
|
|
107
|
+
"version": "57.9.0"
|
|
108
108
|
}
|
package/src/docs/resources/ui.md
CHANGED
|
@@ -253,7 +253,7 @@ radiusSm, radiusMd, radiusLg, radiusXl, radius2xl, radius3xl
|
|
|
253
253
|
## Utilities
|
|
254
254
|
|
|
255
255
|
```typescript
|
|
256
|
-
import { useStoredState, MediaQuery,
|
|
256
|
+
import { useStoredState, MediaQuery, isNarrowViewport } from "@terreno/ui";
|
|
257
257
|
|
|
258
258
|
// Persist state to storage
|
|
259
259
|
const [value, setValue] = useStoredState("key", defaultValue);
|
|
@@ -263,9 +263,10 @@ const [value, setValue] = useStoredState("key", defaultValue);
|
|
|
263
263
|
<DesktopLayout />
|
|
264
264
|
</MediaQuery>
|
|
265
265
|
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
|
|
266
|
+
// Current window is below the desktop breakpoint.
|
|
267
|
+
// isMobileDevice() is deprecated in favor of isNarrowViewport().
|
|
268
|
+
if (isNarrowViewport()) {
|
|
269
|
+
// Narrow-viewport code
|
|
269
270
|
}
|
|
270
271
|
```
|
|
271
272
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Upgrading to 57.8.0
|
|
2
|
+
|
|
3
|
+
**Action required:** No
|
|
4
|
+
**Affected packages:** @terreno/ui, @terreno/announcements
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
Bump every lockstep `@terreno/*` package together to `57.8.0`. `@terreno/ui` adds opt-in `SplitPage` web layouts and `IconButton` `backgroundOpacity`, and deprecates `isMobileDevice` in favor of `isNarrowViewport` (the old function still returns the same result). `@terreno/announcements` can import a Markdown release pack through `POST /announcements/import-release`. `DropdownPanel` anchors to its trigger, and `/gpt/prompt` emits each generated image once. No Expo upgrade is required if you are already on `57.x`.
|
|
9
|
+
|
|
10
|
+
## Breaking changes
|
|
11
|
+
|
|
12
|
+
None
|
|
13
|
+
|
|
14
|
+
## Deprecations
|
|
15
|
+
|
|
16
|
+
### `isMobileDevice`
|
|
17
|
+
|
|
18
|
+
**What changed**
|
|
19
|
+
|
|
20
|
+
`isMobileDevice` is deprecated. `isNarrowViewport` is the supported name. Both stay exported and return the same boolean: true when the window is below the supported desktop floor (web width under 1024, native width under 1024).
|
|
21
|
+
|
|
22
|
+
**Why**
|
|
23
|
+
|
|
24
|
+
`isMobileDevice` described a window-width check. The new name matches that behavior.
|
|
25
|
+
|
|
26
|
+
**Migration**
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Before
|
|
30
|
+
import {isMobileDevice} from "@terreno/ui";
|
|
31
|
+
|
|
32
|
+
if (isMobileDevice()) {
|
|
33
|
+
// narrow layout
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// After
|
|
37
|
+
import {isNarrowViewport} from "@terreno/ui";
|
|
38
|
+
|
|
39
|
+
if (isNarrowViewport()) {
|
|
40
|
+
// narrow layout
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## New capabilities
|
|
45
|
+
|
|
46
|
+
`SplitPage` web props are opt-in. Existing callers keep the previous layout.
|
|
47
|
+
|
|
48
|
+
- `desktopChildrenMinWidth` keeps one or two desktop children at least that many pixels wide and scrolls the row when it is tighter. More than two children keeps the segmented control.
|
|
49
|
+
- `narrowViewportChildLabels`, `narrowViewportSelectionActive`, `narrowViewportSelectionKey`, and `narrowViewportListButtonLabel` replace the dotted narrow swiper with a labeled pager.
|
|
50
|
+
- `narrowBelowWidth` uses the narrow layout when the window width is less than or equal to that pixel value. Omit it to follow `isNarrowViewport()`.
|
|
51
|
+
- Native `SplitPage` ignores these props.
|
|
52
|
+
- `IconButton` `backgroundOpacity` tints only that button's background.
|
|
53
|
+
|
|
54
|
+
`@terreno/announcements` accepts a `terreno.announcement-pack/v1` directory (`pack.yaml` plus one Markdown file per announcement) at `POST /announcements/import-release`. Imports are idempotent by product, release version, channel, and slug, default to drafts, and publish immediately when `publish: true`. Admin auth or bearer `ANNOUNCEMENTS_UPLOAD_TOKEN` can call the route. The token is optional.
|
|
55
|
+
|
|
56
|
+
## Verification
|
|
57
|
+
|
|
58
|
+
- `bun add` every lockstep `@terreno/*` dependency to `57.8.0`, then `bun run compile` at the app root
|
|
59
|
+
- Replace `isMobileDevice` imports with `isNarrowViewport` before a future major removes the alias
|
|
60
|
+
- Open a `DropdownPanel` whose trigger is not at the start of its row and confirm the panel opens on the trigger
|
|
61
|
+
- Import a draft announcement pack with `POST /announcements/import-release` and confirm a second import updates the same slug instead of inserting a duplicate
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Upgrading to 57.9.0
|
|
2
|
+
|
|
3
|
+
**Action required:** No
|
|
4
|
+
**Affected packages:** @terreno/ai, @terreno/ui
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
This release adds durable and resumable GPT chat streams, safer attachment handling, operations-dashboard components, and improved web toast and file-picker behavior. Existing applications continue to work without migration.
|
|
9
|
+
|
|
10
|
+
## Breaking changes
|
|
11
|
+
|
|
12
|
+
None
|
|
13
|
+
|
|
14
|
+
## Deprecations
|
|
15
|
+
|
|
16
|
+
None
|
|
17
|
+
|
|
18
|
+
## New capabilities
|
|
19
|
+
|
|
20
|
+
- Configure `fileStorageService` to persist chat attachments and resume in-flight replies through `GET /gpt/histories/:id/stream`.
|
|
21
|
+
- Compose operations dashboards with scorecards, comparison series, spanning items, and richer chart presentation.
|
|
22
|
+
- Set `maxHeight` on growing `TextField` and `TextArea` components.
|
|
23
|
+
|
|
24
|
+
## Verification
|
|
25
|
+
|
|
26
|
+
- Run `bun run compile` and `bun run lint` at the app root.
|
|
27
|
+
- Exercise GPT chat attachment upload, reload during a response, and stream resumption when adopting the new AI capabilities.
|
|
28
|
+
- Check web toasts above an open modal and file selection through `FilePickerButton`.
|
|
@@ -20,6 +20,14 @@ Height works the same way: `height` is the whole chart, and the tick row, toolti
|
|
|
20
20
|
row come out of that budget. A chart therefore fits a fixed-height slot, and reserving the tooltip
|
|
21
21
|
row even when no tooltip is showing keeps hovering from reflowing the page.
|
|
22
22
|
|
|
23
|
+
Cartesian facades use `xTickPolicy="auto"` by default: up to seven categorical labels
|
|
24
|
+
stay horizontal, while denser sets rotate 45 degrees and reserve a taller axis row.
|
|
25
|
+
That taller row comes out of `height`; the plot shrinks so the chart still fits the
|
|
26
|
+
requested slot. `SparklineChart` scales to the data range so a small period-over-period
|
|
27
|
+
change stays visible.
|
|
28
|
+
Callers may force `"truncate"` or `"rotate"`. `title` and `periodLabel` are convenience
|
|
29
|
+
props backed by the same `ChartCard` used for explicit chart/table composition.
|
|
30
|
+
|
|
23
31
|
`DashboardGrid` is layout only, so it stays on the eager root export. Chart implementations sit behind the same lazy root boundary as `GPTChat`. Cell width subtracts flex `gap` so `md`/`lg` column counts actually fit.
|
|
24
32
|
|
|
25
33
|
Chart paint is proven with **rendered PNG goldens**, not React test-renderer JSON.
|
|
@@ -27,3 +35,7 @@ Chart paint is proven with **rendered PNG goldens**, not React test-renderer JSO
|
|
|
27
35
|
(`/demo/chart-visual-gallery`), screenshots each fixture from easy to hard, and
|
|
28
36
|
pixel-diffs against `demo/rendered-snapshots/`. Agents use the `review-chart-visuals`
|
|
29
37
|
skill to read golden / actual / diff images when a compare fails.
|
|
38
|
+
|
|
39
|
+
The example app admin home (`/admin`) mounts `AdminCharts` so scorecards, a multi-series line,
|
|
40
|
+
bars, an area, and a donut with a center label render together. See
|
|
41
|
+
[Compose charts in a dashboard grid](../how-to/charts-and-dashboards.md).
|
|
@@ -20,7 +20,8 @@ that file (and its imports) to a working example. Gaps stay explicit.
|
|
|
20
20
|
| Feature flags + live updates | yes — `FeatureFlagsApp` in `example-backend/src/server.ts`, seed `example-backend/src/scripts/seed-feature-flags.ts` | yes — `useTerrenoFeatureFlags` in `example-frontend/app/_layout.tsx` | Socket-backed live updates share the realtime connection. |
|
|
21
21
|
| Websockets / realtime | yes — `RealtimeApp` in `example-backend/src/server.ts`, `example-backend/src/websockets.ts` | yes — `useSocketConnection` in `example-frontend/app/_layout.tsx` | Sync deltas also use the socket (`SyncApp` + `@terreno/syncdb`). |
|
|
22
22
|
| Consent forms | yes — `example-backend/src/consentDefinitions.ts`, seed scripts | yes — `example-frontend/app/(tabs)/consents.tsx`, admin `example-frontend/app/admin/consent-forms/` | First-login flow is covered by e2e (`example-frontend/e2e/consents.spec.ts`). |
|
|
23
|
-
|
|
|
23
|
+
| Product announcements | yes — `AnnouncementsApp` in `example-backend/src/server.ts`, release upload token via `ANNOUNCEMENTS_UPLOAD_TOKEN`, seed `example-backend/src/scripts/seed-announcements.ts`, sample release pack `example-backend/announcements/releases/1.14.0/` with `bun run announcements:pack` | yes — `AnnouncementNavigator` in `example-frontend/app/_layout.tsx` and admin announcement routes | Release packs support multiple Markdown surfaces and idempotent draft or explicit live API import. |
|
|
24
|
+
| File upload / GCS | yes — `example-backend/src/api/settings.ts`, AI file routes in `example-backend/src/api/ai.ts`, `file-uploads` flag in `example-backend/src/api/fileUploads.ts` | yes — `example-frontend/app/(tabs)/files.tsx`, `example-frontend/app/(tabs)/ai.tsx`, `example-frontend/app/gcs-settings.tsx` | The `file-uploads` feature flag hides upload controls and rejects uploads when off. A missing flag leaves uploads enabled. |
|
|
24
25
|
| Better Auth | yes — `example-backend/src/utils/betterAuthConfig.ts`, `BetterAuthApp` in `example-backend/src/server.ts` | yes — `example-frontend/app/login.tsx`, `example-frontend/lib/betterAuth.ts` | Default `AUTH_PROVIDER` is `better-auth`. |
|
|
25
26
|
| syncdb local-first | yes — `SyncApp` in `example-backend/src/server.ts` | yes — `example-frontend/store/syncdb.ts`, `example-frontend/app/(tabs)/index.tsx` | PR #869 closed without merge; `@terreno/syncdb` shipped on the launch line and is the example todos path. |
|
|
26
27
|
| SyncDB diagnostics | n/a | yes — `debug` registration in `example-frontend/store/syncdb.ts`, debugger UI at `example-frontend/app/syncdb-debug.tsx` | `terreno-mcp-local` can inspect, snapshot/compare/merge, mutate, flush, reconcile/resync, and exercise offline/conflict paths against the running development client. |
|
|
@@ -101,7 +101,7 @@ HTTP method and scope map to a CRUD permission check:
|
|
|
101
101
|
**403** — denied after the instance document is loaded (e.g. `IsOwner` with a document that fails the check).
|
|
102
102
|
**401** — unauthenticated when a permission requires auth (from existing auth middleware).
|
|
103
103
|
|
|
104
|
-
`authenticateMiddleware` honors the router’s `allowAnonymous` option, same as CRUD.
|
|
104
|
+
`authenticateMiddleware` honors the router’s `allowAnonymous` option, same as CRUD. An action may set `allowAnonymous: true` to accept unauthenticated requests without making the router's CRUD routes or other actions anonymous. Keep a non-empty permission such as `Permissions.IsAny` and authenticate any service token in the handler.
|
|
105
105
|
|
|
106
106
|
## Validation
|
|
107
107
|
|
|
@@ -639,6 +639,26 @@ docs are the proof; comms admin stats consume these primitives later.
|
|
|
639
639
|
|
|
640
640
|
---
|
|
641
641
|
|
|
642
|
+
## dashboard-chart-parity
|
|
643
|
+
|
|
644
|
+
**Title:** `Ops dashboard chart parity`
|
|
645
|
+
|
|
646
|
+
**Labels:** `area:ui`, `type:feature`
|
|
647
|
+
**Project fields:** Area=`ui`, Target=`Next`, Impact=`Feature`, IP=`dashboard-chart-parity`, Status=`Planned`
|
|
648
|
+
|
|
649
|
+
Follow-up to charts-and-dashboards: scorecards with comparison sparklines, `ChartCard`
|
|
650
|
+
period badges, additive multi-series facades, donut hole labels, spanning `DashboardGrid`
|
|
651
|
+
items, and DataTable period headers / totals / range status so apps can compose a
|
|
652
|
+
“How’s it going?”-class ops dashboard. Terreno theme defaults; no Looker preset. Grammar
|
|
653
|
+
not required.
|
|
654
|
+
|
|
655
|
+
- **Implementation plan:** [dashboard-chart-parity.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/dashboard-chart-parity.md)
|
|
656
|
+
- **Tasks:** [dashboard-chart-parity.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/dashboard-chart-parity.md)
|
|
657
|
+
- **RTK flag:** None
|
|
658
|
+
- **Depends on:** charts-and-dashboards
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
642
662
|
## dark-mode-theme
|
|
643
663
|
|
|
644
664
|
**Title:** `First-class dark mode`
|
|
@@ -1257,6 +1277,20 @@ IP and tracking issue; this entry is the release checklist, not a plan.
|
|
|
1257
1277
|
|
|
1258
1278
|
---
|
|
1259
1279
|
|
|
1280
|
+
## demo-workshop
|
|
1281
|
+
|
|
1282
|
+
**Title:** `Demo workshop`
|
|
1283
|
+
|
|
1284
|
+
**Labels:** `area:dx`, `type:feature`
|
|
1285
|
+
**Project fields:** Area=`dx`, Target=`Next`, Impact=`Feature`, IP=`demo-workshop`, Status=`Planned`
|
|
1286
|
+
|
|
1287
|
+
Turn the Expo demo into the workshop for `@terreno/ui`: a person can find a component, copy a usage snippet, change theme and viewport from the URL, and see whether every stable story passes interaction, accessibility, and visual checks on web and Android.
|
|
1288
|
+
|
|
1289
|
+
- **Implementation plan:** [demo-workshop.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/demo-workshop.md)
|
|
1290
|
+
- **Tasks:** [demo-workshop.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/demo-workshop.md)
|
|
1291
|
+
|
|
1292
|
+
---
|
|
1293
|
+
|
|
1260
1294
|
# Shipped, umbrella, and declined IPs
|
|
1261
1295
|
|
|
1262
1296
|
Tracking issues created for IPs that previously lacked a `**Roadmap issue:**` header.
|
|
@@ -39,7 +39,7 @@ Problem-oriented, practical steps. Use these when you know what you want to do.
|
|
|
39
39
|
- [Upgrade banner](upgrade-banner.md) — Soft warning and hard-block app update UX
|
|
40
40
|
- [Upgrade Terreno](upgrade-terreno.md) — Lockstep `@terreno/*` bumps, note range, order, rollback
|
|
41
41
|
- [Track upstream Expo](track-upstream-expo.md) — Morning probe for SDK betas; `release-X.Y.Z` loop log + native fingerprint deps
|
|
42
|
-
- [Compose charts in a dashboard grid](charts-and-dashboards.md) — `LineChart` / `BarChart` / `AreaChart` / `DonutChart` inside `Card`s in `DashboardGrid`
|
|
42
|
+
- [Compose charts in a dashboard grid](charts-and-dashboards.md) — `LineChart` / `BarChart` / `AreaChart` / `DonutChart` inside `Card`s in `DashboardGrid` (ops-dashboard scorecards and spans: [dashboard-chart-parity](../implementationPlans/dashboard-chart-parity.md))
|
|
43
43
|
- [Compare rendered chart snapshots](compare-chart-rendered-snapshots.md) — PNG goldens for the chart visual gallery, not JSON snapshots
|
|
44
44
|
- [Migrate from @terreno/rtk to @terreno/syncdb](migrate-rtk-to-syncdb.md) — Move data sync to the local-first layer
|
|
45
45
|
- [Generate a REST CLI from OpenAPI](generate-a-rest-cli.md) — Scaffold `terreno generate rest-cli` for an app API
|
|
@@ -18,7 +18,7 @@ const app = new TerrenoApp({userModel: User})
|
|
|
18
18
|
|
|
19
19
|
- `FeatureFlagsApp`: FeatureFlag model and `feature-flags-overrides` home widget.
|
|
20
20
|
- `ConsentApp`: ConsentForm and ConsentResponse models plus consent field-widget IDs.
|
|
21
|
-
- `DocumentStorageApp`: `documents` custom screen.
|
|
21
|
+
- `DocumentStorageApp`: `documents` custom screen. Pass `fileUploadsEnabled: false` (or a function that returns `false`) to reject uploads while listing and download stay available. The example app wires this to the `file-uploads` feature flag.
|
|
22
22
|
- `AIAdminApp`: `ai-requests` custom screen and explorer API.
|
|
23
23
|
- `JobsApp`: `jobs` custom screen and home widget (`dead` / `running` counts). With
|
|
24
24
|
`accessControl`, requires **both** `admin:access` and `admin:jobs`; without it, legacy
|
|
@@ -35,3 +35,8 @@ export const OpsDashboard: FC = () => {
|
|
|
35
35
|
Charts have no width prop: each one fills the container you put it in and redraws when that width changes, so size the `Card` or `Box` around it. `height` is the chart's whole height, tick row and tooltip row included, so `height={140}` fits a 140px slot; the tooltip row is always reserved so hovering never reflows the page. Long x labels truncate inside their band rather than widening the chart.
|
|
36
36
|
|
|
37
37
|
Prove paint with `bun run ui:charts:compare` against `demo/rendered-snapshots/`, not with JSON snapshots. See [Compare rendered chart snapshots](compare-chart-rendered-snapshots.md).
|
|
38
|
+
|
|
39
|
+
The example app admin home (`example-frontend/components/AdminCharts.tsx`, mounted
|
|
40
|
+
below the admin dashboard at `/admin`) shows the same pieces together: scorecards with comparison
|
|
41
|
+
sparklines, a multi-series line, a donut with a center label, a bar chart, and an
|
|
42
|
+
area chart inside a spanning `DashboardGrid`.
|
|
@@ -242,9 +242,10 @@ restrict `terreno-release` and `terreno-npm` to tag/manual release pipelines.
|
|
|
242
242
|
Until contexts exist, e2e jobs may use **project env vars for `E2E_*` secrets only**
|
|
243
243
|
(or the in-job `ci-e2e-*-secret` fallbacks). **Do not** put `GITHUB_TOKEN` (or any
|
|
244
244
|
GitHub PAT) in project env vars — those are injected into every job, including
|
|
245
|
-
`bun` scripts from the PR.
|
|
246
|
-
project
|
|
247
|
-
`dco` and `architectural-pr-review
|
|
245
|
+
`bun` scripts from the PR. `terreno-github-api` must hold the PAT as
|
|
246
|
+
`GITHUB_TOKEN`; restrict it to this project and leave fork-PR secret passing off.
|
|
247
|
+
The `always` workflow attaches it **only** to `dco` and `architectural-pr-review`
|
|
248
|
+
(the latter also gets `terreno-agentic`). DCO skips if `GITHUB_TOKEN` is unset.
|
|
248
249
|
`architectural-pr-review` also skips if `GITHUB_TOKEN` or `CURSOR_API_KEY` is
|
|
249
250
|
unset, and it skips fork PRs. The job checks out `origin/master` before running
|
|
250
251
|
the review script so a PR cannot rewrite the reviewer.
|
|
@@ -351,20 +352,35 @@ a closed PR.
|
|
|
351
352
|
`manual-publish-package` also accepts `feature-flags`. Versions must be semver.
|
|
352
353
|
Semver git tags (`57.3.0`, `57.3.0-beta.1`) automatically start
|
|
353
354
|
`publish-release`; prereleases publish to their prerelease npm dist-tag.
|
|
354
|
-
`
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
355
|
+
`publish-release` compiles the 16 lockstep packages once with
|
|
356
|
+
`bun run --filter ... compile` (dependency order), then runs
|
|
357
|
+
`scripts/ci/publish-package.sh` for all of them in parallel with
|
|
358
|
+
`TERRENO_PUBLISH_PREBUILT=1`. It does not rerun tests: the tagged commit
|
|
359
|
+
already passed CI on master, and rerunning every suite per package made
|
|
360
|
+
releases take 20+ minutes. The job has no Mongo sidecar. Each publish writes
|
|
361
|
+
its own temporary npmrc (`NPM_CONFIG_USERCONFIG`) so parallel publishes do not
|
|
362
|
+
remove each other's token.
|
|
363
|
+
|
|
364
|
+
`publish-package.sh` pins `workspace:*` to the tag version for the tarball.
|
|
365
|
+
It must not `bun install` after that pin: sibling `@terreno/*` packages are
|
|
366
|
+
not on npm yet, so bun would look up `@terreno/test@X.Y.Z` (and similar) on
|
|
367
|
+
the registry and fail the whole job. Without `TERRENO_PUBLISH_PREBUILT` (the
|
|
368
|
+
manual single-package publish), it compiles the package and its workspace
|
|
369
|
+
dependencies and runs `test:ci` when that script exists, not `test`.
|
|
370
|
+
`@terreno/ui`'s `test` is `bun test --watch` and would hang. If a package's
|
|
371
|
+
tag version is already on npm, `publish-package.sh` skips it so a recut of
|
|
372
|
+
the same tag can finish the rest.
|
|
373
|
+
|
|
374
|
+
Only stable tags (`57.3.0`) run `deploy-demo`. It builds the demo from source,
|
|
375
|
+
so it runs alongside `publish-release` instead of waiting for it. Use
|
|
365
376
|
`{"run-demo-deploy":true}` on `master` if a prerelease must also refresh the
|
|
366
377
|
demo site.
|
|
367
378
|
|
|
379
|
+
`scripts/ci/netlify-deploy.sh` builds each site itself and calls
|
|
380
|
+
`netlify deploy --no-build`. Without `--no-build`, netlify-cli runs the root
|
|
381
|
+
`netlify.toml` docs build (wipe `node_modules`, reinstall, full Docusaurus),
|
|
382
|
+
which added about 3.5 minutes to every demo and frontend deploy.
|
|
383
|
+
|
|
368
384
|
CircleCI does not receive GitHub `pull_request.closed` events, so
|
|
369
385
|
`.github/workflows/preview-cleanup.yml` forwards them: it runs master's
|
|
370
386
|
`scripts/ci/trigger-circleci-pipeline.sh` with `{"run-preview-cleanup":"<PR>"}`
|
|
@@ -33,4 +33,12 @@ easy-through-hard charts in the demo app and diffs those PNGs against goldens.
|
|
|
33
33
|
Agents reviewing a fail should follow the `review-chart-visuals` skill and look at the
|
|
34
34
|
PNGs, not only the code diff.
|
|
35
35
|
|
|
36
|
+
Hard fixture `scorecard-sparkline-comparison` renders five KPI tiles with solid current
|
|
37
|
+
and dotted previous-period sparklines.
|
|
38
|
+
Cartesian parity fixtures are `bar-time-rotated-ticks`, `bar-day-of-week`, and
|
|
39
|
+
`line-three-series`.
|
|
40
|
+
Donut parity fixtures are `donut-center-and-share` and `donut-single-slice`.
|
|
41
|
+
Hard fixture `hows-it-going-dashboard` composes KPI scorecards, time-series charts, donuts,
|
|
42
|
+
and table placeholders in a spanning `DashboardGrid`.
|
|
43
|
+
|
|
36
44
|
`CHART_VISUAL_BASE_URL` overrides the demo origin when the gallery is already hosted.
|
|
@@ -70,7 +70,7 @@ scan stages come from
|
|
|
70
70
|
| Docs | `update-docs`, `update-agent-docs`, architecture skills |
|
|
71
71
|
| GitHub | issues, review, UI verification, release, dependency updates |
|
|
72
72
|
| Code scans | `terreno-scan-1-aim` … `terreno-scan-5-track`, `terreno-scan-campaign`, `terreno-scan-loop` |
|
|
73
|
-
| Expo and native | `track-upstream-expo`, `upgrading-expo`, deployment / EAS skills |
|
|
73
|
+
| Expo and native | `track-upstream-expo`, `upgrading-expo`, `store-assets`, deployment / EAS skills |
|
|
74
74
|
| Plugin agents | `pre-commit`, `ui-verifier` |
|
|
75
75
|
|
|
76
76
|
`skills.sh.json` at the repo root groups those names on [skills.sh](https://skills.sh).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Preview a component demo
|
|
2
|
+
|
|
3
|
+
Open a component demo and change the shareable query. The preview bar is on demo and
|
|
4
|
+
dev component routes. `?embed=1` applies the same query and hides the bar.
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
/demo/Button?theme=dark&viewport=375&background=inverse&locale=en-US&rtl=1&reducedMotion=1
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
| Query | Values |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| `theme` | `light` (default) or `dark` (canonical dark role remap) |
|
|
13
|
+
| `viewport` | `full` (default), `320`, `375`, `1024`, `1280` |
|
|
14
|
+
| `background` | `default`, `inverse`, `transparent` |
|
|
15
|
+
| `locale` | Passed to components that already read a locale, such as consent |
|
|
16
|
+
| `rtl` | `1` sets document direction to `rtl` on web |
|
|
17
|
+
| `reducedMotion` | `1` sets `data-reduced-motion="1"` on the document element |
|
|
18
|
+
|
|
19
|
+
Reload keeps the query. The bar shows the current query when any value is not the default. Choosing a control's default removes that key from the URL. Leaving the component route restores the app theme and, on web, document direction and reduced motion. Custom palettes stay on `/palette`.
|
|
@@ -11,6 +11,7 @@ import {AnnouncementsApp} from "@terreno/announcements";
|
|
|
11
11
|
|
|
12
12
|
new AnnouncementsApp({
|
|
13
13
|
defaultAcknowledgementPolicy: "dismiss-only",
|
|
14
|
+
uploadToken: process.env.ANNOUNCEMENTS_UPLOAD_TOKEN,
|
|
14
15
|
// audienceType staff/patient/all is applied inside the plugin via matchAudienceByType.
|
|
15
16
|
isStaff: (user) => (user as {admin?: boolean}).admin === true,
|
|
16
17
|
matchAudience: (user, announcement) => {
|
|
@@ -46,6 +47,8 @@ For Flourish-style surfaces on one collection:
|
|
|
46
47
|
|
|
47
48
|
2. Create announcements in admin (draft → publish). Use `AnnouncementOverview`, `AnnouncementEditor`, and (optionally) `AnnouncementList` from `@terreno/admin-frontend` with dedicated Expo routes (see `example-frontend/app/admin/announcements/`). The built-in admin screen widget key `announcements` renders the overview when your host uses `AdminScreenRouter` for custom screens. Published `title`/`body` edits auto-increment `version`, which re-shows the surface to users who only acknowledged the previous version.
|
|
48
49
|
|
|
50
|
+
For release-driven batches, use an [announcement release pack](../reference/announcement-release-packs.md). It keeps one `pack.yaml` manifest plus multiple Markdown announcements in source control, validates release and build versioning, and can import idempotent drafts or explicitly publish the whole pack through a dedicated bearer token. The example Cloud Run service accepts `Authorization: Bearer terreno-example-announcement-upload` (Terraform variable `announcements_upload_token`).
|
|
51
|
+
|
|
49
52
|
### Admin editor fields
|
|
50
53
|
|
|
51
54
|
`AnnouncementEditor` exposes structured targeting controls (no raw `requiresAcknowledgement` boolean):
|
|
@@ -274,7 +274,7 @@ Env (example-backend):
|
|
|
274
274
|
| `AI_OBS_DATASETS_PRIMARY` | default `local` |
|
|
275
275
|
| `AI_OBS_EXPERIMENTS_PRIMARY` | must equal datasets |
|
|
276
276
|
| `AI_OBS_SAMPLE_RATE` | `0`–`1`, default `0` |
|
|
277
|
-
| `AI_OBS_PRICE_MAP_JSON` | `{ "gemini-
|
|
277
|
+
| `AI_OBS_PRICE_MAP_JSON` | `{ "gemini-3.8-flash": { "inputPerMTok": 0.1, "outputPerMTok": 0.4 } }` |
|
|
278
278
|
| existing Langfuse keys | unchanged |
|
|
279
279
|
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | optional OTLP |
|
|
280
280
|
|
|
@@ -36,7 +36,7 @@ org switcher, dark mode).
|
|
|
36
36
|
| C | Communications (pluggable) | `comms-abstraction`, one item **per adapter**: `comms-adapter-expo-push` (first push adapter, per D4), `comms-adapter-twilio-sms`, `comms-adapter-twilio-verify`, `comms-adapter-sendgrid` (first mail adapter, per D2); operations: `comms-admin-dashboard`; consumers: `password-reset-and-email-verification`, `notification-center` |
|
|
37
37
|
| B | Billing | `inbound-webhooks`, `billing-stripe` (web-first, per D1), `mobile-iap-revenuecat` (Future) |
|
|
38
38
|
| D | Zero-to-deployed DX | `create-terreno-app`, `mongo-migrations` (deploy items already exist in the OSS launch program) |
|
|
39
|
-
| E | B2B UI surfaces | `data-grid-server-filters`, `charts-and-dashboards`, `dark-mode-theme`, `command-palette`, `wizard-stepper`, `wysiwyg-editor` (markdown stays for now, per D3), `global-search` |
|
|
39
|
+
| E | B2B UI surfaces | `data-grid-server-filters`, `charts-and-dashboards`, `dashboard-chart-parity`, `dark-mode-theme`, `command-palette`, `wizard-stepper`, `wysiwyg-editor` (markdown stays for now, per D3), `global-search` |
|
|
40
40
|
| F | Enterprise & scale | `framework-audit-log` (Next), `rate-limiting` (Next), `job-queues` (Next), `enterprise-sso`, `mfa-step-up-auth` |
|
|
41
41
|
| — | Native baseline | `native-module-baseline` — all new native modules land in one major release |
|
|
42
42
|
|
|
@@ -194,8 +194,9 @@ None.
|
|
|
194
194
|
|
|
195
195
|
## Not Included / Future Work
|
|
196
196
|
|
|
197
|
-
-
|
|
198
|
-
-
|
|
197
|
+
- Ops-dashboard parity (scorecards, comparison sparklines, additive multi-series, donut centers, spanning grid, table chrome) — [`dashboard-chart-parity.md`](dashboard-chart-parity.md).
|
|
198
|
+
- Composition grammar (Phase 6) — recorded Grow decisions; implement on a follow-up Pick. Not required for the How’s it going dashboard.
|
|
199
|
+
- Multi-series cartesian via additive `series` lands in `dashboard-chart-parity`; grammar `dataKey` / `stackId` remains later.
|
|
199
200
|
- Wiring `CommsDashboardScreen` charts to the stats endpoint.
|
|
200
201
|
- Example-frontend dashboard.
|
|
201
202
|
- Zoom/pan.
|