-
-
- );
-};
-
-const BranchPicker: FC = ({
- className,
- ...rest
- }) => {
- return (
-
-
-
-
-
-
-
- /
-
-
-
-
-
-
-
- );
-};
diff --git a/components/assistant-ui/tooltip-icon-button.tsx b/components/assistant-ui/tooltip-icon-button.tsx
deleted file mode 100644
index dd7dbf04..00000000
--- a/components/assistant-ui/tooltip-icon-button.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-"use client";
-
-import { type ComponentPropsWithRef, forwardRef } from "react";
-import { Slot } from "radix-ui";
-
-import {
- Tooltip,
- TooltipContent,
- TooltipProvider,
- TooltipTrigger,
-} from "@/components/ui/tooltip";
-import { Button } from "@/components/ui/button";
-import { cn } from "@/lib/utils";
-
-export type TooltipIconButtonProps = ComponentPropsWithRef & {
- tooltip: string;
- side?: "top" | "bottom" | "left" | "right";
-};
-
-export const TooltipIconButton = forwardRef<
- HTMLButtonElement,
- TooltipIconButtonProps
->(({ children, tooltip, side = "bottom", className, ...rest }, ref) => {
- return (
-
-
-
-
-
- {tooltip}
-
-
- );
-});
-
-TooltipIconButton.displayName = "TooltipIconButton";
diff --git a/components/blog/mdx-components.tsx b/components/blog/mdx-components.tsx
index 4a5a4a4a..8fffdd9e 100644
--- a/components/blog/mdx-components.tsx
+++ b/components/blog/mdx-components.tsx
@@ -1,6 +1,6 @@
import {slugify} from '@/lib/mdx';
import {cn} from "@/lib/utils";
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
function extractText(children: React.ReactNode): string {
if (typeof children === 'string') return children;
diff --git a/components/blog/related-posts.tsx b/components/blog/related-posts.tsx
index 7d179427..c8fff9a8 100644
--- a/components/blog/related-posts.tsx
+++ b/components/blog/related-posts.tsx
@@ -1,5 +1,5 @@
import type { Post } from '@/lib/mdx';
-import { OwPostList } from '@/components/ow-ui/ow-post-list';
+import { OwPostList } from '@/components/owui/ow-post-list';
interface Props {
posts: Post[];
diff --git a/components/cards/card-masonry.tsx b/components/cards/card-masonry.tsx
index 267abd3c..2ef8efc5 100644
--- a/components/cards/card-masonry.tsx
+++ b/components/cards/card-masonry.tsx
@@ -4,7 +4,7 @@ import {useState} from 'react';
import Masonry from 'react-masonry-css';
import type {Card} from '@/lib/api';
import {CardDisplay} from '@/components/cards/variants/card-display';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
const breakpointCols = { default: 5, 1023: 4, 767: 3, 639: 2 };
diff --git a/components/cards/detail/card-detail-cashback.tsx b/components/cards/detail/card-detail-cashback.tsx
index 52034358..3f3a7be3 100644
--- a/components/cards/detail/card-detail-cashback.tsx
+++ b/components/cards/detail/card-detail-cashback.tsx
@@ -3,9 +3,9 @@ import type {Merchant} from '@/lib/api';
import {getIntents, getMerchants} from '@/lib/api';
import {IntentModel} from '@/lib/intent-model';
import type {CardModel} from '@/lib/card-model';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
+import {OwAmount} from '@/components/owui/ow-amount';
import {IconInfoCircle} from '@tabler/icons-react';
-import {OwAlert} from '@/components/ow-ui/ow-alert';
+import {OwAlert} from '@/components/owui/ow-alert';
import {CardDetailSection} from '@/components/cards/detail/card-detail-section';
import {fmtIsoDate, fmtIsoDateLifespan} from '@/lib/utils';
import {
diff --git a/components/cards/detail/card-detail-fees.tsx b/components/cards/detail/card-detail-fees.tsx
index 918ac0b0..623d7667 100644
--- a/components/cards/detail/card-detail-fees.tsx
+++ b/components/cards/detail/card-detail-fees.tsx
@@ -1,6 +1,6 @@
import type {Bank, FeeEntry, FeeEntryWithWaiver, FeeWaiver} from '@/lib/api';
import type {CardModel} from '@/lib/card-model';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
+import {OwAmount} from '@/components/owui/ow-amount';
import {CardDetailSection} from '@/components/cards/detail/card-detail-section';
function FeeValue({ entry }: { entry?: FeeEntry | null }) {
diff --git a/components/cards/detail/card-detail-header.tsx b/components/cards/detail/card-detail-header.tsx
index a77b208c..46ddc436 100644
--- a/components/cards/detail/card-detail-header.tsx
+++ b/components/cards/detail/card-detail-header.tsx
@@ -3,8 +3,8 @@ import {BankModel} from '@/lib/bank-model';
import {normalizeCardTypes} from '@/lib/api';
import type {CardModel} from '@/lib/card-model';
import {CoBrandDisplay} from '@/components/cards/co-brand-display';
-import {OwBankImage} from '@/components/ow-ui/ow-bank-image';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
+import {OwBankImage} from '@/components/owui/ow-bank-image';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
interface Props {
card: CardModel;
diff --git a/components/cards/detail/card-detail-intents.tsx b/components/cards/detail/card-detail-intents.tsx
index 1c77b90a..348ea216 100644
--- a/components/cards/detail/card-detail-intents.tsx
+++ b/components/cards/detail/card-detail-intents.tsx
@@ -1,6 +1,6 @@
import {getIntents} from '@/lib/api';
import type {CardModel} from '@/lib/card-model';
-import {OwCardIntentBadges} from '@/components/ow-ui/ow-card-intent-badges';
+import {OwCardIntentBadges} from '@/components/owui/ow-card-intent-badges';
import {CardDetailSection} from '@/components/cards/detail/card-detail-section';
interface Props {
diff --git a/components/cards/detail/card-detail-other-fees.tsx b/components/cards/detail/card-detail-other-fees.tsx
index 45da4015..15c2a2d9 100644
--- a/components/cards/detail/card-detail-other-fees.tsx
+++ b/components/cards/detail/card-detail-other-fees.tsx
@@ -1,8 +1,8 @@
import type {Bank, FeeEntry} from '@/lib/api';
import {BankModel} from '@/lib/bank-model';
import type {CardModel} from '@/lib/card-model';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
-import {OwWobbleCard} from '@/components/ow-ui/ow-wobble-card';
+import {OwAmount} from '@/components/owui/ow-amount';
+import {OwWobbleCard} from '@/components/owui/ow-wobble-card';
function NoteLines({ note }: { note: string }) {
const lines = note.split('|').map((l) => l.trim()).filter(Boolean);
diff --git a/components/cards/detail/card-detail-rank-badges.tsx b/components/cards/detail/card-detail-rank-badges.tsx
index 06186ef0..77e25cdf 100644
--- a/components/cards/detail/card-detail-rank-badges.tsx
+++ b/components/cards/detail/card-detail-rank-badges.tsx
@@ -2,7 +2,7 @@ import Link from 'next/link';
import {getPersonas, getRankedCards} from '@/lib/api';
import type {CardModel} from '@/lib/card-model';
import {PersonaModel} from '@/lib/persona-model';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
import {CardDetailSection} from '@/components/cards/detail/card-detail-section';
interface RankBadge {
diff --git a/components/cards/detail/cashback-calculator.tsx b/components/cards/detail/cashback-calculator.tsx
index fbbcc5a7..b473c5b0 100644
--- a/components/cards/detail/cashback-calculator.tsx
+++ b/components/cards/detail/cashback-calculator.tsx
@@ -2,12 +2,12 @@
import * as React from 'react';
import type {CashbackBenefit, CashbackResult, Merchant} from '@/lib/api';
import {IconAlertTriangle, IconLoader2} from '@tabler/icons-react';
-import {OwRangeSlider} from '@/components/ow-ui/ow-range-slider';
-import {formatOwAmount, OwAmount} from '@/components/ow-ui/ow-amount';
-import {OwCardCashbackRule} from '@/components/ow-ui/ow-card-cashback-rule';
+import {OwRangeSlider} from '@/components/owui/ow-range-slider';
+import {formatOwAmount, OwAmount} from '@/components/owui/ow-amount';
+import {OwCardCashbackRule} from '@/components/owui/ow-card-cashback-rule';
import {IntentModel} from '@/lib/intent-model';
import {CATCHALL_SLUGS} from '@/lib/cashback-utils';
-import {OwAlert} from "@/components/ow-ui/ow-alert";
+import {OwAlert} from "@/components/owui/ow-alert";
export type SerializedIntentMap = Record;
export type SerializedMerchantMap = Record;
diff --git a/components/cards/variants/card-display.tsx b/components/cards/variants/card-display.tsx
index 5d45a862..051663bc 100644
--- a/components/cards/variants/card-display.tsx
+++ b/components/cards/variants/card-display.tsx
@@ -9,9 +9,9 @@ import {normalizeCardTypes} from '@/lib/api';
import type {Bank} from '@/lib/api';
import {BankModel} from '@/lib/bank-model';
import {CardModel} from '@/lib/card-model';
-import {OwCardImage} from '@/components/ow-ui/ow-card-image';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
+import {OwCardImage} from '@/components/owui/ow-card-image';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
+import {OwAmount} from '@/components/owui/ow-amount';
import {useCompareList} from '@/lib/use-compare-list';
interface BadgeConfig {
diff --git a/components/chat/chat-panel.tsx b/components/chat/chat-panel.tsx
index 3ffdcbac..097ca0f3 100644
--- a/components/chat/chat-panel.tsx
+++ b/components/chat/chat-panel.tsx
@@ -4,7 +4,7 @@ import {useCallback, useEffect, useState} from 'react';
import {useRouter} from 'next/navigation';
import {CheckIcon} from 'lucide-react';
import {cn} from '@/lib/utils';
-import {OwTrafficLights} from '@/components/ow-ui/ow-traffic-lights';
+import {OwTrafficLights} from '@/components/owui/ow-traffic-lights';
import {
Select,
SelectContent,
@@ -20,7 +20,7 @@ import {ChatRuntime} from '@/components/chat/chat-runtime';
import {getUserId} from '@/lib/chat/anonymous-user';
import {type Conversation, createConversation, getLastActiveId, listConversations, setLastActiveId,} from '@/lib/chat/conversation-store';
import Link from 'next/link';
-import {OwLogo} from "@/components/ow-ui/ow-logo";
+import {OwLogo} from "@/components/owui/ow-logo";
import {IconArrowsMaximize, IconHome, IconMinus, IconPlus} from "@tabler/icons-react";
function groupConversations(convos: Conversation[]) {
@@ -231,4 +231,4 @@ export function ChatPanel() {
);
-}
\ No newline at end of file
+}
diff --git a/components/chat/open-owie-button.tsx b/components/chat/open-owie-button.tsx
index 7a1e9915..321b9b4b 100644
--- a/components/chat/open-owie-button.tsx
+++ b/components/chat/open-owie-button.tsx
@@ -2,8 +2,8 @@
import { useRouter } from 'next/navigation';
import { useChatContext } from '@/components/chat/chat-provider';
-import { OwButton, type OwButtonSize } from '@/components/ow-ui/ow-button';
-import type { OwButtonColor } from '@/components/ow-ui/ow-button';
+import { OwButton, type OwButtonSize } from '@/components/owui/ow-button';
+import type { OwButtonColor } from '@/components/owui/ow-button';
interface Props {
label?: string;
diff --git a/components/compare/compare-button.tsx b/components/compare/compare-button.tsx
index 89d1246c..107370c4 100644
--- a/components/compare/compare-button.tsx
+++ b/components/compare/compare-button.tsx
@@ -2,7 +2,7 @@
import {IconScale} from '@tabler/icons-react';
import {useCompareList} from '@/lib/use-compare-list';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
interface Props {
card: {
diff --git a/components/compare/compare-row-defs.tsx b/components/compare/compare-row-defs.tsx
index 3465d41f..70ce1265 100644
--- a/components/compare/compare-row-defs.tsx
+++ b/components/compare/compare-row-defs.tsx
@@ -1,9 +1,9 @@
import type {Card, CompareResult, CompareTableRow as ApiRow} from '@/lib/api';
import {normalizeCardTypes} from '@/lib/api';
-import {OwBankImage} from '@/components/ow-ui/ow-bank-image';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
-import {OwCardIntentBadges} from '@/components/ow-ui/ow-card-intent-badges';
-import {OwAmount} from "@/components/ow-ui/ow-amount";
+import {OwBankImage} from '@/components/owui/ow-bank-image';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
+import {OwCardIntentBadges} from '@/components/owui/ow-card-intent-badges';
+import {OwAmount} from "@/components/owui/ow-amount";
import {formatDueDate} from '@/lib/card-dates';
// ─── Context ──────────────────────────────────────────────────────────────────
diff --git a/components/compare/compare-section.tsx b/components/compare/compare-section.tsx
index 422cbd92..e3087c7a 100644
--- a/components/compare/compare-section.tsx
+++ b/components/compare/compare-section.tsx
@@ -8,7 +8,7 @@ import {cn} from '@/lib/utils';
import type {SearchCard} from '@/lib/search-types';
import type {Card, CompareResult} from '@/lib/api';
import {compareCards, getCard} from '@/lib/api';
-import {OwCardImage} from '@/components/ow-ui/ow-card-image';
+import {OwCardImage} from '@/components/owui/ow-card-image';
import {CardSearchInput} from '@/components/compare/card-search-input';
import {CompareTable} from '@/components/compare/compare-table';
import {RecentCompares} from '@/components/compare/recent-compares';
diff --git a/components/compare/recent-compares.tsx b/components/compare/recent-compares.tsx
index 24c88b32..8f44b1a6 100644
--- a/components/compare/recent-compares.tsx
+++ b/components/compare/recent-compares.tsx
@@ -6,7 +6,7 @@ import {IconX} from '@tabler/icons-react';
import {normalizePair, useRecentCompares} from '@/lib/use-recent-compares';
import {useCardSearch} from '@/lib/use-card-search';
import {getTool} from '@/lib/tools';
-import {OwCardImage} from '@/components/ow-ui/ow-card-image';
+import {OwCardImage} from '@/components/owui/ow-card-image';
const cardBattleHref = getTool('Card Battle').href;
diff --git a/components/layout/discord-button.tsx b/components/layout/discord-button.tsx
index 325c7f77..18111467 100644
--- a/components/layout/discord-button.tsx
+++ b/components/layout/discord-button.tsx
@@ -1,5 +1,5 @@
import {IconBrandDiscord} from '@tabler/icons-react';
-import {OwButtonHeader} from '@/components/ow-ui/ow-button-header';
+import {OwButtonHeader} from '@/components/owui/ow-button-header';
interface DiscordButtonProps {
iconOnly?: boolean;
diff --git a/components/layout/footer.tsx b/components/layout/footer.tsx
index f98c6fce..132f2782 100644
--- a/components/layout/footer.tsx
+++ b/components/layout/footer.tsx
@@ -1,6 +1,6 @@
import Image from 'next/image';
import Link from 'next/link';
-import {OwLogo} from '@/components/ow-ui/ow-logo';
+import {OwLogo} from '@/components/owui/ow-logo';
import {TOOLS} from '@/lib/tools';
import {cn} from '@/lib/utils';
import {ROUTES} from '@/lib/routes';
diff --git a/components/layout/header.tsx b/components/layout/header.tsx
index dd2dc0c1..116893fc 100644
--- a/components/layout/header.tsx
+++ b/components/layout/header.tsx
@@ -2,7 +2,7 @@ import {getBanks, getCards, getNetworks, isHybridCard} from '@/lib/api';
import {MobileNav} from './mobile-nav';
import {SearchDialog} from '@/components/search/search-dialog';
import {Nav2} from "@/components/layout/nav2";
-import {OwLogo} from "@/components/ow-ui/ow-logo";
+import {OwLogo} from "@/components/owui/ow-logo";
import {DiscordButton} from "@/components/layout/discord-button";
const NETWORK_TIER_FILTER = 'visa:infinite,visa:signature,mastercard:world-elite,mastercard:world,amex:platinum,jcb:ultimate';
diff --git a/components/layout/logo.tsx b/components/layout/logo.tsx
index efb30303..3be3bef8 100644
--- a/components/layout/logo.tsx
+++ b/components/layout/logo.tsx
@@ -1 +1 @@
-export { OwLogo as Logo } from '@/components/ow-ui/ow-logo';
+export { OwLogo as Logo } from '@/components/owui/ow-logo';
diff --git a/components/marketing/banks-section.tsx b/components/marketing/banks-section.tsx
index aa8d4454..32f2fd26 100644
--- a/components/marketing/banks-section.tsx
+++ b/components/marketing/banks-section.tsx
@@ -1,6 +1,6 @@
import Link from 'next/link';
import {getBanks} from '@/lib/api';
-import {OwBankRow} from '@/components/ow-ui/ow-bank-row';
+import {OwBankRow} from '@/components/owui/ow-bank-row';
import {ROUTES} from '@/lib/routes';
interface Props {
diff --git a/components/marketing/card-ranking-table.tsx b/components/marketing/card-ranking-table.tsx
index 530a9bd7..beb512cd 100644
--- a/components/marketing/card-ranking-table.tsx
+++ b/components/marketing/card-ranking-table.tsx
@@ -2,7 +2,7 @@
import {useState} from 'react';
import type {RankedCard} from '@/lib/card-ranker';
-import {OwCardRankedRow} from '@/components/ow-ui/ow-card-ranked-row';
+import {OwCardRankedRow} from '@/components/owui/ow-card-ranked-row';
import {IconInfoCircle} from '@tabler/icons-react';
interface Props {
diff --git a/components/marketing/cards-catalog-teaser.tsx b/components/marketing/cards-catalog-teaser.tsx
index 27e8b3c2..aca0b794 100644
--- a/components/marketing/cards-catalog-teaser.tsx
+++ b/components/marketing/cards-catalog-teaser.tsx
@@ -1,7 +1,7 @@
import Link from 'next/link';
import type {Bank, Card} from '@/lib/api';
import {CardDisplay} from '@/components/cards/variants/card-display';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
import {ROUTES} from '@/lib/routes';
interface Props {
diff --git a/components/marketing/category-seo-section.tsx b/components/marketing/category-seo-section.tsx
index a45a1521..231dbcdf 100644
--- a/components/marketing/category-seo-section.tsx
+++ b/components/marketing/category-seo-section.tsx
@@ -1,5 +1,5 @@
import type { ReactNode } from 'react';
-import { OwAccordion } from '@/components/ow-ui/ow-accordion';
+import { OwAccordion } from '@/components/owui/ow-accordion';
export function PersonaIntro({intro}: {intro: ReactNode}) {
return (
diff --git a/components/marketing/contact-form.tsx b/components/marketing/contact-form.tsx
index 28b7bce5..443ea10c 100644
--- a/components/marketing/contact-form.tsx
+++ b/components/marketing/contact-form.tsx
@@ -1,4 +1,4 @@
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
const TO = 'hello@openwallet.vn';
diff --git a/components/marketing/faq-section.tsx b/components/marketing/faq-section.tsx
index 4b471938..6a70ce0b 100644
--- a/components/marketing/faq-section.tsx
+++ b/components/marketing/faq-section.tsx
@@ -1,4 +1,4 @@
-import {OwAccordion} from '@/components/ow-ui/ow-accordion';
+import {OwAccordion} from '@/components/owui/ow-accordion';
import NeuralBackground from "@/components/ui/flow-field-background";
import Link from 'next/link';
diff --git a/components/marketing/hero-section.tsx b/components/marketing/hero-section.tsx
index 470775fe..9545bf47 100644
--- a/components/marketing/hero-section.tsx
+++ b/components/marketing/hero-section.tsx
@@ -2,9 +2,9 @@ import Image from 'next/image';
import Link from 'next/link';
import {IconCircleCheck, IconCreditCard, IconSettings} from '@tabler/icons-react';
import {ROUTES} from '@/lib/routes';
-import {OwBadgeNumberIcon} from '@/components/ow-ui/ow-badge-number-icon';
-import {OwCardImage} from '@/components/ow-ui/ow-card-image';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwBadgeNumberIcon} from '@/components/owui/ow-badge-number-icon';
+import {OwCardImage} from '@/components/owui/ow-card-image';
+import {OwButton} from '@/components/owui/ow-button';
import {OpenOwieButton} from '@/components/chat/open-owie-button';
export function HeroSection({cardCount, bankCount}: { cardCount: number; bankCount: number }) {
diff --git a/components/marketing/persona-categories.tsx b/components/marketing/persona-categories.tsx
index 74e2e6f0..11dce8c9 100644
--- a/components/marketing/persona-categories.tsx
+++ b/components/marketing/persona-categories.tsx
@@ -1,5 +1,5 @@
import {PersonaModel} from '@/lib/persona-model';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwButton} from '@/components/owui/ow-button';
function CategoryLink({persona}: {persona: PersonaModel}) {
if (!persona.isAvailable()) {
diff --git a/components/marketing/recent-posts-section.tsx b/components/marketing/recent-posts-section.tsx
index 53e6a5c2..f6bdd7ea 100644
--- a/components/marketing/recent-posts-section.tsx
+++ b/components/marketing/recent-posts-section.tsx
@@ -1,5 +1,5 @@
import {getAllPosts} from '@/lib/mdx';
-import {OwFeaturedPosts} from '@/components/ow-ui/ow-featured-posts';
+import {OwFeaturedPosts} from '@/components/owui/ow-featured-posts';
export function RecentPostsSection() {
const posts = getAllPosts().slice(0, 4);
diff --git a/components/marketing/tools-section.tsx b/components/marketing/tools-section.tsx
index 0f9d327e..03ef148d 100644
--- a/components/marketing/tools-section.tsx
+++ b/components/marketing/tools-section.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import Link from 'next/link';
import {ROUTES} from '@/lib/routes';
-import {OwWobbleCard} from '@/components/ow-ui/ow-wobble-card';
+import {OwWobbleCard} from '@/components/owui/ow-wobble-card';
const TOOLS: {name: string; href: string; description: React.ReactNode; color: string}[] = [
{
diff --git a/components/match/card-match-finder.tsx b/components/match/card-match-finder.tsx
index 8107657e..bf9db76a 100644
--- a/components/match/card-match-finder.tsx
+++ b/components/match/card-match-finder.tsx
@@ -5,10 +5,10 @@ import {usePathname, useRouter, useSearchParams} from 'next/navigation';
import {getTool} from '@/lib/tools';
import type {Intent, Persona} from '@/lib/api';
import type {RankedCard} from '@/lib/card-ranker';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
-import {OwCardRankedRow} from '@/components/ow-ui/ow-card-ranked-row';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
+import {OwCardRankedRow} from '@/components/owui/ow-card-ranked-row';
import {cn} from "@/lib/utils";
-import {OwRangeSlider} from '@/components/ow-ui/ow-range-slider';
+import {OwRangeSlider} from '@/components/owui/ow-range-slider';
const STORAGE_KEY = 'ow-rec-prefs';
const cardMatchHref = getTool('Card Match').href;
diff --git a/components/ow-ui/ow-tooltip.tsx b/components/ow-ui/ow-tooltip.tsx
deleted file mode 100644
index 485f9f17..00000000
--- a/components/ow-ui/ow-tooltip.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-"use client";
-
-import React, {useId} from "react";
-import {cn} from "@/lib/utils";
-
-type TooltipAlign = "top" | "bottom";
-
-export interface OwTooltipProps {
- children: React.ReactNode;
- tooltip?: string | React.ReactNode;
- tooltipAlign?: TooltipAlign;
- className?: string;
- classNameTooltip?: string;
-}
-
-const TOOLTIP_STYLES = `
- @keyframes tooltip-enter-top {
- from { opacity: 0; transform: translateY(10px) scale(0.9) rotate(0deg); }
- to { opacity: 1; transform: translateY(0) scale(1) rotate(var(--tooltip-rotation)); }
- }
- @keyframes tooltip-enter-bottom {
- from { opacity: 0; transform: translateY(-10px) scale(0.9) rotate(0deg); }
- to { opacity: 1; transform: translateY(0) scale(1) rotate(var(--tooltip-rotation)); }
- }
- @keyframes tooltip-exit {
- from { opacity: 1; transform: translateY(0) scale(1) rotate(0deg); }
- to { opacity: 0; transform: translateY(-8px) scale(0.95); }
- }
- .tooltip {
- opacity: 0;
- animation: tooltip-exit 0.15s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
- }
- .tooltip-wrapper:hover .tooltip {
- opacity: 1;
- animation: tooltip-enter-top 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
- }
- .tooltip-wrapper[data-tooltip-align="bottom"]:hover .tooltip {
- animation: tooltip-enter-bottom 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
- }
-`;
-
-export function OwTooltip({
- tooltip,
- tooltipAlign = "top",
- className,
- classNameTooltip,
- children,
-}: OwTooltipProps) {
- const id = useId();
-
- const rotation = React.useMemo(
- () => Math.floor(Math.random() * 11) - 5,
- []
- );
-
- const tooltipStyle = React.useMemo(
- () => ({"--tooltip-rotation": `${rotation}deg`} as React.CSSProperties),
- [rotation]
- );
-
- return (
- <>
-
-
-
- {children}
-
-
- {tooltip && (
-
- {tooltip}
-
- )}
-
- >
- );
-}
diff --git a/components/ow-ui/ow-typing-bubble.stories.tsx b/components/owai/ow-typing-bubble.stories.tsx
similarity index 92%
rename from components/ow-ui/ow-typing-bubble.stories.tsx
rename to components/owai/ow-typing-bubble.stories.tsx
index 9ab1c879..722f28ac 100644
--- a/components/ow-ui/ow-typing-bubble.stories.tsx
+++ b/components/owai/ow-typing-bubble.stories.tsx
@@ -1,10 +1,10 @@
import type {Meta, StoryObj} from '@storybook/nextjs-vite';
import {OwTypingBubble} from './ow-typing-bubble';
-import {OwStories, OwStorySection} from './ow-story-section';
+import {OwStories, OwStorySection} from "@/components/owui/ow-story-section";
const meta: Meta = {
component: OwTypingBubble,
- title: 'Assistant UI/OwTypingBubble',
+ title: 'OW AI/OwTypingBubble',
tags: ['autodocs'],
parameters: {
docs: {
diff --git a/components/ow-ui/ow-typing-bubble.tsx b/components/owai/ow-typing-bubble.tsx
similarity index 96%
rename from components/ow-ui/ow-typing-bubble.tsx
rename to components/owai/ow-typing-bubble.tsx
index f74cd264..aac54dde 100644
--- a/components/ow-ui/ow-typing-bubble.tsx
+++ b/components/owai/ow-typing-bubble.tsx
@@ -1,4 +1,4 @@
-import {OwLogo} from "@/components/ow-ui/ow-logo";
+import {OwLogo} from "@/components/owui/ow-logo";
import type {FC} from "react";
export const OwTypingBubble: FC<{ visible?: boolean }> = ({visible = true}) => {
diff --git a/components/ow-ui/ow-accordion.stories.tsx b/components/owui/ow-accordion.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-accordion.stories.tsx
rename to components/owui/ow-accordion.stories.tsx
diff --git a/components/ow-ui/ow-accordion.tsx b/components/owui/ow-accordion.tsx
similarity index 100%
rename from components/ow-ui/ow-accordion.tsx
rename to components/owui/ow-accordion.tsx
diff --git a/components/ow-ui/ow-alert.stories.tsx b/components/owui/ow-alert.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-alert.stories.tsx
rename to components/owui/ow-alert.stories.tsx
diff --git a/components/ow-ui/ow-alert.tsx b/components/owui/ow-alert.tsx
similarity index 100%
rename from components/ow-ui/ow-alert.tsx
rename to components/owui/ow-alert.tsx
diff --git a/components/ow-ui/ow-amount.stories.tsx b/components/owui/ow-amount.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-amount.stories.tsx
rename to components/owui/ow-amount.stories.tsx
diff --git a/components/ow-ui/ow-amount.tsx b/components/owui/ow-amount.tsx
similarity index 100%
rename from components/ow-ui/ow-amount.tsx
rename to components/owui/ow-amount.tsx
diff --git a/components/ow-ui/ow-badge-number-icon.stories.tsx b/components/owui/ow-badge-number-icon.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-badge-number-icon.stories.tsx
rename to components/owui/ow-badge-number-icon.stories.tsx
diff --git a/components/ow-ui/ow-badge-number-icon.tsx b/components/owui/ow-badge-number-icon.tsx
similarity index 100%
rename from components/ow-ui/ow-badge-number-icon.tsx
rename to components/owui/ow-badge-number-icon.tsx
diff --git a/components/ow-ui/ow-badge.stories.tsx b/components/owui/ow-badge.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-badge.stories.tsx
rename to components/owui/ow-badge.stories.tsx
diff --git a/components/ow-ui/ow-badge.tsx b/components/owui/ow-badge.tsx
similarity index 100%
rename from components/ow-ui/ow-badge.tsx
rename to components/owui/ow-badge.tsx
diff --git a/components/ow-ui/ow-bank-image.stories.tsx b/components/owui/ow-bank-image.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-bank-image.stories.tsx
rename to components/owui/ow-bank-image.stories.tsx
diff --git a/components/ow-ui/ow-bank-image.tsx b/components/owui/ow-bank-image.tsx
similarity index 100%
rename from components/ow-ui/ow-bank-image.tsx
rename to components/owui/ow-bank-image.tsx
diff --git a/components/ow-ui/ow-bank-row.stories.tsx b/components/owui/ow-bank-row.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-bank-row.stories.tsx
rename to components/owui/ow-bank-row.stories.tsx
diff --git a/components/ow-ui/ow-bank-row.tsx b/components/owui/ow-bank-row.tsx
similarity index 93%
rename from components/ow-ui/ow-bank-row.tsx
rename to components/owui/ow-bank-row.tsx
index 637639d6..d8270a1a 100644
--- a/components/ow-ui/ow-bank-row.tsx
+++ b/components/owui/ow-bank-row.tsx
@@ -3,10 +3,10 @@
import Link from 'next/link';
import type {Bank} from '@/lib/api';
import {BankModel} from '@/lib/bank-model';
-import {OwBankImage} from '@/components/ow-ui/ow-bank-image';
-import {OwButton} from '@/components/ow-ui/ow-button';
+import {OwBankImage} from '@/components/owui/ow-bank-image';
+import {OwButton} from '@/components/owui/ow-button';
import {IconAffiliateFilled, IconCreditCardFilled} from "@tabler/icons-react";
-import {OwBadge} from "@/components/ow-ui/ow-badge";
+import {OwBadge} from "@/components/owui/ow-badge";
interface Props {
bank: Bank;
diff --git a/components/ow-ui/ow-button-header.stories.tsx b/components/owui/ow-button-header.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-button-header.stories.tsx
rename to components/owui/ow-button-header.stories.tsx
diff --git a/components/ow-ui/ow-button-header.tsx b/components/owui/ow-button-header.tsx
similarity index 96%
rename from components/ow-ui/ow-button-header.tsx
rename to components/owui/ow-button-header.tsx
index 92d40ad3..361e24ca 100644
--- a/components/ow-ui/ow-button-header.tsx
+++ b/components/owui/ow-button-header.tsx
@@ -1,7 +1,7 @@
import * as React from "react"
import Link from "next/link"
import {cn} from "@/lib/utils"
-import {OwLogo} from "@/components/ow-ui/ow-logo"
+import {OwLogo} from "@/components/owui/ow-logo"
type Props = React.ComponentProps<"button"> & {
icon?: React.ReactNode
diff --git a/components/ow-ui/ow-button.stories.tsx b/components/owui/ow-button.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-button.stories.tsx
rename to components/owui/ow-button.stories.tsx
diff --git a/components/ow-ui/ow-button.tsx b/components/owui/ow-button.tsx
similarity index 100%
rename from components/ow-ui/ow-button.tsx
rename to components/owui/ow-button.tsx
diff --git a/components/ow-ui/ow-card-cashback-rule.stories.tsx b/components/owui/ow-card-cashback-rule.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-card-cashback-rule.stories.tsx
rename to components/owui/ow-card-cashback-rule.stories.tsx
diff --git a/components/ow-ui/ow-card-cashback-rule.tsx b/components/owui/ow-card-cashback-rule.tsx
similarity index 99%
rename from components/ow-ui/ow-card-cashback-rule.tsx
rename to components/owui/ow-card-cashback-rule.tsx
index ef9dd8c8..3c8afef7 100644
--- a/components/ow-ui/ow-card-cashback-rule.tsx
+++ b/components/owui/ow-card-cashback-rule.tsx
@@ -1,8 +1,8 @@
import type {CashbackRule, Merchant, SpendTier} from '@/lib/api';
import {IntentModel} from '@/lib/intent-model';
import {cn} from '@/lib/utils';
-import {OwBadge} from '@/components/ow-ui/ow-badge';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
+import {OwBadge} from '@/components/owui/ow-badge';
+import {OwAmount} from '@/components/owui/ow-amount';
import {CATCHALL_SLUGS} from '@/lib/cashback-utils';
import {
IconBuildingStore,
diff --git a/components/ow-ui/ow-card-image.stories.tsx b/components/owui/ow-card-image.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-card-image.stories.tsx
rename to components/owui/ow-card-image.stories.tsx
diff --git a/components/ow-ui/ow-card-image.tsx b/components/owui/ow-card-image.tsx
similarity index 100%
rename from components/ow-ui/ow-card-image.tsx
rename to components/owui/ow-card-image.tsx
diff --git a/components/ow-ui/ow-card-intent-badges.stories.tsx b/components/owui/ow-card-intent-badges.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-card-intent-badges.stories.tsx
rename to components/owui/ow-card-intent-badges.stories.tsx
diff --git a/components/ow-ui/ow-card-intent-badges.tsx b/components/owui/ow-card-intent-badges.tsx
similarity index 96%
rename from components/ow-ui/ow-card-intent-badges.tsx
rename to components/owui/ow-card-intent-badges.tsx
index fddf329d..bdf53187 100644
--- a/components/ow-ui/ow-card-intent-badges.tsx
+++ b/components/owui/ow-card-intent-badges.tsx
@@ -3,7 +3,7 @@
import type {Card, Intent} from '@/lib/api';
import {IntentModel} from '@/lib/intent-model';
import {CardModel} from '@/lib/card-model';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
import {useIntentMap} from '@/lib/intent-map-context';
export interface IntentItem {
diff --git a/components/ow-ui/ow-card-ranked-row.stories.tsx b/components/owui/ow-card-ranked-row.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-card-ranked-row.stories.tsx
rename to components/owui/ow-card-ranked-row.stories.tsx
diff --git a/components/ow-ui/ow-card-ranked-row.tsx b/components/owui/ow-card-ranked-row.tsx
similarity index 97%
rename from components/ow-ui/ow-card-ranked-row.tsx
rename to components/owui/ow-card-ranked-row.tsx
index 633b602d..9975ce6b 100644
--- a/components/ow-ui/ow-card-ranked-row.tsx
+++ b/components/owui/ow-card-ranked-row.tsx
@@ -4,11 +4,11 @@ import type {RankedCard} from '@/lib/card-ranker';
import {CATCHALL_SLUGS} from '@/lib/card-display-utils';
import {IconAlertTriangle, IconBulb, IconCaretDownFilled, IconCaretUpFilled} from '@tabler/icons-react';
import {CardModel} from '@/lib/card-model';
-import {OwCardImage} from '@/components/ow-ui/ow-card-image';
-import {OwRankBadge} from '@/components/ow-ui/ow-rank-badge';
-import {OwAmount} from '@/components/ow-ui/ow-amount';
-import {OwBadge, OwBadges} from '@/components/ow-ui/ow-badge';
-import {OwCardIntentBadges} from '@/components/ow-ui/ow-card-intent-badges';
+import {OwCardImage} from '@/components/owui/ow-card-image';
+import {OwRankBadge} from '@/components/owui/ow-rank-badge';
+import {OwAmount} from '@/components/owui/ow-amount';
+import {OwBadge, OwBadges} from '@/components/owui/ow-badge';
+import {OwCardIntentBadges} from '@/components/owui/ow-card-intent-badges';
type IntentMap = Map>;
diff --git a/components/ow-ui/ow-featured-posts.stories.tsx b/components/owui/ow-featured-posts.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-featured-posts.stories.tsx
rename to components/owui/ow-featured-posts.stories.tsx
diff --git a/components/ow-ui/ow-featured-posts.tsx b/components/owui/ow-featured-posts.tsx
similarity index 98%
rename from components/ow-ui/ow-featured-posts.tsx
rename to components/owui/ow-featured-posts.tsx
index 7d3fecef..26237264 100644
--- a/components/ow-ui/ow-featured-posts.tsx
+++ b/components/owui/ow-featured-posts.tsx
@@ -3,7 +3,7 @@ import type {Post} from '@/lib/mdx';
import {resolvePosts} from '@/lib/posts-utils';
import {ROUTES} from '@/lib/routes';
import {OwPostCategoryDate} from './ow-post-category-date';
-import {OwButton} from "@/components/ow-ui/ow-button";
+import {OwButton} from "@/components/owui/ow-button";
function FeaturedGridItem({post}: { post: Post }) {
return (
diff --git a/components/ow-ui/ow-logo.stories.tsx b/components/owui/ow-logo.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-logo.stories.tsx
rename to components/owui/ow-logo.stories.tsx
diff --git a/components/ow-ui/ow-logo.tsx b/components/owui/ow-logo.tsx
similarity index 100%
rename from components/ow-ui/ow-logo.tsx
rename to components/owui/ow-logo.tsx
diff --git a/components/ow-ui/ow-owie-fab.stories.tsx b/components/owui/ow-owie-fab.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-owie-fab.stories.tsx
rename to components/owui/ow-owie-fab.stories.tsx
diff --git a/components/ow-ui/ow-owie-fab.tsx b/components/owui/ow-owie-fab.tsx
similarity index 94%
rename from components/ow-ui/ow-owie-fab.tsx
rename to components/owui/ow-owie-fab.tsx
index da0b81a6..441609a8 100644
--- a/components/ow-ui/ow-owie-fab.tsx
+++ b/components/owui/ow-owie-fab.tsx
@@ -3,8 +3,8 @@
import * as React from 'react';
import {usePathname, useRouter} from 'next/navigation';
import {cn} from '@/lib/utils';
-import {OwLogo} from '@/components/ow-ui/ow-logo';
-import {OwTooltip} from '@/components/ow-ui/ow-tooltip';
+import {OwLogo} from '@/components/owui/ow-logo';
+import {OwTooltip} from '@/components/owui/ow-tooltip';
import {useChatContext} from '@/components/chat/chat-provider';
import {MovingBorder} from '@/components/phucbm/moving-border';
diff --git a/components/ow-ui/ow-post-category-date.tsx b/components/owui/ow-post-category-date.tsx
similarity index 100%
rename from components/ow-ui/ow-post-category-date.tsx
rename to components/owui/ow-post-category-date.tsx
diff --git a/components/ow-ui/ow-post-list.stories.tsx b/components/owui/ow-post-list.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-post-list.stories.tsx
rename to components/owui/ow-post-list.stories.tsx
diff --git a/components/ow-ui/ow-post-list.tsx b/components/owui/ow-post-list.tsx
similarity index 100%
rename from components/ow-ui/ow-post-list.tsx
rename to components/owui/ow-post-list.tsx
diff --git a/components/ow-ui/ow-range-slider.stories.tsx b/components/owui/ow-range-slider.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-range-slider.stories.tsx
rename to components/owui/ow-range-slider.stories.tsx
diff --git a/components/ow-ui/ow-range-slider.tsx b/components/owui/ow-range-slider.tsx
similarity index 97%
rename from components/ow-ui/ow-range-slider.tsx
rename to components/owui/ow-range-slider.tsx
index 11351a73..f764e854 100644
--- a/components/ow-ui/ow-range-slider.tsx
+++ b/components/owui/ow-range-slider.tsx
@@ -2,7 +2,7 @@
import {Slider, Tooltip} from 'radix-ui';
import {cn} from '@/lib/utils';
-import {OwLogo} from '@/components/ow-ui/ow-logo';
+import {OwLogo} from '@/components/owui/ow-logo';
export interface OwRangeSliderProps {
min?: number;
diff --git a/components/ow-ui/ow-rank-badge.stories.tsx b/components/owui/ow-rank-badge.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-rank-badge.stories.tsx
rename to components/owui/ow-rank-badge.stories.tsx
diff --git a/components/ow-ui/ow-rank-badge.tsx b/components/owui/ow-rank-badge.tsx
similarity index 100%
rename from components/ow-ui/ow-rank-badge.tsx
rename to components/owui/ow-rank-badge.tsx
diff --git a/components/ow-ui/ow-source-list.stories.tsx b/components/owui/ow-source-list.stories.tsx
similarity index 100%
rename from components/ow-ui/ow-source-list.stories.tsx
rename to components/owui/ow-source-list.stories.tsx
diff --git a/components/ow-ui/ow-source-list.tsx b/components/owui/ow-source-list.tsx
similarity index 100%
rename from components/ow-ui/ow-source-list.tsx
rename to components/owui/ow-source-list.tsx
diff --git a/components/ow-ui/ow-story-constants.ts b/components/owui/ow-story-constants.ts
similarity index 100%
rename from components/ow-ui/ow-story-constants.ts
rename to components/owui/ow-story-constants.ts
diff --git a/components/ow-ui/ow-story-section.tsx b/components/owui/ow-story-section.tsx
similarity index 100%
rename from components/ow-ui/ow-story-section.tsx
rename to components/owui/ow-story-section.tsx
diff --git a/components/owui/ow-tooltip-icon-button.stories.tsx b/components/owui/ow-tooltip-icon-button.stories.tsx
new file mode 100644
index 00000000..527fae40
--- /dev/null
+++ b/components/owui/ow-tooltip-icon-button.stories.tsx
@@ -0,0 +1,86 @@
+import type {Meta, StoryObj} from '@storybook/nextjs-vite';
+import {OwTooltipIconButton} from './ow-tooltip-icon-button';
+import {OwStories, OwStorySection} from './ow-story-section';
+import {Copy, Heart, Share2, Trash2} from 'lucide-react';
+
+const meta: Meta = {
+ component: OwTooltipIconButton,
+ title: 'OW UI/OwTooltipIconButton',
+ tags: ['autodocs'],
+ parameters: {
+ docs: {
+ description: {
+ component: [
+ 'Ghost icon button with animated `OwTooltip`. Forwards ref to underlying `