diff --git a/public/images/assets/icons/credits.png b/public/images/assets/icons/credits.png new file mode 100644 index 0000000..b99cfe6 Binary files /dev/null and b/public/images/assets/icons/credits.png differ diff --git a/src/collections/game/GameRules.ts b/src/collections/game/GameRules.ts index d829f47..70dba61 100644 --- a/src/collections/game/GameRules.ts +++ b/src/collections/game/GameRules.ts @@ -37,9 +37,11 @@ export const GameRules: GlobalConfig = { }, { name: "currencySymbol", - type: "text", + type: "upload", + relationTo: "media", admin: { - description: 'Optional symbol prefixed to amounts, e.g. "¢" or "$".', + description: + "Optional emblem shown inline before amounts. It renders scaled to the surrounding text height (unlike a text symbol).", }, }, { diff --git a/src/components/frontend/banking/AccountCard.tsx b/src/components/frontend/banking/AccountCard.tsx index ccd7325..42038ec 100644 --- a/src/components/frontend/banking/AccountCard.tsx +++ b/src/components/frontend/banking/AccountCard.tsx @@ -11,7 +11,8 @@ import { ItemTitle, } from "@/components/ui/item"; import { LandmarkIcon, UsersIcon, WalletIcon } from "lucide-react"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { type AccountStatus, accountStatusBase, accountStatusClass } from "@/lib/banking/ui"; const accountTypeMeta = { @@ -85,10 +86,10 @@ export function AccountCard({
- {formatAmount( - account.balance ?? 0, - currencyConfig.resourceName ? currencyConfig : currency, - )} +
diff --git a/src/components/frontend/banking/AccountDetail.tsx b/src/components/frontend/banking/AccountDetail.tsx index 21195d3..ea00c0b 100644 --- a/src/components/frontend/banking/AccountDetail.tsx +++ b/src/components/frontend/banking/AccountDetail.tsx @@ -4,7 +4,8 @@ import Link from "next/link"; import { ArrowLeftIcon } from "lucide-react"; import type { BankAccount, LedgerEntry } from "@/payload-types"; import { Item, ItemContent, ItemHeader, ItemTitle } from "@/components/ui/item"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { type AccountStatus, accountStatusBase, accountStatusClass } from "@/lib/banking/ui"; import { accountTypeInfo } from "@/components/frontend/banking/AccountCard"; import { BankTransactionDialog } from "@/components/frontend/banking/BankTransactionDialog"; @@ -72,10 +73,10 @@ export function AccountDetail({ Balance

- {formatAmount( - account.balance ?? 0, - currencyConfig.resourceName ? currencyConfig : currency, - )} +

diff --git a/src/components/frontend/banking/BankingOverview.tsx b/src/components/frontend/banking/BankingOverview.tsx index ac30f55..0b6f689 100644 --- a/src/components/frontend/banking/BankingOverview.tsx +++ b/src/components/frontend/banking/BankingOverview.tsx @@ -8,7 +8,8 @@ import { AccountCard } from "@/components/frontend/banking/AccountCard"; import { CreateAccountDialog } from "@/components/frontend/banking/CreateAccountDialog"; import { WalletHero } from "@/components/frontend/banking/WalletHero"; import { ActivityFeed } from "@/components/frontend/banking/ActivityFeed"; -import { currencyLabel, formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import { currencyLabel, type CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { usePageCommands } from "@/components/command-palette/CommandPaletteContext"; interface BankingOverviewProps { @@ -126,7 +127,7 @@ export function BankingOverview({ {isManager && (

UNIT FUNDS  - {formatAmount(unitFundsTotal, currencyConfig)} +

)} diff --git a/src/components/frontend/banking/CurrencyAmount.tsx b/src/components/frontend/banking/CurrencyAmount.tsx new file mode 100644 index 0000000..4a8c7b0 --- /dev/null +++ b/src/components/frontend/banking/CurrencyAmount.tsx @@ -0,0 +1,23 @@ +import { formatAmount } from "@/lib/banking/format"; +import type { CurrencyDisplay } from "@/lib/banking/format"; +import { CurrencySymbol } from "./CurrencySymbol"; + +/** + * Renders the currency emblem inline with the formatted amount. Delegates + * symbol rendering to and formatting to formatAmount. + * Renders nothing when currency is null/undefined/number (no emblem to show). + */ +export function CurrencyAmount({ + value, + currency, +}: { + readonly value: number; + readonly currency?: CurrencyDisplay | null; +}) { + return ( + <> + + {formatAmount(value, currency)} + + ); +} diff --git a/src/components/frontend/banking/CurrencySymbol.tsx b/src/components/frontend/banking/CurrencySymbol.tsx new file mode 100644 index 0000000..1d80af2 --- /dev/null +++ b/src/components/frontend/banking/CurrencySymbol.tsx @@ -0,0 +1,43 @@ +import type { CurrencyDisplay } from "@/lib/banking/format"; +import { cn } from "@/lib/utils"; +import { isCurrencyConfig } from "@/lib/banking/format"; + +/** + * Renders the currency emblem (an uploaded media image) inline with the text it + * sits beside. The image height is tied to the surrounding font size and capped + * just below the line height, so it scales with the text and never floats larger + * than the numbers next to it. Renders nothing when no emblem is configured. + */ +export function CurrencySymbol({ + currency, + className, + ariaHidden, +}: { + readonly currency?: CurrencyDisplay | null; + readonly className?: string; + readonly ariaHidden?: boolean; +}) { + if (!currency || typeof currency !== "object") return null; + const config = isCurrencyConfig(currency) ? currency : null; + const symbolUrl = config?.symbol; + if (!symbolUrl) return null; + + const alt = + config?.name?.trim() || + config?.singular?.trim() || + config?.plural?.trim() || + "currency symbol"; + + return ( + {alt} + ); +} diff --git a/src/components/frontend/banking/WalletHero.tsx b/src/components/frontend/banking/WalletHero.tsx index 51ebd0c..2d7398f 100644 --- a/src/components/frontend/banking/WalletHero.tsx +++ b/src/components/frontend/banking/WalletHero.tsx @@ -6,7 +6,8 @@ import Link from "next/link"; import { ChevronRightIcon, WalletIcon } from "lucide-react"; import type { BankAccount, Resource } from "@/payload-types"; import { Button } from "@/components/ui/button"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { type AccountStatus, accountStatusBase, @@ -120,10 +121,10 @@ export function WalletHero({

- {formatAmount( - account.balance ?? 0, - currencyConfig.resourceName ? currencyConfig : currency, - )} +

LAST ACTIVITY {lastActivity} diff --git a/src/components/frontend/baseManagement/EmploymentCard.tsx b/src/components/frontend/baseManagement/EmploymentCard.tsx index 309ef2c..2a51e6c 100644 --- a/src/components/frontend/baseManagement/EmploymentCard.tsx +++ b/src/components/frontend/baseManagement/EmploymentCard.tsx @@ -1,7 +1,8 @@ "use client"; import { BadgeCheckIcon } from "lucide-react"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { HireStaffDialog } from "@/components/frontend/baseManagement/HireStaffDialog"; import type { LaborClassificationOption, StructureStaffingOption } from "@/lib/base"; @@ -51,7 +52,7 @@ export function EmploymentCard({ {employment.positionType} · {employment.structureName}

- {formatAmount(employment.salary, currencyConfig)}/tick + /tick

) : canManage && hiringEnabled ? ( diff --git a/src/components/frontend/baseManagement/StaffRoster.tsx b/src/components/frontend/baseManagement/StaffRoster.tsx index 9743ec9..9408beb 100644 --- a/src/components/frontend/baseManagement/StaffRoster.tsx +++ b/src/components/frontend/baseManagement/StaffRoster.tsx @@ -17,7 +17,8 @@ import { import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; -import { currencyLabel, formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import { currencyLabel, type CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import type { LaborClassificationOption, StructureStaffingOption } from "@/lib/base"; import { HireStaffDialog } from "@/components/frontend/baseManagement/HireStaffDialog"; @@ -239,7 +240,7 @@ export function StaffRoster({ {structure.maintenanceCost > 0 && (

- Maintenance: {formatAmount(structure.maintenanceCost, currencyConfig)}/tick + Maintenance: /tick

)} @@ -262,7 +263,7 @@ export function StaffRoster({
- {formatAmount(member.salary, currencyConfig)}/tick + /tick {canManage && (
diff --git a/src/components/frontend/dashboard/OpenNegotiations.tsx b/src/components/frontend/dashboard/OpenNegotiations.tsx index 72b5c5c..9f1e7e4 100644 --- a/src/components/frontend/dashboard/OpenNegotiations.tsx +++ b/src/components/frontend/dashboard/OpenNegotiations.tsx @@ -2,7 +2,8 @@ import Link from "next/link"; import type { MarketListing, MarketNegotiation } from "@/payload-types"; import { Item, ItemContent, ItemHeader, ItemTitle } from "@/components/ui/item"; import { ChevronRightIcon, HandshakeIcon } from "lucide-react"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; interface OpenNegotiationsProps { readonly negotiations: MarketNegotiation[]; @@ -36,7 +37,7 @@ export function OpenNegotiations({ // NegotiationPanel on the market page). if (negotiations.length === 0) return null; - const fmt = (n: number) => formatAmount(n, currencyConfig); + const fmt = (n: number) => ; return ( diff --git a/src/components/frontend/dashboard/WalletWidget.tsx b/src/components/frontend/dashboard/WalletWidget.tsx index 8d96b25..4ffcb81 100644 --- a/src/components/frontend/dashboard/WalletWidget.tsx +++ b/src/components/frontend/dashboard/WalletWidget.tsx @@ -2,7 +2,8 @@ import Link from "next/link"; import type { BankAccount } from "@/payload-types"; import { Item, ItemContent, ItemHeader, ItemTitle } from "@/components/ui/item"; import { WalletIcon } from "lucide-react"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { MyWalletCard } from "@/components/frontend/banking/MyWalletCard"; interface WalletWidgetProps { @@ -44,7 +45,7 @@ export function WalletWidget({ account, currencyConfig }: WalletWidgetProps) { - {formatAmount(account.balance ?? 0, currencyConfig)} + diff --git a/src/components/frontend/intelligence/CampaignCard.tsx b/src/components/frontend/intelligence/CampaignCard.tsx index 24ba1b4..baccc56 100644 --- a/src/components/frontend/intelligence/CampaignCard.tsx +++ b/src/components/frontend/intelligence/CampaignCard.tsx @@ -43,8 +43,8 @@ const officialStatusLabels: Record = { const statusTextColors: Record = { concept: "text-muted-foreground", - inProgress: "text-blue-400", - completed: "text-emerald-400", + inProgress: "text-emerald-400", + completed: "text-blue-400", }; export function CampaignCard({ campaign, size = "lg" }: CampaignCardProps) { diff --git a/src/components/frontend/market/ListingCard.tsx b/src/components/frontend/market/ListingCard.tsx index 4420726..2621a7c 100644 --- a/src/components/frontend/market/ListingCard.tsx +++ b/src/components/frontend/market/ListingCard.tsx @@ -18,7 +18,8 @@ import { } from "@/components/ui/item"; import { getAssetTypeLabel } from "@/lib/locker"; import { getRarityLabel, isNegotiable } from "@/lib/market"; -import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import type { CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { PackageIcon, ShoppingCartIcon, XIcon } from "lucide-react"; import { buyMarketListing, cancelMarketListing, resetEconomyState } from "@/app/(frontend)/logistics/market/actions"; import { Countdown } from "@/components/frontend/market/Countdown"; @@ -156,7 +157,7 @@ export function ListingCard({
- {formatAmount(listing.price ?? 0, currencyConfig)} / unit + / unit {stock > 1 && ( @@ -164,7 +165,7 @@ export function ListingCard({ {selectedQty}/{stock} ·{" "} )} - total {formatAmount(selectedTotal, currencyConfig)} + total
{error &&

{error}

} diff --git a/src/components/frontend/market/MakeOfferDialog.tsx b/src/components/frontend/market/MakeOfferDialog.tsx index 4b36db7..ef8764c 100644 --- a/src/components/frontend/market/MakeOfferDialog.tsx +++ b/src/components/frontend/market/MakeOfferDialog.tsx @@ -17,6 +17,7 @@ import { DialogTrigger, } from "@/components/ui/dialog"; import { currencyLabel, formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { acceptMarketOffer, cancelMarketOffer, @@ -239,7 +240,7 @@ export function MakeOfferDialog({ listing, currentUserId, currencyConfig }: Make Negotiate: {assetName} {isVendor ? "Haggle with the vendor." : "Send an offer to the seller."} Asking{" "} - {fmt(listing.price ?? 0)} per unit. + per unit. @@ -282,7 +283,7 @@ export function MakeOfferDialog({ listing, currentUserId, currencyConfig }: Make )}

{stock}× in stock · total{" "} - {fmt((Number(amount) || 0) * clampedQty)} +

{error &&

{error}

} @@ -291,7 +292,7 @@ export function MakeOfferDialog({ listing, currentUserId, currencyConfig }: Make {outcome?.kind === "pending" && (

- Offer of {fmt(negotiation?.amount ?? 0)} each for{" "} + Offer of each for{" "} {negotiation?.quantity ?? stock}× sent. Waiting for the{" "} {isVendor ? "vendor" : "seller"} to respond.

@@ -303,10 +304,10 @@ export function MakeOfferDialog({ listing, currentUserId, currencyConfig }: Make

The {isVendor ? "vendor" : "seller"} counteroffers{" "} - {fmt(negotiation?.amount ?? 0)}{" "} + {" "} each for {negotiation?.quantity ?? stock}×, for a total of{" "} - {fmt((negotiation?.amount ?? 0) * (negotiation?.quantity ?? stock))} + .

@@ -330,10 +331,10 @@ export function MakeOfferDialog({ listing, currentUserId, currencyConfig }: Make Deal closed

- Sold at {fmt(outcome.price)} each for{" "} + Sold at each for{" "} {negotiation?.quantity ?? stock}×, for a total of{" "} - {fmt(outcome.price * (negotiation?.quantity ?? stock))} + . The items are in your locker.

diff --git a/src/components/frontend/market/NegotiationHistoryDialog.tsx b/src/components/frontend/market/NegotiationHistoryDialog.tsx index 9abd337..8d3e728 100644 --- a/src/components/frontend/market/NegotiationHistoryDialog.tsx +++ b/src/components/frontend/market/NegotiationHistoryDialog.tsx @@ -14,7 +14,8 @@ import { DialogTrigger, } from "@/components/ui/dialog"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import { currencyLabel, formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import { currencyLabel, type CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { buildChatBubbles } from "@/lib/market/chatBubbles"; import { ChatBubbleList } from "@/components/frontend/market/ChatBubbleList"; import { ChevronDownIcon, HistoryIcon } from "lucide-react"; @@ -79,7 +80,7 @@ function HistoryRow({ }) { const [expanded, setExpanded] = useState(false); const listing = listingOf(negotiation); - const fmt = (n: number) => formatAmount(n, currencyConfig); + const fmt = (n: number) => ; const buyerLabel = role === "buyer" ? "You" : counterpartyLabel(negotiation, "buyer"); const sellerLabel = role === "seller" ? "You" : counterpartyLabel(negotiation, "seller"); diff --git a/src/components/frontend/market/NegotiationPanel.tsx b/src/components/frontend/market/NegotiationPanel.tsx index 5324fb7..9d2736a 100644 --- a/src/components/frontend/market/NegotiationPanel.tsx +++ b/src/components/frontend/market/NegotiationPanel.tsx @@ -7,6 +7,7 @@ import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { formatAmount, type CurrencyConfig } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; import { acceptMarketOffer, cancelMarketOffer, @@ -131,7 +132,7 @@ function NegotiationRow({
- {fmt(negotiation.amount ?? 0)} + {negotiation.quantity ? `${negotiation.quantity}× · ` : ""} {theirProposal @@ -143,7 +144,7 @@ function NegotiationRow({ <> {" · total "} - {fmt((negotiation.amount ?? 0) * negotiation.quantity)} + ) : null} diff --git a/src/components/frontend/personnel/NpcProfile.tsx b/src/components/frontend/personnel/NpcProfile.tsx index 1b08d5f..794b361 100644 --- a/src/components/frontend/personnel/NpcProfile.tsx +++ b/src/components/frontend/personnel/NpcProfile.tsx @@ -14,7 +14,7 @@ import { CardTitle, } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; -import { formatAmount } from "@/lib/banking/format"; +import { CurrencyAmount } from "@/components/frontend/banking/CurrencyAmount"; interface NpcProfileProps { readonly npc: GameNpc; @@ -183,7 +183,7 @@ export function NpcProfile({ npc, listings }: NpcProfileProps) {

- {formatAmount(listing.price, listing.currency)} +
diff --git a/src/lib/banking/format.ts b/src/lib/banking/format.ts index 571af70..93197a0 100644 --- a/src/lib/banking/format.ts +++ b/src/lib/banking/format.ts @@ -14,9 +14,9 @@ export interface CurrencyConfig { readonly resourceName?: string | null; } -type CurrencyDisplay = CurrencyLike | CurrencyConfig | number | null; +export type CurrencyDisplay = CurrencyLike | CurrencyConfig | number | null; -function isCurrencyConfig(currency: CurrencyLike | CurrencyConfig): currency is CurrencyConfig { +export function isCurrencyConfig(currency: CurrencyLike | CurrencyConfig): currency is CurrencyConfig { return ( "symbol" in currency || "singular" in currency || @@ -47,12 +47,7 @@ export function currencyLabel(currency?: CurrencyDisplay, amount = 2): string { export function formatAmount(amount: number, currency?: CurrencyDisplay): string { const n = amount.toLocaleString(); const label = currencyLabel(currency, amount); - const symbol = - currency && typeof currency === "object" && isCurrencyConfig(currency) - ? currency.symbol?.trim() - : undefined; - const formatted = symbol ? `${symbol}${n}` : n; - return label ? `${formatted} ${label}` : formatted; + return label ? `${n} ${label}` : n; } export function formatDate(date: string | Date): string { diff --git a/src/lib/banking/index.ts b/src/lib/banking/index.ts index fcc9092..e0cee12 100644 --- a/src/lib/banking/index.ts +++ b/src/lib/banking/index.ts @@ -51,10 +51,15 @@ export async function getMainCurrencyName(payload: PayloadType): Promise= 1, so guard the object case before reading .url. + const symbolMedia = + typeof rules.currencySymbol === "object" && rules.currencySymbol !== null + ? rules.currencySymbol + : null; return { name: rules.currencyName?.trim() || null, - symbol: rules.currencySymbol?.trim() || null, + symbol: symbolMedia?.url ?? null, singular: rules.currencySingular?.trim() || null, plural: rules.currencyPlural?.trim() || null, denomination: rules.currencyDenomination?.trim() || null, diff --git a/src/migrations/20260921_140000_add_currency_symbol_image.ts b/src/migrations/20260921_140000_add_currency_symbol_image.ts new file mode 100644 index 0000000..7479774 --- /dev/null +++ b/src/migrations/20260921_140000_add_currency_symbol_image.ts @@ -0,0 +1,17 @@ +import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' + +export async function up({ db, payload, req }: MigrateUpArgs): Promise { + await db.execute(sql` + ALTER TABLE "game_rules" DROP COLUMN "currency_symbol"; + ALTER TABLE "game_rules" ADD COLUMN "currency_symbol_id" integer; + ALTER TABLE "game_rules" ADD CONSTRAINT "game_rules_currency_symbol_id_media_id_fk" FOREIGN KEY ("currency_symbol_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + CREATE INDEX "game_rules_currency_symbol_idx" ON "game_rules" USING btree ("currency_symbol_id");`) +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { + await db.execute(sql` + ALTER TABLE "game_rules" DROP CONSTRAINT "game_rules_currency_symbol_id_media_id_fk"; + DROP INDEX "game_rules_currency_symbol_idx"; + ALTER TABLE "game_rules" DROP COLUMN "currency_symbol_id"; + ALTER TABLE "game_rules" ADD COLUMN "currency_symbol" varchar;`) +} diff --git a/src/migrations/index.ts b/src/migrations/index.ts index 51e72b1..b0af3aa 100644 --- a/src/migrations/index.ts +++ b/src/migrations/index.ts @@ -77,6 +77,11 @@ import * as migration_20260918_194842_add_operation_allocation from './20260918_ import * as migration_20260918_222549_add_operation_readiness from './20260918_222549_add_operation_readiness'; import * as migration_20260920_044743_add_zone_pressure from './20260920_044743_add_zone_pressure'; import * as migration_20260921_113443_add_supply_boxes from './20260921_113443_add_supply_boxes'; +import * as migration_20260921_120000_add_world_map_flag from './20260921_120000_add_world_map_flag'; +import * as migration_20260921_123000_add_map_intel_fields from './20260921_123000_add_map_intel_fields'; +import * as migration_20260921_130500_weather_freeform from './20260921_130500_weather_freeform'; +import * as migration_20260921_134000_add_node_icons from './20260921_134000_add_node_icons'; +import * as migration_20260921_140000_add_currency_symbol_image from './20260921_140000_add_currency_symbol_image'; export const migrations = [ { @@ -472,6 +477,31 @@ export const migrations = [ { up: migration_20260921_113443_add_supply_boxes.up, down: migration_20260921_113443_add_supply_boxes.down, - name: '20260921_113443_add_supply_boxes' + name: '20260921_113443_add_supply_boxes', + }, + { + up: migration_20260921_120000_add_world_map_flag.up, + down: migration_20260921_120000_add_world_map_flag.down, + name: '20260921_120000_add_world_map_flag', + }, + { + up: migration_20260921_123000_add_map_intel_fields.up, + down: migration_20260921_123000_add_map_intel_fields.down, + name: '20260921_123000_add_map_intel_fields', + }, + { + up: migration_20260921_130500_weather_freeform.up, + down: migration_20260921_130500_weather_freeform.down, + name: '20260921_130500_weather_freeform', + }, + { + up: migration_20260921_134000_add_node_icons.up, + down: migration_20260921_134000_add_node_icons.down, + name: '20260921_134000_add_node_icons', + }, + { + up: migration_20260921_140000_add_currency_symbol_image.up, + down: migration_20260921_140000_add_currency_symbol_image.down, + name: '20260921_140000_add_currency_symbol_image', }, ];