@bardioc/create-bardioc-app 0.5.6 → 0.6.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.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/templates/_base/README.md +1 -1
  4. package/templates/_base/public/app-manifest.json +1 -2
  5. package/templates/angular/.env.example +4 -1
  6. package/templates/angular/package.json +2 -2
  7. package/templates/angular/scripts/dev-env.mjs +62 -0
  8. package/templates/angular/scripts/dev.mjs +56 -0
  9. package/templates/angular/scripts/sync-runtime-env.mjs +2 -28
  10. package/templates/angular/src/app/app.component.ts +44 -26
  11. package/templates/angular/src/app/bardioc.token.ts +2 -2
  12. package/templates/angular/src/main.ts +6 -8
  13. package/templates/angular/src/styles.css +4 -0
  14. package/templates/nextjs/.env.example +4 -1
  15. package/templates/nextjs/app/page.tsx +18 -15
  16. package/templates/nextjs/next.config.ts +1 -1
  17. package/templates/nextjs/package.json +3 -3
  18. package/templates/nextjs/scripts/dev-env.mjs +62 -0
  19. package/templates/nextjs/scripts/dev.mjs +56 -0
  20. package/templates/preact/.env.example +3 -0
  21. package/templates/preact/package.json +2 -2
  22. package/templates/preact/src/App.tsx +10 -10
  23. package/templates/preact/src/main.tsx +3 -3
  24. package/templates/preact/vite.config.ts +4 -1
  25. package/templates/solid/.env.example +3 -0
  26. package/templates/solid/package.json +2 -2
  27. package/templates/solid/src/App.tsx +10 -10
  28. package/templates/solid/src/bardioc-sdk.tsx +11 -23
  29. package/templates/solid/src/main.tsx +5 -3
  30. package/templates/solid/vite.config.ts +4 -1
  31. package/templates/svelte/.env.example +3 -0
  32. package/templates/svelte/package.json +2 -2
  33. package/templates/svelte/src/App.svelte +12 -12
  34. package/templates/svelte/src/main.ts +5 -5
  35. package/templates/svelte/vite.config.ts +4 -1
  36. package/templates/vite/.env.example +3 -0
  37. package/templates/vite/CLAUDE.md +34 -7
  38. package/templates/vite/package.json +3 -3
  39. package/templates/vite/public/app-manifest.json +0 -1
  40. package/templates/vite/src/auth/onboarding.tsx +7 -5
  41. package/templates/vite/src/climate/conditions-chart.tsx +2 -2
  42. package/templates/vite/src/climate/overview-view.tsx +1 -1
  43. package/templates/vite/src/climate/stations-view.tsx +3 -10
  44. package/templates/vite/src/climate/use-climate.ts +8 -8
  45. package/templates/vite/src/events/live-events-view.tsx +8 -10
  46. package/templates/vite/src/graph/explorer-view.tsx +7 -14
  47. package/templates/vite/src/graph/requests.ts +16 -19
  48. package/templates/vite/src/locales/de.json +7 -8
  49. package/templates/vite/src/locales/en.json +45 -46
  50. package/templates/vite/src/main.tsx +3 -3
  51. package/templates/vite/src/profile/profile-view.tsx +5 -12
  52. package/templates/vite/src/profile/use-profile.ts +3 -3
  53. package/templates/vite/src/shell/about-dialog.tsx +5 -11
  54. package/templates/vite/src/shell/app-shell.tsx +63 -22
  55. package/templates/vite/src/shell/header.tsx +24 -24
  56. package/templates/vite/vite.config.ts +4 -1
  57. package/templates/vue/.env.example +3 -0
  58. package/templates/vue/package.json +2 -2
  59. package/templates/vue/src/App.vue +12 -12
  60. package/templates/vue/src/bardioc-sdk.ts +6 -15
  61. package/templates/vue/src/main.ts +5 -4
  62. package/templates/vue/vite.config.ts +4 -1
  63. package/templates/angular/scripts/dev-auth-proxy.mjs +0 -17
  64. package/templates/angular/src/app/bardioc-bridge.ts +0 -5
  65. package/templates/nextjs/scripts/dev-auth-proxy.mjs +0 -17
