@xeonr/platform-ui 1.3.1 → 1.4.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 (81) hide show
  1. package/dist/index.d.ts +12 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +22 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/kit/Anchored.d.ts +13 -2
  6. package/dist/kit/Anchored.d.ts.map +1 -1
  7. package/dist/kit/Anchored.js +47 -18
  8. package/dist/kit/Anchored.js.map +1 -1
  9. package/dist/kit/Badge.d.ts +1 -0
  10. package/dist/kit/Badge.d.ts.map +1 -1
  11. package/dist/kit/Badge.js +14 -0
  12. package/dist/kit/Badge.js.map +1 -1
  13. package/dist/kit/Button.d.ts +8 -2
  14. package/dist/kit/Button.d.ts.map +1 -1
  15. package/dist/kit/Button.js +17 -3
  16. package/dist/kit/Button.js.map +1 -1
  17. package/dist/kit/Chip.d.ts +6 -0
  18. package/dist/kit/Chip.d.ts.map +1 -1
  19. package/dist/kit/Chip.js +2 -1
  20. package/dist/kit/Chip.js.map +1 -1
  21. package/dist/kit/Color.d.ts +69 -0
  22. package/dist/kit/Color.d.ts.map +1 -0
  23. package/dist/kit/Color.js +150 -0
  24. package/dist/kit/Color.js.map +1 -0
  25. package/dist/kit/Combobox.d.ts +5 -1
  26. package/dist/kit/Combobox.d.ts.map +1 -1
  27. package/dist/kit/Combobox.js +39 -28
  28. package/dist/kit/Combobox.js.map +1 -1
  29. package/dist/kit/Controls.d.ts +184 -0
  30. package/dist/kit/Controls.d.ts.map +1 -0
  31. package/dist/kit/Controls.js +344 -0
  32. package/dist/kit/Controls.js.map +1 -0
  33. package/dist/kit/DatePicker.d.ts +125 -0
  34. package/dist/kit/DatePicker.d.ts.map +1 -0
  35. package/dist/kit/DatePicker.js +438 -0
  36. package/dist/kit/DatePicker.js.map +1 -0
  37. package/dist/kit/Dropzone.d.ts +41 -0
  38. package/dist/kit/Dropzone.d.ts.map +1 -0
  39. package/dist/kit/Dropzone.js +118 -0
  40. package/dist/kit/Dropzone.js.map +1 -0
  41. package/dist/kit/Form.d.ts +86 -13
  42. package/dist/kit/Form.d.ts.map +1 -1
  43. package/dist/kit/Form.js +124 -13
  44. package/dist/kit/Form.js.map +1 -1
  45. package/dist/kit/Icon.d.ts +4 -0
  46. package/dist/kit/Icon.d.ts.map +1 -1
  47. package/dist/kit/Icon.js +5 -1
  48. package/dist/kit/Icon.js.map +1 -1
  49. package/dist/kit/List.d.ts +55 -8
  50. package/dist/kit/List.d.ts.map +1 -1
  51. package/dist/kit/List.js +43 -6
  52. package/dist/kit/List.js.map +1 -1
  53. package/dist/kit/Menu.d.ts +71 -9
  54. package/dist/kit/Menu.d.ts.map +1 -1
  55. package/dist/kit/Menu.js +119 -21
  56. package/dist/kit/Menu.js.map +1 -1
  57. package/dist/kit/Modal.d.ts +37 -4
  58. package/dist/kit/Modal.d.ts.map +1 -1
  59. package/dist/kit/Modal.js +42 -14
  60. package/dist/kit/Modal.js.map +1 -1
  61. package/dist/kit/MultiCombobox.d.ts +48 -1
  62. package/dist/kit/MultiCombobox.d.ts.map +1 -1
  63. package/dist/kit/MultiCombobox.js +100 -27
  64. package/dist/kit/MultiCombobox.js.map +1 -1
  65. package/dist/kit/Picker.d.ts +6 -1
  66. package/dist/kit/Picker.d.ts.map +1 -1
  67. package/dist/kit/Picker.js +10 -5
  68. package/dist/kit/Picker.js.map +1 -1
  69. package/dist/kit/Popover.d.ts +13 -1
  70. package/dist/kit/Popover.d.ts.map +1 -1
  71. package/dist/kit/Popover.js +31 -9
  72. package/dist/kit/Popover.js.map +1 -1
  73. package/dist/kit/Skeleton.d.ts +44 -3
  74. package/dist/kit/Skeleton.d.ts.map +1 -1
  75. package/dist/kit/Skeleton.js +39 -1
  76. package/dist/kit/Skeleton.js.map +1 -1
  77. package/dist/kit/Stepper.d.ts +33 -0
  78. package/dist/kit/Stepper.d.ts.map +1 -0
  79. package/dist/kit/Stepper.js +97 -0
  80. package/dist/kit/Stepper.js.map +1 -0
  81. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0CrF,eAAO,MAAM,WAAW;;WAgBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;aAAyB,OAAO,GAAG,SAAS;YAMnE,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY;;WAIxB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAW,EAAE,IAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,+BA0C1G"}
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0CrF,eAAO,MAAM,WAAW;;WAgBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;aAAyB,OAAO,GAAG,SAAS;YAMnE,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY;;WAIxB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAW,EAAE,IAAW,EAAE,KAAK,EAAE,IAAe,EAAE,KAAe,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAiE5I"}
@@ -73,7 +73,7 @@ export const PopoverGroup = styled.div `
73
73
  border-bottom: 1px solid ${v.line};
74
74
  &:last-child { border-bottom: none; }
75
75
  `;
