@idosgames/react 0.5.2 → 0.6.1

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.
@@ -62,16 +62,30 @@ interface UiThemeConfig {
62
62
  blueDeep: string;
63
63
  red: string;
64
64
  redDeep: string;
65
+ purple: string;
66
+ purpleDeep: string;
67
+ orange: string;
68
+ orangeDeep: string;
69
+ teal: string;
70
+ tealDeep: string;
65
71
  shadow: string;
66
72
  /** Dim of the screen behind a popup. */
67
73
  backdrop: string;
74
+ /** The dark outline drawn around everything — buttons, panels, counters, the letters. */
75
+ ink: string;
76
+ /** The bottom menu bar. */
77
+ nav: string;
78
+ /** Thickness of that outline around buttons and panels, px. */
79
+ outline: number;
68
80
  /** Text colour on a filled button of each tone. */
69
81
  onGreen: string;
70
82
  onGold: string;
71
83
  onBlue: string;
72
84
  onRed: string;
73
- /** `text-shadow` of text on screens and panels: the casual dark outline on light text, none on dark. */
85
+ /** `text-shadow` of text on screens and panels: the casual dark drop on light text, none on dark. */
74
86
  textOutline: string;
87
+ /** `-webkit-text-stroke` of that text: the ink outline of the letters on light text, none on dark. */
88
+ textStroke: string;
75
89
  /** Thin line/border on a panel (dividers, outlines of chips). */
76
90
  line: string;
77
91
  /** Recessed background of counters, round icon buttons. */
@@ -134,7 +148,10 @@ type UiKitConfigInput = {
134
148
  };
135
149
  /** Typed helper for `src/ui.config.ts`: `export default defineUiConfig({ … })`. */
136
150
  declare function defineUiConfig(config: UiKitConfigInput): UiKitConfigInput;
137
- /** The default look: the casual mobile-game style of the Board Survival Unity project. */
151
+ /** The default ink: the near-black navy outline of the casual look. */
152
+ declare const INK = "#17193a";
153
+ /** The default look: Layer Lab "Vertical Casual" — bright blue-violet screens, chunky glossy plates
154
+ * with a heavy ink outline and a darker bottom lip, white letters outlined in ink (owner, 2026-10-22). */
138
155
  declare const DEFAULT_UI_CONFIG: UiKitConfig;
139
156
  /**
140
157
  * Defaults ← project config, field by field. Out-of-range numbers are clamped (speed 0.1..5,
@@ -336,6 +353,8 @@ declare function canAfford(price: ResourceLine[], balances: Record<string, {
336
353
  cryptoBalances?: Record<string, {
337
354
  Amount?: number | string;
338
355
  } | null | undefined> | null): boolean;
356
+ /** Amount of a resource line as text: "$5" for a crypto price in USD, else {@link formatAmount}. */
357
+ declare function formatLineAmount(line: ResourceLine): string;
339
358
  /** 1234 → "1 234", 1_250_000 → "1.25M" — balances must fit a chip. */
340
359
  declare function formatAmount(value: number): string;
341
360
  /**
@@ -606,10 +625,13 @@ declare function UiKitProvider({ config: input, children, overlays, notification
606
625
 
607
626
  declare function renderKitOverlays(state: KitOverlayState): ReactNode;
608
627
 
609
- declare const GLYPHS: readonly ["coin", "gem", "potion", "scroll", "sword", "shield", "crown", "gift", "bag", "box", "trophy", "calendar", "star", "check", "lock", "shop", "chest", "quest", "user", "logout", "copy", "hero", "hammer", "market", "flame", "ticket", "friends", "chat", "link", "swords", "gear", "globe", "sound", "mute", "bell", "bulb", "menu", "close", "back", "plus", "energy", "heart", "offer", "clock", "trash", "edit"];
628
+ declare const GLYPHS: readonly ["coin", "gem", "potion", "scroll", "sword", "shield", "crown", "gift", "bag", "box", "trophy", "calendar", "star", "check", "lock", "shop", "chest", "quest", "user", "logout", "copy", "hero", "hammer", "market", "flame", "ticket", "friends", "chat", "link", "swords", "gear", "globe", "sound", "mute", "bell", "bulb", "menu", "close", "back", "plus", "energy", "heart", "offer", "clock", "trash", "edit", "home", "mail", "megaphone", "rune", "clapper", "info", "settings"];
610
629
  type Glyph = (typeof GLYPHS)[number];
611
630
  declare function isGlyph(value: string): value is Glyph;
612
- /** Glyph for a currency id: gems for "premium-looking" ids, energy for dice/energy, coins for the rest. */
631
+ /**
632
+ * Glyph for a currency id: gems for "premium-looking" ids, energy for dice/energy, a potion for
633
+ * potions, a ticket for tickets and keys, a star for experience, coins for the rest.
634
+ */
613
635
  declare function currencyGlyph(currencyID: string): Glyph;
614
636
  /** Glyph for an item by its tags or class (first known wins), else a box. */
615
637
  declare function itemGlyph(tags: readonly string[] | null | undefined, itemClass?: string | null,
@@ -624,11 +646,18 @@ declare function Icon({ glyph: requested, size, color, fallback, }: {
624
646
  fallback?: Glyph;
625
647
  }): ReactNode;
626
648
 
627
- type ButtonTone = "green" | "gold" | "blue" | "red" | "grey";
649
+ /**
650
+ * The colours of buttons and filled surfaces — the eleven plates of the casual sheet. `grey` is the
651
+ * violet-grey of "Cancel" and of a disabled button, `silver` the neutral grey, `slate` the dark plate
652
+ * of close / back / menu buttons, `white` the white plate with blue letters.
653
+ */
654
+ type ButtonTone = "green" | "gold" | "blue" | "red" | "grey" | "purple" | "orange" | "teal" | "white" | "silver" | "slate";
655
+ declare const TONES: Record<ButtonTone, [string, string]>;
628
656
  /** Text colour and its outline on a filled surface of each tone (theme tokens `onGreen`, …). */
629
657
  declare const ON_TONE: Record<ButtonTone, {
630
658
  color: string;
631
659
  textShadow: string;
660
+ WebkitTextStroke: string;
632
661
  }>;
633
662
  /**
634
663
  * A surface filled with a tone of the theme (a hero banner, "your row", a highlighted day). Inside it
@@ -637,6 +666,8 @@ declare const ON_TONE: Record<ButtonTone, {
637
666
  * saturated tone, dark ink on a pastel one. Never hard-code a banner colour in a module: pick a tone.
638
667
  */
639
668
  declare function toneSurface(tone: ButtonTone): CSSProperties;
669
+ /** The glossy plate of a tone with the ink frame — a button, a coloured card, a chip. */
670
+ declare function tonePlate(tone: ButtonTone): CSSProperties;
640
671
  declare function buttonStyle(tone: ButtonTone, disabled?: boolean, size?: "sm" | "md" | "lg"): CSSProperties;
641
672
  interface ButtonProps {
642
673
  children: ReactNode;
@@ -655,7 +686,7 @@ interface ButtonProps {
655
686
  "data-tutorial-anchor"?: string;
656
687
  }
657
688
  declare function Button({ children, onClick, tone, size, disabled, busy, attract, style, className, sound, title, ...rest }: ButtonProps): ReactNode;
658
- /** Round icon button (close, back, menu). */
689
+ /** Square icon button with rounded corners (close, back, menu) — the dark slate plate by default. */
659
690
  declare function IconButton({ glyph, onClick, label, size, tone, style, badge, }: {
660
691
  glyph: Glyph | string;
661
692
  onClick: () => void;
@@ -668,7 +699,7 @@ declare function IconButton({ glyph, onClick, label, size, tone, style, badge, }
668
699
  declare function Spinner({ size }: {
669
700
  size?: number;
670
701
  }): ReactNode;
671
- /** Red "N" on a button — something to claim (Unity ButtonAlertBadge). Hidden at 0. */
702
+ /** Red "N" square on a button — something to claim. Hidden at 0. */
672
703
  declare function Badge({ count, dot, style, }: {
673
704
  count: number;
674
705
  dot?: boolean;
@@ -704,7 +735,9 @@ declare function ResourceCounter({ currencyID, amount, size, onClick, }: {
704
735
  size?: number;
705
736
  onClick?: () => void;
706
737
  }): ReactNode;
707
- /** Item tile: rarity frame, icon, count badge, optional level. */
738
+ /** The card of a rarity colour: a glossy plate of that colour in the ink frame (shop and reward cards). */
739
+ declare function rarityPlate(color: string): CSSProperties;
740
+ /** Item tile: a plate of its rarity colour, icon, count, optional level. */
708
741
  declare function ItemTile({ itemID, count, level, onClick, size, selected, dim, }: {
709
742
  itemID: string;
710
743
  count?: number;
@@ -714,17 +747,22 @@ declare function ItemTile({ itemID, count, level, onClick, size, selected, dim,
714
747
  selected?: boolean;
715
748
  dim?: boolean;
716
749
  }): ReactNode;
717
- /** Rounded progress bar with the value written on it; the fill slides when the value changes. */
750
+ /**
751
+ * The casual bar: a dark track in the ink frame, a glossy fill of the tone, the value written over
752
+ * it in outlined letters; the fill slides when the value changes.
753
+ */
718
754
  declare function ProgressBar({ value, max, tone, label, height, }: {
719
755
  value: number;
720
756
  max: number;
721
- tone?: "green" | "gold" | "blue";
757
+ tone?: ButtonTone;
722
758
  label?: string;
723
759
  height?: number;
724
760
  }): ReactNode;
725
- declare function SectionTitle({ children, right, }: {
761
+ /** A section's banner — a ribbon of the tone with a swallowtail end — and actions on its right. */
762
+ declare function SectionTitle({ children, right, tone, }: {
726
763
  children: ReactNode;
727
764
  right?: ReactNode;
765
+ tone?: ButtonTone;
728
766
  }): ReactNode;
729
767
  declare function EmptyState({ glyph, text, action, }: {
730
768
  glyph: Glyph | string;
@@ -747,7 +785,11 @@ interface TabItem<T extends string> {
747
785
  glyph?: Glyph | string;
748
786
  badge?: number;
749
787
  }
750
- /** Segmented tabs (sections of one screen). Scrolls sideways when they do not fit. */
788
+ /**
789
+ * Segmented tabs (sections of one screen), as the sheet's "Daily | Challenge": one strip in the ink
790
+ * frame, the active segment white with blue letters and a light-blue underline, the rest blue.
791
+ * Up to four share the width equally and wrap a long name; more scroll sideways.
792
+ */
751
793
  declare function Tabs<T extends string>({ tabs, value, onChange, style, }: {
752
794
  tabs: TabItem<T>[];
753
795
  value: T;
@@ -849,10 +891,17 @@ declare const EN: {
849
891
  readonly cryptoBacked: "Crypto";
850
892
  readonly cryptoUnbacked: "IOU (not backed yet)";
851
893
  readonly cryptoIouHint: "IOUs spend in the app like crypto; the developer backs them with real crypto later.";
894
+ readonly soldOut: "Sold out";
895
+ readonly on: "On";
896
+ readonly off: "Off";
897
+ readonly level: "Level";
898
+ readonly info: "Info";
899
+ readonly locked: "Locked";
900
+ readonly skip: "Skip";
852
901
  };
853
902
  type UiStringKey = keyof typeof EN;
854
903
  /** Strings of the kit itself. */
855
- declare const uiT: (key: "close" | "claim" | "error" | "events" | "cancel" | "offline" | "other" | "back" | "confirm" | "youGot" | "great" | "loading" | "ok" | "loadingNamed" | "stillLoading" | "retry" | "notEnough" | "dailyLimitReached" | "more" | "menu" | "nothingHere" | "economy" | "social" | "profile" | "free" | "claimAll" | "rewards" | "premium" | "tokenEvent" | "tokenSeason" | "tokenQuest" | "tokenScore" | "cryptoTotal" | "cryptoBacked" | "cryptoUnbacked" | "cryptoIouHint") => string;
904
+ declare const uiT: (key: "close" | "claim" | "error" | "events" | "on" | "info" | "cancel" | "offline" | "other" | "back" | "confirm" | "youGot" | "great" | "loading" | "ok" | "loadingNamed" | "stillLoading" | "retry" | "notEnough" | "dailyLimitReached" | "more" | "menu" | "nothingHere" | "economy" | "social" | "profile" | "free" | "claimAll" | "rewards" | "premium" | "tokenEvent" | "tokenSeason" | "tokenQuest" | "tokenScore" | "cryptoTotal" | "cryptoBacked" | "cryptoUnbacked" | "cryptoIouHint" | "soldOut" | "off" | "level" | "locked" | "skip") => string;
856
905
  /** Turns a server error into words the player understands; long texts are cut. */
857
906
  declare function errorText(error: string | null | undefined): string;
858
907
 
@@ -882,8 +931,18 @@ declare const v: {
882
931
  readonly blueDeep: "var(--idos-ui-blue-deep)";
883
932
  readonly red: "var(--idos-ui-red)";
884
933
  readonly redDeep: "var(--idos-ui-red-deep)";
934
+ readonly purple: "var(--idos-ui-purple)";
935
+ readonly purpleDeep: "var(--idos-ui-purple-deep)";
936
+ readonly orange: "var(--idos-ui-orange)";
937
+ readonly orangeDeep: "var(--idos-ui-orange-deep)";
938
+ readonly teal: "var(--idos-ui-teal)";
939
+ readonly tealDeep: "var(--idos-ui-teal-deep)";
885
940
  readonly shadow: "var(--idos-ui-shadow)";
886
941
  readonly backdrop: "var(--idos-ui-backdrop)";
942
+ readonly ink: "var(--idos-ui-ink)";
943
+ readonly nav: "var(--idos-ui-nav)";
944
+ /** Thickness of the ink outline, as a CSS length. */
945
+ readonly outline: "var(--idos-ui-outline)";
887
946
  readonly onGreen: "var(--idos-ui-on-green)";
888
947
  readonly onGold: "var(--idos-ui-on-gold)";
889
948
  readonly onBlue: "var(--idos-ui-on-blue)";
@@ -892,7 +951,15 @@ declare const v: {
892
951
  readonly onGoldOutline: "var(--idos-ui-on-gold-outline)";
893
952
  readonly onBlueOutline: "var(--idos-ui-on-blue-outline)";
894
953
  readonly onRedOutline: "var(--idos-ui-on-red-outline)";
954
+ readonly onGreenStroke: "var(--idos-ui-on-green-stroke)";
955
+ readonly onGoldStroke: "var(--idos-ui-on-gold-stroke)";
956
+ readonly onBlueStroke: "var(--idos-ui-on-blue-stroke)";
957
+ readonly onRedStroke: "var(--idos-ui-on-red-stroke)";
958
+ /** The ink drop and stroke of white letters, whatever the theme's text is. */
959
+ readonly inkOutline: "var(--idos-ui-ink-outline)";
960
+ readonly inkStroke: "var(--idos-ui-ink-stroke)";
895
961
  readonly textOutline: "var(--idos-ui-text-outline)";
962
+ readonly textStroke: "var(--idos-ui-text-stroke)";
896
963
  readonly line: "var(--idos-ui-line)";
897
964
  readonly well: "var(--idos-ui-well)";
898
965
  readonly wellSoft: "var(--idos-ui-well-soft)";
@@ -913,11 +980,34 @@ declare const v: {
913
980
  * light theme's dark letters never get a dark double.
914
981
  */
915
982
  declare const outlined: CSSProperties;
916
- /** The glossy card every panel uses. */
983
+ /** White letters with the ink outline on ANY background (a coloured plate, art) — whatever the theme's text. */
984
+ declare const inked: CSSProperties;
985
+ /** The heavy ink frame of buttons, plates and counters. */
986
+ declare const inkFrame: string;
987
+ /**
988
+ * A glossy plate of one colour, the look of every button and coloured card: a lighter top, the colour,
989
+ * the deep shade at the bottom with a darker inner lip, the ink frame, a short drop.
990
+ */
991
+ declare function plate(top: string, deep: string): CSSProperties;
992
+ /** The card every panel uses: the theme's blue body, the ink frame, a lighter top edge. */
917
993
  declare const panel: CSSProperties;
918
- /** Full-screen background of a screen. */
994
+ /**
995
+ * A row of a list on a panel (letters, friends, ranks): a strip a shade deeper than the panel with a
996
+ * soft top light and a bottom shade — no frame of its own, the panel's frame holds the list.
997
+ */
998
+ declare const listRow: CSSProperties;
999
+ /**
1000
+ * The casual background pattern as one background layer: semi-transparent white gear (swords,
1001
+ * shields, potions, gems, crowns…) on a 240px square tile, so moving it by whole tiles loops without
1002
+ * a seam (`idos-screen` / `.idos-pattern` move it by one).
1003
+ */
1004
+ declare const GEAR_PATTERN: string;
1005
+ /**
1006
+ * Full-screen background of a screen: the gear pattern over the theme's glow and gradient. Give the
1007
+ * element `className="idos-screen"` and the pattern drifts (it stays still when motion is off).
1008
+ */
919
1009
  declare const screenBackground: string;
920
- /** A recessed chip/slot (balances, round icon buttons). */
1010
+ /** A recessed dark plate (balances, counters, bar tracks). */
921
1011
  declare const well: CSSProperties;
922
1012
  /** Easing with an overshoot — the "pop" of casual games. */
923
1013
  declare const EASE_POP = "cubic-bezier(.2, .9, .3, 1.25)";
@@ -927,7 +1017,7 @@ declare const EASE_IN = "cubic-bezier(.5, 0, .75, .2)";
927
1017
  * Keyframes and the few class-based effects inline styles cannot express. Overshoots are written as
928
1018
  * `calc(1 + X * var(--idos-ui-k))`, so `motion.intensity` 0 flattens them and 2 doubles them.
929
1019
  */
930
- declare const KIT_CSS = "\n@keyframes idos-pop-in { 0% { transform: scale(.7); opacity: 0 } 65% { transform: scale(calc(1 + .06 * var(--idos-ui-k, 1))); opacity: 1 } 100% { transform: scale(1); opacity: 1 } }\n@keyframes idos-pop-out { 0% { transform: scale(1); opacity: 1 } 30% { transform: scale(calc(1 + .03 * var(--idos-ui-k, 1))) } 100% { transform: scale(.75); opacity: 0 } }\n@keyframes idos-fade-in { from { opacity: 0 } to { opacity: 1 } }\n.idos-select option { background: var(--idos-ui-panel-deep); color: var(--idos-ui-text) }\n@keyframes idos-fade-out { from { opacity: 1 } to { opacity: 0 } }\n@keyframes idos-rise-in { from { transform: translateY(14px); opacity: 0 } to { transform: none; opacity: 1 } }\n@keyframes idos-drop-in { 0% { transform: translateY(-16px) scale(.97); opacity: 0 } 70% { transform: translateY(calc(2px * var(--idos-ui-k, 1))); opacity: 1 } 100% { transform: none; opacity: 1 } }\n@keyframes idos-drop-out { from { transform: none; opacity: 1 } to { transform: translateY(-10px) scale(.97); opacity: 0 } }\n@keyframes idos-timer { from { transform: scaleX(1) } to { transform: scaleX(0) } }\n@keyframes idos-sheet-in { 0% { transform: translateY(100%) } 75% { transform: translateY(calc(-2% * var(--idos-ui-k, 1))) } 100% { transform: none } }\n@keyframes idos-sheet-out { from { transform: none } to { transform: translateY(100%) } }\n@keyframes idos-window-in { from { transform: translateY(24px) scale(.98); opacity: 0 } to { transform: none; opacity: 1 } }\n@keyframes idos-window-out { from { transform: none; opacity: 1 } to { transform: translateY(24px) scale(.98); opacity: 0 } }\n@keyframes idos-bounce { 0%, 100% { transform: translateY(0) rotate(0) } 50% { transform: translateY(calc(-1px * var(--idos-float-amp, 5) * var(--idos-ui-k, 1))) rotate(calc(1deg * var(--idos-float-tilt, 0) * var(--idos-ui-k, 1))) } }\n@keyframes idos-shine { 0% { transform: translateX(-120%) skewX(-20deg) } 60%, 100% { transform: translateX(220%) skewX(-20deg) } }\n@keyframes idos-spin { to { transform: rotate(360deg) } }\n@keyframes idos-glow { 0%, 100% { box-shadow: 0 0 0 0 transparent } 50% { box-shadow: 0 0 18px 4px color-mix(in srgb, var(--idos-ui-gold) 55%, transparent) } }\n@keyframes idos-pulse { 0%, 100% { transform: scale(1) } 50% { transform: scale(calc(1 + .18 * var(--idos-ui-k, 1))) } }\n@keyframes idos-bump { 0% { transform: scale(1) } 40% { transform: scale(calc(1 + .22 * var(--idos-ui-k, 1))) } 100% { transform: scale(1) } }\n@keyframes idos-shake { 0%, 100% { transform: rotate(0) } 20% { transform: rotate(calc(-9deg * var(--idos-ui-k, 1))) } 40% { transform: rotate(calc(8deg * var(--idos-ui-k, 1))) } 60% { transform: rotate(calc(-6deg * var(--idos-ui-k, 1))) } 80% { transform: rotate(calc(4deg * var(--idos-ui-k, 1))) } }\n@keyframes idos-star { 0% { transform: scale(0) rotate(-40deg) } 60% { transform: scale(calc(1 + .15 * var(--idos-ui-k, 1))) rotate(8deg) } 100% { transform: scale(1) rotate(0) } }\n@keyframes idos-rays { to { transform: rotate(360deg) } }\n.idos-press { transition: transform var(--idos-ui-fast) ease, filter var(--idos-ui-fast) ease; -webkit-tap-highlight-color: transparent; touch-action: manipulation }\n.idos-press:not(:disabled):hover { filter: brightness(1.07) }\n.idos-press:not(:disabled):active { transform: translateY(3px) scale(.96); filter: brightness(.95); transition-duration: 40ms }\n.idos-shine { position: relative; overflow: hidden }\n.idos-shine::after { content: \"\"; position: absolute; top: 0; bottom: 0; width: 40%; left: 0; pointer-events: none;\n background: linear-gradient(90deg, transparent, rgba(255,255,255,.28), transparent);\n animation: idos-shine calc(var(--idos-ui-slow) * var(--idos-shine-speed, 6)) ease-in-out calc(var(--idos-ui-slow) * var(--idos-shine-phase, 0)) infinite }\n.idos-bounce { animation: idos-bounce calc(var(--idos-ui-slow) * var(--idos-float-speed, 2.1)) ease-in-out calc(var(--idos-ui-slow) * var(--idos-float-phase, 0)) infinite }\n.idos-glow { animation: idos-glow calc(var(--idos-ui-slow) * var(--idos-float-speed, 2.1) * 1.4) ease-in-out calc(var(--idos-ui-slow) * var(--idos-float-phase, 0)) infinite }\n.idos-pulse { animation: idos-pulse calc(var(--idos-ui-slow) * var(--idos-float-speed, 2.1)) ease-in-out calc(var(--idos-ui-slow) * var(--idos-float-phase, 0)) infinite }\n.idos-bump { animation: idos-bump var(--idos-ui-normal) ease-out }\n.idos-scroll { scrollbar-width: thin; scrollbar-color: var(--idos-ui-panel-edge) transparent; overscroll-behavior: contain }\n.idos-scroll::-webkit-scrollbar { width: 6px; height: 6px }\n.idos-scroll::-webkit-scrollbar-thumb { background: var(--idos-ui-panel-edge); border-radius: 3px }\n[data-idos-motion=\"off\"] .idos-shine::after, [data-idos-motion=\"off\"] .idos-bounce, [data-idos-motion=\"off\"] .idos-glow, [data-idos-motion=\"off\"] .idos-pulse, [data-idos-motion=\"off\"] .idos-bump { animation: none }\n";
1020
+ declare const KIT_CSS: string;
931
1021
 
932
1022
  /** The layout for the element's current width, following it as it resizes. */
933
1023
  declare function useLayout(ref: {
@@ -970,6 +1060,159 @@ declare function useBalances(): Array<[string, number]>;
970
1060
  /** Re-renders every `ms` — for countdowns. */
971
1061
  declare function useNow(ms?: number): number;
972
1062
 
1063
+ /** The ink outline of a clipped shape (a clip-path cuts any border off): four hard drops around it. */
1064
+ declare function inkShadow(width?: number): string;
1065
+ /** The slanted dark "◀" tab at the left edge of a screen's header. */
1066
+ declare function BackButton({ onClick, label, style, }: {
1067
+ onClick: () => void;
1068
+ label?: string;
1069
+ style?: CSSProperties;
1070
+ }): ReactNode;
1071
+ /** A screen's header: the back tab, the title, whatever goes on the right (balances, a timer, "i"). */
1072
+ declare function ScreenHeader({ title, icon, onBack, right, style, }: {
1073
+ title: ReactNode;
1074
+ icon?: Glyph | string;
1075
+ onBack?: () => void;
1076
+ right?: ReactNode;
1077
+ style?: CSSProperties;
1078
+ }): ReactNode;
1079
+ /** A square light-blue tile in the ink frame holding an icon, a picture or a face (letters, friends). */
1080
+ declare function IconTile({ children, glyph, size, tone, style, }: {
1081
+ children?: ReactNode;
1082
+ glyph?: Glyph | string;
1083
+ size?: number;
1084
+ /** A tone instead of the light blue (a rarity, a highlight). */
1085
+ tone?: ButtonTone;
1086
+ style?: CSSProperties;
1087
+ }): ReactNode;
1088
+ /** A ribbon banner: the band of the tone, its folded tails behind, faint stars at both ends. */
1089
+ declare function Ribbon({ children, tone, stars, size, style, }: {
1090
+ children: ReactNode;
1091
+ tone?: ButtonTone;
1092
+ stars?: boolean;
1093
+ /** Font size; the ribbon scales with it. */
1094
+ size?: number;
1095
+ style?: CSSProperties;
1096
+ }): ReactNode;
1097
+ /** A slanted rarity tag ("Common", "Epic", "Mythic") in the rarity's colour. */
1098
+ declare function RarityTag({ label, color, size, }: {
1099
+ label: ReactNode;
1100
+ color: string;
1101
+ size?: number;
1102
+ }): ReactNode;
1103
+ /** The tilted "SOLD OUT" stamp over a card. */
1104
+ declare function SoldOutStamp({ size }: {
1105
+ size?: number;
1106
+ }): ReactNode;
1107
+ /** The ON / OFF switch: a blue track with "ON" and the white knob on the right, a dark one with "OFF". */
1108
+ declare function Toggle({ value, onChange, label, }: {
1109
+ value: boolean;
1110
+ onChange: (next: boolean) => void;
1111
+ /** For screen readers. */
1112
+ label?: string;
1113
+ }): ReactNode;
1114
+ /** A white speech bubble in the ink frame, the tail at one corner (hints, tutorials, tooltips). */
1115
+ declare function SpeechBubble({ children, tail, style, }: {
1116
+ children: ReactNode;
1117
+ tail?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | "none";
1118
+ style?: CSSProperties;
1119
+ }): ReactNode;
1120
+ /** A hexagon of a tone in the ink frame — a reward slot of a level road, a level number. */
1121
+ declare function HexBadge({ children, tone, size, glow, style, }: {
1122
+ children?: ReactNode;
1123
+ tone?: ButtonTone;
1124
+ size?: number;
1125
+ /** The golden sparkle of the current step. */
1126
+ glow?: boolean;
1127
+ style?: CSSProperties;
1128
+ }): ReactNode;
1129
+ /** The level shield (the "3" before a bar): a shield of the tone with the number in it. */
1130
+ declare function LevelShield({ level, tone, size, }: {
1131
+ level: ReactNode;
1132
+ tone?: ButtonTone;
1133
+ size?: number;
1134
+ }): ReactNode;
1135
+ /** A level and the bar to the next one: the shield overlapping the bar's left end. */
1136
+ declare function LevelBar({ level, value, max, label, tone, height, style, }: {
1137
+ level: ReactNode;
1138
+ value: number;
1139
+ max: number;
1140
+ label?: string;
1141
+ tone?: ButtonTone;
1142
+ height?: number;
1143
+ style?: CSSProperties;
1144
+ }): ReactNode;
1145
+ /** "29 / 100 +": a count against its limit on a dark plate, a blue "+" to raise the limit. */
1146
+ declare function StepperCounter({ value, max, onPlus, }: {
1147
+ value: number;
1148
+ max: number;
1149
+ onPlus?: () => void;
1150
+ }): ReactNode;
1151
+ /** The round blue "i" — opens an explanation. */
1152
+ declare function InfoButton({ onClick, label, size, tone, }: {
1153
+ onClick: () => void;
1154
+ label?: string;
1155
+ size?: number;
1156
+ tone?: ButtonTone;
1157
+ }): ReactNode;
1158
+ /** A big square menu tile — an icon over its name on a dark-blue plate ("Ranking", "Mission", "Menu"). */
1159
+ declare function MenuTile({ glyph, label, onClick, badge, size, }: {
1160
+ glyph: Glyph | string;
1161
+ label?: ReactNode;
1162
+ onClick: () => void;
1163
+ badge?: number;
1164
+ size?: number;
1165
+ }): ReactNode;
1166
+ type RoadState = "done" | "current" | "next" | "locked";
1167
+ /**
1168
+ * One step of a level road ("25 Level" + its reward in a hexagon on the right): white for the next
1169
+ * one, gold and sparkling for the current, faded blue with a tick when taken, dim when far ahead.
1170
+ */
1171
+ declare function LevelRoadRow({ level, label, reward, rewardLabel, state, tag, onClick, }: {
1172
+ level: ReactNode;
1173
+ label?: ReactNode;
1174
+ /** What is in the hexagon: an icon, a hero, a number. */
1175
+ reward?: ReactNode;
1176
+ /** The amount under it ("10,000", "x3"). */
1177
+ rewardLabel?: ReactNode;
1178
+ state: RoadState;
1179
+ /** A small red tag on the corner ("Next"). */
1180
+ tag?: ReactNode;
1181
+ onClick?: () => void;
1182
+ }): ReactNode;
1183
+ /**
1184
+ * The slowly drifting background pattern (semi-transparent white gear: swords, shields, potions…),
1185
+ * filling its positioned parent — put it as the first child of a screen's or a stage's backdrop. The
1186
+ * loop is seamless: the pattern is a 240px tile moved by exactly one tile a cycle. Stops when motion
1187
+ * is off.
1188
+ */
1189
+ declare function MovingPattern({ style }: {
1190
+ style?: CSSProperties;
1191
+ }): ReactNode;
1192
+ /**
1193
+ * A list laid out for the width it gets — one column on a phone, two or three side by side on a
1194
+ * tablet or a PC — so a screen of rows or cards never stretches one line across a wide window.
1195
+ *
1196
+ * - `kind="cards"` (default): cards (offers, VIP passes, sets, players) in as many columns of at
1197
+ * least `min` px as fit, row after row.
1198
+ * - `kind="strips"`: edge-to-edge strips (quests, letters, market lots): one column — the strips
1199
+ * as they are; two or more — each strip becomes a framed card with a gap around it.
1200
+ * - `kind="ranked"`: an ordered list (a leaderboard): the order runs DOWN the first column, then
1201
+ * the next — 1…N on the left, N+1… on the right, never 1 | 2 across.
1202
+ *
1203
+ * Pure CSS (a container query on its own width), so it fits the area it is in — a page, a window,
1204
+ * a side panel — not the viewport.
1205
+ */
1206
+ declare function Columns({ kind, min, gap, children, style, }: {
1207
+ kind?: "cards" | "strips" | "ranked";
1208
+ /** The narrowest a column gets, px (`cards` only; strips use 340, ranked lists 460). */
1209
+ min?: number;
1210
+ /** The space between items, px (`cards` — 10 by default; `ranked` — none by default). */
1211
+ gap?: number;
1212
+ children: ReactNode;
1213
+ style?: CSSProperties;
1214
+ }): ReactNode;
1215
+
973
1216
  /** Closes the popup this component is in, with its exit animation. */
974
1217
  declare function usePopupClose(): () => void;
975
1218
  /** Renders into the kit layer; in place when there is no provider. */
@@ -987,7 +1230,7 @@ interface PopupProps {
987
1230
  title?: ReactNode;
988
1231
  /** Max width on tablet/desktop, px (default 400). */
989
1232
  width?: number;
990
- /** "auto" — a bottom sheet on a phone, a centred popup elsewhere (default); "center" — always centred. */
1233
+ /** "auto" / "center" — a centred popup on every screen (default); "sheet" — a panel sliding up from the bottom. */
991
1234
  variant?: "auto" | "center" | "sheet";
992
1235
  /** Backdrop and Escape close it (default true when onClose is set). */
993
1236
  dismissible?: boolean;
@@ -1040,38 +1283,39 @@ declare function FeatureGrid({ items, onOpen, }: {
1040
1283
  declare const LEVEL_TONE: Record<NotificationLevel, ButtonTone>;
1041
1284
 
1042
1285
  declare const U: {
1043
- readonly ink: "#10172e";
1044
- readonly navy: "#1f2440";
1045
- readonly navyDeep: "#1a1f38";
1046
- readonly blue: "#0d80f2";
1047
- readonly blueBody: "#0897f7";
1048
- readonly sky: "#00aeff";
1049
- readonly topbar: "#33364a";
1050
- readonly tabOn: "#3082ff";
1051
- readonly tabOff: "#363650";
1052
- readonly bg: "#0340a3";
1053
- readonly bgDeep: "#032b73";
1054
- readonly gold: "#ffce0d";
1055
- readonly listLight: "#d9e8f2";
1056
- readonly listBlue: "#00ccff";
1057
- readonly listBlueInner: "#0099ff";
1058
- readonly listYellow: "#fffed6";
1059
- readonly listYellowInner: "#fffc54";
1060
- readonly sliderBg: "#212130";
1061
- readonly fillGreen: "#47d61e";
1062
- readonly fillOrange: "#ff9a1a";
1286
+ readonly ink: "var(--idos-ui-ink)";
1287
+ readonly navy: "var(--idos-ui-panel-deep)";
1288
+ readonly navyDeep: "color-mix(in srgb, var(--idos-ui-panel-deep) 70%, var(--idos-ui-ink))";
1289
+ readonly blue: "var(--idos-ui-blue)";
1290
+ readonly blueBody: "var(--idos-ui-panel)";
1291
+ readonly sky: "var(--idos-ui-blue)";
1292
+ readonly topbar: "var(--idos-ui-bg-top)";
1293
+ readonly tabOn: "var(--idos-ui-blue)";
1294
+ readonly tabOff: "#45475f";
1295
+ readonly bg: "var(--idos-ui-bg-top)";
1296
+ readonly bgDeep: "var(--idos-ui-bg-bottom)";
1297
+ readonly gold: "var(--idos-ui-gold)";
1298
+ readonly listLight: "#ffffff";
1299
+ readonly listBlue: "var(--idos-ui-panel)";
1300
+ readonly listBlueInner: "color-mix(in srgb, var(--idos-ui-panel) 70%, #fff)";
1301
+ readonly listYellow: "color-mix(in srgb, var(--idos-ui-gold) 45%, #fff)";
1302
+ readonly listYellowInner: "var(--idos-ui-gold)";
1303
+ readonly sliderBg: "var(--idos-ui-well)";
1304
+ readonly fillGreen: "var(--idos-ui-green)";
1305
+ readonly fillOrange: "var(--idos-ui-orange)";
1063
1306
  };
1064
1307
  /** The reference's outlined game text (TMP with outline + a drop shadow). */
1065
1308
  declare function uText(size: number, color?: string, stroke?: string): CSSProperties;
1066
- /** The faint diagonal pattern laid over the blue backgrounds (Pattern01_s, white at ~8 %). */
1067
- declare const U_PATTERN = "repeating-linear-gradient(135deg, rgba(255,255,255,.08) 0 14px, rgba(255,255,255,0) 14px 28px)";
1309
+ /** The soft glow laid over the screen backgrounds (the casual look has no stripes). */
1310
+ declare const U_PATTERN: string;
1068
1311
  /** Gradient_Panel01 tinted: a radial glow over a solid, with the pattern on top. */
1069
1312
  declare function uBackdrop(color?: string, glow?: string): CSSProperties;
1070
1313
  /**
1071
- * A lobby screen in the reference's look: the blue patterned window background from edge to edge,
1072
- * at least as tall as the lobby's scroll box (a short list does not leave the lobby's own colour
1073
- * under it), with `footer` pinned to the bottom of the box (Unity's bottom tabs / my row). The pin
1074
- * offset is read from the box's padding, so it lands flush whatever the lobby's spacing is.
1314
+ * A lobby screen in the reference's look, from edge to edge of the lobby's scroll box and at least
1315
+ * as tall as it, with `footer` pinned to the bottom of the box (Unity's bottom tabs / my row). The
1316
+ * edges are read from the box's own padding — whatever the lobby's spacing at this width — so no
1317
+ * strip is left at the sides on a tablet or a monitor. On the default background the screen is see-
1318
+ * through: the lobby's own background (its moving gear pattern) shows, one pattern for the whole app.
1075
1319
  */
1076
1320
  declare function UScreen({ children, footer, background, }: {
1077
1321
  children: ReactNode;
@@ -1238,4 +1482,4 @@ declare const U_CSS = "\n@keyframes idos-u-spin { to { transform: rotate(360deg)
1238
1482
  /** Renders U_CSS once per page (each U screen calls it; the tag is shared by id). */
1239
1483
  declare function UStyles(): ReactNode;
1240
1484
 
1241
- export { Badge, type Burst, Button, type ButtonProps, type ButtonTone, Card, type Catalog, type CelebrateOptions, Center, ConfirmPopup, CryptoBalanceChip, type CryptoBalanceView, type CurrencySection, DEFAULT_PLAYER_PREFS, DEFAULT_UI_CONFIG, DESKTOP_MIN_PX, EASE_IN, EASE_OUT, EASE_POP, EmptyState, FeatureGrid, type FeatureMenuItem, Field, type Flight, FxStore, GLYPHS, type Glyph, Icon, IconButton, type ItemDefinitionView, type ItemSection, ItemTile, KIT_CSS, type KitNotify, type KitOverlayState, KitPortal, LANGUAGE_EVENT, LANGUAGE_KEY, LEVEL_TONE, LanguageSwitch, type Layout, type NotificationAction, type NotificationInput, type NotificationLevel, type NotificationSource, NotificationStore, ON_TONE, type Point, Popup, type PopupProps, ProgressBar, RARITY_ORDER, type ResolvedSound, ResourceBadge, ResourceCounter, type ResourceKind, type ResourceLine, ResourceList, SOUND_PRESETS, SectionTitle, Select, type ShownNotification, Spinner, type SynthNoise, type SynthNote, type SynthPreset, TABLET_MIN_PX, TOAST_DURATION, type TabItem, Tabs, TextArea, TextInput, Timer, type TitleSections, U, UAvatar, UButton, UCloseCircle, UDivider, UFlag, UHexRank, UI_SOUND_EVENTS, UIconSlider, UItemFrame, UMedal, type UMilestone, type UMilestoneState, UMilestonesPopup, UPopup, URankRow, type URankTone, URays, URibbon, URow, type URowTone, UScreen, USlider, UStyles, UTabs, UTimer, type UTone, UTopBar, U_CSS, U_PATTERN, type UiKitConfig, type UiKitConfigInput, UiKitProvider, type UiKitProviderProps, type UiKitValue, type UiLanguage, type UiMotion, type UiMotionConfig, type UiPlayerPrefs, type UiSoundConfig, UiSoundEngine, type UiSoundEvent, type UiSoundSpec, type UiStringKey, type UiThemeConfig, Window, bundleLines, buttonStyle, canAfford, configSection, costLines, countdown, counterKeys, createNotificationStore, cryptoBalance, currencyGlyph, defineUiConfig, effectiveVolume, errorText, formatAmount, formatCryptoAmount, grantLines, grantedBy, groupBy, iconsFor, iouCurrencies, iouCurrencyOf, isGlyph, itemDefinitions, itemGlyph, layoutFor, makeT, mergeLines, motionDurations, onLanguageChange, outlined, panel, parsePlayerPrefs, pickLanguage, plural, rarityRank, renderKitOverlays, resolveSound, resolveUiConfig, resourceName, screenBackground, setAutoPopupsHeld, setLanguage, sortFeatures, themeVars, tokenGlyph, tokenName, tokenParts, toneSurface, uBackdrop, uText, uiT, useAnimatedNumber, useBalances, useCatalog, useCelebrate, useCounterValue, useGameLayout, useLanguage, useLayout, useMotion, useNotify, useNow, usePlayerPrefs, usePopupClose, usePresence, useSound, useStagger, useToast, useUiKit, v, well };
1485
+ export { BackButton, Badge, type Burst, Button, type ButtonProps, type ButtonTone, Card, type Catalog, type CelebrateOptions, Center, Columns, ConfirmPopup, CryptoBalanceChip, type CryptoBalanceView, type CurrencySection, DEFAULT_PLAYER_PREFS, DEFAULT_UI_CONFIG, DESKTOP_MIN_PX, EASE_IN, EASE_OUT, EASE_POP, EmptyState, FeatureGrid, type FeatureMenuItem, Field, type Flight, FxStore, GEAR_PATTERN, GLYPHS, type Glyph, HexBadge, INK, Icon, IconButton, IconTile, InfoButton, type ItemDefinitionView, type ItemSection, ItemTile, KIT_CSS, type KitNotify, type KitOverlayState, KitPortal, LANGUAGE_EVENT, LANGUAGE_KEY, LEVEL_TONE, LanguageSwitch, type Layout, LevelBar, LevelRoadRow, LevelShield, MenuTile, MovingPattern, type NotificationAction, type NotificationInput, type NotificationLevel, type NotificationSource, NotificationStore, ON_TONE, type Point, Popup, type PopupProps, ProgressBar, RARITY_ORDER, RarityTag, type ResolvedSound, ResourceBadge, ResourceCounter, type ResourceKind, type ResourceLine, ResourceList, Ribbon, type RoadState, SOUND_PRESETS, ScreenHeader, SectionTitle, Select, type ShownNotification, SoldOutStamp, SpeechBubble, Spinner, StepperCounter, type SynthNoise, type SynthNote, type SynthPreset, TABLET_MIN_PX, TOAST_DURATION, TONES, type TabItem, Tabs, TextArea, TextInput, Timer, type TitleSections, Toggle, U, UAvatar, UButton, UCloseCircle, UDivider, UFlag, UHexRank, UI_SOUND_EVENTS, UIconSlider, UItemFrame, UMedal, type UMilestone, type UMilestoneState, UMilestonesPopup, UPopup, URankRow, type URankTone, URays, URibbon, URow, type URowTone, UScreen, USlider, UStyles, UTabs, UTimer, type UTone, UTopBar, U_CSS, U_PATTERN, type UiKitConfig, type UiKitConfigInput, UiKitProvider, type UiKitProviderProps, type UiKitValue, type UiLanguage, type UiMotion, type UiMotionConfig, type UiPlayerPrefs, type UiSoundConfig, UiSoundEngine, type UiSoundEvent, type UiSoundSpec, type UiStringKey, type UiThemeConfig, Window, bundleLines, buttonStyle, canAfford, configSection, costLines, countdown, counterKeys, createNotificationStore, cryptoBalance, currencyGlyph, defineUiConfig, effectiveVolume, errorText, formatAmount, formatCryptoAmount, formatLineAmount, grantLines, grantedBy, groupBy, iconsFor, inkFrame, inkShadow, inked, iouCurrencies, iouCurrencyOf, isGlyph, itemDefinitions, itemGlyph, layoutFor, listRow, makeT, mergeLines, motionDurations, onLanguageChange, outlined, panel, parsePlayerPrefs, pickLanguage, plate, plural, rarityPlate, rarityRank, renderKitOverlays, resolveSound, resolveUiConfig, resourceName, screenBackground, setAutoPopupsHeld, setLanguage, sortFeatures, themeVars, tokenGlyph, tokenName, tokenParts, tonePlate, toneSurface, uBackdrop, uText, uiT, useAnimatedNumber, useBalances, useCatalog, useCelebrate, useCounterValue, useGameLayout, useLanguage, useLayout, useMotion, useNotify, useNow, usePlayerPrefs, usePopupClose, usePresence, useSound, useStagger, useToast, useUiKit, v, well };