@@ -25,9 +25,10 @@ export function Onboarding() {
25
25
  icon={PlugZap}
26
26
  iconVariant="chip"
27
27
  titleSize="lg"
28
- title={t('auth.title', { fallback: 'Connect to Bardioc OS' })}
28
+ title={t('auth.title', { fallback: 'Connect to Bardioc' })}
29
29
  description={t('auth.description', {
30
- fallback: 'This dashboard reads live data through the Bardioc SDK transport.',
30
+ fallback:
31
+ 'This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc, or standalone with dev auth.',
31
32
  })}
32
33
  actions={
33
34
  <Button onClick={() => globalThis.location.reload()}>
@@ -42,7 +43,8 @@ export function Onboarding() {
42
43
  <ol className="text-muted-foreground list-decimal space-y-2 pl-4">
43
44
  <li>
44
45
  {t('auth.step1', {
45
- fallback: 'Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in .env',
46
+ fallback:
47
+ 'Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in the .env file.',
46
48
  })}
47
49
  </li>
48
50
  <li>
@@ -52,10 +54,10 @@ export function Onboarding() {
52
54
  </ol>
53
55
  <div className="border-border mt-3 space-y-1 border-t pt-3">
54
56
  <p className="text-foreground font-medium">
55
- {t('auth.detectedTitle', { fallback: 'Detected environment' })}
57
+ {t('auth.detectedTitle', { fallback: 'Detected Environment' })}
56
58
  </p>
57
59
  <DetectedRow
58
- label={t('auth.insideHost', { fallback: 'Inside host iframe' })}
60
+ label={t('auth.insideHost', { fallback: 'Inside Host Iframe' })}
59
61
  ok={insideHost}
60
62
  />
61
63
  </div>
@@ -28,8 +28,8 @@ export function ConditionsChart({ forecast }: Readonly<ConditionsChartProps>) {
28
28
  seriesData={seriesData}
29
29
  xKey="day"
30
30
  chartConfig={chartConfig}
31
- title={t('chart.title', { fallback: '7-day outlook' })}
32
- description={t('chart.description', { fallback: 'Daylight hours by condition' })}
31
+ title={t('chart.title', { fallback: '7-Day Outlook' })}
32
+ description={t('chart.description', { fallback: 'Daylight hours by condition.' })}
33
33
  heightClass="h-[220px]"
34
34
  />
35
35
  );
@@ -42,7 +42,7 @@ export function OverviewView() {
42
42
  ) : (
43
43
  <span>
44
44
  {t('overview.notPersisted', {
45
- fallback: 'Preview — not persisted (open inside Bardioc OS to persist)',
45
+ fallback: 'Preview — not persisted (open inside Bardioc to persist)',
46
46
  })}
47
47
  </span>
48
48
  )}
@@ -120,27 +120,20 @@ export function StationsView() {
120
120
 
121
121
  return (
122
122
  <div className="flex flex-col gap-3">
123
- <div>
124
- <h2 className="text-lg font-semibold">
125
- {t('stations.title', { fallback: 'Monitoring stations' })}
126
- </h2>
127
- <p className="text-muted-foreground text-xs">
128
- {t('stations.description', { fallback: '' })}
129
- </p>
130
- </div>
123
+ <p className="text-muted-foreground text-xs">{t('stations.description', { fallback: '' })}</p>
131
124
  <DataTable
132
125
  boxed
133
126
  data={data}
134
127
  columns={columns}
135
128
  filterKey={['name', 'region']}
136
129
  showSearchBar
137
- filterPlaceholder={t('stations.search', { fallback: 'Search stations…' })}
130
+ filterPlaceholder={t('stations.search', { fallback: 'Search Stations…' })}
138
131
  itemLabel={t('stations.itemLabel', { fallback: 'stations' })}
139
132
  onRowClick={station => setActiveStation(station.id)}
140
133
  filterSlot={<ConditionFilter selected={conditions} onToggle={onToggle} />}
141
134
  emptyState={
142
135
  <p className="text-muted-foreground p-6 text-center text-sm">
143
- {t('stations.empty', { fallback: 'No stations match your filters' })}
136
+ {t('stations.empty', { fallback: 'No stations match your filters.' })}
144
137
  </p>
145
138
  }
146
139
  />
@@ -6,10 +6,10 @@ import { generateState, syncState } from './climate-data';
6
6
  import { IDB_LOG_PREFIX, IDB_STATE_KEY, IDB_STORE, type ClimateState } from './types';
7
7
 
8
8
  export function useClimate() {
9
- const bridge = useSdk();
9
+ const bardioc = useSdk();
10
10
  const notify = useAppNotify();
11
11
  const { t } = useTranslation();
12
- const store = useMemo(() => bridge.idb(IDB_STORE), [bridge]);
12
+ const store = useMemo(() => bardioc.idb(IDB_STORE), [bardioc]);
13
13
 
14
14
  const [state, setState] = useState<ClimateState | null>(null);
15
15
  const [syncing, setSyncing] = useState(false);
@@ -42,7 +42,7 @@ export function useClimate() {
42
42
  useEffect(() => {
43
43
  let active = true;
44
44
  void (async () => {
45
- const raw = await store.get<unknown>(IDB_STATE_KEY).catch(() => null);
45
+ const raw = (await store.get(IDB_STATE_KEY).catch(() => null))?.value;
46
46
  const saved =
47
47
  raw !== null &&
48
48
  raw !== undefined &&
@@ -69,12 +69,12 @@ export function useClimate() {
69
69
  try {
70
70
  let source: ClimateState['source'] = 'graph';
71
71
  try {
72
- await bridge.transport.os.profile.get();
72
+ await bardioc.os.profile.get();
73
73
  } catch {
74
74
  source = 'mock';
75
75
  }
76
76
 
77
- const raw = await store.get<unknown>(IDB_STATE_KEY).catch(() => null);
77
+ const raw = (await store.get(IDB_STATE_KEY).catch(() => null))?.value;
78
78
  const saved =
79
79
  raw !== null &&
80
80
  raw !== undefined &&
@@ -89,7 +89,7 @@ export function useClimate() {
89
89
 
90
90
  notify(
91
91
  t('notify.synced', {
92
- fallback: 'Synced {count} stations',
92
+ fallback: 'Synced {count} stations.',
93
93
  params: { count: next.stations.length },
94
94
  }),
95
95
  source === 'graph' ? 'success' : 'warning'
@@ -97,7 +97,7 @@ export function useClimate() {
97
97
  } finally {
98
98
  setSyncing(false);
99
99
  }
100
- }, [bridge, notify, persist, store, t]);
100
+ }, [bardioc, notify, persist, store, t]);
101
101
 
102
102
  const setActiveStation = useCallback(
103
103
  (id: string) => {
@@ -108,7 +108,7 @@ export function useClimate() {
108
108
  const station = next.stations.find(item => item.id === id);
109
109
  notify(
110
110
  t('notify.stationSelected', {
111
- fallback: 'Active station: {name}',
111
+ fallback: 'Active station: {name}.',
112
112
  params: { name: station?.name ?? id },
113
113
  }),
114
114
  'info'
@@ -23,28 +23,26 @@ export function LiveEventsView() {
23
23
 
24
24
  return (
25
25
  <div className="flex h-full min-w-0 flex-col gap-3">
26
- <div>
27
- <h2 className="text-lg font-semibold">{t('events.title', { fallback: 'Live Events' })}</h2>
28
- <p className="text-muted-foreground text-xs">
29
- {t('events.description', {
30
- fallback: 'Live graph events streamed from the OS over SSE (permission "events").',
31
- })}
32
- </p>
33
- </div>
26
+ <p className="text-muted-foreground text-xs">
27
+ {t('events.description', {
28
+ fallback: 'Live graph events streamed from the OS over SSE (permission "events").',
29
+ })}
30
+ </p>
34
31
 
35
32
  <Card className="min-h-0 min-w-0 flex-1">
36
33
  {events.length === 0 ? (
37
34
  <Empty
38
35
  icon={Activity}
39
36
  iconVariant="chip"
40
- title={t('events.emptyTitle', { fallback: 'Waiting for events' })}
37
+ title={t('events.emptyTitle', { fallback: 'Waiting for Events' })}
41
38
  description={
42
39
  isInsideIframe()
43
40
  ? t('events.emptyHost', {
44
41
  fallback: 'No graph events yet — activity will appear here as it happens.',
45
42
  })
46
43
  : t('events.emptyStandalone', {
47
- fallback: 'Open inside Bardioc OS (or a dev session) to receive live events.',
44
+ fallback:
45
+ 'Open inside Bardioc (or run standalone with dev auth) to receive live events.',
48
46
  })
49
47
  }
50
48
  />
@@ -13,7 +13,7 @@ type Result =
13
13
 
14
14
  export function ExplorerView() {
15
15
  const { t } = useTranslation();
16
- const bridge = useSdk();
16
+ const bardioc = useSdk();
17
17
  const notify = useAppNotify();
18
18
  const [activeId, setActiveId] = useState(SDK_REQUESTS[0].id);
19
19
  const [result, setResult] = useState<Result>({ status: 'idle' });
@@ -25,15 +25,15 @@ export function ExplorerView() {
25
25
  setResult({ status: 'running' });
26
26
  const started = Date.now();
27
27
  try {
28
- const data = await request.run(bridge);
28
+ const data = await request.run(bardioc);
29
29
  const ms = Date.now() - started;
30
30
  setResult({ status: 'done', live: true, ms, data });
31
- notify(t('notify.queryOk', { fallback: 'Request ok ({ms} ms)', params: { ms } }), 'success');
31
+ notify(t('notify.queryOk', { fallback: 'Request OK ({ms} ms).', params: { ms } }), 'success');
32
32
  } catch {
33
33
  const ms = Date.now() - started;
34
34
  setResult({ status: 'done', live: false, ms, data: request.mock() });
35
35
  notify(
36
- t('notify.queryFailed', { fallback: 'Request failed — showing simulated data' }),
36
+ t('notify.queryFailed', { fallback: 'Request failed — showing simulated data.' }),
37
37
  'warning'
38
38
  );
39
39
  }
@@ -41,14 +41,7 @@ export function ExplorerView() {
41
41
 
42
42
  return (
43
43
  <div className="flex h-full min-w-0 flex-col gap-3">
44
- <div>
45
- <h2 className="text-lg font-semibold">
46
- {t('explorer.title', { fallback: 'Graph Explorer' })}
47
- </h2>
48
- <p className="text-muted-foreground text-xs">
49
- {t('explorer.description', { fallback: '' })}
50
- </p>
51
- </div>
44
+ <p className="text-muted-foreground text-xs">{t('explorer.description', { fallback: '' })}</p>
52
45
 
53
46
  <div className="grid min-w-0 gap-3 lg:grid-cols-[minmax(0,240px)_minmax(0,1fr)]">
54
47
  <div className="flex min-w-0 flex-col gap-1">
@@ -85,7 +78,7 @@ export function ExplorerView() {
85
78
  >
86
79
  {result.status === 'running'
87
80
  ? t('explorer.running', { fallback: 'Running…' })
88
- : t('explorer.run', { fallback: 'Run request' })}
81
+ : t('explorer.run', { fallback: 'Run Request' })}
89
82
  </Button>
90
83
  </div>
91
84
 
@@ -107,7 +100,7 @@ export function ExplorerView() {
107
100
  {result.status === 'done'
108
101
  ? JSON.stringify(result.data, null, 2)
109
102
  : t('explorer.empty', {
110
- fallback: 'Select a request and run it to see the response',
103
+ fallback: 'Select a request and run it to see the response.',
111
104
  })}
112
105
  </pre>
113
106
  </div>
@@ -1,4 +1,4 @@
1
- import type { HostBridge } from '@bardioc/app-sdk';
1
+ import type { Bardioc } from '@bardioc/app-sdk';
2
2
 
3
3
  export type RequestCategory = 'graph' | 'os';
4
4
 
@@ -6,7 +6,7 @@ export interface SdkRequest {
6
6
  id: string;
7
7
  category: RequestCategory;
8
8
  label: string;
9
- run: (bridge: HostBridge) => Promise<unknown>;
9
+ run: (bardioc: Bardioc) => Promise<unknown>;
10
10
  mock: () => unknown;
11
11
  }
12
12
 
@@ -32,8 +32,8 @@ function toItems(result: unknown): GraphNode[] {
32
32
  return [];
33
33
  }
34
34
 
35
- async function sampleNodes(bridge: HostBridge, limit: number): Promise<GraphNode[]> {
36
- return toItems(await bridge.transport.graph.query<GraphNode>('*', { limit }));
35
+ async function sampleNodes(bardioc: Bardioc, limit: number): Promise<GraphNode[]> {
36
+ return toItems(await bardioc.graph.query<GraphNode>('*', { limit }));
37
37
  }
38
38
 
39
39
  // The full surface a hosted app can reach over the SDK transport. Each `run` issues a real call
@@ -48,7 +48,7 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
48
48
  id: 'graph.query.all',
49
49
  category: 'graph',
50
50
  label: "graph.query('*', { limit: 10 })",
51
- run: bridge => bridge.transport.graph.query('*', { limit: 10 }),
51
+ run: bardioc => bardioc.graph.query('*', { limit: 10 }),
52
52
  mock: () => ({
53
53
  items: [
54
54
  {
@@ -63,14 +63,14 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
63
63
  id: 'graph.query.type',
64
64
  category: 'graph',
65
65
  label: String.raw`graph.query('ogit\/_type:"<first result type>"', { limit: 5 })`,
66
- run: async bridge => {
67
- const [first] = await sampleNodes(bridge, 1);
66
+ run: async bardioc => {
67
+ const [first] = await sampleNodes(bardioc, 1);
68
68
  const type = first?.['ogit/_type'];
69
69
  if (!type) {
70
70
  return [];
71
71
  }
72
72
  const escapedType = type.replaceAll('/', String.raw`\/`);
73
- return bridge.transport.graph.query(String.raw`ogit\/_type:"${escapedType}"`, { limit: 5 });
73
+ return bardioc.graph.query(String.raw`ogit\/_type:"${escapedType}"`, { limit: 5 });
74
74
  },
75
75
  mock: () => ({
76
76
  items: [
@@ -86,13 +86,13 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
86
86
  id: 'graph.get',
87
87
  category: 'graph',
88
88
  label: 'graph.get(firstNodeId)',
89
- run: async bridge => {
90
- const [first] = await sampleNodes(bridge, 1);
89
+ run: async bardioc => {
90
+ const [first] = await sampleNodes(bardioc, 1);
91
91
  const id = first?.['ogit/_id'];
92
92
  if (!id) {
93
93
  return null;
94
94
  }
95
- return bridge.transport.graph.get(id);
95
+ return bardioc.graph.get(id);
96
96
  },
97
97
  mock: () => ({
98
98
  'ogit/_id': 'cmexample_app-1',
@@ -106,11 +106,8 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
106
106
  label: "graph.gremlin(nodeId, 'both()')",
107
107
  // `both()` returns adjacent vertices in either direction. Replace this id with a connected
108
108
  // node from your own instance — many nodes (e.g. config vertices) have no traversable edges.
109
- run: bridge =>
110
- bridge.transport.graph.gremlin(
111
- 'cjohdg6y80000ai48sw7swsq0_cmm2b2jz3t6dq0110poeobock',
112
- 'both()'
113
- ),
109
+ run: bardioc =>
110
+ bardioc.graph.gremlin('cjohdg6y80000ai48sw7swsq0_cmm2b2jz3t6dq0110poeobock', 'both()'),
114
111
  mock: () => [
115
112
  {
116
113
  'ogit/_id': 'cmexample_node-2',
@@ -123,21 +120,21 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
123
120
  id: 'os.profile',
124
121
  category: 'os',
125
122
  label: 'os.profile.get()',
126
- run: bridge => bridge.transport.os.profile.get(),
123
+ run: bardioc => bardioc.os.profile.get(),
127
124
  mock: () => ({ id: 'usr-demo', email: 'operator@bardioc.dev', name: 'Demo Operator' }),
128
125
  },
129
126
  {
130
127
  id: 'os.organization',
131
128
  category: 'os',
132
129
  label: 'os.organization.getStructure()',
133
- run: bridge => bridge.transport.os.organization.getStructure(),
130
+ run: bardioc => bardioc.os.organization.getStructure(),
134
131
  mock: () => ({ id: 'org-demo', name: 'Bardioc Climate Corp', units: [], members: [] }),
135
132
  },
136
133
  {
137
134
  id: 'os.applications',
138
135
  category: 'os',
139
136
  label: 'os.applications.list()',
140
- run: bridge => bridge.transport.os.applications.list(),
137
+ run: bardioc => bardioc.os.applications.list(),
141
138
  mock: () => [{ id: 'app-demo', name: 'Climate Dashboard', version: '0.0.1' }],
142
139
  },
143
140
  ];
@@ -16,12 +16,11 @@
16
16
  "version": "Version",
17
17
  "id": "App-ID",
18
18
  "description": "Beschreibung",
19
- "permissions": "Berechtigungen",
20
19
  "error": "app-manifest.json konnte nicht gelesen werden",
21
20
  "source": "Live aus public/app-manifest.json gelesen"
22
21
  },
23
22
  "genericTable": {
24
- "filterPlaceholder": "Ergebnisse filtern...",
23
+ "filterPlaceholder": "Ergebnisse filtern…",
25
24
  "itemLabel": "Zeilen",
26
25
  "showing": "{from} bis {to} von {total}",
27
26
  "columns": "Spalten",
@@ -39,9 +38,9 @@
39
38
  "neverSaved": "Noch nicht gespeichert"
40
39
  },
41
40
  "auth": {
42
- "title": "Mit Bardioc OS verbinden",
43
- "description": "Dieses Dashboard liest Live-Daten über den Bardioc-SDK-Transport. Es läuft in Bardioc OS oder eigenständig mit einer CLI-Dev-Session.",
44
- "stepsTitle": "Eigenständig mit Dev-Session ausführen:",
41
+ "title": "Mit Bardioc verbinden",
42
+ "description": "Dieses Dashboard liest Live-Daten über den Bardioc-SDK-Transport. Es läuft in Bardioc oder eigenständig mit Dev-Auth.",
43
+ "stepsTitle": "Eigenständig mit Dev-Auth ausführen:",
45
44
  "step1": "Setze DEV_SECRET=<dein-secret> und API_BASE_URL=<dein-host> in .env",
46
45
  "step2": "Dev-Server starten:",
47
46
  "detectedTitle": "Erkannte Umgebung",
@@ -56,7 +55,7 @@
56
55
  "noOperator": "Betreiber nicht verfügbar",
57
56
  "updated": "Aktualisiert {time}",
58
57
  "persistence": "In IndexedDB gespeichert",
59
- "notPersisted": "Vorschau — nicht gespeichert (in Bardioc OS öffnen zum Speichern)",
58
+ "notPersisted": "Vorschau — nicht gespeichert (in Bardioc öffnen zum Speichern)",
60
59
  "historyOne": "{count} Snapshot im Verlauf",
61
60
  "historyOther": "{count} Snapshots im Verlauf",
62
61
  "source": "Quelle"
@@ -127,14 +126,14 @@
127
126
  "description": "Live-Graph-Ereignisse, vom OS über SSE gestreamt (Berechtigung \"events\").",
128
127
  "emptyTitle": "Warte auf Ereignisse",
129
128
  "emptyHost": "Noch keine Graph-Ereignisse — Aktivität erscheint hier, sobald sie auftritt.",
130
- "emptyStandalone": "In Bardioc OS (oder einer Dev-Session) öffnen, um Live-Ereignisse zu empfangen."
129
+ "emptyStandalone": "In Bardioc öffnen (oder eigenständig mit Dev-Auth ausführen), um Live-Ereignisse zu empfangen."
131
130
  },
132
131
  "notify": {
133
132
  "synced": "{count} Stationen synchronisiert",
134
133
  "saved": "In IndexedDB gespeichert",
135
134
  "stationSelected": "Aktive Station: {name}",
136
135
  "localeChanged": "Sprache gewechselt zu {locale}",
137
- "queryOk": "Anfrage ok ({ms} ms)",
136
+ "queryOk": "Anfrage OK ({ms} ms)",
138
137
  "queryFailed": "Anfrage fehlgeschlagen — zeige simulierte Daten"
139
138
  }
140
139
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "app": { "title": "Weather Dashboard", "tagline": "Live planetary readings" },
2
+ "app": { "title": "Weather Dashboard", "tagline": "Live Planetary Readings" },
3
3
  "nav": {
4
4
  "overview": "Overview",
5
5
  "stations": "Stations",
@@ -9,77 +9,76 @@
9
9
  },
10
10
  "menu": {
11
11
  "view": "View",
12
- "about": "About this app"
12
+ "about": "About This App"
13
13
  },
14
14
  "about": {
15
- "title": "About this app",
15
+ "title": "About This App",
16
16
  "version": "Version",
17
17
  "id": "App ID",
18
18
  "description": "Description",
19
- "permissions": "Permissions",
20
- "error": "Could not read app-manifest.json",
21
- "source": "Read live from public/app-manifest.json"
19
+ "error": "Could not read app-manifest.json.",
20
+ "source": "Read live from public/app-manifest.json."
22
21
  },
23
22
  "genericTable": {
24
- "filterPlaceholder": "Filter results...",
23
+ "filterPlaceholder": "Filter Results…",
25
24
  "itemLabel": "rows",
26
25
  "showing": "{from} to {to} of {total}",
27
26
  "columns": "Columns",
28
27
  "noResults": "No results found.",
29
- "goToPreviousPage": "Go to previous page",
30
- "goToNextPage": "Go to next page"
28
+ "goToPreviousPage": "Go to Previous Page",
29
+ "goToNextPage": "Go to Next Page"
31
30
  },
32
31
  "common": { "button": { "previous": "Previous", "next": "Next" } },
33
32
  "header": {
34
- "search": "Search stations…",
33
+ "search": "Search Stations…",
35
34
  "sync": "Sync",
36
35
  "syncing": "Syncing…",
37
36
  "location": "Station",
38
37
  "savedAt": "Saved {time}",
39
- "neverSaved": "Not yet saved"
38
+ "neverSaved": "Not Yet Saved"
40
39
  },
41
40
  "auth": {
42
- "title": "Connect to Bardioc OS",
43
- "description": "This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc OS, or standalone with a CLI dev session.",
44
- "stepsTitle": "Run standalone with a dev session:",
45
- "step1": "Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in .env",
41
+ "title": "Connect to Bardioc",
42
+ "description": "This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc, or standalone with dev auth.",
43
+ "stepsTitle": "Run standalone with dev auth:",
44
+ "step1": "Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in the .env file.",
46
45
  "step2": "Start the dev server:",
47
- "detectedTitle": "Detected environment",
48
- "insideHost": "Inside host iframe",
49
- "devAuth": "Dev auth enabled",
46
+ "detectedTitle": "Detected Environment",
47
+ "insideHost": "Inside Host Iframe",
48
+ "devAuth": "Dev Auth Enabled",
50
49
  "yes": "yes",
51
50
  "no": "no",
52
51
  "retry": "Reload"
53
52
  },
54
53
  "overview": {
55
54
  "operator": "Operator",
56
- "noOperator": "Operator unavailable",
55
+ "noOperator": "Operator Unavailable",
57
56
  "updated": "Updated {time}",
58
57
  "persistence": "Persisted to IndexedDB",
59
- "notPersisted": "Preview — not persisted (open inside Bardioc OS to persist)",
58
+ "notPersisted": "Preview — not persisted (open inside Bardioc to persist)",
60
59
  "historyOne": "{count} snapshot in history",
61
60
  "historyOther": "{count} snapshots in history",
62
61
  "source": "Source"
63
62
  },
64
63
  "conditions": { "sunny": "Sunny", "cloudy": "Cloudy", "rainy": "Rainy" },
65
- "source": { "graph": "Bardioc graph", "mock": "Simulated" },
64
+ "source": { "graph": "Bardioc Graph", "mock": "Simulated" },
66
65
  "metrics": {
67
66
  "oxygen": "Oxygen",
68
- "temperature": "Surface temp",
67
+ "temperature": "Surface Temp",
69
68
  "humidity": "Humidity",
70
- "windSpeed": "Wind speed",
69
+ "windSpeed": "Wind Speed",
71
70
  "vegetation": "Vegetation",
72
- "oxygenHint": "Atmospheric mix",
73
- "temperatureHint": "Ground level",
71
+ "oxygenHint": "Atmospheric Mix",
72
+ "temperatureHint": "Ground Level",
74
73
  "humidityHint": "Relative",
75
74
  "windSpeedHint": "Sustained",
76
- "vegetationHint": "Surface cover"
75
+ "vegetationHint": "Surface Cover"
77
76
  },
78
- "chart": { "title": "7-day outlook", "description": "Daylight hours by condition" },
77
+ "chart": { "title": "7-Day Outlook", "description": "Daylight hours by condition." },
79
78
  "stations": {
80
- "title": "Monitoring stations",
79
+ "title": "Monitoring Stations",
81
80
  "description": "All stations reporting to this instance. Search, filter, or select one.",
82
- "search": "Search stations…",
81
+ "search": "Search Stations…",
83
82
  "filter": "Condition",
84
83
  "colName": "Station",
85
84
  "colRegion": "Region",
@@ -88,16 +87,16 @@
88
87
  "colHumidity": "Humidity",
89
88
  "colVegetation": "Vegetation",
90
89
  "itemLabel": "stations",
91
- "empty": "No stations match your filters",
90
+ "empty": "No stations match your filters.",
92
91
  "apply": "Apply",
93
92
  "clear": "Clear"
94
93
  },
95
94
  "explorer": {
96
95
  "title": "Graph Explorer",
97
96
  "description": "Run real Bardioc SDK transport requests. Without a session, each request falls back to simulated data so you can still explore the shape.",
98
- "run": "Run request",
97
+ "run": "Run Request",
99
98
  "running": "Running…",
100
- "empty": "Select a request and run it to see the response",
99
+ "empty": "Select a request and run it to see the response.",
101
100
  "live": "Live",
102
101
  "mock": "Simulated",
103
102
  "categoryGraph": "Graph",
@@ -106,35 +105,35 @@
106
105
  "durationMs": "{ms} ms"
107
106
  },
108
107
  "profile": {
109
- "title": "Operator profile",
108
+ "title": "Operator Profile",
110
109
  "description": "Pulled live from the OS transport (os.profile).",
111
110
  "name": "Name",
112
- "displayName": "Display name",
113
- "firstName": "First name",
114
- "lastName": "Last name",
111
+ "displayName": "Display Name",
112
+ "firstName": "First Name",
113
+ "lastName": "Last Name",
115
114
  "email": "Email",
116
115
  "id": "ID",
117
116
  "organization": "Organization",
118
117
  "units": "Units",
119
118
  "members": "Members",
120
- "raw": "Raw response",
121
- "errorTitle": "Could not load profile",
119
+ "raw": "Raw Response",
120
+ "errorTitle": "Could Not Load Profile",
122
121
  "errorHint": "The transport returned an error. Authorize a session, then reload.",
123
122
  "unknown": "Unknown"
124
123
  },
125
124
  "events": {
126
125
  "title": "Live Events",
127
126
  "description": "Live graph events streamed from the OS over SSE (permission \"events\").",
128
- "emptyTitle": "Waiting for events",
127
+ "emptyTitle": "Waiting for Events",
129
128
  "emptyHost": "No graph events yet — activity will appear here as it happens.",
130
- "emptyStandalone": "Open inside Bardioc OS (or a dev session) to receive live events."
129
+ "emptyStandalone": "Open inside Bardioc (or run standalone with dev auth) to receive live events."
131
130
  },
132
131
  "notify": {
133
- "synced": "Synced {count} stations",
134
- "saved": "Saved to IndexedDB",
135
- "stationSelected": "Active station: {name}",
136
- "localeChanged": "Language switched to {locale}",
137
- "queryOk": "Request ok ({ms} ms)",
138
- "queryFailed": "Request failed — showing simulated data"
132
+ "synced": "Synced {count} stations.",
133
+ "saved": "Saved to IndexedDB.",
134
+ "stationSelected": "Active station: {name}.",
135
+ "localeChanged": "Language switched to {locale}.",
136
+ "queryOk": "Request OK ({ms} ms).",
137
+ "queryFailed": "Request failed — showing simulated data."
139
138
  }
140
139
  }
@@ -1,4 +1,4 @@
1
- import { installDevBridge, isDevStandalone, isInsideIframe } from '@bardioc/app-sdk/dev';
1
+ import { installDevHost, isDevStandalone, isInsideIframe } from '@bardioc/app-sdk/dev';
2
2
  import { AppSdkProvider } from '@bardioc/app-sdk/react';
3
3
  import { StrictMode } from 'react';
4
4
  import { createRoot } from 'react-dom/client';
@@ -17,13 +17,13 @@ const devStandalone = isDevStandalone();
17
17
  const useSdkProvider = insideIframe || devStandalone;
18
18
 
19
19
  if (devStandalone) {
20
- installDevBridge({ debug: false });
20
+ installDevHost({ appId: APP_NAME });
21
21
  }
22
22
 
23
23
  createRoot(document.getElementById('root')!).render(
24
24
  <StrictMode>
25
25
  {useSdkProvider ? (
26
- <AppSdkProvider appId={APP_NAME}>
26
+ <AppSdkProvider>
27
27
  <AppI18nProvider syncWithOs>
28
28
  <App />
29
29
  </AppI18nProvider>