76
- export function Popover({ anchor, onClose, label, width = 268, flip = true, sheet, children }) {
76
+ export function Popover({ anchor, onClose, label, width = 268, flip = true, sheet, side = "bottom", align = "start", children }) {
77
77
  const ref = useRef(null);
78
78
  const [pos, setPos] = useState({ top: anchor.bottom + 4, left: anchor.left });
79
79
  // Escape closes this before any drawer or modal it sits in (CON-59)
@@ -86,16 +86,38 @@ export function Popover({ anchor, onClose, label, width = 268, flip = true, shee
86
86
  const box = ref.current?.getBoundingClientRect();
87
87
  if (!box)
88
88
  return;
89
- const left = Math.max(8, Math.min(anchor.left, window.innerWidth - box.width - 8));
89
+ const vw = window.innerWidth;
90
+ const vh = window.innerHeight;
91
+ const E = 8;
92
+ const clampX = (x) => Math.max(E, Math.min(x, vw - box.width - E));
93
+ const clampY = (y) => Math.max(E, Math.min(y, vh - box.height - E));
94
+ if (side === "right" || side === "left") {
95
+ const right = anchor.right + 4;
96
+ const left = anchor.left - box.width - 4;
97
+ const fitsRight = right + box.width <= vw - E;
98
+ const fitsLeft = left >= E;
99
+ const x = side === "right" ? (fitsRight || !flip || !fitsLeft ? right : left) : (fitsLeft || !flip || !fitsRight ? left : right);
100
+ const y = align === "end" ? anchor.bottom - box.height : align === "center" ? anchor.top + anchor.height / 2 - box.height / 2 : anchor.top;
101
+ setPos({ top: clampY(y), left: clampX(x) });
102
+ return;
103
+ }
104
+ // Kept on screen: anchored near the right edge it would otherwise hang off
105
+ // it, and near the bottom it would be cut in half.
106
+ const x = align === "end" ? anchor.right - box.width : align === "center" ? anchor.left + anchor.width / 2 - box.width / 2 : anchor.left;
107
+ const left = clampX(x);
90
108
  const below = anchor.bottom + 4;
91
- const overflows = below + box.height > window.innerHeight - 8;
92
- const top = overflows
93
- ? flip
94
- ? Math.max(8, anchor.top - box.height - 4)
95
- : Math.max(8, window.innerHeight - box.height - 8)
96
- : below;
109
+ const above = anchor.top - box.height - 4;
110
+ const fitsBelow = below + box.height <= vh - E;
111
+ const fitsAbove = above >= E;
112
+ let top;
113
+ if (side === "top") {
114
+ top = fitsAbove ? above : flip && fitsBelow ? below : flip ? Math.max(E, above) : clampY(above);
115
+ }
116
+ else {
117
+ top = fitsBelow ? below : flip ? Math.max(E, above) : clampY(below);
118
+ }
97
119
  setPos({ top, left });
98
- }, [anchor, flip]);
120
+ }, [anchor, flip, side, align]);
99
121
  useEffect(() => {
100
122
  const onDown = (e) => {
101
123
  if (!ref.current?.contains(e.target))
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"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"}
@@ -1,18 +1,59 @@
1
+ import type { CSSProperties, ReactNode } from "react";
1
2
  /** Skeleton: sits at the exact final geometry and breathes; no spinners for known shapes. */
2
3
  export declare const Skeleton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
3
- style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
4
+ style?: CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
4
5
  }, {
5
6
  $w?: string | undefined;
6
7
  $h?: string | undefined;
7
8
  $r?: string | undefined;
8
9
  }>> & string;
9
10
  export declare const SkeletonRow: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
10
- style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
11
+ style?: CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
11
12
  }> & string;
