@unisim/sdk 0.157.0 → 0.158.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/README.md +42 -6
- package/dist/UserCountBreakdown.d.ts.map +1 -1
- package/dist/UserCountBreakdown.js +127 -21
- package/dist/UserCountBreakdown.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +100 -16
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/presence.d.ts +102 -9
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +302 -47
- package/dist/presence.js.map +1 -1
- package/dist/provider.d.ts +8 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +8 -2
- package/dist/provider.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -314,12 +314,26 @@ the last line of the navbar's profile menu. **Nothing to wire up:** the provider
|
|
|
314
314
|
reports the app as in use (guests included) and the menu reads the figure.
|
|
315
315
|
|
|
316
316
|
- **Counting** (migration 0175): the provider calls `app_presence_beat(product,
|
|
317
|
-
install_id)` on
|
|
317
|
+
install_id, platform)` on sign-in/out and every 45 s while the page is visible.
|
|
318
318
|
The install id is a random UUID in localStorage (`unisim:install-id`). An
|
|
319
319
|
account is one person across all its devices and platforms; a guest install is
|
|
320
320
|
one person unless somebody signed in on it. "Live" = a beat in the last 2 min.
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
⚠️ **The FIRST beat waits for an interaction on the web** (since 0.158.0) —
|
|
322
|
+
a pointer, key, touch, wheel or scroll event. A page load on its own is not
|
|
323
|
+
somebody using the app, and until this it counted as one. An **installed** app
|
|
324
|
+
(Capacitor, Electron) beats the moment it opens: choosing the icon and waiting
|
|
325
|
+
for it to launch is a good deal more deliberate than arriving at a URL. For a
|
|
326
|
+
surface that is watched rather than touched — a wall display, a kiosk — pass
|
|
327
|
+
`presence: { requireInteraction: false }`.
|
|
328
|
+
⚠️ **PostgREST resolves an RPC by its argument NAMES**, so sending
|
|
329
|
+
`p_platform` to a database without migration 0187 is "function not found",
|
|
330
|
+
not an ignored argument. A beat refused for that reason retries without it and
|
|
331
|
+
drops the argument for the rest of the page — publishing this SDK ahead of the
|
|
332
|
+
migration costs the platform column, not the count.
|
|
333
|
+
- **Reading**: `app_user_counts(product)` → `{ total, live, web, native }`, only
|
|
334
|
+
while the menu is open. The line hides until a real number arrives. A database
|
|
335
|
+
without 0187 answers two columns; `web`/`native` come back `null` and no split
|
|
336
|
+
is drawn.
|
|
323
337
|
- **It opens on the WHOLE SUITE** since 0.150.0 — `suite_user_counts()`, "There
|
|
324
338
|
are a total of 1,234 users across all UNI·SIM apps (12 live)" (migration
|
|
325
339
|
0177) — and a tap switches to this app's own figure and back. An account is
|
|
@@ -342,13 +356,35 @@ reports the app as in use (guests included) and the menu reads the figure.
|
|
|
342
356
|
dropped, because the database enum gains values without the SDK being
|
|
343
357
|
rebuilt. A database without 0184 shows "not available" and nothing else
|
|
344
358
|
breaks. Turn it off with `<UserCountLine breakdown={false} />`.
|
|
359
|
+
- **web / native on every figure** (since 0.158.0, migration 0187): each row
|
|
360
|
+
reads "1,234 users · 900 web · 334 native · 5 live", and the suite figure
|
|
361
|
+
carries the split under it. The four phrases wrap onto a second line where a
|
|
362
|
+
row is too narrow for them, so nothing is ever cut off.
|
|
363
|
+
⚠️ **`web + native` can be LESS than `total`.** Each *person* is put in one
|
|
364
|
+
bucket — the platform of their most recent beat, so a phone-and-laptop person
|
|
365
|
+
is counted once — and anyone whose last beat predates 0187 is in neither. It
|
|
366
|
+
heals one visitor at a time; `live` is complete within two minutes. `web` and
|
|
367
|
+
`native` are `null`, and the split is drawn nowhere, for an app whose total is
|
|
368
|
+
its own account counter (0185, the Bipolar apps): a Firestore counter has no
|
|
369
|
+
platform in it.
|
|
370
|
+
⚠️ **The native figure lags by an app RELEASE, not a deploy** — `cap sync`,
|
|
371
|
+
a rebuild and a store review each. A low native figure is far more likely to
|
|
372
|
+
be an unshipped build than a bug.
|
|
373
|
+
- **"How we count a user"** — a collapsed fold at the bottom of the popup
|
|
374
|
+
stating, in the reader's language, all of the above that a user can see: who
|
|
375
|
+
counts as one person, that the web counts from an interaction, that opening an
|
|
376
|
+
installed app is that interaction, what "live" means, and why web + native can
|
|
377
|
+
come to less than the total.
|
|
345
378
|
- **Off switches**: `presence: false` in `UniversalConfig`; `showUserCount={false}`
|
|
346
379
|
on `<UserProfile>`. The hubs (`product: 'central'`) never beat or show it.
|
|
347
380
|
- **Elsewhere**: `<UserCountLine />` / `useUserCounts()` for a home screen, and
|
|
348
381
|
`<UserCountBreakdown />` / `useUserCountsByProduct()` for the per-app list.
|
|
349
|
-
Apps without `<UniversalProvider>` use `startPresence(supabase, product)`,
|
|
350
|
-
`fetchUserCounts`, `fetchUserCountsByProduct
|
|
351
|
-
`formatUserCounts(language, counts)`
|
|
382
|
+
Apps without `<UniversalProvider>` use `startPresence(supabase, product, opts)`,
|
|
383
|
+
`fetchUserCounts`, `fetchUserCountsByProduct`,
|
|
384
|
+
`formatUserCounts(language, counts)` and — for the four wrapping phrases of a
|
|
385
|
+
row — `userCountParts(language, counts)` directly. `devicePlatform()`,
|
|
386
|
+
`isInstalledApp()`, `onFirstInteraction()` and `hasInteracted()` are exported
|
|
387
|
+
for an app that wants to hold something else of its own back on the same rule.
|
|
352
388
|
|
|
353
389
|
### Languages
|
|
354
390
|
- `SUPPORTED_LANGUAGES`: `en`, `en-gb`, `fr`, `es`, `it`, `de`, **`pt-BR`**, **`pt-PT`**, `tr`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCountBreakdown.d.ts","sourceRoot":"","sources":["../src/UserCountBreakdown.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAGrD,OAAO,
|
|
1
|
+
{"version":3,"file":"UserCountBreakdown.d.ts","sourceRoot":"","sources":["../src/UserCountBreakdown.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAGrD,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAA;AAyDtB;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,UAAO,GAAG,aAAa,EAAE,GAAG,IAAI,CAmB5E;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAe,EAAE,EAAE,uBAAuB,sCAoHpG"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useRef, useState } from 'react';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
5
|
import { NAV_OVERLAY_Z_INDEX } from './DropdownSurface.js';
|
|
@@ -7,7 +7,7 @@ import { t } from './i18n.js';
|
|
|
7
7
|
import { MENU } from './menuTheme.js';
|
|
8
8
|
import { productDisplayName } from './productNames.js';
|
|
9
9
|
import { useLanguage, useUniversal } from './provider.js';
|
|
10
|
-
import { PRESENCE_BEAT_MS, cachedUserCountsByProduct, fetchUserCountsByProduct, formatUserCounts, } from './presence.js';
|
|
10
|
+
import { PRESENCE_BEAT_MS, cachedUserCountsByProduct, fetchUserCountsByProduct, formatUserCounts, userCountParts, } from './presence.js';
|
|
11
11
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
12
12
|
// <UserCountBreakdown /> — "…and which apps are those people in?"
|
|
13
13
|
//
|
|
@@ -17,7 +17,12 @@ import { PRESENCE_BEAT_MS, cachedUserCountsByProduct, fetchUserCountsByProduct,
|
|
|
17
17
|
// it opens on, this app's figure on a tap (2026-09-17), and this list on a press
|
|
18
18
|
// and hold.
|
|
19
19
|
//
|
|
20
|
-
//
|
|
20
|
+
// James, 2026-09-21 added two more things to it: the web / native split on
|
|
21
|
+
// every figure ("perhaps on the long press of unisim users it can show
|
|
22
|
+
// web | native | live if there's enough space"), and the collapsed "How we
|
|
23
|
+
// count a user" fold at the bottom.
|
|
24
|
+
//
|
|
25
|
+
// Five things worth knowing before changing it:
|
|
21
26
|
//
|
|
22
27
|
// 1. **The rows do not add up to the suite total, and the note says so.** An
|
|
23
28
|
// account that uses four apps is four rows here and one person in the suite
|
|
@@ -39,6 +44,21 @@ import { PRESENCE_BEAT_MS, cachedUserCountsByProduct, fetchUserCountsByProduct,
|
|
|
39
44
|
// portal is not, so without the capture-phase guard below the first click in
|
|
40
45
|
// here would close the menu and take this popup down with it.
|
|
41
46
|
//
|
|
47
|
+
// 4. **"If there's enough space" is CSS, not a measurement.** The figures are
|
|
48
|
+
// four separate phrases in a wrapping flex row, so "1,234 users · 900 web ·
|
|
49
|
+
// 334 native · 5 live" sits beside the app name where it fits and drops to
|
|
50
|
+
// its own line where it does not — at any width, in any language, with no
|
|
51
|
+
// ResizeObserver and nothing to get wrong at 320px. Never join them into one
|
|
52
|
+
// string: a string can only wrap where its language puts spaces, and German
|
|
53
|
+
// ("gerade aktiv") and Turkish do not put them where English does.
|
|
54
|
+
//
|
|
55
|
+
// 5. **A row can have no split, and that is not an empty one.** `web`/`native`
|
|
56
|
+
// come back null for an app whose total is its own account counter
|
|
57
|
+
// (migration 0185 — the Bipolar apps, counted in Firestore). The split is
|
|
58
|
+
// left OUT of such a row rather than drawn as "0 web · 0 native", which
|
|
59
|
+
// would be a claim, and a false one. `userCountParts` does that filtering;
|
|
60
|
+
// this file just renders what it gets.
|
|
61
|
+
//
|
|
42
62
|
// ⚠️ Inline styles, not Tailwind — this ships inside node_modules and the apps'
|
|
43
63
|
// Tailwind builds do not scan it. Same as AboutAppDialog and PrivacyNote.
|
|
44
64
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
@@ -130,21 +150,46 @@ export function UserCountBreakdown({ open, onClose, suite, theme = 'light' }) {
|
|
|
130
150
|
// backdrop. An onClick here would close the popup in the same gesture
|
|
131
151
|
// that opened it. A fresh press on the backdrop sends its own
|
|
132
152
|
// pointerdown, which is the dismissal we actually want.
|
|
133
|
-
onPointerDown: onClose, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": t(language, 'users.breakdown_title'), ref: cardRef, style: cardStyle(p), onPointerDown: (e) => e.stopPropagation(), children: [_jsxs("div", { style: headerRowStyle, children: [_jsx("h2", { style: titleStyle(p), children: t(language, 'users.breakdown_title') }), _jsx("button", { type: "button", onClick: onClose, "aria-label": t(language, 'nav.menu_close'), style: closeButtonStyle(p), children: _jsx(IconClose, {}) })] }), suite && _jsx("p", { style: suiteLineStyle(p), children: formatUserCounts(language, suite, 'suite') }), loading && _jsx("p", { style: quietStyle(p), children: t(language, 'users.breakdown_loading') }), !loading && !rows && _jsx("p", { style: quietStyle(p), children: t(language, 'users.breakdown_empty') }), rows && (_jsx("ul", { style: listStyle, children: rows.map((row) => (_jsxs("li", { style: rowStyle(p), children: [_jsx("span", { style: nameStyle(p), children: productDisplayName(row.product) }), _jsxs("span", { style: figureStyle(p), children: [row.live > 0 && _jsx("span", { style: liveDotStyle, "aria-hidden": true }),
|
|
153
|
+
onPointerDown: onClose, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": t(language, 'users.breakdown_title'), ref: cardRef, style: cardStyle(p), onPointerDown: (e) => e.stopPropagation(), children: [_jsxs("div", { style: headerRowStyle, children: [_jsx("h2", { style: titleStyle(p), children: t(language, 'users.breakdown_title') }), _jsx("button", { type: "button", onClick: onClose, "aria-label": t(language, 'nav.menu_close'), style: closeButtonStyle(p), children: _jsx(IconClose, {}) })] }), suite && (_jsxs(_Fragment, { children: [_jsx("p", { style: suiteLineStyle(p), children: formatUserCounts(language, suite, 'suite') }), _jsx(SuiteSplit, { counts: suite, language: language, palette: p })] })), loading && _jsx("p", { style: quietStyle(p), children: t(language, 'users.breakdown_loading') }), !loading && !rows && _jsx("p", { style: quietStyle(p), children: t(language, 'users.breakdown_empty') }), rows && (_jsx("ul", { style: listStyle, children: rows.map((row) => (_jsxs("li", { style: rowStyle(p), children: [_jsx("span", { style: nameStyle(p), children: productDisplayName(row.product) }), _jsxs("span", { style: figureStyle(p), children: [row.live > 0 && _jsx("span", { style: liveDotStyle, "aria-hidden": true }), _jsx(Figures, { counts: row, language: language, palette: p })] })] }, row.product))) })), rows && _jsx("p", { style: noteStyle(p), children: t(language, 'users.breakdown_note') }), _jsx(HowWeCount, { language: language, palette: p })] }) }), document.body);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* "1,234 users · 900 web · 334 native · 5 live" — as four spans that can wrap
|
|
157
|
+
* between one another, never mid-phrase, with the separators marked
|
|
158
|
+
* `aria-hidden` so a screen reader reads four facts rather than a row of dots.
|
|
159
|
+
*
|
|
160
|
+
* ⚠️ The whole point is that this is NOT one string. See note 4 in the header.
|
|
161
|
+
*/
|
|
162
|
+
function Figures({ counts, language, palette }) {
|
|
163
|
+
const parts = userCountParts(language, counts);
|
|
164
|
+
return (_jsx(_Fragment, { children: parts.map((part, i) => (_jsxs("span", { style: figurePartStyle, children: [i > 0 && _jsx("span", { "aria-hidden": true, style: separatorStyle(palette), children: "\u00B7" }), part] }, part))) }));
|
|
134
165
|
}
|
|
135
|
-
/**
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
166
|
+
/**
|
|
167
|
+
* The suite figure's own split, on the line under it. Drawn only when there is
|
|
168
|
+
* one: a database without migration 0187 answers null, and "0 web · 0 native"
|
|
169
|
+
* beneath a four-figure total would read as a broken count rather than a
|
|
170
|
+
* missing one.
|
|
171
|
+
*/
|
|
172
|
+
function SuiteSplit({ counts, language, palette }) {
|
|
173
|
+
if (typeof counts.web !== 'number' || typeof counts.native !== 'number')
|
|
174
|
+
return null;
|
|
175
|
+
const parts = userCountParts(language, counts).slice(1, 3);
|
|
176
|
+
return (_jsx("p", { style: suiteSplitStyle(palette), children: parts.map((part, i) => (_jsxs("span", { style: figurePartStyle, children: [i > 0 && _jsx("span", { "aria-hidden": true, style: separatorStyle(palette), children: "\u00B7" }), part] }, part))) }));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* "How we count a user", collapsed (James, 2026-09-21). Every figure in this
|
|
180
|
+
* popup is a judgement call about who a person is, and the popup is the only
|
|
181
|
+
* place anybody meets those calls — so the answer belongs in it rather than in
|
|
182
|
+
* a migration header nobody outside this repo can read.
|
|
183
|
+
*
|
|
184
|
+
* ⚠️ A real `<details>`, not a state-driven fold: it is the suite's house
|
|
185
|
+
* pattern, it opens with no JavaScript, and `installRevealOnExpand` (on by
|
|
186
|
+
* default in every app) already scrolls an opened fold into view — here that
|
|
187
|
+
* means the card scrolls, because the card is the nearest thing with
|
|
188
|
+
* `overflow-y: auto` and `scrollChain` finds the innermost scroller first.
|
|
189
|
+
*/
|
|
190
|
+
function HowWeCount({ language, palette }) {
|
|
191
|
+
const lines = ['users.how_person', 'users.how_web', 'users.how_native', 'users.how_live', 'users.how_split'];
|
|
192
|
+
return (_jsxs("details", { style: detailsStyle(palette), children: [_jsx("summary", { style: summaryStyle(palette), children: t(language, 'users.how_title') }), _jsx("ul", { style: howListStyle, children: lines.map((key) => (_jsx("li", { style: howItemStyle(palette), children: t(language, key) }, key))) })] }));
|
|
148
193
|
}
|
|
149
194
|
function IconClose() {
|
|
150
195
|
return (_jsx("svg", { viewBox: "0 0 24 24", width: "15", height: "15", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", "aria-hidden": "true", children: _jsx("path", { d: "M6 6 18 18M18 6 6 18" }) }));
|
|
@@ -215,6 +260,15 @@ const suiteLineStyle = (p) => ({
|
|
|
215
260
|
lineHeight: 1.4,
|
|
216
261
|
color: p.muted,
|
|
217
262
|
});
|
|
263
|
+
const suiteSplitStyle = (p) => ({
|
|
264
|
+
margin: '2px 0 0',
|
|
265
|
+
display: 'flex',
|
|
266
|
+
flexWrap: 'wrap',
|
|
267
|
+
gap: '0 5px',
|
|
268
|
+
fontSize: 11,
|
|
269
|
+
lineHeight: 1.4,
|
|
270
|
+
color: p.faint,
|
|
271
|
+
});
|
|
218
272
|
const quietStyle = (p) => ({
|
|
219
273
|
margin: '14px 0 0',
|
|
220
274
|
fontSize: 12,
|
|
@@ -231,7 +285,13 @@ const rowStyle = (p) => ({
|
|
|
231
285
|
display: 'flex',
|
|
232
286
|
alignItems: 'baseline',
|
|
233
287
|
justifyContent: 'space-between',
|
|
234
|
-
|
|
288
|
+
// ⚠️ The row WRAPS now that a figure can be four phrases long (0.158.0).
|
|
289
|
+
// `gap: '2px 12px'` keeps the old 12px between the name and the figures and
|
|
290
|
+
// adds a hair of leading when they end up stacked — which is what "if
|
|
291
|
+
// there's enough space" amounts to: a row too narrow for both puts the
|
|
292
|
+
// figures under the app name instead of squeezing or clipping them.
|
|
293
|
+
flexWrap: 'wrap',
|
|
294
|
+
gap: '2px 12px',
|
|
235
295
|
padding: '5px 0',
|
|
236
296
|
borderBottom: `1px solid ${p.divider}`,
|
|
237
297
|
});
|
|
@@ -243,12 +303,22 @@ const nameStyle = (p) => ({
|
|
|
243
303
|
const figureStyle = (p) => ({
|
|
244
304
|
display: 'inline-flex',
|
|
245
305
|
alignItems: 'baseline',
|
|
246
|
-
|
|
247
|
-
|
|
306
|
+
// The phrases wrap between themselves; each one is nowrap on its own, so a
|
|
307
|
+
// grouped figure is never broken away from the word it belongs to.
|
|
308
|
+
flexWrap: 'wrap',
|
|
309
|
+
justifyContent: 'flex-end',
|
|
310
|
+
gap: '0 5px',
|
|
248
311
|
fontSize: 12,
|
|
249
312
|
color: p.muted,
|
|
250
|
-
|
|
313
|
+
});
|
|
314
|
+
const figurePartStyle = {
|
|
251
315
|
whiteSpace: 'nowrap',
|
|
316
|
+
};
|
|
317
|
+
const separatorStyle = (p) => ({
|
|
318
|
+
// The dot belongs to the phrase after it, so a wrap never leaves one
|
|
319
|
+
// stranded at the end of a line.
|
|
320
|
+
marginRight: 5,
|
|
321
|
+
color: p.faint,
|
|
252
322
|
});
|
|
253
323
|
const liveDotStyle = {
|
|
254
324
|
display: 'inline-block',
|
|
@@ -265,4 +335,40 @@ const noteStyle = (p) => ({
|
|
|
265
335
|
lineHeight: 1.45,
|
|
266
336
|
color: p.faint,
|
|
267
337
|
});
|
|
338
|
+
// ── "How we count a user" ────────────────────────────────────────────────────
|
|
339
|
+
const detailsStyle = (p) => ({
|
|
340
|
+
marginTop: 12,
|
|
341
|
+
paddingTop: 10,
|
|
342
|
+
borderTop: `1px solid ${p.divider}`,
|
|
343
|
+
});
|
|
344
|
+
const summaryStyle = (p) => ({
|
|
345
|
+
// A summary is a button to everyone who can see it; these two make it one to
|
|
346
|
+
// a pointer and to a reader who presses and holds on a phone, where the
|
|
347
|
+
// browser would otherwise offer to select the words instead of opening it.
|
|
348
|
+
cursor: 'pointer',
|
|
349
|
+
WebkitUserSelect: 'none',
|
|
350
|
+
userSelect: 'none',
|
|
351
|
+
fontSize: 12,
|
|
352
|
+
fontWeight: 600,
|
|
353
|
+
color: p.muted,
|
|
354
|
+
// The disclosure triangle is left in place on purpose: it is the one thing on
|
|
355
|
+
// screen that says the fold opens, and it is drawn by the browser in the
|
|
356
|
+
// reader's own conventions.
|
|
357
|
+
listStyle: 'revert',
|
|
358
|
+
});
|
|
359
|
+
const howListStyle = {
|
|
360
|
+
listStyle: 'none',
|
|
361
|
+
margin: '8px 0 0',
|
|
362
|
+
padding: 0,
|
|
363
|
+
display: 'grid',
|
|
364
|
+
gap: 6,
|
|
365
|
+
};
|
|
366
|
+
const howItemStyle = (p) => ({
|
|
367
|
+
fontSize: 11,
|
|
368
|
+
lineHeight: 1.45,
|
|
369
|
+
color: p.faint,
|
|
370
|
+
// No marker and no indent: the card is 380px at its widest and a <ul>'s
|
|
371
|
+
// default 40px of padding costs one of these sentences a whole line on a
|
|
372
|
+
// phone. The gap between items is what separates them.
|
|
373
|
+
});
|
|
268
374
|
//# sourceMappingURL=UserCountBreakdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCountBreakdown.js","sourceRoot":"","sources":["../src/UserCountBreakdown.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserCountBreakdown.js","sourceRoot":"","sources":["../src/UserCountBreakdown.tsx"],"names":[],"mappings":"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"}
|
package/dist/i18n.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,mBAAmB,0EAA2E,CAAA;AAE3G,MAAM,MAAM,QAAQ,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAEzD,eAAO,MAAM,gBAAgB,EAAE,QAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,mBAAmB,0EAA2E,CAAA;AAE3G,MAAM,MAAM,QAAQ,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAEzD,eAAO,MAAM,gBAAgB,EAAE,QAAe,CAAA;AAwwD9C,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,QAAQ,CAGrF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAUhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAS3E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAC9C,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,CAAC,GAAG,SAAS,CAUf"}
|
package/dist/i18n.js
CHANGED
|
@@ -241,13 +241,34 @@ const en = {
|
|
|
241
241
|
// The breakdown behind the suite figure — one row per app, on a long
|
|
242
242
|
// press (0.154.0). Names of apps are NOT here: they are brand identity and
|
|
243
243
|
// come from the switcher catalogue in every language (productNames.ts).
|
|
244
|
+
//
|
|
245
|
+
// ⚠️ The row's figures are five SEPARATE phrases, not one sentence (0.158.0,
|
|
246
|
+
// and `users.breakdown_row` / `_one` are gone). A row can now carry four of
|
|
247
|
+
// them — "1,234 users · 900 web · 334 native · 5 live" — and they have to be
|
|
248
|
+
// able to wrap onto a second line on a phone without a translator having to
|
|
249
|
+
// guess where the break should fall. `{n}` is whichever figure the phrase is
|
|
250
|
+
// for, grouped for the reader's language by the caller.
|
|
244
251
|
'users.breakdown_hint': "Press and hold to see the users in each app",
|
|
245
252
|
'users.breakdown_title': "Users per app",
|
|
246
|
-
'users.
|
|
247
|
-
'users.
|
|
253
|
+
'users.part_total': "{n} users",
|
|
254
|
+
'users.part_total_one': "{n} user",
|
|
255
|
+
'users.part_web': "{n} web",
|
|
256
|
+
'users.part_native': "{n} native",
|
|
257
|
+
'users.part_live': "{n} live",
|
|
248
258
|
'users.breakdown_note': "One person who uses several apps appears in each of them, so these add up to more than the suite total.",
|
|
249
259
|
'users.breakdown_loading': "Counting…",
|
|
250
260
|
'users.breakdown_empty': "The breakdown is not available just now.",
|
|
261
|
+
// The fold at the bottom of the popup (0.158.0, James 2026-09-21: "It would
|
|
262
|
+
// be good to have an explainer on the popup collapsed saying 'How we count a
|
|
263
|
+
// user'"). Every line is a claim about what the numbers above it mean, so
|
|
264
|
+
// none of them is decoration: if one stops being true, the fix is the count,
|
|
265
|
+
// not the copy.
|
|
266
|
+
'users.how_title': "How we count a user",
|
|
267
|
+
'users.how_person': "One person is one account, however many devices they sign in on. Someone who is not signed in counts once per app install or browser.",
|
|
268
|
+
'users.how_web': "On the web, someone counts from the moment they interact with the page — not just for loading it.",
|
|
269
|
+
'users.how_native': "In an installed app — Windows, Android, iOS — opening the app is that first interaction.",
|
|
270
|
+
'users.how_live': "“Live” means used in the last two minutes.",
|
|
271
|
+
'users.how_split': "Web and native say where each person was last seen. Anyone whose app is too old to say is in neither, so the two can add up to less than the total.",
|
|
251
272
|
};
|
|
252
273
|
// en-gb defers to en for chrome wording — spelling differences for this set
|
|
253
274
|
// of strings are minimal, but locale-aware date formatting picks up "en-gb"
|
|
@@ -451,11 +472,20 @@ const fr = {
|
|
|
451
472
|
'users.suite_other': "Il y a {total} utilisateurs au total sur toutes les applications UNI·SIM ({live} en ligne)",
|
|
452
473
|
'users.breakdown_hint': "Appuyez longuement pour voir les utilisateurs de chaque application",
|
|
453
474
|
'users.breakdown_title': "Utilisateurs par application",
|
|
454
|
-
'users.
|
|
455
|
-
'users.
|
|
475
|
+
'users.part_total': "{n} utilisateurs",
|
|
476
|
+
'users.part_total_one': "{n} utilisateur",
|
|
477
|
+
'users.part_web': "{n} web",
|
|
478
|
+
'users.part_native': "{n} appli",
|
|
479
|
+
'users.part_live': "{n} en ligne",
|
|
456
480
|
'users.breakdown_note': "Une personne qui utilise plusieurs applications apparaît dans chacune d’elles : le cumul dépasse donc le total de la suite.",
|
|
457
481
|
'users.breakdown_loading': "Comptage…",
|
|
458
482
|
'users.breakdown_empty': "Le détail n’est pas disponible pour le moment.",
|
|
483
|
+
'users.how_title': "Comment nous comptons un utilisateur",
|
|
484
|
+
'users.how_person': "Une personne, c’est un compte, quel que soit le nombre d’appareils utilisés. Sans connexion, elle est comptée une fois par installation ou par navigateur.",
|
|
485
|
+
'users.how_web': "Sur le web, une personne est comptée à partir du moment où elle interagit avec la page, et non au simple chargement.",
|
|
486
|
+
'users.how_native': "Dans une application installée — Windows, Android, iOS — l’ouverture de l’application tient lieu de première interaction.",
|
|
487
|
+
'users.how_live': "« En ligne » signifie utilisé dans les deux dernières minutes.",
|
|
488
|
+
'users.how_split': "Web et appli indiquent où chaque personne a été vue en dernier. Celles dont l’application est trop ancienne pour le dire ne sont dans ni l’un ni l’autre : le cumul peut donc être inférieur au total.",
|
|
459
489
|
};
|
|
460
490
|
const es = {
|
|
461
491
|
'nav.for': 'para',
|
|
@@ -655,11 +685,20 @@ const es = {
|
|
|
655
685
|
'users.suite_other': "Hay {total} usuarios en total en todas las aplicaciones UNI·SIM ({live} en línea)",
|
|
656
686
|
'users.breakdown_hint': "Mantén pulsado para ver los usuarios de cada aplicación",
|
|
657
687
|
'users.breakdown_title': "Usuarios por aplicación",
|
|
658
|
-
'users.
|
|
659
|
-
'users.
|
|
688
|
+
'users.part_total': "{n} usuarios",
|
|
689
|
+
'users.part_total_one': "{n} usuario",
|
|
690
|
+
'users.part_web': "{n} web",
|
|
691
|
+
'users.part_native': "{n} app",
|
|
692
|
+
'users.part_live': "{n} en línea",
|
|
660
693
|
'users.breakdown_note': "Una persona que usa varias aplicaciones aparece en todas ellas, así que la suma supera el total de la suite.",
|
|
661
694
|
'users.breakdown_loading': "Contando…",
|
|
662
695
|
'users.breakdown_empty': "El desglose no está disponible ahora mismo.",
|
|
696
|
+
'users.how_title': "Cómo contamos a un usuario",
|
|
697
|
+
'users.how_person': "Una persona es una cuenta, use los dispositivos que use. Quien no inicia sesión se cuenta una vez por instalación o navegador.",
|
|
698
|
+
'users.how_web': "En la web, una persona cuenta desde que interactúa con la página, no solo por cargarla.",
|
|
699
|
+
'users.how_native': "En una app instalada —Windows, Android, iOS— abrir la app ya es esa primera interacción.",
|
|
700
|
+
'users.how_live': "«En línea» significa usado en los últimos dos minutos.",
|
|
701
|
+
'users.how_split': "Web y app indican dónde se vio a cada persona por última vez. Quien tenga una versión demasiado antigua no está en ninguno de los dos, así que la suma puede ser menor que el total.",
|
|
663
702
|
};
|
|
664
703
|
const it = {
|
|
665
704
|
'nav.for': 'per',
|
|
@@ -859,11 +898,20 @@ const it = {
|
|
|
859
898
|
'users.suite_other': "Ci sono {total} utenti in totale in tutte le app UNI·SIM ({live} online)",
|
|
860
899
|
'users.breakdown_hint': "Tieni premuto per vedere gli utenti di ogni app",
|
|
861
900
|
'users.breakdown_title': "Utenti per app",
|
|
862
|
-
'users.
|
|
863
|
-
'users.
|
|
901
|
+
'users.part_total': "{n} utenti",
|
|
902
|
+
'users.part_total_one': "{n} utente",
|
|
903
|
+
'users.part_web': "{n} web",
|
|
904
|
+
'users.part_native': "{n} app",
|
|
905
|
+
'users.part_live': "{n} online",
|
|
864
906
|
'users.breakdown_note': "Chi usa più app compare in ognuna, quindi la somma supera il totale della suite.",
|
|
865
907
|
'users.breakdown_loading': "Conteggio…",
|
|
866
908
|
'users.breakdown_empty': "Il dettaglio non è disponibile al momento.",
|
|
909
|
+
'users.how_title': "Come contiamo un utente",
|
|
910
|
+
'users.how_person': "Una persona è un account, su quanti dispositivi voglia. Chi non ha effettuato l’accesso viene contato una volta per installazione o browser.",
|
|
911
|
+
'users.how_web': "Sul web una persona conta dal momento in cui interagisce con la pagina, non per il solo caricamento.",
|
|
912
|
+
'users.how_native': "In un’app installata — Windows, Android, iOS — aprire l’app è già quella prima interazione.",
|
|
913
|
+
'users.how_live': "«Online» significa usato negli ultimi due minuti.",
|
|
914
|
+
'users.how_split': "Web e app dicono dove ogni persona è stata vista l’ultima volta. Chi ha una versione troppo vecchia non rientra in nessuno dei due, quindi la somma può essere inferiore al totale.",
|
|
867
915
|
};
|
|
868
916
|
const de = {
|
|
869
917
|
'nav.for': 'für',
|
|
@@ -1063,11 +1111,20 @@ const de = {
|
|
|
1063
1111
|
'users.suite_other': "Insgesamt {total} Nutzer in allen UNI·SIM-Apps ({live} gerade aktiv)",
|
|
1064
1112
|
'users.breakdown_hint': "Gedrückt halten, um die Nutzer jeder App zu sehen",
|
|
1065
1113
|
'users.breakdown_title': "Nutzer pro App",
|
|
1066
|
-
'users.
|
|
1067
|
-
'users.
|
|
1114
|
+
'users.part_total': "{n} Nutzer",
|
|
1115
|
+
'users.part_total_one': "{n} Nutzer",
|
|
1116
|
+
'users.part_web': "{n} Web",
|
|
1117
|
+
'users.part_native': "{n} App",
|
|
1118
|
+
'users.part_live': "{n} gerade aktiv",
|
|
1068
1119
|
'users.breakdown_note': "Wer mehrere Apps nutzt, erscheint in jeder davon — die Summe liegt deshalb über dem Gesamtwert der Suite.",
|
|
1069
1120
|
'users.breakdown_loading': "Wird gezählt…",
|
|
1070
1121
|
'users.breakdown_empty': "Die Aufschlüsselung ist gerade nicht verfügbar.",
|
|
1122
|
+
'users.how_title': "Wie wir Nutzer zählen",
|
|
1123
|
+
'users.how_person': "Eine Person ist ein Konto, auf wie vielen Geräten auch immer. Wer nicht angemeldet ist, zählt einmal je Installation oder Browser.",
|
|
1124
|
+
'users.how_web': "Im Web zählt jemand ab dem Moment, in dem er mit der Seite interagiert — nicht schon beim Laden.",
|
|
1125
|
+
'users.how_native': "In einer installierten App — Windows, Android, iOS — ist das Öffnen der App genau diese erste Interaktion.",
|
|
1126
|
+
'users.how_live': "„Gerade aktiv“ heißt: in den letzten zwei Minuten genutzt.",
|
|
1127
|
+
'users.how_split': "Web und App zeigen, wo jede Person zuletzt gesehen wurde. Wessen App zu alt ist, um das zu melden, steht in keinem von beiden — die Summe kann deshalb unter dem Gesamtwert liegen.",
|
|
1071
1128
|
};
|
|
1072
1129
|
// European Portuguese — the SDK's original `pt`, unchanged but for the name.
|
|
1073
1130
|
const ptPT = {
|
|
@@ -1268,11 +1325,20 @@ const ptPT = {
|
|
|
1268
1325
|
'users.suite_other': "Há {total} utilizadores no total em todas as aplicações UNI·SIM ({live} online)",
|
|
1269
1326
|
'users.breakdown_hint': "Mantenha premido para ver os utilizadores de cada aplicação",
|
|
1270
1327
|
'users.breakdown_title': "Utilizadores por aplicação",
|
|
1271
|
-
'users.
|
|
1272
|
-
'users.
|
|
1328
|
+
'users.part_total': "{n} utilizadores",
|
|
1329
|
+
'users.part_total_one': "{n} utilizador",
|
|
1330
|
+
'users.part_web': "{n} web",
|
|
1331
|
+
'users.part_native': "{n} app",
|
|
1332
|
+
'users.part_live': "{n} online",
|
|
1273
1333
|
'users.breakdown_note': "Quem usa várias aplicações aparece em todas elas, por isso a soma ultrapassa o total da suite.",
|
|
1274
1334
|
'users.breakdown_loading': "A contar…",
|
|
1275
1335
|
'users.breakdown_empty': "O detalhe não está disponível de momento.",
|
|
1336
|
+
'users.how_title': "Como contamos um utilizador",
|
|
1337
|
+
'users.how_person': "Uma pessoa é uma conta, use os dispositivos que usar. Quem não inicia sessão conta uma vez por instalação ou navegador.",
|
|
1338
|
+
'users.how_web': "Na web, uma pessoa conta a partir do momento em que interage com a página, e não apenas por a carregar.",
|
|
1339
|
+
'users.how_native': "Numa aplicação instalada — Windows, Android, iOS — abrir a aplicação é essa primeira interação.",
|
|
1340
|
+
'users.how_live': "«Online» significa usado nos últimos dois minutos.",
|
|
1341
|
+
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez. Quem tiver uma versão demasiado antiga não está em nenhum dos dois, por isso a soma pode ser inferior ao total.",
|
|
1276
1342
|
};
|
|
1277
1343
|
// Brazilian Portuguese — its own read-through, NOT pt-PT with words swapped
|
|
1278
1344
|
// (added 0.141.5). What differs, so the next edit keeps it Brazilian:
|
|
@@ -1487,11 +1553,20 @@ const ptBR = {
|
|
|
1487
1553
|
'users.suite_other': "Há {total} usuários no total em todos os apps UNI·SIM ({live} online)",
|
|
1488
1554
|
'users.breakdown_hint': "Toque e segure para ver os usuários de cada app",
|
|
1489
1555
|
'users.breakdown_title': "Usuários por app",
|
|
1490
|
-
'users.
|
|
1491
|
-
'users.
|
|
1556
|
+
'users.part_total': "{n} usuários",
|
|
1557
|
+
'users.part_total_one': "{n} usuário",
|
|
1558
|
+
'users.part_web': "{n} web",
|
|
1559
|
+
'users.part_native': "{n} app",
|
|
1560
|
+
'users.part_live': "{n} online",
|
|
1492
1561
|
'users.breakdown_note': "Quem usa vários apps aparece em cada um deles, então a soma fica maior que o total da suíte.",
|
|
1493
1562
|
'users.breakdown_loading': "Contando…",
|
|
1494
1563
|
'users.breakdown_empty': "O detalhamento não está disponível agora.",
|
|
1564
|
+
'users.how_title': "Como contamos um usuário",
|
|
1565
|
+
'users.how_person': "Uma pessoa é uma conta, não importa em quantos aparelhos. Quem não faz login conta uma vez por instalação ou navegador.",
|
|
1566
|
+
'users.how_web': "Na web, a pessoa conta a partir do momento em que interage com a página, e não só por carregá-la.",
|
|
1567
|
+
'users.how_native': "Em um app instalado — Windows, Android, iOS — abrir o app já é essa primeira interação.",
|
|
1568
|
+
'users.how_live': "“Online” significa usado nos últimos dois minutos.",
|
|
1569
|
+
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez. Quem estiver com uma versão antiga demais não fica em nenhum dos dois, então a soma pode ser menor que o total.",
|
|
1495
1570
|
};
|
|
1496
1571
|
const tr = {
|
|
1497
1572
|
'nav.for': 'için',
|
|
@@ -1691,11 +1766,20 @@ const tr = {
|
|
|
1691
1766
|
'users.suite_other': "Tüm UNI·SIM uygulamalarında toplam {total} kullanıcı ({live} çevrimiçi)",
|
|
1692
1767
|
'users.breakdown_hint': "Her uygulamanın kullanıcılarını görmek için basılı tutun",
|
|
1693
1768
|
'users.breakdown_title': "Uygulama başına kullanıcı",
|
|
1694
|
-
'users.
|
|
1695
|
-
'users.
|
|
1769
|
+
'users.part_total': "{n} kullanıcı",
|
|
1770
|
+
'users.part_total_one': "{n} kullanıcı",
|
|
1771
|
+
'users.part_web': "{n} web",
|
|
1772
|
+
'users.part_native': "{n} uygulama",
|
|
1773
|
+
'users.part_live': "{n} çevrimiçi",
|
|
1696
1774
|
'users.breakdown_note': "Birden fazla uygulama kullanan biri her birinde görünür; bu yüzden toplamları paketin toplamından fazladır.",
|
|
1697
1775
|
'users.breakdown_loading': "Sayılıyor…",
|
|
1698
1776
|
'users.breakdown_empty': "Dağılım şu anda kullanılamıyor.",
|
|
1777
|
+
'users.how_title': "Bir kullanıcıyı nasıl sayıyoruz",
|
|
1778
|
+
'users.how_person': "Bir kişi, kaç cihaz kullanırsa kullansın, bir hesaptır. Giriş yapmayan biri her kurulum veya tarayıcı için bir kez sayılır.",
|
|
1779
|
+
'users.how_web': "Web’de bir kişi, sayfayı yalnızca açtığı anda değil, sayfayla etkileşime geçtiği andan itibaren sayılır.",
|
|
1780
|
+
'users.how_native': "Kurulu bir uygulamada — Windows, Android, iOS — uygulamayı açmak zaten o ilk etkileşimdir.",
|
|
1781
|
+
'users.how_live': "“Çevrimiçi”, son iki dakika içinde kullanıldı demektir.",
|
|
1782
|
+
'users.how_split': "Web ve uygulama, her kişinin en son nerede görüldüğünü gösterir. Uygulaması bunu bildiremeyecek kadar eski olanlar ikisinde de yer almaz; bu yüzden toplamları genel toplamdan az olabilir.",
|
|
1699
1783
|
};
|
|
1700
1784
|
const TRANSLATIONS = {
|
|
1701
1785
|
'en': en,
|