@jirawatpyk/aura-react 5.34.0 → 5.36.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.
@@ -35,6 +35,7 @@ const ActionBar = React.forwardRef(function ActionBar2(props, ref) {
35
35
  },
36
36
  role: "region",
37
37
  "aria-label": props.label || t.actions,
38
+ "data-aura-hide-bottomnav": props.hidesBottomNav && !idle ? "" : void 0,
38
39
  className: cx(
39
40
  "aura-actionbar",
40
41
  "aura-actionbar--" + (props.position || "viewport"),
@@ -5,6 +5,7 @@ import { IconButton } from "./IconButton.js";
5
5
  import { cx, useIsoLayoutEffect, useMergedRef } from "./internal.js";
6
6
  import { useStrings } from "./locale.js";
7
7
  import { useBreakpoint } from "./responsive.js";
8
+ import { useHideOnScroll } from "./scrollHide.js";
8
9
  import { IconMenu } from "./icons.js";
9
10
  const AppShell = React.forwardRef(function AppShell2(props, ref) {
10
11
  const t = useStrings();
@@ -29,13 +30,24 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
29
30
  const mergedRef = useMergedRef(ref, rootRef);
30
31
  const hasBar = !!(props.header || props.nav);
31
32
  const barH = React.useState(null);
33
+ const away = useHideOnScroll(!!props.headerHideOnScroll && hasBar, barRef, "(max-width: 1023.98px)", barH[0] || 56);
34
+ const awayRef = React.useRef(away);
35
+ awayRef.current = away;
36
+ useIsoLayoutEffect(
37
+ function() {
38
+ const root = rootRef.current, bar = barRef.current;
39
+ if (!root || !bar) return;
40
+ root.style.setProperty("--aura-shell-bar-height", away ? "0px" : bar.getBoundingClientRect().height + "px");
41
+ },
42
+ [away]
43
+ );
32
44
  useIsoLayoutEffect(
33
45
  function() {
34
46
  const root = rootRef.current, bar = barRef.current;
35
47
  if (!root || !bar) return;
36
48
  function sync() {
37
49
  const h = bar.getBoundingClientRect().height;
38
- root.style.setProperty("--aura-shell-bar-height", h + "px");
50
+ root.style.setProperty("--aura-shell-bar-height", awayRef.current ? "0px" : h + "px");
39
51
  if (h > 0) barH[1](Math.round(h));
40
52
  }
41
53
  sync();
@@ -103,7 +115,9 @@ const AppShell = React.forwardRef(function AppShell2(props, ref) {
103
115
  ref: barRef,
104
116
  className: cx(
105
117
  "aura-shell__bar",
106
- (!props.header || props.headerHideFrom === "lg") && "aura-shell__bar--menu-only"
118
+ (!props.header || props.headerHideFrom === "lg") && "aura-shell__bar--menu-only",
119
+ props.headerHideOnScroll && "aura-shell__bar--hides",
120
+ away && "is-away"
107
121
  )
108
122
  },
109
123
  props.nav ? /* @__PURE__ */ React.createElement(
@@ -3,6 +3,8 @@ import * as React from "react";
3
3
  import { Icon } from "./Icon.js";
4
4
  import { cx, devWarnOnce, plainClick, useMaybeControlled } from "./internal.js";
5
5
  import { useLinkComponent, useStrings } from "./locale.js";
6
+ import { useHideOnScroll } from "./scrollHide.js";
7
+ import { breakpoints } from "./breakpoints.js";
6
8
  const BottomNav = React.forwardRef(function BottomNav2(props, ref) {
7
9
  const t = useStrings();
8
10
  const Link = useLinkComponent(props.linkComponent);
@@ -13,11 +15,33 @@ const BottomNav = React.forwardRef(function BottomNav2(props, ref) {
13
15
  );
14
16
  const active = st[0];
15
17
  const hide = props.hideFrom === false ? "always" : "below-" + (props.hideFrom || "lg");
18
+ const own = React.useRef(null);
19
+ const hf = props.hideFrom === false ? null : props.hideFrom || "lg";
20
+ const away = useHideOnScroll(
21
+ !!props.hideOnScroll,
22
+ own,
23
+ hf ? "(max-width: " + (breakpoints[hf] - 0.02) + "px)" : "all",
24
+ 64
25
+ );
26
+ const setRef = React.useCallback(
27
+ function(el) {
28
+ own.current = el;
29
+ if (typeof ref === "function") ref(el);
30
+ else if (ref) ref.current = el;
31
+ },
32
+ [ref]
33
+ );
16
34
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: cx("aura-bottomnav-spacer", "aura-bottomnav--" + hide), "aria-hidden": "true" }), /* @__PURE__ */ React.createElement(
17
35
  "nav",
18
36
  {
19
- ref,
20
- className: cx("aura-bottomnav", "aura-bottomnav--" + hide, props.className),
37
+ ref: setRef,
38
+ className: cx(
39
+ "aura-bottomnav",
40
+ "aura-bottomnav--" + hide,
41
+ props.hideOnScroll && "aura-bottomnav--hides",
42
+ away && "is-away",
43
+ props.className
44
+ ),
21
45
  "aria-label": props.label || t.mainNav
22
46
  },
23
47
  /* @__PURE__ */ React.createElement("ul", { className: "aura-bottomnav__list" }, props.items.map(function(it) {
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+ import * as React from "react";
3
+ const STEP = 8;
4
+ function useHideOnScroll(enabled, el, media, from) {
5
+ const st = React.useState(false), hidden = st[0], setHidden = st[1];
6
+ React.useEffect(
7
+ function() {
8
+ if (!enabled || typeof window === "undefined") {
9
+ setHidden(false);
10
+ return;
11
+ }
12
+ const mq = window.matchMedia ? window.matchMedia(media) : null;
13
+ let last = window.scrollY, lastH = window.innerHeight, resizedAt = -1e9, run = 0;
14
+ let restore = null;
15
+ function update() {
16
+ if (restore) {
17
+ const r = restore;
18
+ if (performance.now() > r.until || window.scrollY >= r.y - 1) restore = null;
19
+ else {
20
+ restore = null;
21
+ last = r.y;
22
+ window.scrollTo(window.scrollX, r.y);
23
+ return;
24
+ }
25
+ }
26
+ const y = window.scrollY, dy = y - last;
27
+ last = y;
28
+ const node2 = el.current;
29
+ if (mq && !mq.matches || y <= from || node2 && document.activeElement && node2.contains(document.activeElement)) {
30
+ run = 0;
31
+ setHidden(false);
32
+ return;
33
+ }
34
+ if (window.innerHeight !== lastH || performance.now() - resizedAt < 150) {
35
+ lastH = window.innerHeight;
36
+ resizedAt = performance.now();
37
+ run = 0;
38
+ return;
39
+ }
40
+ if (y + window.innerHeight > document.documentElement.scrollHeight + 1) return;
41
+ run = dy > 0 === run > 0 ? run + dy : dy;
42
+ if (run > STEP) setHidden(true);
43
+ else if (run < -STEP) setHidden(false);
44
+ }
45
+ let tabbing = false;
46
+ function disarm() {
47
+ restore = null;
48
+ }
49
+ function onKey(e) {
50
+ if (e.key !== "Tab" && e.code !== "Tab") {
51
+ if (e.key !== "Shift") restore = null;
52
+ return;
53
+ }
54
+ tabbing = true;
55
+ requestAnimationFrame(function() {
56
+ tabbing = false;
57
+ });
58
+ }
59
+ function reveal() {
60
+ const n = el.current;
61
+ if (n && n.classList.contains("is-away")) {
62
+ n.classList.remove("is-away");
63
+ if (tabbing) {
64
+ if (window.scrollY < last) window.scrollTo(window.scrollX, last);
65
+ else restore = { y: last, until: performance.now() + 400 };
66
+ }
67
+ }
68
+ setHidden(false);
69
+ }
70
+ window.addEventListener("scroll", update, { passive: true });
71
+ window.addEventListener("resize", update);
72
+ document.addEventListener("keydown", onKey, true);
73
+ window.addEventListener("wheel", disarm, { passive: true, capture: true });
74
+ window.addEventListener("touchstart", disarm, { passive: true, capture: true });
75
+ window.addEventListener("pointerdown", disarm, true);
76
+ const node = el.current;
77
+ if (node) node.addEventListener("focusin", reveal);
78
+ if (mq && mq.addEventListener) mq.addEventListener("change", update);
79
+ return function() {
80
+ window.removeEventListener("scroll", update);
81
+ window.removeEventListener("resize", update);
82
+ document.removeEventListener("keydown", onKey, true);
83
+ window.removeEventListener("wheel", disarm, true);
84
+ window.removeEventListener("touchstart", disarm, true);
85
+ window.removeEventListener("pointerdown", disarm, true);
86
+ if (node) node.removeEventListener("focusin", reveal);
87
+ if (mq && mq.removeEventListener) mq.removeEventListener("change", update);
88
+ };
89
+ },
90
+ [enabled, el, media, from]
91
+ );
92
+ return enabled && hidden;
93
+ }
94
+ export {
95
+ useHideOnScroll
96
+ };
@@ -131,6 +131,7 @@ const STRINGS = {
131
131
  statusProblem: "Problem",
132
132
  statusMaintenance: "Maintenance",
133
133
  statusOk: "OK",
134
+ statusUnknown: "No data",
134
135
  accepts: function(list, max) {
135
136
  return [list, max && "up to " + max + " each"].filter(Boolean).join(", ");
136
137
  }
@@ -127,6 +127,7 @@ const sv = {
127
127
  statusProblem: "Problem",
128
128
  statusMaintenance: "Underh\xE5ll",
129
129
  statusOk: "OK",
130
+ statusUnknown: "Ingen data",
130
131
  accepts: function(list, max) {
131
132
  return [list, max && "h\xF6gst " + max + " per fil"].filter(Boolean).join(", ");
132
133
  }
@@ -127,6 +127,7 @@ const th = {
127
127
  statusProblem: "\u0E21\u0E35\u0E1B\u0E31\u0E0D\u0E2B\u0E32",
128
128
  statusMaintenance: "\u0E1B\u0E34\u0E14\u0E1B\u0E23\u0E31\u0E1A\u0E1B\u0E23\u0E38\u0E07",
129
129
  statusOk: "\u0E1B\u0E01\u0E15\u0E34",
130
+ statusUnknown: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25",
130
131
  accepts: function(list, max) {
131
132
  return [list, max && "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19 " + max + " \u0E15\u0E48\u0E2D\u0E44\u0E1F\u0E25\u0E4C"].filter(Boolean).join(" \xB7 ");
132
133
  }
package/dist/esm/tiles.js CHANGED
@@ -1,28 +1,31 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
3
  import { Icon } from "./Icon.js";
4
- import { cx } from "./classes.js";
4
+ import { cx, devWarnOnce } from "./classes.js";
5
5
  import { respVars } from "./breakpoints.js";
6
6
  import { STRINGS } from "./strings.js";
7
- import { IconCircleAlert, IconCircleCheck, IconTriangleAlert, IconWrench } from "./icons.js";
7
+ import { IconCircleAlert, IconCircleCheck, IconCircleDotDashed, IconTriangleAlert, IconWrench } from "./icons.js";
8
8
  const h = React.createElement;
9
9
  const STATUS_ICON = {
10
10
  down: IconCircleAlert,
11
11
  problem: IconTriangleAlert,
12
12
  maintenance: IconWrench,
13
- ok: IconCircleCheck
13
+ ok: IconCircleCheck,
14
+ unknown: IconCircleDotDashed
14
15
  };
15
16
  const STATUS_TONE = {
16
17
  down: "danger",
17
18
  problem: "warning",
18
19
  maintenance: "accent",
19
- ok: "default"
20
+ ok: "default",
21
+ unknown: "default"
20
22
  };
21
23
  const STATUS_WORD = {
22
24
  down: "statusDown",
23
25
  problem: "statusProblem",
24
26
  maintenance: "statusMaintenance",
25
- ok: "statusOk"
27
+ ok: "statusOk",
28
+ unknown: "statusUnknown"
26
29
  };
27
30
  function statusWord(status, t) {
28
31
  return String(t[STATUS_WORD[status]] || STATUS_WORD[status]);
@@ -37,7 +40,12 @@ function attrs(props) {
37
40
  }
38
41
  const comma = h("span", { className: "aura-status-tile__sep" }, ",");
39
42
  function statusTileElement(props, ref, Link, t, titleRef) {
40
- const status = STATUS_ICON[props.status] ? props.status : "ok";
43
+ const status = STATUS_ICON[props.status] ? props.status : "unknown";
44
+ if (status !== props.status)
45
+ devWarnOnce(
46
+ "status-tile-status-" + String(props.status),
47
+ 'StatusTile status="' + String(props.status) + '" is not down, problem, maintenance, ok or unknown: it shows as unknown ("No data"). Map your value first.'
48
+ );
41
49
  const valueTone = props.valueTone || STATUS_TONE[status];
42
50
  const word = props.statusLabel || statusWord(status, t);
43
51
  const markers = (props.markers || []).filter(Boolean);
package/dist/index.d.cts CHANGED
@@ -1214,6 +1214,10 @@ export interface AppShellProps {
1214
1214
  * as when there is no `header`: from lg up it is hidden and `--aura-shell-bar-height` is 0. For apps whose phone
1215
1215
  * pages have a top bar (brand, avatar) and whose desktop pages don't. Default: the bar shows at every width. */
1216
1216
  headerHideFrom?: "lg" | undefined;
1217
+ /** 5.35 (DxT Monitor #13): below 1024px the top bar slides up while the page scrolls down and comes back on the way
1218
+ * up, near the top, and when focus enters it; `--aura-shell-bar-height` is 0 while it is away, so headers pinned
1219
+ * under it follow. No motion with reduced motion. Default false. */
1220
+ headerHideOnScroll?: boolean | undefined;
1217
1221
  children?: React$1.ReactNode | undefined;
1218
1222
  navLabel?: string | undefined;
1219
1223
  menuLabel?: string | undefined;
@@ -1324,6 +1328,10 @@ export interface ActionBarProps {
1324
1328
  * parent, so they never cover the last field. Make it the last child of the form or card it belongs to: like any
1325
1329
  * `position: sticky` element it sticks only while that parent is on screen. */
1326
1330
  position?: "viewport" | "container" | undefined;
1331
+ /** 5.35 (DxT Monitor #14): while this bar is on the page, a BottomNav (and its spacer) is hidden and the bar takes the
1332
+ * bottom edge — for a page whose own actions (Acknowledge, Visit site) replace the tab bar. Any element can do the
1333
+ * same with the `data-aura-hide-bottomnav` attribute. */
1334
+ hidesBottomNav?: boolean | undefined;
1327
1335
  /** Bulk actions: the number of selected rows. Shows "N selected" in the status; at 0 the bar hides (its live region
1328
1336
  * stays, so the next selection is announced) and its actions leave the tab order. */
1329
1337
  selected?: number | undefined;
@@ -1365,6 +1373,10 @@ export interface BottomNavProps {
1365
1373
  linkComponent?: React$1.ElementType | undefined;
1366
1374
  /** Hidden from this breakpoint up, in CSS (so the server's HTML is right). Default `lg` (1024px); `false` never hides. */
1367
1375
  hideFrom?: "md" | "lg" | "xl" | false | undefined;
1376
+ /** 5.35 (DxT Monitor #14): slides down out of view while the page scrolls down and comes back on the way up, near the
1377
+ * top, and when focus enters it. Viewport ActionBars and toasts follow it down. Default false. To keep it away on a
1378
+ * page with its own bottom bar, see ActionBar `hidesBottomNav` (or `data-aura-hide-bottomnav` on your own bar). */
1379
+ hideOnScroll?: boolean | undefined;
1368
1380
  className?: string | undefined;
1369
1381
  }
1370
1382
  export interface StatChange {
@@ -1615,7 +1627,7 @@ export interface Theme {
1615
1627
  css(selector?: string): string;
1616
1628
  }
1617
1629
  /** A monitored thing's state on a StatusTile. */
1618
- export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok";
1630
+ export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok" | "unknown";
1619
1631
  /** A colour for a tile's value or a marker: `danger`, `warning`, `accent` (violet), `neutral` (grey) or `default`
1620
1632
  * (the text colour). */
1621
1633
  export type TileTone = "danger" | "warning" | "accent" | "neutral" | "default";
@@ -1629,14 +1641,15 @@ export interface StatusTileMarker {
1629
1641
  tone?: TileTone | undefined;
1630
1642
  }
1631
1643
  export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "style" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
1632
- /** down (red), problem (amber), maintenance (violet) or ok (grey). Each has its own icon too, so colour is never the
1633
- * only sign. */
1644
+ /** down (red), problem (amber), maintenance (violet), ok (grey) or unknown (5.35: no data yet — a dashed circle on
1645
+ * the plain surface). Each has its own icon too, so colour is never the only sign. */
1634
1646
  status: StatusTileStatus;
1635
1647
  /** The name. Wraps to two lines at most, then ends with "…"; a cut name shows in full in a tip on hover. */
1636
1648
  title: React$1.ReactNode;
1637
1649
  /** Top right, tabular figures: "12m", "99.98%", "240 ms". */
1638
1650
  value?: React$1.ReactNode | undefined;
1639
- /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok → default). */
1651
+ /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok and
1652
+ * unknown → default). */
1640
1653
  valueTone?: TileTone | undefined;
1641
1654
  /** A short second line: "since 09:41", "3 of 4 checks". */
1642
1655
  meta?: React$1.ReactNode | undefined;
@@ -1646,7 +1659,7 @@ export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement
1646
1659
  href?: string | undefined;
1647
1660
  /** Your router's link (e.g. `next/link`); defaults to AuraProvider's `linkComponent`, then `<a>`. */
1648
1661
  linkComponent?: React$1.ElementType | undefined;
1649
- /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK). */
1662
+ /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK, No data). */
1650
1663
  statusLabel?: string | undefined;
1651
1664
  className?: string | undefined;
1652
1665
  }
@@ -1986,6 +1999,8 @@ export interface AuraStrings {
1986
1999
  statusProblem: string;
1987
2000
  statusMaintenance: string;
1988
2001
  statusOk: string;
2002
+ /** StatusTile `unknown` (5.35). */
2003
+ statusUnknown: string;
1989
2004
  }
1990
2005
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
1991
2006
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
package/dist/index.d.ts CHANGED
@@ -1214,6 +1214,10 @@ export interface AppShellProps {
1214
1214
  * as when there is no `header`: from lg up it is hidden and `--aura-shell-bar-height` is 0. For apps whose phone
1215
1215
  * pages have a top bar (brand, avatar) and whose desktop pages don't. Default: the bar shows at every width. */
1216
1216
  headerHideFrom?: "lg" | undefined;
1217
+ /** 5.35 (DxT Monitor #13): below 1024px the top bar slides up while the page scrolls down and comes back on the way
1218
+ * up, near the top, and when focus enters it; `--aura-shell-bar-height` is 0 while it is away, so headers pinned
1219
+ * under it follow. No motion with reduced motion. Default false. */
1220
+ headerHideOnScroll?: boolean | undefined;
1217
1221
  children?: React$1.ReactNode | undefined;
1218
1222
  navLabel?: string | undefined;
1219
1223
  menuLabel?: string | undefined;
@@ -1324,6 +1328,10 @@ export interface ActionBarProps {
1324
1328
  * parent, so they never cover the last field. Make it the last child of the form or card it belongs to: like any
1325
1329
  * `position: sticky` element it sticks only while that parent is on screen. */
1326
1330
  position?: "viewport" | "container" | undefined;
1331
+ /** 5.35 (DxT Monitor #14): while this bar is on the page, a BottomNav (and its spacer) is hidden and the bar takes the
1332
+ * bottom edge — for a page whose own actions (Acknowledge, Visit site) replace the tab bar. Any element can do the
1333
+ * same with the `data-aura-hide-bottomnav` attribute. */
1334
+ hidesBottomNav?: boolean | undefined;
1327
1335
  /** Bulk actions: the number of selected rows. Shows "N selected" in the status; at 0 the bar hides (its live region
1328
1336
  * stays, so the next selection is announced) and its actions leave the tab order. */
1329
1337
  selected?: number | undefined;
@@ -1365,6 +1373,10 @@ export interface BottomNavProps {
1365
1373
  linkComponent?: React$1.ElementType | undefined;
1366
1374
  /** Hidden from this breakpoint up, in CSS (so the server's HTML is right). Default `lg` (1024px); `false` never hides. */
1367
1375
  hideFrom?: "md" | "lg" | "xl" | false | undefined;
1376
+ /** 5.35 (DxT Monitor #14): slides down out of view while the page scrolls down and comes back on the way up, near the
1377
+ * top, and when focus enters it. Viewport ActionBars and toasts follow it down. Default false. To keep it away on a
1378
+ * page with its own bottom bar, see ActionBar `hidesBottomNav` (or `data-aura-hide-bottomnav` on your own bar). */
1379
+ hideOnScroll?: boolean | undefined;
1368
1380
  className?: string | undefined;
1369
1381
  }
1370
1382
  export interface StatChange {
@@ -1615,7 +1627,7 @@ export interface Theme {
1615
1627
  css(selector?: string): string;
1616
1628
  }
1617
1629
  /** A monitored thing's state on a StatusTile. */
1618
- export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok";
1630
+ export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok" | "unknown";
1619
1631
  /** A colour for a tile's value or a marker: `danger`, `warning`, `accent` (violet), `neutral` (grey) or `default`
1620
1632
  * (the text colour). */
1621
1633
  export type TileTone = "danger" | "warning" | "accent" | "neutral" | "default";
@@ -1629,14 +1641,15 @@ export interface StatusTileMarker {
1629
1641
  tone?: TileTone | undefined;
1630
1642
  }
1631
1643
  export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "style" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
1632
- /** down (red), problem (amber), maintenance (violet) or ok (grey). Each has its own icon too, so colour is never the
1633
- * only sign. */
1644
+ /** down (red), problem (amber), maintenance (violet), ok (grey) or unknown (5.35: no data yet — a dashed circle on
1645
+ * the plain surface). Each has its own icon too, so colour is never the only sign. */
1634
1646
  status: StatusTileStatus;
1635
1647
  /** The name. Wraps to two lines at most, then ends with "…"; a cut name shows in full in a tip on hover. */
1636
1648
  title: React$1.ReactNode;
1637
1649
  /** Top right, tabular figures: "12m", "99.98%", "240 ms". */
1638
1650
  value?: React$1.ReactNode | undefined;
1639
- /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok → default). */
1651
+ /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok and
1652
+ * unknown → default). */
1640
1653
  valueTone?: TileTone | undefined;
1641
1654
  /** A short second line: "since 09:41", "3 of 4 checks". */
1642
1655
  meta?: React$1.ReactNode | undefined;
@@ -1646,7 +1659,7 @@ export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement
1646
1659
  href?: string | undefined;
1647
1660
  /** Your router's link (e.g. `next/link`); defaults to AuraProvider's `linkComponent`, then `<a>`. */
1648
1661
  linkComponent?: React$1.ElementType | undefined;
1649
- /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK). */
1662
+ /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK, No data). */
1650
1663
  statusLabel?: string | undefined;
1651
1664
  className?: string | undefined;
1652
1665
  }
@@ -1986,6 +1999,8 @@ export interface AuraStrings {
1986
1999
  statusProblem: string;
1987
2000
  statusMaintenance: string;
1988
2001
  statusOk: string;
2002
+ /** StatusTile `unknown` (5.35). */
2003
+ statusUnknown: string;
1989
2004
  }
1990
2005
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
1991
2006
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -152,6 +152,7 @@ var sv = {
152
152
  statusProblem: "Problem",
153
153
  statusMaintenance: "Underh\xE5ll",
154
154
  statusOk: "OK",
155
+ statusUnknown: "Ingen data",
155
156
  accepts: function(list, max) {
156
157
  return [list, max && "h\xF6gst " + max + " per fil"].filter(Boolean).join(", ");
157
158
  }
@@ -94,6 +94,8 @@ export interface AuraStrings {
94
94
  statusProblem: string;
95
95
  statusMaintenance: string;
96
96
  statusOk: string;
97
+ /** StatusTile `unknown` (5.35). */
98
+ statusUnknown: string;
97
99
  }
98
100
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
99
101
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -94,6 +94,8 @@ export interface AuraStrings {
94
94
  statusProblem: string;
95
95
  statusMaintenance: string;
96
96
  statusOk: string;
97
+ /** StatusTile `unknown` (5.35). */
98
+ statusUnknown: string;
97
99
  }
98
100
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
99
101
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -152,6 +152,7 @@ var th = {
152
152
  statusProblem: "\u0E21\u0E35\u0E1B\u0E31\u0E0D\u0E2B\u0E32",
153
153
  statusMaintenance: "\u0E1B\u0E34\u0E14\u0E1B\u0E23\u0E31\u0E1A\u0E1B\u0E23\u0E38\u0E07",
154
154
  statusOk: "\u0E1B\u0E01\u0E15\u0E34",
155
+ statusUnknown: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25",
155
156
  accepts: function(list, max) {
156
157
  return [list, max && "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19 " + max + " \u0E15\u0E48\u0E2D\u0E44\u0E1F\u0E25\u0E4C"].filter(Boolean).join(" \xB7 ");
157
158
  }
@@ -94,6 +94,8 @@ export interface AuraStrings {
94
94
  statusProblem: string;
95
95
  statusMaintenance: string;
96
96
  statusOk: string;
97
+ /** StatusTile `unknown` (5.35). */
98
+ statusUnknown: string;
97
99
  }
98
100
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
99
101
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -94,6 +94,8 @@ export interface AuraStrings {
94
94
  statusProblem: string;
95
95
  statusMaintenance: string;
96
96
  statusOk: string;
97
+ /** StatusTile `unknown` (5.35). */
98
+ statusUnknown: string;
97
99
  }
98
100
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
99
101
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -341,6 +341,7 @@ var th = {
341
341
  statusProblem: "\u0E21\u0E35\u0E1B\u0E31\u0E0D\u0E2B\u0E32",
342
342
  statusMaintenance: "\u0E1B\u0E34\u0E14\u0E1B\u0E23\u0E31\u0E1A\u0E1B\u0E23\u0E38\u0E07",
343
343
  statusOk: "\u0E1B\u0E01\u0E15\u0E34",
344
+ statusUnknown: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25",
344
345
  accepts: function(list, max) {
345
346
  return [list, max && "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19 " + max + " \u0E15\u0E48\u0E2D\u0E44\u0E1F\u0E25\u0E4C"].filter(Boolean).join(" \xB7 ");
346
347
  }
@@ -476,6 +477,7 @@ var sv = {
476
477
  statusProblem: "Problem",
477
478
  statusMaintenance: "Underh\xE5ll",
478
479
  statusOk: "OK",
480
+ statusUnknown: "Ingen data",
479
481
  accepts: function(list, max) {
480
482
  return [list, max && "h\xF6gst " + max + " per fil"].filter(Boolean).join(", ");
481
483
  }
@@ -612,6 +614,7 @@ var STRINGS = {
612
614
  statusProblem: "Problem",
613
615
  statusMaintenance: "Maintenance",
614
616
  statusOk: "OK",
617
+ statusUnknown: "No data",
615
618
  accepts: function(list, max) {
616
619
  return [list, max && "up to " + max + " each"].filter(Boolean).join(", ");
617
620
  }
@@ -1444,19 +1447,22 @@ var STATUS_ICON = {
1444
1447
  down: IconCircleAlert,
1445
1448
  problem: IconTriangleAlert,
1446
1449
  maintenance: IconWrench,
1447
- ok: IconCircleCheck
1450
+ ok: IconCircleCheck,
1451
+ unknown: IconCircleDotDashed
1448
1452
  };
1449
1453
  var STATUS_TONE = {
1450
1454
  down: "danger",
1451
1455
  problem: "warning",
1452
1456
  maintenance: "accent",
1453
- ok: "default"
1457
+ ok: "default",
1458
+ unknown: "default"
1454
1459
  };
1455
1460
  var STATUS_WORD = {
1456
1461
  down: "statusDown",
1457
1462
  problem: "statusProblem",
1458
1463
  maintenance: "statusMaintenance",
1459
- ok: "statusOk"
1464
+ ok: "statusOk",
1465
+ unknown: "statusUnknown"
1460
1466
  };
1461
1467
  function statusWord(status, t) {
1462
1468
  return String(t[STATUS_WORD[status]] || STATUS_WORD[status]);
@@ -1471,7 +1477,12 @@ function attrs(props) {
1471
1477
  }
1472
1478
  var comma = h5("span", { className: "aura-status-tile__sep" }, ",");
1473
1479
  function statusTileElement(props, ref, Link, t, titleRef) {
1474
- const status = STATUS_ICON[props.status] ? props.status : "ok";
1480
+ const status = STATUS_ICON[props.status] ? props.status : "unknown";
1481
+ if (status !== props.status)
1482
+ devWarnOnce(
1483
+ "status-tile-status-" + String(props.status),
1484
+ 'StatusTile status="' + String(props.status) + '" is not down, problem, maintenance, ok or unknown: it shows as unknown ("No data"). Map your value first.'
1485
+ );
1475
1486
  const valueTone = props.valueTone || STATUS_TONE[status];
1476
1487
  const word = props.statusLabel || statusWord(status, t);
1477
1488
  const markers = (props.markers || []).filter(Boolean);
@@ -202,7 +202,7 @@ export interface Theme {
202
202
  css(selector?: string): string;
203
203
  }
204
204
  /** A monitored thing's state on a StatusTile. */
205
- export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok";
205
+ export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok" | "unknown";
206
206
  /** A colour for a tile's value or a marker: `danger`, `warning`, `accent` (violet), `neutral` (grey) or `default`
207
207
  * (the text colour). */
208
208
  export type TileTone = "danger" | "warning" | "accent" | "neutral" | "default";
@@ -216,14 +216,15 @@ export interface StatusTileMarker {
216
216
  tone?: TileTone | undefined;
217
217
  }
218
218
  export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "style" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
219
- /** down (red), problem (amber), maintenance (violet) or ok (grey). Each has its own icon too, so colour is never the
220
- * only sign. */
219
+ /** down (red), problem (amber), maintenance (violet), ok (grey) or unknown (5.35: no data yet — a dashed circle on
220
+ * the plain surface). Each has its own icon too, so colour is never the only sign. */
221
221
  status: StatusTileStatus;
222
222
  /** The name. Wraps to two lines at most, then ends with "…"; a cut name shows in full in a tip on hover. */
223
223
  title: React$1.ReactNode;
224
224
  /** Top right, tabular figures: "12m", "99.98%", "240 ms". */
225
225
  value?: React$1.ReactNode | undefined;
226
- /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok → default). */
226
+ /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok and
227
+ * unknown → default). */
227
228
  valueTone?: TileTone | undefined;
228
229
  /** A short second line: "since 09:41", "3 of 4 checks". */
229
230
  meta?: React$1.ReactNode | undefined;
@@ -233,7 +234,7 @@ export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement
233
234
  href?: string | undefined;
234
235
  /** Your router's link (e.g. `next/link`); defaults to AuraProvider's `linkComponent`, then `<a>`. */
235
236
  linkComponent?: React$1.ElementType | undefined;
236
- /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK). */
237
+ /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK, No data). */
237
238
  statusLabel?: string | undefined;
238
239
  className?: string | undefined;
239
240
  }
@@ -380,6 +381,8 @@ export interface AuraStrings {
380
381
  statusProblem: string;
381
382
  statusMaintenance: string;
382
383
  statusOk: string;
384
+ /** StatusTile `unknown` (5.35). */
385
+ statusUnknown: string;
383
386
  }
384
387
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
385
388
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */
@@ -202,7 +202,7 @@ export interface Theme {
202
202
  css(selector?: string): string;
203
203
  }
204
204
  /** A monitored thing's state on a StatusTile. */
205
- export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok";
205
+ export type StatusTileStatus = "down" | "problem" | "maintenance" | "ok" | "unknown";
206
206
  /** A colour for a tile's value or a marker: `danger`, `warning`, `accent` (violet), `neutral` (grey) or `default`
207
207
  * (the text colour). */
208
208
  export type TileTone = "danger" | "warning" | "accent" | "neutral" | "default";
@@ -216,14 +216,15 @@ export interface StatusTileMarker {
216
216
  tone?: TileTone | undefined;
217
217
  }
218
218
  export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "style" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
219
- /** down (red), problem (amber), maintenance (violet) or ok (grey). Each has its own icon too, so colour is never the
220
- * only sign. */
219
+ /** down (red), problem (amber), maintenance (violet), ok (grey) or unknown (5.35: no data yet — a dashed circle on
220
+ * the plain surface). Each has its own icon too, so colour is never the only sign. */
221
221
  status: StatusTileStatus;
222
222
  /** The name. Wraps to two lines at most, then ends with "…"; a cut name shows in full in a tip on hover. */
223
223
  title: React$1.ReactNode;
224
224
  /** Top right, tabular figures: "12m", "99.98%", "240 ms". */
225
225
  value?: React$1.ReactNode | undefined;
226
- /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok → default). */
226
+ /** The value's colour. Default: the status's (down → danger, problem → warning, maintenance → accent, ok and
227
+ * unknown → default). */
227
228
  valueTone?: TileTone | undefined;
228
229
  /** A short second line: "since 09:41", "3 of 4 checks". */
229
230
  meta?: React$1.ReactNode | undefined;
@@ -233,7 +234,7 @@ export interface StatusTileProps extends Pick<React$1.HTMLAttributes<HTMLElement
233
234
  href?: string | undefined;
234
235
  /** Your router's link (e.g. `next/link`); defaults to AuraProvider's `linkComponent`, then `<a>`. */
235
236
  linkComponent?: React$1.ElementType | undefined;
236
- /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK). */
237
+ /** The status word read out after the title. Default: the locale's (Down, Problem, Maintenance, OK, No data). */
237
238
  statusLabel?: string | undefined;
238
239
  className?: string | undefined;
239
240
  }
@@ -380,6 +381,8 @@ export interface AuraStrings {
380
381
  statusProblem: string;
381
382
  statusMaintenance: string;
382
383
  statusOk: string;
384
+ /** StatusTile `unknown` (5.35). */
385
+ statusUnknown: string;
383
386
  }
384
387
  /** Built-in strings by locale. th and sv also ship as packs (`@jirawatpyk/aura-react/locales/th`, `/sv`, 5.9); in 6.0
385
388
  * only en stays built in and a Thai or Swedish app passes its pack to AuraProvider `strings`. */