12
13
  /** Spinner: an indeterminate wait of unknown length. */
13
14
  export declare const Spinner: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
14
- style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
15
+ style?: CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
15
16
  }, {
16
17
  $size?: number | undefined;
17
18
  }>> & string;
19
+ /** what a busy region's veil is: the scrim (content shows through, blurred), the surface (lighter), or the page canvas (opaque — a frame that is not ready to show anything) */
20
+ export type BusyVeil = "scrim" | "surface" | "canvas";
21
+ /**
22
+ * BusyOverlay: the veil alone, covering its nearest positioned ancestor —
23
+ * for a host that is already `position: relative` (a preview frame, a card).
24
+ * Otherwise wrap the region in BusyRegion.
25
+ */
26
+ export declare function BusyOverlay({ label, veil, radius, inset, spinner }: {
27
+ /** what it is waiting for ("Waiting for authentication"); shown, and the accessible name */
28
+ label?: ReactNode | undefined;
29
+ veil?: BusyVeil | undefined;
30
+ /** corner radius of the veil — a CSS length, or px (default: the host's) */
31
+ radius?: string | number | undefined;
32
+ /**
33
+ * px between the veil and the host's edges (default 0). Negative overhangs
34
+ * the host — a veil that should also cover a card's padding or border.
35
+ */
36
+ inset?: number | undefined;
37
+ /** show the spinner (default true) */
38
+ spinner?: boolean | undefined;
39
+ }): import("react").JSX.Element;
40
+ /**
41
+ * BusyRegion: a region that keeps its content in place while it waits — a
42
+ * form waiting on a token, a list reloading under a filter — under a veil
43
+ * with a Spinner and a label. The content is inert while busy (no clicks, no
44
+ * focus) and the region says `aria-busy`. Not for a first load of known shape:
45
+ * that is a Skeleton.
46
+ */
47
+ export declare function BusyRegion({ busy, label, veil, radius, inset, children, style, className }: {
48
+ busy: boolean;
49
+ label?: ReactNode | undefined;
50
+ veil?: BusyVeil | undefined;
51
+ /** the veil's corner radius (see BusyOverlay; default: the region's) */
52
+ radius?: string | number | undefined;
53
+ /** px between the veil and the region's edges; negative overhangs it (see BusyOverlay) */
54
+ inset?: number | undefined;
55
+ children: ReactNode;
56
+ style?: CSSProperties | undefined;
57
+ className?: string | undefined;
58
+ }): import("react").JSX.Element;
18
59
  //# sourceMappingURL=Skeleton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"AAKA,6FAA6F;AAC7F,eAAO,MAAM,QAAQ;;;SAAsB,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;YAO9G,CAAC;AAEF,eAAO,MAAM,WAAW;;WAOvB,CAAC;AAOF,wDAAwD;AACxD,eAAO,MAAM,OAAO;;;YAAyB,MAAM,GAAG,SAAS;YAS9D,CAAC"}
