feat(admin): modernize tenant admin PWA with cockpit layout and slate theme

- Replaced rainbow grid with phase-aware cockpit layout
- Implemented smart lifecycle hero with readiness logic
- Introduced dark command bar header with context pill and search placeholder
- Updated global Tamagui theme to slate/indigo palette
- Refined bottom navigation with minimalist spotlight style
This commit is contained in:
Codex Agent
2026-01-17 14:46:19 +01:00
parent d6ee372671
commit 323ddea72d
12 changed files with 17652 additions and 48608 deletions

View File

@@ -5152,7 +5152,7 @@ var require_useMergeRefs = __commonJS({
}
return React83.useMemo(
() => (0, _mergeRefs.default)(...args),
// eslint-disable-next-line
[...args]
);
}
@@ -12243,7 +12243,7 @@ var require_useMergeRefs2 = __commonJS({
}
},
[...refs]
// eslint-disable-line react-hooks/exhaustive-deps
);
}
__name(useMergeRefs, "useMergeRefs");
@@ -12938,7 +12938,7 @@ var require_VirtualizedSectionList = __commonJS({
}
};
this._renderItem = (listItemCount) => (
// eslint-disable-next-line react/no-unstable-nested-components
(_ref2) => {
var item = _ref2.item, index5 = _ref2.index;
var info = this._subExtractor(index5);
@@ -30935,17 +30935,17 @@ function useInteractions(propsList) {
const itemDeps = propsList.map((key) => key == null ? void 0 : key.item);
const getReferenceProps = React51.useCallback(
(userProps) => mergeProps(userProps, propsList, "reference"),
// eslint-disable-next-line react-hooks/exhaustive-deps
referenceDeps
);
const getFloatingProps = React51.useCallback(
(userProps) => mergeProps(userProps, propsList, "floating"),
// eslint-disable-next-line react-hooks/exhaustive-deps
floatingDeps
);
const getItemProps = React51.useCallback(
(userProps) => mergeProps(userProps, propsList, "item"),
// eslint-disable-next-line react-hooks/exhaustive-deps
itemDeps
);
return React51.useMemo(() => ({
@@ -33866,7 +33866,7 @@ function FloatingFocusManager(props) {
queueMicrotask(() => {
const tabbableReturnElement = getFirstTabbableElement(returnElement);
if (
// eslint-disable-next-line react-hooks/exhaustive-deps
returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(tabbableReturnElement) && // If the focus moved somewhere else after mount, avoid returning focus
// since it likely entered a different element which should be
// respected: https://github.com/floating-ui/floating-ui/issues/2607
@@ -34615,17 +34615,17 @@ function useInteractions2(propsList) {
const itemDeps = propsList.map((key) => key == null ? void 0 : key.item);
const getReferenceProps = React60.useCallback(
(userProps) => mergeProps2(userProps, propsList, "reference"),
// eslint-disable-next-line react-hooks/exhaustive-deps
referenceDeps
);
const getFloatingProps = React60.useCallback(
(userProps) => mergeProps2(userProps, propsList, "floating"),
// eslint-disable-next-line react-hooks/exhaustive-deps
floatingDeps
);
const getItemProps = React60.useCallback(
(userProps) => mergeProps2(userProps, propsList, "item"),
// eslint-disable-next-line react-hooks/exhaustive-deps
itemDeps
);
return React60.useMemo(() => ({
@@ -39482,17 +39482,17 @@ function useInteractions3(propsList) {
const itemDeps = propsList.map((key) => key == null ? void 0 : key.item);
const getReferenceProps = React76.useCallback(
(userProps) => mergeProps3(userProps, propsList, "reference"),
// eslint-disable-next-line react-hooks/exhaustive-deps
referenceDeps
);
const getFloatingProps = React76.useCallback(
(userProps) => mergeProps3(userProps, propsList, "floating"),
// eslint-disable-next-line react-hooks/exhaustive-deps
floatingDeps
);
const getItemProps = React76.useCallback(
(userProps) => mergeProps3(userProps, propsList, "item"),
// eslint-disable-next-line react-hooks/exhaustive-deps
itemDeps
);
return React76.useMemo(() => ({

View File

@@ -4160,27 +4160,33 @@ var tokens3 = {
...tokens2,
color: {
...tokens2.color,
primary: "#FF5C5C",
accent: "#3D5AFE",
accentSoft: "#E8ECFF",
success: "#22C55E",
warning: "#FBBF24",
primary: "#4F46E5",
// Indigo 600
accent: "#F43F5E",
// Rose 500
accentSoft: "#E0E7FF",
// Indigo 100
success: "#10B981",
// Emerald 500
warning: "#F59E0B",
// Amber 500
danger: "#EF4444",
// Red 500
surface: "#ffffff",
muted: "#FFF6F0",
border: "#F3D6C9",
text: "#0B132B"
muted: "#F8FAFC",
// Slate 50
border: "#E2E8F0",
// Slate 200
text: "#0F172A"
// Slate 900
},
radius: {
...tokens2.radius,
card: 20,
// ... existing radius tokens ...
card: 16,
tile: 14,
pill: 999
},
size: {
...tokens2.size,
card: 20
}
// ...
};
var themes3 = {
...themes2,
@@ -4188,27 +4194,30 @@ var themes3 = {
...themes2.light,
primary: tokens3.color.primary,
accent: tokens3.color.accent,
background: "#FFF1E8",
backgroundHover: "#FFE8DD",
backgroundPress: "#FFE1D2",
background: "#F1F5F9",
// Slate 100
backgroundHover: "#E2E8F0",
backgroundPress: "#CBD5E1",
backgroundStrong: tokens3.color.surface,
backgroundTransparent: "rgba(255, 241, 232, 0)",
backgroundTransparent: "rgba(241, 245, 249, 0)",
color: tokens3.color.text,
colorHover: "#091024",
colorPress: "#091024",
colorFocus: "#091024",
colorHover: "#1E293B",
colorPress: "#1E293B",
colorFocus: "#1E293B",
borderColor: tokens3.color.border,
borderColorHover: "#EBCABA",
borderColorPress: "#E1BFAE",
shadowColor: "rgba(11, 19, 43, 0.16)",
shadowColorPress: "rgba(11, 19, 43, 0.2)",
shadowColorFocus: "rgba(11, 19, 43, 0.24)",
borderColorHover: "#CBD5E1",
borderColorPress: "#94A3B8",
shadowColor: "rgba(15, 23, 42, 0.08)",
shadowColorPress: "rgba(15, 23, 42, 0.12)",
shadowColorFocus: "rgba(15, 23, 42, 0.12)",
surface: tokens3.color.surface,
muted: tokens3.color.muted,
blue3: tokens3.color.accentSoft,
blue6: tokens3.color.accent,
blue6: "#6366F1",
// Indigo 500
blue10: tokens3.color.primary,
blue11: "#1E36F1"
blue11: "#4338CA"
// Indigo 700
},
dark: {
...themes2.dark,

File diff suppressed because it is too large Load Diff