@idosgames/react 0.5.1 → 0.6.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.
@@ -1,4 +1,4 @@
1
- import { ReactNode, CSSProperties, MouseEvent, SelectHTMLAttributes, TextareaHTMLAttributes, InputHTMLAttributes } from 'react';
1
+ import { ReactNode, CSSProperties, MouseEvent, SelectHTMLAttributes, TextareaHTMLAttributes, InputHTMLAttributes, ButtonHTMLAttributes, ComponentProps } from 'react';
2
2
  import { TitlePublicConfigurationModel, IDosGamesClient, ResourceConsume, ResourceGrant } from '@idosgames/core';
3
3
 
4
4
  /** Interface sound events. Components of the kit play theirs by themselves. */
@@ -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,13 +625,18 @@ 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
- declare function itemGlyph(tags: readonly string[] | null | undefined, itemClass?: string | null): Glyph;
637
+ declare function itemGlyph(tags: readonly string[] | null | undefined, itemClass?: string | null,
638
+ /** An engine resource path or id to guess from ("Sprites/Chest/Chest_Wood" → chest). */
639
+ hint?: string | null): Glyph;
616
640
  /** A glyph by name, an image by URL ("https://…", "/…", "data:…"), or any other text (an emoji). */
617
641
  declare function Icon({ glyph: requested, size, color, fallback, }: {
618
642
  glyph: Glyph | string;
@@ -622,11 +646,18 @@ declare function Icon({ glyph: requested, size, color, fallback, }: {
622
646
  fallback?: Glyph;
623
647
  }): ReactNode;
624
648
 
625
- 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]>;
626
656
  /** Text colour and its outline on a filled surface of each tone (theme tokens `onGreen`, …). */
627
657
  declare const ON_TONE: Record<ButtonTone, {
628
658
  color: string;
629
659
  textShadow: string;
660
+ WebkitTextStroke: string;
630
661
  }>;
631
662
  /**
632
663
  * A surface filled with a tone of the theme (a hero banner, "your row", a highlighted day). Inside it
@@ -635,6 +666,8 @@ declare const ON_TONE: Record<ButtonTone, {
635
666
  * saturated tone, dark ink on a pastel one. Never hard-code a banner colour in a module: pick a tone.
636
667
  */
637
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;
638
671
  declare function buttonStyle(tone: ButtonTone, disabled?: boolean, size?: "sm" | "md" | "lg"): CSSProperties;
639
672
  interface ButtonProps {
640
673
  children: ReactNode;
@@ -653,7 +686,7 @@ interface ButtonProps {
653
686
  "data-tutorial-anchor"?: string;
654
687
  }
655
688
  declare function Button({ children, onClick, tone, size, disabled, busy, attract, style, className, sound, title, ...rest }: ButtonProps): ReactNode;
656
- /** Round icon button (close, back, menu). */
689
+ /** Square icon button with rounded corners (close, back, menu) — the dark slate plate by default. */
657
690
  declare function IconButton({ glyph, onClick, label, size, tone, style, badge, }: {
658
691
  glyph: Glyph | string;
659
692
  onClick: () => void;
@@ -666,7 +699,7 @@ declare function IconButton({ glyph, onClick, label, size, tone, style, badge, }
666
699
  declare function Spinner({ size }: {
667
700
  size?: number;
668
701
  }): ReactNode;
669
- /** 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. */
670
703
  declare function Badge({ count, dot, style, }: {
671
704
  count: number;
672
705
  dot?: boolean;
@@ -702,7 +735,9 @@ declare function ResourceCounter({ currencyID, amount, size, onClick, }: {
702
735
  size?: number;
703
736
  onClick?: () => void;
704
737
  }): ReactNode;
705
- /** 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. */
706
741
  declare function ItemTile({ itemID, count, level, onClick, size, selected, dim, }: {
707
742
  itemID: string;
708
743
  count?: number;
@@ -712,17 +747,22 @@ declare function ItemTile({ itemID, count, level, onClick, size, selected, dim,
712
747
  selected?: boolean;
713
748
  dim?: boolean;
714
749
  }): ReactNode;
715
- /** 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
+ */
716
754
  declare function ProgressBar({ value, max, tone, label, height, }: {
717
755
  value: number;
718
756
  max: number;
719
- tone?: "green" | "gold" | "blue";
757
+ tone?: ButtonTone;
720
758
  label?: string;
721
759
  height?: number;
722
760
  }): ReactNode;
723
- 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, }: {
724
763
  children: ReactNode;
725
764
  right?: ReactNode;
765
+ tone?: ButtonTone;
726
766
  }): ReactNode;
727
767
  declare function EmptyState({ glyph, text, action, }: {
728
768
  glyph: Glyph | string;
@@ -745,7 +785,11 @@ interface TabItem<T extends string> {
745
785
  glyph?: Glyph | string;
746
786
  badge?: number;
747
787
  }
748
- /** 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
+ */
749
793
  declare function Tabs<T extends string>({ tabs, value, onChange, style, }: {
750
794
  tabs: TabItem<T>[];
751
795
  value: T;
@@ -837,6 +881,8 @@ declare const EN: {
837
881
  readonly free: "Free";
838
882
  readonly claim: "Claim";
839
883
  readonly claimAll: "Claim all";
884
+ readonly rewards: "Rewards";
885
+ readonly premium: "Premium";
840
886
  readonly tokenEvent: "Event points";
841
887
  readonly tokenSeason: "Season status";
842
888
  readonly tokenQuest: "Quest points";
@@ -845,10 +891,17 @@ declare const EN: {
845
891
  readonly cryptoBacked: "Crypto";
846
892
  readonly cryptoUnbacked: "IOU (not backed yet)";
847
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";
848
901
  };
849
902
  type UiStringKey = keyof typeof EN;
850
903
  /** Strings of the kit itself. */
851
- 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" | "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;
852
905
  /** Turns a server error into words the player understands; long texts are cut. */
853
906
  declare function errorText(error: string | null | undefined): string;
854
907
 
@@ -878,8 +931,18 @@ declare const v: {
878
931
  readonly blueDeep: "var(--idos-ui-blue-deep)";
879
932
  readonly red: "var(--idos-ui-red)";
880
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)";
881
940
  readonly shadow: "var(--idos-ui-shadow)";
882
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)";
883
946
  readonly onGreen: "var(--idos-ui-on-green)";
884
947
  readonly onGold: "var(--idos-ui-on-gold)";
885
948
  readonly onBlue: "var(--idos-ui-on-blue)";
@@ -888,7 +951,15 @@ declare const v: {
888
951
  readonly onGoldOutline: "var(--idos-ui-on-gold-outline)";
889
952
  readonly onBlueOutline: "var(--idos-ui-on-blue-outline)";
890
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)";
891
961
  readonly textOutline: "var(--idos-ui-text-outline)";
962
+ readonly textStroke: "var(--idos-ui-text-stroke)";
892
963
  readonly line: "var(--idos-ui-line)";
893
964
  readonly well: "var(--idos-ui-well)";
894
965
  readonly wellSoft: "var(--idos-ui-well-soft)";
@@ -909,11 +980,34 @@ declare const v: {
909
980
  * light theme's dark letters never get a dark double.
910
981
  */
911
982
  declare const outlined: CSSProperties;
912
- /** 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. */
913
993
  declare const panel: CSSProperties;
914
- /** 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
+ */
915
1009
  declare const screenBackground: string;
916
- /** A recessed chip/slot (balances, round icon buttons). */
1010
+ /** A recessed dark plate (balances, counters, bar tracks). */
917
1011
  declare const well: CSSProperties;
918
1012
  /** Easing with an overshoot — the "pop" of casual games. */
919
1013
  declare const EASE_POP = "cubic-bezier(.2, .9, .3, 1.25)";
@@ -923,7 +1017,7 @@ declare const EASE_IN = "cubic-bezier(.5, 0, .75, .2)";
923
1017
  * Keyframes and the few class-based effects inline styles cannot express. Overshoots are written as
924
1018
  * `calc(1 + X * var(--idos-ui-k))`, so `motion.intensity` 0 flattens them and 2 doubles them.
925
1019
  */
926
- 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;
927
1021
 
928
1022
  /** The layout for the element's current width, following it as it resizes. */
929
1023
  declare function useLayout(ref: {
@@ -966,6 +1060,159 @@ declare function useBalances(): Array<[string, number]>;
966
1060
  /** Re-renders every `ms` — for countdowns. */
967
1061
  declare function useNow(ms?: number): number;
968
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
+
969
1216
  /** Closes the popup this component is in, with its exit animation. */
970
1217
  declare function usePopupClose(): () => void;
971
1218
  /** Renders into the kit layer; in place when there is no provider. */
@@ -983,7 +1230,7 @@ interface PopupProps {
983
1230
  title?: ReactNode;
984
1231
  /** Max width on tablet/desktop, px (default 400). */
985
1232
  width?: number;
986
- /** "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. */
987
1234
  variant?: "auto" | "center" | "sheet";
988
1235
  /** Backdrop and Escape close it (default true when onClose is set). */
989
1236
  dismissible?: boolean;
@@ -1035,4 +1282,204 @@ declare function FeatureGrid({ items, onOpen, }: {
1035
1282
  /** The theme tone of each level: colour of its badge, its stripe, its main button. */
1036
1283
  declare const LEVEL_TONE: Record<NotificationLevel, ButtonTone>;
1037
1284
 
1038
- 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, UI_SOUND_EVENTS, 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, uiT, useAnimatedNumber, useBalances, useCatalog, useCelebrate, useCounterValue, useGameLayout, useLanguage, useLayout, useMotion, useNotify, useNow, usePlayerPrefs, usePopupClose, usePresence, useSound, useStagger, useToast, useUiKit, v, well };
1285
+ declare const U: {
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)";
1306
+ };
1307
+ /** The reference's outlined game text (TMP with outline + a drop shadow). */
1308
+ declare function uText(size: number, color?: string, stroke?: string): CSSProperties;
1309
+ /** The soft glow laid over the screen backgrounds (the casual look has no stripes). */
1310
+ declare const U_PATTERN: string;
1311
+ /** Gradient_Panel01 tinted: a radial glow over a solid, with the pattern on top. */
1312
+ declare function uBackdrop(color?: string, glow?: string): CSSProperties;
1313
+ /**
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.
1319
+ */
1320
+ declare function UScreen({ children, footer, background, }: {
1321
+ children: ReactNode;
1322
+ footer?: ReactNode;
1323
+ background?: string;
1324
+ }): ReactNode;
1325
+ type UTone = "green" | "sky" | "yellow" | "purple" | "red" | "gray" | "orange";
1326
+ declare function UButton({ tone, size, busy, disabled, attract, children, style, onClick, ...rest }: {
1327
+ tone?: UTone;
1328
+ size?: "s" | "m" | "l";
1329
+ busy?: boolean;
1330
+ attract?: boolean;
1331
+ } & ButtonHTMLAttributes<HTMLButtonElement>): ReactNode;
1332
+ /** The round close button under a popup / at the bottom bar (Button_Circle118 + Icon_Close02). */
1333
+ declare function UCloseCircle({ onClick, size, }: {
1334
+ onClick: () => void;
1335
+ size?: number;
1336
+ }): ReactNode;
1337
+ /**
1338
+ * The reference's popup: a body (blue or navy), a blue top bar with the title and a light streak, an
1339
+ * optional icon before the title (inline: a bottom sheet clips anything above its edge). The kit's Popup underneath — closing, the exit
1340
+ * animation and usePopupClose() work as everywhere else.
1341
+ */
1342
+ declare function UPopup({ title, icon, tone, children, panelStyle, ...rest }: ComponentProps<typeof Popup> & {
1343
+ icon?: string;
1344
+ tone?: "navy" | "blue";
1345
+ }): ReactNode;
1346
+ /** PanelFrame03 top bar: the title on the left, a black oblique corner with a counter on the right. */
1347
+ declare function UTopBar({ title, corner, cornerLabel, children, }: {
1348
+ title: ReactNode;
1349
+ corner?: ReactNode;
1350
+ cornerLabel?: ReactNode;
1351
+ children?: ReactNode;
1352
+ }): ReactNode;
1353
+ /** Bottom pill tabs (Button_Round10: blue when focused, slate otherwise, a red alert dot). */
1354
+ declare function UTabs<T extends string>({ tabs, value, onChange, }: {
1355
+ tabs: Array<{
1356
+ id: T;
1357
+ label: ReactNode;
1358
+ alert?: boolean;
1359
+ }>;
1360
+ value: T;
1361
+ onChange: (id: T) => void;
1362
+ }): ReactNode;
1363
+ type URowTone = "light" | "blue" | "yellow" | "navy";
1364
+ /** ListFrame04 (quests) / ListFrame01 (leaderboard rows): an outer rim, an inner plate, a dim when done. */
1365
+ declare function URow({ tone, dim, children, style, }: {
1366
+ tone?: URowTone;
1367
+ dim?: boolean;
1368
+ children: ReactNode;
1369
+ style?: CSSProperties;
1370
+ }): ReactNode;
1371
+ /** ListFrame00~02 tints: [rim, inner plate, oblique right end] as the reference scene sets them. */
1372
+ type URankTone = "gold" | "silver" | "bronze" | "blue" | "entry" | "me";
1373
+ /**
1374
+ * ListFrame00~02 (leaderboard entries, rank rewards): a dark rim, a bright inner plate, a darker
1375
+ * oblique block at the right end holding `right` (the score / the reward).
1376
+ */
1377
+ declare function URankRow({ tone, children, right, height, rightWidth, }: {
1378
+ tone: URankTone;
1379
+ children: ReactNode;
1380
+ right?: ReactNode;
1381
+ height?: number;
1382
+ rightWidth?: number;
1383
+ }): ReactNode;
1384
+ /** ItemIcon_Medal_Gold/Silver/Bronze_2: a ribbon and a disc with the place. */
1385
+ declare function UMedal({ place, size, }: {
1386
+ place: 1 | 2 | 3;
1387
+ size?: number;
1388
+ }): ReactNode;
1389
+ /** BasicFrame_Hexagon87 with the place inside (the leaderboard entry's rank). */
1390
+ declare function UHexRank({ children, color, size, }: {
1391
+ children: ReactNode;
1392
+ color?: string;
1393
+ size?: number;
1394
+ }): ReactNode;
1395
+ /** ProfileFrame01: a navy rim, a coloured inner square, the player's picture or initial. */
1396
+ declare function UAvatar({ name, src, inner, size, }: {
1397
+ name: string;
1398
+ src?: string | null;
1399
+ inner?: string;
1400
+ size?: number;
1401
+ }): ReactNode;
1402
+ /** BorderFrame_Flag Blue / Red / Green: the podium's hanging banner (gold bar on top, notched tail). */
1403
+ declare function UFlag({ color, height, children, }: {
1404
+ color: "blue" | "red" | "green";
1405
+ height?: number;
1406
+ children: ReactNode;
1407
+ }): ReactNode;
1408
+ /** A reward/item in a navy frame with its amount under the icon. */
1409
+ declare function UItemFrame({ line, size, glyph, label, onClick, }: {
1410
+ line?: ResourceLine | null;
1411
+ size?: number;
1412
+ glyph?: string;
1413
+ label?: ReactNode;
1414
+ onClick?: () => void;
1415
+ }): ReactNode;
1416
+ /** Slider_Basic02: a dark rounded track with a green (or orange) fill and the count in the middle. */
1417
+ declare function USlider({ value, max, tone, label, height, }: {
1418
+ value: number;
1419
+ max: number;
1420
+ tone?: "green" | "orange" | "blue";
1421
+ label?: ReactNode;
1422
+ height?: number;
1423
+ }): ReactNode;
1424
+ /** Slider_Icon01: a slider with a framed icon at its left end (the quests / leaderboard milestone track). */
1425
+ declare function UIconSlider({ glyph, value, max, label, onClick, }: {
1426
+ glyph: string;
1427
+ value: number;
1428
+ max: number;
1429
+ label?: ReactNode;
1430
+ onClick?: () => void;
1431
+ }): ReactNode;
1432
+ /** Title_Ribbon01 (orange / plum / sky): a raised plate with folded ends. */
1433
+ declare function URibbon({ tone, children, width, }: {
1434
+ tone?: "orange" | "plum" | "sky";
1435
+ children: ReactNode;
1436
+ width?: number;
1437
+ }): ReactNode;
1438
+ /** BorderFrame_Oval timer: a dark pill with a clock. */
1439
+ declare function UTimer({ children }: {
1440
+ children: ReactNode;
1441
+ }): ReactNode;
1442
+ /** Title_Line01: "REWARDS" between two golden dividers. */
1443
+ declare function UDivider({ children }: {
1444
+ children: ReactNode;
1445
+ }): ReactNode;
1446
+ /** Image_Effect_Rotate: soft rays turning behind a prize. */
1447
+ declare function URays({ size, color, }: {
1448
+ size?: number;
1449
+ color?: string;
1450
+ }): ReactNode;
1451
+ type UMilestoneState = "locked" | "ready" | "claimed";
1452
+ interface UMilestone {
1453
+ id: string;
1454
+ /** Points (or rank) needed — shown in the left badge. */
1455
+ required: number;
1456
+ /** Shown instead of the number (e.g. "Top 3"). */
1457
+ label?: ReactNode;
1458
+ free: ResourceLine[];
1459
+ state: UMilestoneState;
1460
+ /** The premium column (events / season pass); omitted — the window has one column. */
1461
+ premium?: ResourceLine[];
1462
+ premiumState?: UMilestoneState;
1463
+ }
1464
+ /**
1465
+ * The reference's milestone window: a row per milestone — the required points in a badge, the free
1466
+ * reward, the premium reward (locked without the pass) — each with its Claim. `onClaim` returns
1467
+ * whether it succeeded; the row stays busy until then.
1468
+ */
1469
+ declare function UMilestonesPopup({ title, glyph, value, milestones, premiumOwned, onPremiumLock, onClaim, onClose, }: {
1470
+ title?: ReactNode;
1471
+ glyph?: string;
1472
+ value: number;
1473
+ milestones: UMilestone[];
1474
+ premiumOwned?: boolean;
1475
+ /** A tap on a locked premium reward — the game opens its pass offer (VIP). */
1476
+ onPremiumLock?: () => void;
1477
+ onClaim: (id: string, track: "free" | "premium") => Promise<boolean>;
1478
+ onClose: () => void;
1479
+ }): ReactNode;
1480
+ /** Keyframes the U* components use; a screen drawing them renders this once. */
1481
+ declare const U_CSS = "\n@keyframes idos-u-spin { to { transform: rotate(360deg); } }\n@keyframes idos-u-attract { 0%,100% { transform: scale(1); } 50% { transform: scale(1.05); } }\n@keyframes idos-u-pop { from { opacity: 0; transform: scale(.4); } to { opacity: 1; transform: scale(1); } }\n@keyframes idos-u-float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }\n@keyframes idos-u-shake { 0%,100% { transform: rotate(0); } 25% { transform: rotate(-7deg); } 75% { transform: rotate(7deg); } }\n";
1482
+ /** Renders U_CSS once per page (each U screen calls it; the tag is shared by id). */
1483
+ declare function UStyles(): ReactNode;
1484
+
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 };