1
+ {"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKtD,6FAA6F;AAC7F,eAAO,MAAM,QAAQ;;;SAAsB,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;YAO9G,CAAC;AAEF,eAAO,MAAM,WAAW;;WAOvB,CAAC;AAOF,wDAAwD;AACxD,eAAO,MAAM,OAAO;;;YAAyB,MAAM,GAAG,SAAS;YAS9D,CAAC;AAOF,gLAAgL;AAChL,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAuBtD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAc,EAAE,MAAM,EAAE,KAAS,EAAE,OAAc,EAAE,EAAE;IACxF,4FAA4F;IAC5F,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,+BAOA;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IACvG,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,+BAOA"}
@@ -1,4 +1,5 @@
1
- import styled, { keyframes } from "styled-components";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import styled, { css, keyframes } from "styled-components";
2
3
  import { v } from "../theme/tokens.js";
3
4
  const shimmer = keyframes `50% { opacity: 0.45; }`;
4
5
  /** Skeleton: sits at the exact final geometry and breathes; no spinners for known shapes. */
@@ -33,4 +34,41 @@ export const Spinner = styled.span `
33
34
  border-radius: 50%;
34
35
  animation: ${spin} 0.8s linear infinite;
35
36
  `;
37
+ const fade = keyframes `from { opacity: 0; }`;
38
+ const Veil = styled.div `
39
+ position: absolute;
40
+ inset: ${(p) => p.$inset}px;
41
+ z-index: 2;
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: center;
45
+ justify-content: center;
46
+ gap: 10px;
47
+ border-radius: ${(p) => p.$radius ?? "inherit"};
48
+ color: ${v.muted};
49
+ font-size: 12px;
50
+ text-align: center;
51
+ animation: ${fade} 0.18s ease;
52
+ ${(p) => p.$veil === "scrim" && css `background: ${v.scrim}; backdrop-filter: blur(2px); color: ${v.text};`}
53
+ ${(p) => p.$veil === "surface" && css `background: color-mix(in srgb, ${v.surface} 72%, transparent); backdrop-filter: blur(1px);`}
54
+ ${(p) => p.$veil === "canvas" && css `background: ${v.canvas};`}
55
+ `;
56
+ /**
57
+ * BusyOverlay: the veil alone, covering its nearest positioned ancestor —
58
+ * for a host that is already `position: relative` (a preview frame, a card).
59
+ * Otherwise wrap the region in BusyRegion.
60
+ */
61
+ export function BusyOverlay({ label, veil = "scrim", radius, inset = 0, spinner = true }) {
62
+ return (_jsxs(Veil, { "$veil": veil, "$radius": typeof radius === "number" ? `${radius}px` : radius, "$inset": inset, role: "status", "aria-live": "polite", children: [spinner ? _jsx(Spinner, { "aria-hidden": true }) : null, label ? _jsx("span", { children: label }) : _jsx("span", { style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clip: "rect(0 0 0 0)" }, children: "Loading" })] }));
63
+ }
64
+ /**
65
+ * BusyRegion: a region that keeps its content in place while it waits — a
66
+ * form waiting on a token, a list reloading under a filter — under a veil
67
+ * with a Spinner and a label. The content is inert while busy (no clicks, no
68
+ * focus) and the region says `aria-busy`. Not for a first load of known shape:
69
+ * that is a Skeleton.
70
+ */
71
+ export function BusyRegion({ busy, label, veil = "surface", radius, inset, children, style, className }) {
72
+ return (_jsxs("div", { style: { position: "relative", minWidth: 0, ...style }, className: className, "aria-busy": busy || undefined, children: [_jsx("div", { inert: busy || undefined, style: { display: "contents" }, children: children }), busy ? _jsx(BusyOverlay, { label: label, veil: veil, radius: radius, inset: inset }) : null] }));
73
+ }
36
74
  //# sourceMappingURL=Skeleton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Skeleton.js","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,MAAM,OAAO,GAAG,SAAS,CAAA,wBAAwB,CAAC;AAElD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAA+E;;WAEvG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM;YACpB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM;mBACd,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK;gBACvB,CAAC,CAAC,KAAK;eACR,OAAO;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;6BAKR,CAAC,CAAC,IAAI;;CAElC,CAAC;AAEF,6EAA6E;AAC7E,+EAA+E;AAC/E,iEAAiE;AACjE,MAAM,IAAI,GAAG,SAAS,CAAA,mCAAmC,CAAC;AAE1D,wDAAwD;AACxD,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAgC;;;WAGvD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;YACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;sBACV,CAAC,CAAC,KAAK;sBACP,CAAC,CAAC,KAAK;;eAEd,IAAI;CAClB,CAAC"}
1
+ {"version":3,"file":"Skeleton.js","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ReactNode } from "react";
2
+ export type StepState = "done" | "current" | "pending" | "error";
3
+ export interface StepperStep {
4
+ id: string;
5
+ title: ReactNode;
6
+ /** a line under the title — what the step asks for */
7
+ description?: ReactNode | undefined;
8
+ /** override the state the position implies — `error` for a step whose fields are refused */
9
+ state?: StepState | undefined;
10
+ /** cannot be clicked to, even with `onStep` */
11
+ disabled?: boolean | undefined;
12
+ }
13
+ /**
14
+ * Stepper: where you are in an ordered sequence of steps — done, current,
15
+ * still to come — with titles and an optional line each. With `onStep`, a
16
+ * step is a button that goes back to it (any step not `disabled`; disable the
17
+ * ones ahead that the current step must be completed to reach). Without it,
18
+ * the strip is a read-only indicator. `orientation="vertical"` for a rail
19
+ * beside a long form. The current step carries `aria-current="step"`.
20
+ */
21
+ export declare function Stepper({ steps, current, onStep, orientation, label, numbered }: {
22
+ steps: StepperStep[];
23
+ /** the current step's id */
24
+ current: string;
25
+ /** a step was clicked; omit for a read-only strip */
26
+ onStep?: ((id: string) => void) | undefined;
27
+ orientation?: "horizontal" | "vertical" | undefined;
28
+ /** accessible name of the list (default "Progress") */
29
+ label?: string | undefined;
30
+ /** show the step's number in its marker (default true); done steps show a tick either way */
31
+ numbered?: boolean | undefined;
32
+ }): import("react").JSX.Element;
33
+ //# sourceMappingURL=Stepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper.d.ts","sourceRoot":"","sources":["../../src/kit/Stepper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,sDAAsD;IACtD,WAAW,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,4FAA4F;IAC5F,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AA+ED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAA0B,EAAE,KAAkB,EAAE,QAAe,EAAE,EAAE;IACnH,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IACpD,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC,+BAiCA"}
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import styled, { css } from "styled-components";
3
+ import { v } from "../theme/tokens.js";
4
+ import { Icon } from "./Icon.js";
5
+ const Strip = styled.ol `
6
+ list-style: none;
7
+ margin: 0;
8
+ padding: 0;
9
+ display: flex;
10
+ flex-direction: ${(p) => (p.$vertical ? "column" : "row")};
11
+ gap: ${(p) => (p.$vertical ? "4px" : "0")};
12
+ min-width: 0;
13
+ `;
14
+ const Item = styled.li `
15
+ position: relative;
16
+ flex: ${(p) => (p.$vertical ? "none" : "1 1 0")};
17
+ min-width: 0;
18
+ display: flex;
19
+ align-items: flex-start;
20
+ /* the connector to the next step */
21
+ ${(p) => !p.$vertical &&
22
+ css `
23
+ &:not(:last-child)::after {
24
+ content: "";
25
+ flex: 1 1 auto;
26
+ height: 2px;
27
+ min-width: 16px;
28
+ margin: 13px 10px 0;
29
+ border-radius: 2px;
30
+ background: ${p.$state === "done" ? v.brand55 : v.line2};
31
+ }
32
+ `}
33
+ `;
34
+ const Btn = styled.button `
35
+ display: flex;
36
+ align-items: flex-start;
37
+ gap: 10px;
38
+ min-width: 0;
39
+ padding: 2px 4px 2px 2px;
40
+ border-radius: ${v.rCtl};
41
+ text-align: left;
42
+ cursor: ${(p) => (p.$clickable ? "pointer" : "default")};
43
+ ${(p) => p.$clickable && css `&:hover .t { color: ${v.text}; } &:hover .n { border-color: ${v.brand55}; }`}
44
+
45
+ .n {
46
+ flex: none;
47
+ width: 26px;
48
+ height: 26px;
49
+ border-radius: 50%;
50
+ display: grid;
51
+ place-items: center;
52
+ font-size: 12px;
53
+ font-weight: 600;
54
+ font-variant-numeric: tabular-nums;
55
+ border: 1.5px solid ${v.line2};
56
+ color: ${v.muted};
57
+ background: ${v.surface};
58
+ transition: border-color 0.14s ease, background 0.14s ease;
59
+ svg { font-size: 11px; }
60
+ }
61
+ .txt { min-width: 0; padding-top: 3px; }
62
+ .t { display: block; font-size: 12.5px; font-weight: 600; color: ${v.muted}; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
63
+ .d { display: block; margin-top: 1px; font-size: 11px; color: ${v.faint}; line-height: 1.4; }
64
+
65
+ ${(p) => p.$state === "current" && css `
66
+ .n { border-color: transparent; background: ${v.grad}; color: ${v.onBrand}; }
67
+ .t { color: ${v.text}; }
68
+ `}
69
+ ${(p) => p.$state === "done" && css `
70
+ .n { border-color: ${v.brand55}; background: ${v.brand12}; color: ${v.brand}; }
71
+ .t { color: ${v.text}; }
72
+ `}
73
+ ${(p) => p.$state === "error" && css `
74
+ .n { border-color: ${v.danger}; background: ${v.dangerBg}; color: ${v.danger}; }
75
+ .t { color: ${v.danger}; }
76
+ `}
77
+ `;
78
+ /**
79
+ * Stepper: where you are in an ordered sequence of steps — done, current,
80
+ * still to come — with titles and an optional line each. With `onStep`, a
81
+ * step is a button that goes back to it (any step not `disabled`; disable the
82
+ * ones ahead that the current step must be completed to reach). Without it,
83
+ * the strip is a read-only indicator. `orientation="vertical"` for a rail
84
+ * beside a long form. The current step carries `aria-current="step"`.
85
+ */
86
+ export function Stepper({ steps, current, onStep, orientation = "horizontal", label = "Progress", numbered = true }) {
87
+ const at = Math.max(0, steps.findIndex((s) => s.id === current));
88
+ const vertical = orientation === "vertical";
89
+ return (_jsx(Strip, { "aria-label": label, "$vertical": vertical, children: steps.map((s, i) => {
90
+ const state = s.state ?? (i < at ? "done" : i === at ? "current" : "pending");
91
+ const clickable = !!onStep && !s.disabled && i !== at;
92
+ return (_jsx(Item, { "$vertical": vertical, "$state": state, children: _jsxs(Btn
93
+ // a step that cannot be gone to is not a button at all
94
+ , { ...(clickable ? { type: "button", onClick: () => onStep(s.id) } : { as: "div" }), "$state": state, "$clickable": clickable, "aria-current": i === at ? "step" : undefined, children: [_jsx("span", { className: "n", "aria-hidden": true, children: state === "done" ? _jsx(Icon, { name: "check" }) : state === "error" ? _jsx(Icon, { name: "warn" }) : numbered ? i + 1 : null }), _jsxs("span", { className: "txt", children: [_jsx("span", { className: "t", children: s.title }), s.description ? _jsx("span", { className: "d", children: s.description }) : null] }), _jsx("span", { style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clip: "rect(0 0 0 0)" }, children: state === "done" ? " (done)" : state === "error" ? " (has errors)" : "" })] }) }, s.id));
95
+ }) }));
96
+ }
97
+ //# sourceMappingURL=Stepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper.js","sourceRoot":"","sources":["../../src/kit/Stepper.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xeonr/platform-ui",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Xeonr Platform Suite design language: the --x-* token sheet, theme provider and kit shared by every Xeonr console.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",