refactor(icons): migrate workspace to Icones

This commit is contained in:
Maofeng
2026-09-20 15:52:22 +08:00
parent 1fc56b6982
commit ea00a71112
95 changed files with 1409 additions and 725 deletions
+8
View File
@@ -0,0 +1,8 @@
---
name: "icones"
description: "The same icon vocabulary, with an API that belongs in your React application."
---
Up-to-date icones documentation for this project. Read it before working with icones:
https://icones.go-slim.dev/llms/react/llms-full.txt
+3 -4
View File
@@ -19,7 +19,7 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@floating-ui/utils": "^0.2.12", "@floating-ui/utils": "^0.2.12",
"@iconify/react": "^6.0.2", "@icones/react": "^0.0.1",
"@lingui/core": "^6", "@lingui/core": "^6",
"@tanstack/react-form": "^1.33.2", "@tanstack/react-form": "^1.33.2",
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
@@ -27,12 +27,10 @@
"@tanstack/react-router": "^1.170.18", "@tanstack/react-router": "^1.170.18",
"@tanstack/react-start": "^1.168.32", "@tanstack/react-start": "^1.168.32",
"@workspace/blocks": "workspace:*", "@workspace/blocks": "workspace:*",
"@workspace/icons": "workspace:*",
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/lexical": "workspace:*", "@workspace/lexical": "workspace:*",
"@workspace/search": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"country-flag-icons": "^1.6.20",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-day-picker": "^10.0.1", "react-day-picker": "^10.0.1",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
@@ -40,6 +38,7 @@
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4", "@tailwindcss/vite": "^4",
"@icones/vite": "^0.0.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@types/node": "^24", "@types/node": "^24",
"@types/react": "^19", "@types/react": "^19",
+1 -1
View File
@@ -8,7 +8,7 @@ import {
TriangleAlertIcon, TriangleAlertIcon,
OctagonXIcon, OctagonXIcon,
Loader2Icon, Loader2Icon,
} from "lucide-react" } from "@workspace/ui/components/icon"
const Toaster = ({ ...props }: ToasterProps) => { const Toaster = ({ ...props }: ToasterProps) => {
const [themeMode] = useUiState("theme-mode") const [themeMode] = useUiState("theme-mode")
+77 -137
View File
@@ -1,63 +1,3 @@
import {
Alert02Icon,
Analytics01Icon,
AnalyticsUpIcon,
AppWindowIcon,
ArrowDataTransferHorizontalIcon,
BubbleChatIcon,
Calculator01Icon,
CallMissed01Icon,
CancelCircleIcon,
Chart01Icon,
ChartIncreaseIcon,
CheckmarkBadge01Icon,
CheckmarkCircle01Icon,
ClipboardListIcon,
Clock01Icon,
CodeSquareIcon,
Compass01Icon,
CreditCardIcon,
CrownIcon,
Delete02Icon,
DeliveryTruck01Icon,
Discount01Icon,
File01Icon,
GalleryHorizontalIcon,
GiftIcon,
HistoryIcon,
IdentityCardIcon,
InboxDownloadIcon,
InboxUploadIcon,
Invoice03Icon,
Key01Icon,
LinkCircleIcon,
Location01Icon,
LockKeyIcon,
Medal01Icon,
MoneySendSquareIcon,
Note01Icon,
Package02Icon,
PackageIcon,
Refresh01Icon,
RoadLocation01Icon,
SecurityWarningIcon,
Settings01Icon,
Settings03Icon,
Share01Icon,
ShoppingBag01Icon,
ShoppingCart01Icon,
StarCircleIcon,
StarIcon,
Store01Icon,
Structure01Icon,
Task01Icon,
Ticket01Icon,
UserGroupIcon,
UserShield01Icon,
Wallet01Icon,
WalletCardsIcon,
} from "@workspace/icons"
import type { NavigationGroup } from "@workspace/blocks/navigation" import type { NavigationGroup } from "@workspace/blocks/navigation"
import { navigationMessages } from "./navigation-messages" import { navigationMessages } from "./navigation-messages"
@@ -71,19 +11,19 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "overview-dashboard", id: "overview-dashboard",
to: "/", to: "/",
label: navigationMessages["overview-dashboard"], label: navigationMessages["overview-dashboard"],
icon: Analytics01Icon, icon: "huge:analytics-01",
}, },
{ {
id: "overview-realtime", id: "overview-realtime",
to: "/analytics/realtime", to: "/analytics/realtime",
label: navigationMessages["overview-realtime"], label: navigationMessages["overview-realtime"],
icon: AnalyticsUpIcon, icon: "huge:analytics-up",
}, },
{ {
id: "overview-tasks", id: "overview-tasks",
to: "/workspace/tasks", to: "/workspace/tasks",
label: navigationMessages["overview-tasks"], label: navigationMessages["overview-tasks"],
icon: Task01Icon, icon: "huge:task-01",
}, },
], ],
}, },
@@ -94,42 +34,42 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
{ {
id: "catalog-products", id: "catalog-products",
label: navigationMessages["catalog-products"], label: navigationMessages["catalog-products"],
icon: ShoppingBag01Icon, icon: "huge:shopping-bag-01",
items: [ items: [
{ {
id: "catalog-products-list", id: "catalog-products-list",
to: "/catalog/products/list", to: "/catalog/products/list",
label: navigationMessages["catalog-products-list"], label: navigationMessages["catalog-products-list"],
icon: ShoppingBag01Icon, icon: "huge:shopping-bag-01",
}, },
{ {
id: "catalog-products-drafts", id: "catalog-products-drafts",
to: "/catalog/products/drafts", to: "/catalog/products/drafts",
label: navigationMessages["catalog-products-drafts"], label: navigationMessages["catalog-products-drafts"],
icon: File01Icon, icon: "huge:file-01",
}, },
{ {
id: "catalog-products-bundles", id: "catalog-products-bundles",
to: "/catalog/products/bundles", to: "/catalog/products/bundles",
label: navigationMessages["catalog-products-bundles"], label: navigationMessages["catalog-products-bundles"],
icon: Package02Icon, icon: "huge:package-02",
}, },
{ {
id: "catalog-products-attributes", id: "catalog-products-attributes",
label: navigationMessages["catalog-products-attributes"], label: navigationMessages["catalog-products-attributes"],
icon: Settings03Icon, icon: "huge:settings-03",
items: [ items: [
{ {
id: "catalog-product-specifications", id: "catalog-product-specifications",
to: "/catalog/products/attributes/specifications", to: "/catalog/products/attributes/specifications",
label: navigationMessages["catalog-product-specifications"], label: navigationMessages["catalog-product-specifications"],
icon: ClipboardListIcon, icon: "huge:clipboard",
}, },
{ {
id: "catalog-product-brands", id: "catalog-product-brands",
to: "/catalog/products/attributes/brands", to: "/catalog/products/attributes/brands",
label: navigationMessages["catalog-product-brands"], label: navigationMessages["catalog-product-brands"],
icon: StarIcon, icon: "huge:star",
}, },
], ],
}, },
@@ -139,19 +79,19 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "catalog-categories", id: "catalog-categories",
to: "/catalog/categories", to: "/catalog/categories",
label: navigationMessages["catalog-categories"], label: navigationMessages["catalog-categories"],
icon: ClipboardListIcon, icon: "huge:clipboard",
items: [ items: [
{ {
id: "catalog-category-tree", id: "catalog-category-tree",
to: "/catalog/categories/tree", to: "/catalog/categories/tree",
label: navigationMessages["catalog-category-tree"], label: navigationMessages["catalog-category-tree"],
icon: Structure01Icon, icon: "huge:structure-01",
}, },
{ {
id: "catalog-category-navigation", id: "catalog-category-navigation",
to: "/catalog/categories/navigation", to: "/catalog/categories/navigation",
label: navigationMessages["catalog-category-navigation"], label: navigationMessages["catalog-category-navigation"],
icon: Compass01Icon, icon: "huge:compass-01",
}, },
], ],
}, },
@@ -159,37 +99,37 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "inventory-center", id: "inventory-center",
to: "/inventory", to: "/inventory",
label: navigationMessages["inventory-center"], label: navigationMessages["inventory-center"],
icon: PackageIcon, icon: "huge:package",
items: [ items: [
{ {
id: "inventory-overview", id: "inventory-overview",
to: "/inventory/overview", to: "/inventory/overview",
label: navigationMessages["inventory-overview"], label: navigationMessages["inventory-overview"],
icon: Chart01Icon, icon: "huge:chart-01",
}, },
{ {
id: "inventory-inbound", id: "inventory-inbound",
to: "/inventory/inbound", to: "/inventory/inbound",
label: navigationMessages["inventory-inbound"], label: navigationMessages["inventory-inbound"],
icon: InboxDownloadIcon, icon: "huge:inbox-download",
}, },
{ {
id: "inventory-outbound", id: "inventory-outbound",
to: "/inventory/outbound", to: "/inventory/outbound",
label: navigationMessages["inventory-outbound"], label: navigationMessages["inventory-outbound"],
icon: InboxUploadIcon, icon: "huge:inbox-upload",
}, },
{ {
id: "inventory-transfers", id: "inventory-transfers",
to: "/inventory/transfers", to: "/inventory/transfers",
label: navigationMessages["inventory-transfers"], label: navigationMessages["inventory-transfers"],
icon: ArrowDataTransferHorizontalIcon, icon: "huge:arrow-data-transfer-horizontal",
}, },
{ {
id: "inventory-alerts", id: "inventory-alerts",
to: "/inventory/alerts", to: "/inventory/alerts",
label: navigationMessages["inventory-alerts"], label: navigationMessages["inventory-alerts"],
icon: Alert02Icon, icon: "huge:alert-02",
}, },
], ],
}, },
@@ -197,25 +137,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "content-assets", id: "content-assets",
to: "/content", to: "/content",
label: navigationMessages["content-assets"], label: navigationMessages["content-assets"],
icon: File01Icon, icon: "huge:file-01",
items: [ items: [
{ {
id: "content-articles", id: "content-articles",
to: "/content/articles", to: "/content/articles",
label: navigationMessages["content-articles"], label: navigationMessages["content-articles"],
icon: File01Icon, icon: "huge:file-01",
}, },
{ {
id: "content-media", id: "content-media",
to: "/content/media", to: "/content/media",
label: navigationMessages["content-media"], label: navigationMessages["content-media"],
icon: GalleryHorizontalIcon, icon: "huge:album-01",
}, },
{ {
id: "content-pages", id: "content-pages",
to: "/content/pages", to: "/content/pages",
label: navigationMessages["content-pages"], label: navigationMessages["content-pages"],
icon: AppWindowIcon, icon: "huge:browser",
}, },
], ],
}, },
@@ -229,37 +169,37 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "trade-orders", id: "trade-orders",
to: "/trade/orders", to: "/trade/orders",
label: navigationMessages["trade-orders"], label: navigationMessages["trade-orders"],
icon: ShoppingCart01Icon, icon: "huge:shopping-cart-01",
items: [ items: [
{ {
id: "trade-orders-awaiting-payment", id: "trade-orders-awaiting-payment",
to: "/trade/orders/awaiting-payment", to: "/trade/orders/awaiting-payment",
label: navigationMessages["trade-orders-awaiting-payment"], label: navigationMessages["trade-orders-awaiting-payment"],
icon: WalletCardsIcon, icon: "huge:wallet-cards",
}, },
{ {
id: "trade-orders-awaiting-shipment", id: "trade-orders-awaiting-shipment",
to: "/trade/orders/awaiting-shipment", to: "/trade/orders/awaiting-shipment",
label: navigationMessages["trade-orders-awaiting-shipment"], label: navigationMessages["trade-orders-awaiting-shipment"],
icon: PackageIcon, icon: "huge:package",
}, },
{ {
id: "trade-orders-shipped", id: "trade-orders-shipped",
to: "/trade/orders/shipped", to: "/trade/orders/shipped",
label: navigationMessages["trade-orders-shipped"], label: navigationMessages["trade-orders-shipped"],
icon: DeliveryTruck01Icon, icon: "huge:delivery-truck-01",
}, },
{ {
id: "trade-orders-completed", id: "trade-orders-completed",
to: "/trade/orders/completed", to: "/trade/orders/completed",
label: navigationMessages["trade-orders-completed"], label: navigationMessages["trade-orders-completed"],
icon: CheckmarkCircle01Icon, icon: "huge:checkmark-circle-01",
}, },
{ {
id: "trade-orders-canceled", id: "trade-orders-canceled",
to: "/trade/orders/canceled", to: "/trade/orders/canceled",
label: navigationMessages["trade-orders-canceled"], label: navigationMessages["trade-orders-canceled"],
icon: CancelCircleIcon, icon: "huge:cancel-circle",
}, },
], ],
}, },
@@ -267,25 +207,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "fulfillment-center", id: "fulfillment-center",
to: "/fulfillment", to: "/fulfillment",
label: navigationMessages["fulfillment-center"], label: navigationMessages["fulfillment-center"],
icon: DeliveryTruck01Icon, icon: "huge:delivery-truck-01",
items: [ items: [
{ {
id: "fulfillment-deliveries", id: "fulfillment-deliveries",
to: "/fulfillment/deliveries", to: "/fulfillment/deliveries",
label: navigationMessages["fulfillment-deliveries"], label: navigationMessages["fulfillment-deliveries"],
icon: Location01Icon, icon: "huge:location-01",
}, },
{ {
id: "fulfillment-pickups", id: "fulfillment-pickups",
to: "/fulfillment/pickups", to: "/fulfillment/pickups",
label: navigationMessages["fulfillment-pickups"], label: navigationMessages["fulfillment-pickups"],
icon: Store01Icon, icon: "huge:store-01",
}, },
{ {
id: "fulfillment-freight-rules", id: "fulfillment-freight-rules",
to: "/fulfillment/freight-rules", to: "/fulfillment/freight-rules",
label: navigationMessages["fulfillment-freight-rules"], label: navigationMessages["fulfillment-freight-rules"],
icon: RoadLocation01Icon, icon: "huge:road-location-01",
}, },
], ],
}, },
@@ -293,25 +233,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "after-sales-center", id: "after-sales-center",
to: "/after-sales", to: "/after-sales",
label: navigationMessages["after-sales-center"], label: navigationMessages["after-sales-center"],
icon: CallMissed01Icon, icon: "huge:call-missed-01",
items: [ items: [
{ {
id: "after-sales-returns", id: "after-sales-returns",
to: "/after-sales/returns", to: "/after-sales/returns",
label: navigationMessages["after-sales-returns"], label: navigationMessages["after-sales-returns"],
icon: Refresh01Icon, icon: "huge:refresh-01",
}, },
{ {
id: "after-sales-refunds", id: "after-sales-refunds",
to: "/after-sales/refunds", to: "/after-sales/refunds",
label: navigationMessages["after-sales-refunds"], label: navigationMessages["after-sales-refunds"],
icon: MoneySendSquareIcon, icon: "huge:money-send-square",
}, },
{ {
id: "after-sales-disputes", id: "after-sales-disputes",
to: "/after-sales/disputes", to: "/after-sales/disputes",
label: navigationMessages["after-sales-disputes"], label: navigationMessages["after-sales-disputes"],
icon: SecurityWarningIcon, icon: "huge:security-warning",
}, },
], ],
}, },
@@ -325,31 +265,31 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "customer-center", id: "customer-center",
to: "/customers", to: "/customers",
label: navigationMessages["customer-center"], label: navigationMessages["customer-center"],
icon: IdentityCardIcon, icon: "huge:identity-card",
items: [ items: [
{ {
id: "customer-profiles", id: "customer-profiles",
to: "/customers/profiles", to: "/customers/profiles",
label: navigationMessages["customer-profiles"], label: navigationMessages["customer-profiles"],
icon: IdentityCardIcon, icon: "huge:identity-card",
}, },
{ {
id: "customer-segments", id: "customer-segments",
to: "/customers/segments", to: "/customers/segments",
label: navigationMessages["customer-segments"], label: navigationMessages["customer-segments"],
icon: UserGroupIcon, icon: "huge:user-group",
}, },
{ {
id: "customer-tiers", id: "customer-tiers",
to: "/customers/tiers", to: "/customers/tiers",
label: navigationMessages["customer-tiers"], label: navigationMessages["customer-tiers"],
icon: CrownIcon, icon: "huge:crown",
}, },
{ {
id: "customer-risk-list", id: "customer-risk-list",
to: "/customers/risk-list", to: "/customers/risk-list",
label: navigationMessages["customer-risk-list"], label: navigationMessages["customer-risk-list"],
icon: SecurityWarningIcon, icon: "huge:security-warning",
}, },
], ],
}, },
@@ -357,31 +297,31 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "marketing-campaigns", id: "marketing-campaigns",
to: "/marketing/campaigns", to: "/marketing/campaigns",
label: navigationMessages["marketing-campaigns"], label: navigationMessages["marketing-campaigns"],
icon: Discount01Icon, icon: "huge:discount-01",
items: [ items: [
{ {
id: "marketing-coupons", id: "marketing-coupons",
to: "/marketing/coupons", to: "/marketing/coupons",
label: navigationMessages["marketing-coupons"], label: navigationMessages["marketing-coupons"],
icon: Ticket01Icon, icon: "huge:ticket-01",
}, },
{ {
id: "marketing-flash-sales", id: "marketing-flash-sales",
to: "/marketing/flash-sales", to: "/marketing/flash-sales",
label: navigationMessages["marketing-flash-sales"], label: navigationMessages["marketing-flash-sales"],
icon: Clock01Icon, icon: "huge:clock-01",
}, },
{ {
id: "marketing-gift-promotions", id: "marketing-gift-promotions",
to: "/marketing/gift-promotions", to: "/marketing/gift-promotions",
label: navigationMessages["marketing-gift-promotions"], label: navigationMessages["marketing-gift-promotions"],
icon: GiftIcon, icon: "huge:gift",
}, },
{ {
id: "marketing-referrals", id: "marketing-referrals",
to: "/marketing/referrals", to: "/marketing/referrals",
label: navigationMessages["marketing-referrals"], label: navigationMessages["marketing-referrals"],
icon: Share01Icon, icon: "huge:share-01",
}, },
], ],
}, },
@@ -389,25 +329,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "loyalty-center", id: "loyalty-center",
to: "/loyalty", to: "/loyalty",
label: navigationMessages["loyalty-center"], label: navigationMessages["loyalty-center"],
icon: Medal01Icon, icon: "huge:medal-01",
items: [ items: [
{ {
id: "loyalty-points", id: "loyalty-points",
to: "/loyalty/points", to: "/loyalty/points",
label: navigationMessages["loyalty-points"], label: navigationMessages["loyalty-points"],
icon: StarCircleIcon, icon: "huge:star-circle",
}, },
{ {
id: "loyalty-stored-value", id: "loyalty-stored-value",
to: "/loyalty/stored-value", to: "/loyalty/stored-value",
label: navigationMessages["loyalty-stored-value"], label: navigationMessages["loyalty-stored-value"],
icon: Wallet01Icon, icon: "huge:wallet-01",
}, },
{ {
id: "loyalty-benefits", id: "loyalty-benefits",
to: "/loyalty/benefits", to: "/loyalty/benefits",
label: navigationMessages["loyalty-benefits"], label: navigationMessages["loyalty-benefits"],
icon: CheckmarkBadge01Icon, icon: "huge:checkmark-badge-01",
}, },
], ],
}, },
@@ -421,31 +361,31 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "report-center", id: "report-center",
to: "/reports", to: "/reports",
label: navigationMessages["report-center"], label: navigationMessages["report-center"],
icon: Chart01Icon, icon: "huge:chart-01",
items: [ items: [
{ {
id: "report-sales", id: "report-sales",
to: "/reports/sales", to: "/reports/sales",
label: navigationMessages["report-sales"], label: navigationMessages["report-sales"],
icon: AnalyticsUpIcon, icon: "huge:analytics-up",
}, },
{ {
id: "report-products", id: "report-products",
to: "/reports/products", to: "/reports/products",
label: navigationMessages["report-products"], label: navigationMessages["report-products"],
icon: ShoppingBag01Icon, icon: "huge:shopping-bag-01",
}, },
{ {
id: "report-customers", id: "report-customers",
to: "/reports/customers", to: "/reports/customers",
label: navigationMessages["report-customers"], label: navigationMessages["report-customers"],
icon: UserGroupIcon, icon: "huge:user-group",
}, },
{ {
id: "report-channels", id: "report-channels",
to: "/reports/channels", to: "/reports/channels",
label: navigationMessages["report-channels"], label: navigationMessages["report-channels"],
icon: ChartIncreaseIcon, icon: "huge:chart-increase",
}, },
], ],
}, },
@@ -453,31 +393,31 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "finance-center", id: "finance-center",
to: "/finance", to: "/finance",
label: navigationMessages["finance-center"], label: navigationMessages["finance-center"],
icon: WalletCardsIcon, icon: "huge:wallet-cards",
items: [ items: [
{ {
id: "finance-settlements", id: "finance-settlements",
to: "/finance/settlements", to: "/finance/settlements",
label: navigationMessages["finance-settlements"], label: navigationMessages["finance-settlements"],
icon: Invoice03Icon, icon: "huge:invoice-03",
}, },
{ {
id: "finance-reconciliation", id: "finance-reconciliation",
to: "/finance/reconciliation", to: "/finance/reconciliation",
label: navigationMessages["finance-reconciliation"], label: navigationMessages["finance-reconciliation"],
icon: Calculator01Icon, icon: "huge:calculator-01",
}, },
{ {
id: "finance-invoices", id: "finance-invoices",
to: "/finance/invoices", to: "/finance/invoices",
label: navigationMessages["finance-invoices"], label: navigationMessages["finance-invoices"],
icon: File01Icon, icon: "huge:file-01",
}, },
{ {
id: "finance-payouts", id: "finance-payouts",
to: "/finance/payouts", to: "/finance/payouts",
label: navigationMessages["finance-payouts"], label: navigationMessages["finance-payouts"],
icon: MoneySendSquareIcon, icon: "huge:money-send-square",
}, },
], ],
}, },
@@ -491,25 +431,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "system-members", id: "system-members",
to: "/system/members", to: "/system/members",
label: navigationMessages["system-members"], label: navigationMessages["system-members"],
icon: UserShield01Icon, icon: "huge:user-shield-01",
items: [ items: [
{ {
id: "system-members-admins", id: "system-members-admins",
to: "/system/members/admins", to: "/system/members/admins",
label: navigationMessages["system-members-admins"], label: navigationMessages["system-members-admins"],
icon: UserShield01Icon, icon: "huge:user-shield-01",
}, },
{ {
id: "system-members-roles", id: "system-members-roles",
to: "/system/members/roles", to: "/system/members/roles",
label: navigationMessages["system-members-roles"], label: navigationMessages["system-members-roles"],
icon: UserGroupIcon, icon: "huge:user-group",
}, },
{ {
id: "system-members-permissions", id: "system-members-permissions",
to: "/system/members/permissions", to: "/system/members/permissions",
label: navigationMessages["system-members-permissions"], label: navigationMessages["system-members-permissions"],
icon: LockKeyIcon, icon: "huge:lock-key",
}, },
], ],
}, },
@@ -517,19 +457,19 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "system-notifications", id: "system-notifications",
to: "/system/notifications", to: "/system/notifications",
label: navigationMessages["system-notifications"], label: navigationMessages["system-notifications"],
icon: BubbleChatIcon, icon: "huge:bubble-chat",
items: [ items: [
{ {
id: "system-notification-templates", id: "system-notification-templates",
to: "/system/notifications/templates", to: "/system/notifications/templates",
label: navigationMessages["system-notification-templates"], label: navigationMessages["system-notification-templates"],
icon: File01Icon, icon: "huge:file-01",
}, },
{ {
id: "system-notification-logs", id: "system-notification-logs",
to: "/system/notifications/logs", to: "/system/notifications/logs",
label: navigationMessages["system-notification-logs"], label: navigationMessages["system-notification-logs"],
icon: HistoryIcon, icon: "huge:time-schedule",
}, },
], ],
}, },
@@ -537,25 +477,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "system-audit", id: "system-audit",
to: "/system/audit", to: "/system/audit",
label: navigationMessages["system-audit"], label: navigationMessages["system-audit"],
icon: Note01Icon, icon: "huge:note-01",
}, },
{ {
id: "system-integrations", id: "system-integrations",
to: "/system/integrations", to: "/system/integrations",
label: navigationMessages["system-integrations"], label: navigationMessages["system-integrations"],
icon: CodeSquareIcon, icon: "huge:code-square",
items: [ items: [
{ {
id: "system-integration-api-keys", id: "system-integration-api-keys",
to: "/system/integrations/api-keys", to: "/system/integrations/api-keys",
label: navigationMessages["system-integration-api-keys"], label: navigationMessages["system-integration-api-keys"],
icon: Key01Icon, icon: "huge:key-01",
}, },
{ {
id: "system-integration-webhooks", id: "system-integration-webhooks",
to: "/system/integrations/webhooks", to: "/system/integrations/webhooks",
label: navigationMessages["system-integration-webhooks"], label: navigationMessages["system-integration-webhooks"],
icon: LinkCircleIcon, icon: "huge:link-circle",
}, },
], ],
}, },
@@ -563,25 +503,25 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "system-settings", id: "system-settings",
to: "/system-configs", to: "/system-configs",
label: navigationMessages["system-settings"], label: navigationMessages["system-settings"],
icon: Settings01Icon, icon: "huge:settings-01",
items: [ items: [
{ {
id: "system-settings-store", id: "system-settings-store",
to: "/system-configs/store", to: "/system-configs/store",
label: navigationMessages["system-settings-store"], label: navigationMessages["system-settings-store"],
icon: Store01Icon, icon: "huge:store-01",
}, },
{ {
id: "system-settings-payments", id: "system-settings-payments",
to: "/system-configs/payments", to: "/system-configs/payments",
label: navigationMessages["system-settings-payments"], label: navigationMessages["system-settings-payments"],
icon: CreditCardIcon, icon: "huge:credit-card",
}, },
{ {
id: "system-settings-shipping", id: "system-settings-shipping",
to: "/system-configs/shipping", to: "/system-configs/shipping",
label: navigationMessages["system-settings-shipping"], label: navigationMessages["system-settings-shipping"],
icon: DeliveryTruck01Icon, icon: "huge:delivery-truck-01",
}, },
], ],
}, },
@@ -589,7 +529,7 @@ export const primaryNavigationGroups: readonly NavigationGroup[] = [
id: "system-recycle-bin", id: "system-recycle-bin",
to: "/system/recycle-bin", to: "/system/recycle-bin",
label: navigationMessages["system-recycle-bin"], label: navigationMessages["system-recycle-bin"],
icon: Delete02Icon, icon: "huge:delete-02",
}, },
], ],
}, },
+4 -10
View File
@@ -1,9 +1,3 @@
import {
DeliveryTruck01Icon,
Mail01Icon,
Message01Icon,
PackageIcon,
} from "@workspace/icons"
import type { QueryFunctionContext } from "@tanstack/react-query" import type { QueryFunctionContext } from "@tanstack/react-query"
import type { Notification } from "@workspace/blocks/notifications" import type { Notification } from "@workspace/blocks/notifications"
@@ -68,7 +62,7 @@ export const fallbackNotifications: readonly Notification[] = [
isRead: true, isRead: true,
media: { media: {
kind: "icon", kind: "icon",
icon: PackageIcon, icon: "huge:package",
tone: "warning", tone: "warning",
}, },
}, },
@@ -81,7 +75,7 @@ export const fallbackNotifications: readonly Notification[] = [
isRead: true, isRead: true,
media: { media: {
kind: "icon", kind: "icon",
icon: DeliveryTruck01Icon, icon: "huge:delivery-truck-01",
tone: "success", tone: "success",
}, },
}, },
@@ -94,7 +88,7 @@ export const fallbackNotifications: readonly Notification[] = [
isRead: true, isRead: true,
media: { media: {
kind: "icon", kind: "icon",
icon: Message01Icon, icon: "huge:message-01",
tone: "info", tone: "info",
}, },
}, },
@@ -106,7 +100,7 @@ export const fallbackNotifications: readonly Notification[] = [
isRead: true, isRead: true,
media: { media: {
kind: "icon", kind: "icon",
icon: Mail01Icon, icon: "huge:mail-01",
tone: "destructive", tone: "destructive",
}, },
}, },
+6 -9
View File
@@ -1,4 +1,4 @@
import { CN, US } from "country-flag-icons/react/1x1" import { Icon } from "@icones/react"
import { import {
DropdownMenu, DropdownMenu,
DropdownMenuContent, DropdownMenuContent,
@@ -13,11 +13,6 @@ import { HeaderActionButton } from "@workspace/blocks/layout"
import { appLocales, isAppLocale, type AppLocaleCountry } from "./app-locales" import { appLocales, isAppLocale, type AppLocaleCountry } from "./app-locales"
import { useAppLocale } from "./app-i18n-provider" import { useAppLocale } from "./app-i18n-provider"
const localeFlags = {
CN,
US,
} satisfies Record<AppLocaleCountry, typeof CN>
function LocaleFlag({ function LocaleFlag({
country, country,
className, className,
@@ -25,8 +20,6 @@ function LocaleFlag({
className?: string className?: string
country: AppLocaleCountry country: AppLocaleCountry
}) { }) {
const Flag = localeFlags[country]
return ( return (
<span <span
aria-hidden="true" aria-hidden="true"
@@ -35,7 +28,11 @@ function LocaleFlag({
className className
)} )}
> >
<Flag className="size-full" /> {country === "CN" ? (
<Icon name="flag:cn-square" className="size-full" />
) : (
<Icon name="flag:us-square" className="size-full" />
)}
</span> </span>
) )
} }
+1 -1
View File
@@ -2,7 +2,7 @@ import React, { useState } from "react"
import { useMutation } from "@tanstack/react-query" import { useMutation } from "@tanstack/react-query"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { Input } from "@workspace/ui/components/input" import { Input } from "@workspace/ui/components/input"
import { EyeIcon, EyeOffIcon } from "lucide-react" import { EyeIcon, EyeOffIcon } from "@workspace/ui/components/icon"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ThemeToggleButton } from "@workspace/blocks/blocks/appearance" import { ThemeToggleButton } from "@workspace/blocks/blocks/appearance"
import { Logo } from "@/components/logo" import { Logo } from "@/components/logo"
+2 -3
View File
@@ -1,5 +1,6 @@
import path from "path" import path from "path"
import tailwindcss from "@tailwindcss/vite" import tailwindcss from "@tailwindcss/vite"
import { icones } from "@icones/vite"
import { tanstackStart } from "@tanstack/react-start/plugin/vite" import { tanstackStart } from "@tanstack/react-start/plugin/vite"
import { i18n } from "@workspace/i18n/vite" import { i18n } from "@workspace/i18n/vite"
import react from "@vitejs/plugin-react" import react from "@vitejs/plugin-react"
@@ -14,11 +15,9 @@ export default defineConfig({
"@": path.resolve(__dirname, "./src"), "@": path.resolve(__dirname, "./src"),
}, },
}, },
optimizeDeps: {
include: ["use-sync-external-store/shim/with-selector"],
},
plugins: [ plugins: [
i18n(), i18n(),
icones({ mode: "symbol", emitData: false }),
tailwindcss(), tailwindcss(),
tanstackStart({ tanstackStart({
router: { router: {
+2 -1
View File
@@ -1,9 +1,10 @@
import path from "node:path" import path from "node:path"
import { icones } from "@icones/vite"
import react from "@vitejs/plugin-react" import react from "@vitejs/plugin-react"
import { defineConfig } from "vitest/config" import { defineConfig } from "vitest/config"
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [icones({ mode: "symbol", emitData: false }), react()],
resolve: { resolve: {
alias: { alias: {
"@": path.resolve(__dirname, "./src"), "@": path.resolve(__dirname, "./src"),
+443 -53
View File
@@ -17,7 +17,7 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@floating-ui/utils": "^0.2.12", "@floating-ui/utils": "^0.2.12",
"@iconify/react": "^6.0.2", "@icones/react": "^0.0.1",
"@lingui/core": "^6", "@lingui/core": "^6",
"@tanstack/react-form": "^1.33.2", "@tanstack/react-form": "^1.33.2",
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
@@ -26,17 +26,16 @@
"@tanstack/react-start": "^1.168.32", "@tanstack/react-start": "^1.168.32",
"@workspace/blocks": "workspace:*", "@workspace/blocks": "workspace:*",
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/icons": "workspace:*",
"@workspace/lexical": "workspace:*", "@workspace/lexical": "workspace:*",
"@workspace/search": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"country-flag-icons": "^1.6.20",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-day-picker": "^10.0.1", "react-day-picker": "^10.0.1",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
"sonner": "^2.0.7", "sonner": "^2.0.7",
}, },
"devDependencies": { "devDependencies": {
"@icones/vite": "^0.0.1",
"@tailwindcss/vite": "^4", "@tailwindcss/vite": "^4",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@types/node": "^24", "@types/node": "^24",
@@ -50,6 +49,39 @@
"vitest": "^4.1.10", "vitest": "^4.1.10",
}, },
}, },
"docs": {
"name": "docs",
"version": "0.0.0",
"dependencies": {
"@icones/react": "^0.0.1",
"@workspace/i18n": "workspace:*",
"@workspace/preferences": "workspace:*",
"@workspace/search": "workspace:*",
"@workspace/ui": "workspace:*",
"clsx": "^2.1.1",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"tailwind-merge": "^3.7.0",
},
"devDependencies": {
"@babel/core": "^7.29.7",
"@icones/vite": "^0.0.1",
"@rolldown/plugin-babel": "^0.2.3",
"@tailwindcss/vite": "^4.3.3",
"@types/babel__core": "^7.20.5",
"@types/node": "^24.13.3",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.7",
"@vitejs/plugin-react": "^6.1.1",
"babel-plugin-react-compiler": "^1.0.0",
"oxlint": "^1.81.0",
"satteri": "^0.10.5",
"tailwindcss": "^4.3.3",
"typescript": "~6.0.2",
"vite": "^8.3.0",
"vite-plugin-satteri": "^0.3.5",
},
},
"packages/blocks": { "packages/blocks": {
"name": "@workspace/blocks", "name": "@workspace/blocks",
"version": "0.0.0", "version": "0.0.0",
@@ -57,16 +89,14 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@floating-ui/utils": "^0.2.12", "@floating-ui/utils": "^0.2.12",
"@icones/react": "^0.0.1",
"@lexical/react": "^0.48.0", "@lexical/react": "^0.48.0",
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
"@tanstack/react-query": "^5.101.4", "@tanstack/react-query": "^5.101.4",
"@tanstack/react-router": "^1.170.18", "@tanstack/react-router": "^1.170.18",
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/icons": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"cmdk": "^1.1.1",
"lexical": "^0.48.0", "lexical": "^0.48.0",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
}, },
@@ -91,9 +121,9 @@
"@lingui/core": "^6", "@lingui/core": "^6",
"@lingui/react": "^6", "@lingui/react": "^6",
"@vitejs/plugin-react": "^6", "@vitejs/plugin-react": "^6",
"@workspace/ui": "workspace:*",
"ansi-to-react": "^6.2.6", "ansi-to-react": "^6.2.6",
"cac": "^7.0.0", "cac": "^7.0.0",
"lucide-react": "^1.27.0",
"open": "^11.0.0", "open": "^11.0.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
@@ -109,19 +139,6 @@
"vitest": "^4", "vitest": "^4",
}, },
}, },
"packages/icons": {
"name": "@workspace/icons",
"version": "0.0.0",
"dependencies": {
"@hugeicons/core-free-icons": "^4.2.3",
"@hugeicons/react": "^1.1.9",
"react": "^19.2.6",
},
"devDependencies": {
"@types/react": "^19",
"typescript": "~6",
},
},
"packages/lexical": { "packages/lexical": {
"name": "@workspace/lexical", "name": "@workspace/lexical",
"version": "0.0.0", "version": "0.0.0",
@@ -137,7 +154,6 @@
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"lexical": "^0.48.0", "lexical": "^0.48.0",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
}, },
@@ -150,6 +166,42 @@
"vitest": "^4.1.10", "vitest": "^4.1.10",
}, },
}, },
"packages/preferences": {
"name": "@workspace/preferences",
"version": "0.0.0",
"dependencies": {
"react": "^19.2.6",
},
"devDependencies": {
"@testing-library/react": "^16.3.2",
"@types/react": "^19",
"@types/react-dom": "^19",
"jsdom": "^30.0.1",
"react-dom": "^19.2.6",
"typescript": "~6",
"vitest": "^4.1.10",
},
},
"packages/search": {
"name": "@workspace/search",
"version": "0.0.0",
"dependencies": {
"@tanstack/react-hotkeys": "^0.10.0",
"@workspace/i18n": "workspace:*",
"@workspace/ui": "workspace:*",
"cmdk": "^1.1.1",
"react": "^19.2.6",
},
"devDependencies": {
"@testing-library/react": "^16.3.2",
"@types/react": "^19",
"@types/react-dom": "^19",
"jsdom": "^30.0.1",
"react-dom": "^19.2.6",
"typescript": "~6",
"vitest": "^4.1.10",
},
},
"packages/ui": { "packages/ui": {
"name": "@workspace/ui", "name": "@workspace/ui",
"version": "0.0.0", "version": "0.0.0",
@@ -157,6 +209,7 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@fontsource-variable/inter": "^5.3.0", "@fontsource-variable/inter": "^5.3.0",
"@icones/react": "^0.0.1",
"@shadcn/react": "^0.2.1", "@shadcn/react": "^0.2.1",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
@@ -164,7 +217,6 @@
"date-fns": "^4.4.0", "date-fns": "^4.4.0",
"embla-carousel-react": "^8.6.0", "embla-carousel-react": "^8.6.0",
"input-otp": "^1.4.2", "input-otp": "^1.4.2",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-day-picker": "^10.0.1", "react-day-picker": "^10.0.1",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
@@ -186,6 +238,8 @@
}, },
}, },
"packages": { "packages": {
"@antfu/install-pkg": ["@antfu/install-pkg@2.0.1", "", { "dependencies": { "package-manager-detector": "^1.7.0", "tinyexec": "^1.2.4" } }, "sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ=="],
"@asamuzakjp/css-color": ["@asamuzakjp/css-color@6.0.5", "", { "dependencies": { "@csstools/css-calc": "^3.2.1", "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", "lru-cache": "^11.5.2" } }, "sha512-mbhpPMmnw/kwW19aRNmSUl1QzLbdGo1SCuE49BT98MNwqF6zaHb3o2owssFc/PEO/4t2UjqtCNwocuDtJornzA=="], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@6.0.5", "", { "dependencies": { "@csstools/css-calc": "^3.2.1", "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", "lru-cache": "^11.5.2" } }, "sha512-mbhpPMmnw/kwW19aRNmSUl1QzLbdGo1SCuE49BT98MNwqF6zaHb3o2owssFc/PEO/4t2UjqtCNwocuDtJornzA=="],
"@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@8.3.0", "", { "dependencies": { "bidi-js": "^1.0.3", "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.5.2" } }, "sha512-UJLfKXBhrc8i1vH2eJXuYQMwlsLKWFw3O+CPqXSuVEiikeAim3UgrfWX0k4tA/X8cRFM8iZ7OaqBokFGbYusdg=="], "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@8.3.0", "", { "dependencies": { "bidi-js": "^1.0.3", "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.5.2" } }, "sha512-UJLfKXBhrc8i1vH2eJXuYQMwlsLKWFw3O+CPqXSuVEiikeAim3UgrfWX0k4tA/X8cRFM8iZ7OaqBokFGbYusdg=="],
@@ -254,8 +308,42 @@
"@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="],
"@bruits/satteri-darwin-arm64": ["@bruits/satteri-darwin-arm64@0.10.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA=="],
"@bruits/satteri-darwin-x64": ["@bruits/satteri-darwin-x64@0.10.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q=="],
"@bruits/satteri-linux-arm64-gnu": ["@bruits/satteri-linux-arm64-gnu@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w=="],
"@bruits/satteri-linux-arm64-musl": ["@bruits/satteri-linux-arm64-musl@0.10.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA=="],
"@bruits/satteri-linux-x64-gnu": ["@bruits/satteri-linux-x64-gnu@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw=="],
"@bruits/satteri-linux-x64-musl": ["@bruits/satteri-linux-x64-musl@0.10.5", "", { "os": "linux", "cpu": "x64" }, "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg=="],
"@bruits/satteri-wasm32-wasi": ["@bruits/satteri-wasm32-wasi@0.10.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.2.3" }, "cpu": "none" }, "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw=="],
"@bruits/satteri-win32-arm64-msvc": ["@bruits/satteri-win32-arm64-msvc@0.10.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw=="],
"@bruits/satteri-win32-x64-msvc": ["@bruits/satteri-win32-x64-msvc@0.10.5", "", { "os": "win32", "cpu": "x64" }, "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ=="],
"@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.5.0", "", {}, "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg=="],
"@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="],
"@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260908.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-t3juyCXFn12OklBL0S7UC98py3nLEmuioBOUOazeyeVsLUu8fv+pfJrR+XzwSH2Uh6rCXZNogRh+LtV0YpzMcQ=="],
"@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260908.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I1nwA4qm/fUNSKhPSO76YA6JAhcA0KU63yFcYHN6AiDowGbDyfjDPH9KCVopT5rI1LY4GfbdAi5b9gODqZsAkQ=="],
"@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260908.1", "", { "os": "linux", "cpu": "x64" }, "sha512-s/h5uSW1UC6dGeVKSqrPLpTu+vo0fKJZCNEokW1Ol1qcCB2oN6WCRHhoyzo4Y69oONAXRgLfLBYaHWe7z51Vnw=="],
"@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260908.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PP/nUKl0R6colwfocggL8dctO/dFMqMft12unzFUkoAJr0aXQeT+ia0JuNmOUWXe6EfvyCSmAbijEsTKQ5t/ew=="],
"@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260908.1", "", { "os": "win32", "cpu": "x64" }, "sha512-jkaS5EKKTvzAdIlbMfOYrHoTucWVRwYBwIig+xRsjXQv5BXTLA2Llg+iM8djlKtk0CjkztZhXmuxuqoqWKZmFw=="],
"@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
"@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg=="], "@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg=="],
"@csstools/css-calc": ["@csstools/css-calc@3.3.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ=="], "@csstools/css-calc": ["@csstools/css-calc@3.3.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ=="],
@@ -358,14 +446,74 @@
"@hono/node-server": ["@hono/node-server@1.19.15", "", { "peerDependencies": { "hono": "^4" } }, "sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg=="], "@hono/node-server": ["@hono/node-server@1.19.15", "", { "peerDependencies": { "hono": "^4" } }, "sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg=="],
"@hugeicons/core-free-icons": ["@hugeicons/core-free-icons@4.2.3", "", {}, "sha512-fpiU0qFZkv4ABi23xJ2m4qNr0BBfuIaYjPboN8WDA6aj9D+OzXa7eykxKOpACZRuGbDz1U9S5DsNx1d5KNnsgA=="], "@icones/core": ["@icones/core@0.0.1", "", { "dependencies": { "@icones/names": "^0.0.1" } }, "sha512-75LHdh7YxW+55sIU56vQx6LO+0PFUk3XU8mf4kchgP7r9HtSlMIZomCBIQ3dytZllKGDOvSbJlcHJ59fIGJpbQ=="],
"@hugeicons/react": ["@hugeicons/react@1.1.9", "", { "peerDependencies": { "react": ">=16.0.0" } }, "sha512-O+lWSWjbijoAvMCxn4K2bQWCGN5+mP1y5j+X99j23mXMj+s0X25fs71T6t9YJLaBodwmZdaewD27dzS/PiboQw=="], "@icones/icons": ["@icones/icons@0.0.1", "", {}, "sha512-5krQCp13yYEsyUY/kshQNqmcuIiIBUHU9BkSoIc68IG7AOym29ocw5pilHftu+OX1il5BhyusuYVR3qTwyH8Ug=="],
"@iconify/react": ["@iconify/react@6.0.2", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg=="], "@icones/names": ["@icones/names@0.0.1", "", {}, "sha512-Vl/e1pmZv5PPbRTDE8fd39m0ohpx2vJSEGH8stkk425cmQFFbGhmXhhip/Q1MJ3kx4ZWgww5MrV7fzrHtdEvAw=="],
"@icones/react": ["@icones/react@0.0.1", "", { "dependencies": { "@icones/core": "^0.0.1" }, "peerDependencies": { "react": "^18.2.0 || ^19.0.0" } }, "sha512-80hN0gf6ozcL8oMUfjZIVLfxegatSOzU2jdmJuzAz6Zq2VIwJHOogi4EfKVJnyq7sWHt4MQr1R0XQrYldK/fFg=="],
"@icones/vite": ["@icones/vite@0.0.1", "", { "dependencies": { "@icones/core": "^0.0.1", "@icones/icons": "^0.0.1", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.7", "parse5": "^8.0.1", "saxes": "^6.0.0" }, "peerDependencies": { "vite": "^8.0.0" } }, "sha512-QLzjlZm79awfLTdt+p/mvQEKY6fB1QB1nyRUfUNoAq5ukolEmKAfbmANq5z3gR/FKk1wWHABMcK7LICzVIUkIA=="],
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
"@iconify/utils": ["@iconify/utils@3.1.7", "", { "dependencies": { "@antfu/install-pkg": "^2.0.1", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w=="],
"@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.1" }, "os": "darwin", "cpu": "arm64" }, "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg=="],
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.1" }, "os": "darwin", "cpu": "x64" }, "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw=="],
"@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.2", "", { "dependencies": { "@img/sharp-wasm32": "0.35.2" }, "os": "freebsd" }, "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw=="],
"@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g=="],
"@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ=="],
"@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg=="],
"@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw=="],
"@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng=="],
"@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.1", "", { "os": "linux", "cpu": "none" }, "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw=="],
"@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew=="],
"@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A=="],
"@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw=="],
"@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg=="],
"@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.1" }, "os": "linux", "cpu": "arm" }, "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A=="],
"@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA=="],
"@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.1" }, "os": "linux", "cpu": "ppc64" }, "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg=="],
"@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.1" }, "os": "linux", "cpu": "none" }, "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA=="],
"@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.1" }, "os": "linux", "cpu": "s390x" }, "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA=="],
"@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA=="],
"@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg=="],
"@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg=="],
"@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="],
"@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.2", "", { "dependencies": { "@img/sharp-wasm32": "0.35.2" }, "cpu": "none" }, "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g=="],
"@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ=="],
"@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog=="],
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.2", "", { "os": "win32", "cpu": "x64" }, "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ=="],
"@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
"@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="],
@@ -450,7 +598,7 @@
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g=="],
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
@@ -544,6 +692,12 @@
"@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.76.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5qcirPHO8nKfkoowEVWtpAoVTcYDy6g0UT0NGic450Qv8J2NrOqg4uQ8QppRP4MDTC7Xx47lbZnmadTH03CGGA=="], "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.76.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5qcirPHO8nKfkoowEVWtpAoVTcYDy6g0UT0NGic450Qv8J2NrOqg4uQ8QppRP4MDTC7Xx47lbZnmadTH03CGGA=="],
"@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="],
"@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="],
"@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="],
"@preact/signals-core": ["@preact/signals-core@1.14.4", "", {}, "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA=="], "@preact/signals-core": ["@preact/signals-core@1.14.4", "", {}, "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA=="],
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.7", "", {}, "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.7", "", {}, "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q=="],
@@ -580,6 +734,8 @@
"@reduxjs/toolkit": ["@reduxjs/toolkit@2.12.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw=="], "@reduxjs/toolkit": ["@reduxjs/toolkit@2.12.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw=="],
"@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.7", "", { "os": "android", "cpu": "arm" }, "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ=="],
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="], "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="],
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="], "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="],
@@ -610,6 +766,8 @@
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="], "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="],
"@rolldown/plugin-babel": ["@rolldown/plugin-babel@0.2.4", "", { "dependencies": { "picomatch": "^4.0.7" }, "peerDependencies": { "@babel/core": "^7.29.0 || ^8.0.0-rc.1", "@babel/plugin-transform-runtime": "^7.29.0 || ^8.0.0-rc.1", "@babel/runtime": "^7.27.0 || ^8.0.0-rc.1", "rolldown": "^1.0.0-rc.5", "vite": "^8.0.0" }, "optionalPeers": ["@babel/plugin-transform-runtime", "@babel/runtime", "vite"] }, "sha512-ygmm2j/mN+aCvstHo0x3IOu4uc6LqXT9SJ3q4kpfG/+Yhfz0B+E47FITcC0FljZADwUFARP6E2kiE+Lc26D8wg=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
"@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
@@ -618,8 +776,12 @@
"@sinclair/typebox": ["@sinclair/typebox@0.27.12", "", {}, "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g=="], "@sinclair/typebox": ["@sinclair/typebox@0.27.12", "", {}, "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g=="],
"@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="],
"@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
"@speed-highlight/core": ["@speed-highlight/core@1.2.24", "", {}, "sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw=="],
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
@@ -716,6 +878,14 @@
"@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
"@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
"@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
"@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
"@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="],
@@ -740,20 +910,28 @@
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
"@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="],
"@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
"@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="],
"@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="],
"@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
"@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="], "@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="],
"@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], "@types/react": ["@types/react@19.2.18", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], "@types/react-dom": ["@types/react-dom@19.3.0", "", { "peerDependencies": { "@types/react": "^19.3.0" } }, "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q=="],
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
"@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="],
"@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
@@ -768,7 +946,7 @@
"@vitejs/devtools-kit": ["@vitejs/devtools-kit@0.4.9", "", { "dependencies": { "@devframes/hub": "^0.7.14", "@devframes/json-render": "^0.7.14", "devframe": "^0.7.14", "local-pkg": "^1.2.1", "mlly": "^1.8.2", "nostics": "^1.2.0", "nypm": "^0.6.8" }, "peerDependencies": { "vite": "*" } }, "sha512-uI1Gk4rfc6qCAK+5m5o3d5HCNVPpnGYi+RlGnLuWn6j9XNcvuP1MiZrgEMyXvpbQHEN3N4mcfUswIPc8XnBvsg=="], "@vitejs/devtools-kit": ["@vitejs/devtools-kit@0.4.9", "", { "dependencies": { "@devframes/hub": "^0.7.14", "@devframes/json-render": "^0.7.14", "devframe": "^0.7.14", "local-pkg": "^1.2.1", "mlly": "^1.8.2", "nostics": "^1.2.0", "nypm": "^0.6.8" }, "peerDependencies": { "vite": "*" } }, "sha512-uI1Gk4rfc6qCAK+5m5o3d5HCNVPpnGYi+RlGnLuWn6j9XNcvuP1MiZrgEMyXvpbQHEN3N4mcfUswIPc8XnBvsg=="],
"@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.4", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@6.1.1", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "oxc-transform-react": "^0.145.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler", "oxc-transform-react"] }, "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw=="],
"@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="], "@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="],
@@ -806,10 +984,12 @@
"@workspace/i18n": ["@workspace/i18n@workspace:packages/i18n"], "@workspace/i18n": ["@workspace/i18n@workspace:packages/i18n"],
"@workspace/icons": ["@workspace/icons@workspace:packages/icons"],
"@workspace/lexical": ["@workspace/lexical@workspace:packages/lexical"], "@workspace/lexical": ["@workspace/lexical@workspace:packages/lexical"],
"@workspace/preferences": ["@workspace/preferences@workspace:packages/preferences"],
"@workspace/search": ["@workspace/search@workspace:packages/search"],
"@workspace/ui": ["@workspace/ui@workspace:packages/ui"], "@workspace/ui": ["@workspace/ui@workspace:packages/ui"],
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
@@ -846,6 +1026,8 @@
"babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="],
"babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="],
"balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
"baseline-browser-mapping": ["baseline-browser-mapping@2.11.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.11.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ=="],
@@ -854,6 +1036,8 @@
"birpc": ["birpc@4.0.0", "", {}, "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw=="], "birpc": ["birpc@4.0.0", "", {}, "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw=="],
"blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
"body-parser": ["body-parser@2.3.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", "debug": "^4.4.3", "http-errors": "^2.0.1", "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", "qs": "^6.15.2", "raw-body": "^3.0.2", "type-is": "^2.1.0" } }, "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw=="], "body-parser": ["body-parser@2.3.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", "debug": "^4.4.3", "http-errors": "^2.0.1", "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", "qs": "^6.15.2", "raw-body": "^3.0.2", "type-is": "^2.1.0" } }, "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw=="],
"brace-expansion": ["brace-expansion@5.0.8", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg=="], "brace-expansion": ["brace-expansion@5.0.8", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg=="],
@@ -928,8 +1112,6 @@
"cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="],
"country-flag-icons": ["country-flag-icons@1.6.20", "", {}, "sha512-py8JiEKzjhYw6HPJ0L7SxLgCYim36UPRTZX43/kqGueUCZLSvnrqAiwW8HtQibur7mdkFQUkjOgdK+o/9FBtaw=="],
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"crossws": ["crossws@0.4.10", "", { "peerDependencies": { "srvx": ">=0.11.5" }, "optionalPeers": ["srvx"] }, "sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA=="], "crossws": ["crossws@0.4.10", "", { "peerDependencies": { "srvx": ">=0.11.5" }, "optionalPeers": ["srvx"] }, "sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA=="],
@@ -1000,6 +1182,8 @@
"diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
"docs": ["docs@workspace:docs"],
"dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
"dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="],
@@ -1034,6 +1218,8 @@
"error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
"error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
@@ -1156,6 +1342,8 @@
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
"input-otp": ["input-otp@1.4.2", "", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="], "input-otp": ["input-otp@1.4.2", "", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="],
@@ -1242,29 +1430,29 @@
"lib0": ["lib0@0.2.117", "", { "dependencies": { "isomorphic.js": "^0.2.4" }, "bin": { "0serve": "bin/0serve.js", "0gentesthtml": "bin/gentesthtml.js", "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js" } }, "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw=="], "lib0": ["lib0@0.2.117", "", { "dependencies": { "isomorphic.js": "^0.2.4" }, "bin": { "0serve": "bin/0serve.js", "0gentesthtml": "bin/gentesthtml.js", "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js" } }, "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw=="],
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="],
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="],
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="],
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="],
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="],
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="],
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="],
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="],
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="],
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="],
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="],
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="],
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
@@ -1280,8 +1468,6 @@
"lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="],
"lucide-react": ["lucide-react@1.27.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw=="],
"lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
@@ -1308,6 +1494,8 @@
"mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
"miniflare": ["miniflare@5.20260908.0-alpha", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.35.2", "undici": "7.29.0", "workerd": "1.20260908.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" } }, "sha512-BHIknb0u6vLIvb+R8PsUAzgoWWk3OlW85DrV2SG0EydfSpIba28YT0rH6xZThjnSwDxzNuW3FDRNSWvbiI/DVw=="],
"minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
@@ -1320,7 +1508,7 @@
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="],
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
@@ -1372,6 +1560,8 @@
"p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="],
"package-manager-detector": ["package-manager-detector@1.8.0", "", {}, "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A=="],
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
"parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
@@ -1388,7 +1578,7 @@
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
"path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
@@ -1406,7 +1596,7 @@
"pofile-ts": ["pofile-ts@4.0.3", "", {}, "sha512-sz1pnjgEfPyZ+QvaeX3NtCmbYnEvG01LZRLoN/uXoLtPZtxCIH5IctL7yXXc0fFyk/fqV6K8g3hlNfr6IJwupA=="], "pofile-ts": ["pofile-ts@4.0.3", "", {}, "sha512-sz1pnjgEfPyZ+QvaeX3NtCmbYnEvG01LZRLoN/uXoLtPZtxCIH5IctL7yXXc0fFyk/fqV6K8g3hlNfr6IJwupA=="],
"postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="],
"postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], "postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="],
@@ -1486,6 +1676,8 @@
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"satteri": ["satteri@0.10.5", "", { "dependencies": { "@types/estree-jsx": "^1.0.5", "@types/hast": "^3.0.5", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3" }, "optionalDependencies": { "@bruits/satteri-darwin-arm64": "0.10.5", "@bruits/satteri-darwin-x64": "0.10.5", "@bruits/satteri-linux-arm64-gnu": "0.10.5", "@bruits/satteri-linux-arm64-musl": "0.10.5", "@bruits/satteri-linux-x64-gnu": "0.10.5", "@bruits/satteri-linux-x64-musl": "0.10.5", "@bruits/satteri-wasm32-wasi": "0.10.5", "@bruits/satteri-win32-arm64-msvc": "0.10.5", "@bruits/satteri-win32-x64-msvc": "0.10.5" } }, "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ=="],
"saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
@@ -1504,6 +1696,8 @@
"shadcn": ["shadcn@4.15.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "kleur": "^4.1.5", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "undici": "^7.27.2", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-fFTpfOuRwqjpXGp/sKpAxJkjdgv1jf8bDrW1xi0cVn2k7WJ5ijV/gjkAlkAidGDjhEkgcUuxVdm4oRB9r8BivA=="], "shadcn": ["shadcn@4.15.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "kleur": "^4.1.5", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "undici": "^7.27.2", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-fFTpfOuRwqjpXGp/sKpAxJkjdgv1jf8bDrW1xi0cVn2k7WJ5ijV/gjkAlkAidGDjhEkgcUuxVdm4oRB9r8BivA=="],
"sharp": ["sharp@0.35.2", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.4" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.2", "@img/sharp-darwin-x64": "0.35.2", "@img/sharp-freebsd-wasm32": "0.35.2", "@img/sharp-libvips-darwin-arm64": "1.3.1", "@img/sharp-libvips-darwin-x64": "1.3.1", "@img/sharp-libvips-linux-arm": "1.3.1", "@img/sharp-libvips-linux-arm64": "1.3.1", "@img/sharp-libvips-linux-ppc64": "1.3.1", "@img/sharp-libvips-linux-riscv64": "1.3.1", "@img/sharp-libvips-linux-s390x": "1.3.1", "@img/sharp-libvips-linux-x64": "1.3.1", "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", "@img/sharp-libvips-linuxmusl-x64": "1.3.1", "@img/sharp-linux-arm": "0.35.2", "@img/sharp-linux-arm64": "0.35.2", "@img/sharp-linux-ppc64": "0.35.2", "@img/sharp-linux-riscv64": "0.35.2", "@img/sharp-linux-s390x": "0.35.2", "@img/sharp-linux-x64": "0.35.2", "@img/sharp-linuxmusl-arm64": "0.35.2", "@img/sharp-linuxmusl-x64": "0.35.2", "@img/sharp-webcontainers-wasm32": "0.35.2", "@img/sharp-win32-arm64": "0.35.2", "@img/sharp-win32-ia32": "0.35.2", "@img/sharp-win32-x64": "0.35.2" } }, "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
@@ -1522,6 +1716,8 @@
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
"smol-toml": ["smol-toml@1.8.0", "", {}, "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ=="],
"sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="],
"source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
@@ -1556,7 +1752,7 @@
"tabbable": ["tabbable@6.5.0", "", {}, "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA=="], "tabbable": ["tabbable@6.5.0", "", {}, "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA=="],
"tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], "tailwind-merge": ["tailwind-merge@3.7.0", "", {}, "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA=="],
"tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="],
@@ -1636,7 +1832,9 @@
"victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="],
"vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="], "vite": ["vite@8.3.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ=="],
"vite-plugin-satteri": ["vite-plugin-satteri@0.3.5", "", { "dependencies": { "smol-toml": "^1.6.1", "yaml": "^2.6.0" }, "peerDependencies": { "satteri": ">=0.10.0", "vite": "^5 || ^6 || ^7 || ^8" } }, "sha512-X41QiFHwlkfcnNE+nOIe6tCeE32M6BKyVN00Wd7irp94lsOmIqXyNtF+lLc2oPIxno0qlVjSyNNPMIZJDghtJQ=="],
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
@@ -1660,8 +1858,14 @@
"why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
"workerd": ["workerd@1.20260908.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260908.1", "@cloudflare/workerd-darwin-arm64": "1.20260908.1", "@cloudflare/workerd-linux-64": "1.20260908.1", "@cloudflare/workerd-linux-arm64": "1.20260908.1", "@cloudflare/workerd-windows-64": "1.20260908.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-rYhpW6NWHD++p34ej+VXWzi5Pdnmd7ncdbB/ux4s+i3mf7IeOpW3O4roqClQ+Z8ernvyMCknBLCb76z1rA+a7Q=="],
"wrangler": ["wrangler@4.130.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "5.20260908.0-alpha", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260908.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^5.20260908.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js", "cf-wrangler": "bin/cf-wrangler.js" } }, "sha512-fzNjnTzyZl31PGJOFXbiLeZqEIToQ9KOzkkvGdQz4wlB+BoHnl3BRwCR5xg8AqYyzVunvvMHlMzvlbThQ7rrAA=="],
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
"ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
"wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
"xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
@@ -1672,12 +1876,18 @@
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
"yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="],
"yjs": ["yjs@13.6.31", "", { "dependencies": { "lib0": "^0.2.99" } }, "sha512-Eq+5BRfbeGyqGVrTJL3bEcr8gKkxPuyuoHmAwpk52fDb8kOVMrfVSTRPd6yiGgX5Fskb96qCRjzjbRjrL4YEnw=="], "yjs": ["yjs@13.6.31", "", { "dependencies": { "lib0": "^0.2.99" } }, "sha512-Eq+5BRfbeGyqGVrTJL3bEcr8gKkxPuyuoHmAwpk52fDb8kOVMrfVSTRPd6yiGgX5Fskb96qCRjzjbRjrL4YEnw=="],
"yocto-spinner": ["yocto-spinner@1.2.2", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng=="], "yocto-spinner": ["yocto-spinner@1.2.2", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng=="],
"yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="], "yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="],
"youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="],
"youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="],
"zigpty": ["zigpty@0.2.1", "", {}, "sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw=="], "zigpty": ["zigpty@0.2.1", "", {}, "sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw=="],
"zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
@@ -1686,6 +1896,8 @@
"@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
"@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
"@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
@@ -1694,10 +1906,20 @@
"@dotenvx/dotenvx/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], "@dotenvx/dotenvx/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="],
"@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="],
"@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
"@reduxjs/toolkit/immer": ["immer@11.1.15", "", {}, "sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ=="], "@reduxjs/toolkit/immer": ["immer@11.1.15", "", {}, "sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ=="],
"@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="],
"@rolldown/plugin-babel/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="],
"@tailwindcss/node/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="],
@@ -1714,12 +1936,16 @@
"@tanstack/start-plugin-core/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], "@tanstack/start-plugin-core/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
"@tanstack/start-plugin-core/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"@vue/compiler-core/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], "@vue/compiler-core/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
"@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
"@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
"@vue/compiler-sfc/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="],
"body-parser/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], "body-parser/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
"conf/ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], "conf/ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
@@ -1732,6 +1958,8 @@
"data-urls/whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], "data-urls/whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="],
"docs/oxlint": ["oxlint@1.83.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.83.0", "@oxlint/binding-android-arm64": "1.83.0", "@oxlint/binding-darwin-arm64": "1.83.0", "@oxlint/binding-darwin-x64": "1.83.0", "@oxlint/binding-freebsd-x64": "1.83.0", "@oxlint/binding-linux-arm-gnueabihf": "1.83.0", "@oxlint/binding-linux-arm-musleabihf": "1.83.0", "@oxlint/binding-linux-arm64-gnu": "1.83.0", "@oxlint/binding-linux-arm64-musl": "1.83.0", "@oxlint/binding-linux-ppc64-gnu": "1.83.0", "@oxlint/binding-linux-riscv64-gnu": "1.83.0", "@oxlint/binding-linux-riscv64-musl": "1.83.0", "@oxlint/binding-linux-s390x-gnu": "1.83.0", "@oxlint/binding-linux-x64-gnu": "1.83.0", "@oxlint/binding-linux-x64-musl": "1.83.0", "@oxlint/binding-openharmony-arm64": "1.83.0", "@oxlint/binding-win32-arm64-msvc": "1.83.0", "@oxlint/binding-win32-ia32-msvc": "1.83.0", "@oxlint/binding-win32-x64-msvc": "1.83.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-cyDzSzaw3uzP0TeCeq3lLRPPoaUxkbB4ZOXj+kn+5r+BX9V+4bNVGk9lxer+WrgcpebH4JxLlJ3KQjveVztOLQ=="],
"dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], "dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="],
"enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
@@ -1742,6 +1970,8 @@
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"miniflare/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="],
"mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
@@ -1762,18 +1992,34 @@
"restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
"router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
"shadcn/ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], "shadcn/ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
"shadcn/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="],
"shadcn/tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="],
"shadcn/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], "shadcn/undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="],
"shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
"sharp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
"string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
"type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], "type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
"vite/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="],
"vite/rolldown": ["rolldown@1.2.7", "", { "dependencies": { "@oxc-project/types": "=0.148.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.7", "@rolldown/binding-android-arm64": "1.2.7", "@rolldown/binding-darwin-arm64": "1.2.7", "@rolldown/binding-darwin-x64": "1.2.7", "@rolldown/binding-freebsd-x64": "1.2.7", "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", "@rolldown/binding-linux-arm64-gnu": "1.2.7", "@rolldown/binding-linux-arm64-musl": "1.2.7", "@rolldown/binding-linux-ppc64-gnu": "1.2.7", "@rolldown/binding-linux-s390x-gnu": "1.2.7", "@rolldown/binding-linux-x64-gnu": "1.2.7", "@rolldown/binding-linux-x64-musl": "1.2.7", "@rolldown/binding-openharmony-arm64": "1.2.7", "@rolldown/binding-win32-arm64-msvc": "1.2.7", "@rolldown/binding-win32-x64-msvc": "1.2.7" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig=="],
"vitest/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="],
"youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
"@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
@@ -1794,10 +2040,94 @@
"@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
"@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
"@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
"@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
"@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
"@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
"@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
"@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
"@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
"@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
"@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"@tanstack/react-router/@tanstack/react-store/@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], "@tanstack/react-router/@tanstack/react-store/@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
"@tanstack/start-plugin-core/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"@vue/compiler-sfc/postcss/nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="],
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
"docs/oxlint/@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.83.0", "", { "os": "android", "cpu": "arm" }, "sha512-0yGY24EwsLk5YDe6F+VkmZyRHSwJDALa3nIrPpq7FXmp2lV2d0TzvBCGeZk+wgiULRGr5blhyr4QMp5KCXJUqA=="],
"docs/oxlint/@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.83.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hHfJ0vc17A4iUjH5p9BsTUPYbYRNxGpvD2lbu1aBRk54bzNIx9o5TtYF39QPZcV95DagZd+4DEAw2RH3G2ZsMg=="],
"docs/oxlint/@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.83.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hsOjYjszLb/3zym/TkzUMPAoQlTJcuzSyEPOAyA+skXJIX9M0o+4JfOtqopX/Vf4hSLrJ98j0nvFo23gzk8auQ=="],
"docs/oxlint/@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.83.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-mjh5oH2EA+wl5yRJYT9K9G61O2zFlpuv+yf2JwZOi0+dq2FnTUtm1h8i+5Ik0fXPWIu/k84I1psZR9aQsLAnyA=="],
"docs/oxlint/@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.83.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fNHr64/YaO8YssuoDVC8+F4Uk5enR86q5uxfHkQrjAPs1dbAILOrD2uaud+J7MO8Fx774g44ERLD0IGIvZE48w=="],
"docs/oxlint/@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.83.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Qpwy3zzAwMj+8/lyYItHmkSMwbkprFNWTK7jPYDOxSyxEhaSLOWYUTCMkjF334J8/WD0nznCCsoBbIH6hpsuIw=="],
"docs/oxlint/@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.83.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s+BirYLFq7JL2k9sP0XI3ZXJ9dYvJ8sX3jLCLoag7tt+zrSHpZxP0jqznfL+Gdgwu7ay0dYgGYJXrQvq3iWloA=="],
"docs/oxlint/@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.83.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-7lihXt3vKr+GIyapNbHrnFHm/biiW30le6Zv/DExbAFPF6YwCQXVFlONPFehxs0CpGO4CBfYPM9rdDT+XMoIlg=="],
"docs/oxlint/@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.83.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-q63JalLYVkZiZvls1z3PPUnpmQluOMXp0khqQMznCeAPLGydfNY8JhvuA4WlK57JfrvikU8wB5lPVveqpIXvew=="],
"docs/oxlint/@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.83.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-krQmDF+dRbxvdqVPV88ZuOoPPu8X5BuqDA8Hd+qcS4YMRQCb+nexA57DazgGsc/rGdKBe3QmV0mnv0bdpW/p5g=="],
"docs/oxlint/@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.83.0", "", { "os": "linux", "cpu": "none" }, "sha512-MmOl8Y6txEAXZU1RG8Rr264jQ6D7VPmqFsU/45x/FeWsGe32hklTqGrLE6UxHzp5Rjt0wP+20tY8YXKgSFB3mw=="],
"docs/oxlint/@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.83.0", "", { "os": "linux", "cpu": "none" }, "sha512-u1rMymh0W3JZkq370kzQsYPULGWqhE09pZRqnZvUSoYaI9pVO5yVX+iYIslmWuEgwuzH9YAaOsScJiobWCHoOw=="],
"docs/oxlint/@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.83.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-y0zK3HNwGysu7rqtE+BQG/d0bx5gh/KwlOtghN8oWeK1KcWzeaLqtZrbm8owqdma1lFyrce/hTO5ismuNu+INQ=="],
"docs/oxlint/@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.83.0", "", { "os": "linux", "cpu": "x64" }, "sha512-rS5gM0NgD7ngmuJmbIehsidtrOwKkLFwCQbKEeb9KuyQrrWNq5Zkn0uV6AYdXOMJ0grrWEiLwBuvMxt8w5vsNw=="],
"docs/oxlint/@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.83.0", "", { "os": "linux", "cpu": "x64" }, "sha512-W2IH4EtpcPaWcvNGCA95YoDg4vxqE/ZiPCi3arrxEEpsK7+JQN9WYwrlYFx9pcdP6KPXqRqkv3zdQPHcx7b6YQ=="],
"docs/oxlint/@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.83.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6LyKkUyoajssTPLlZmDbZIbu4IZ5B4bGuRUnBgCGpEvHP3FQMaYITncHA/unPUo7q+Z+pIu2HhdkQ+8d1SG7iA=="],
"docs/oxlint/@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.83.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Uz/fObEtF0jmNJQJ8CGRBKfefYstS0/wjD3s6IGzP8nUwsJykHQJBiN3npHwKiGRGn/vvBEgNr4B3cCzmmatvg=="],
"docs/oxlint/@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.83.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-u7XcvPW6Bk58tY5iWs2ESb0vJjoE/kuSpHxopbwp/p3ZtWVQXZ6wor5w3ssVTHOqd/v8b+QdhSFWQ4grEUNWpA=="],
"docs/oxlint/@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.83.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LZRubd7ph13QmAg4fFecTYVZkiYbROR2Htaxh/ufWRkDhPOm2wrwaEYR89e0YpPFD3dqBrPoxS7myBw5hmYA7Q=="],
"jest-validate/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-validate/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"jest-validate/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], "jest-validate/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
@@ -1812,8 +2142,68 @@
"shadcn/ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "shadcn/ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
"shadcn/postcss/nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="],
"vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.148.0", "", {}, "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A=="],
"vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.7", "", { "os": "android", "cpu": "arm64" }, "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw=="],
"vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw=="],
"vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ=="],
"vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA=="],
"vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.7", "", { "os": "linux", "cpu": "arm" }, "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ=="],
"vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg=="],
"vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q=="],
"vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg=="],
"vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw=="],
"vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA=="],
"vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw=="],
"vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.7", "", { "os": "none", "cpu": "arm64" }, "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w=="],
"vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw=="],
"vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw=="],
"vitest/vite/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"vitest/vite/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="],
"shadcn/ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], "shadcn/ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
"shadcn/ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "shadcn/ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
"vitest/vite/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
"vitest/vite/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
"vitest/vite/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
"vitest/vite/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
"vitest/vite/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
"vitest/vite/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
"vitest/vite/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
"vitest/vite/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
"vitest/vite/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
"vitest/vite/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
"vitest/vite/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"vitest/vite/postcss/nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="],
} }
} }
+3 -7
View File
@@ -11,16 +11,14 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@floating-ui/utils": "^0.2.12", "@floating-ui/utils": "^0.2.12",
"@icones/react": "^0.0.1",
"@lexical/react": "^0.48.0", "@lexical/react": "^0.48.0",
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
"@tanstack/react-query": "^5.101.4", "@tanstack/react-query": "^5.101.4",
"@tanstack/react-router": "^1.170.18", "@tanstack/react-router": "^1.170.18",
"@workspace/icons": "workspace:*",
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"cmdk": "^1.1.1",
"lexical": "^0.48.0", "lexical": "^0.48.0",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6" "react-dom": "^19.2.6"
}, },
@@ -46,6 +44,7 @@
"./layout": "./src/blocks/layout/index.ts", "./layout": "./src/blocks/layout/index.ts",
"./layout/locales": "./src/blocks/layout/locales/catalogs.ts", "./layout/locales": "./src/blocks/layout/locales/catalogs.ts",
"./layout/locales/*": "./src/blocks/layout/locales/*.ts", "./layout/locales/*": "./src/blocks/layout/locales/*.ts",
"./layouts/vega": "./src/blocks/layouts/vega/index.tsx",
"./media": "./src/blocks/media/index.ts", "./media": "./src/blocks/media/index.ts",
"./media/locales": "./src/blocks/media/locales/catalogs.ts", "./media/locales": "./src/blocks/media/locales/catalogs.ts",
"./media/locales/*": "./src/blocks/media/locales/*.ts", "./media/locales/*": "./src/blocks/media/locales/*.ts",
@@ -54,9 +53,6 @@
"./navigation/locales/*": "./src/blocks/navigation/locales/*.ts", "./navigation/locales/*": "./src/blocks/navigation/locales/*.ts",
"./notifications": "./src/blocks/notifications/index.ts", "./notifications": "./src/blocks/notifications/index.ts",
"./notifications/locales": "./src/blocks/notifications/locales/catalogs.ts", "./notifications/locales": "./src/blocks/notifications/locales/catalogs.ts",
"./notifications/locales/*": "./src/blocks/notifications/locales/*.ts", "./notifications/locales/*": "./src/blocks/notifications/locales/*.ts"
"./search": "./src/blocks/search/index.ts",
"./search/locales": "./src/blocks/search/locales/catalogs.ts",
"./search/locales/*": "./src/blocks/search/locales/*.ts"
} }
} }
@@ -1,4 +1,4 @@
import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react" import { MonitorIcon, MoonIcon, SunIcon } from "@workspace/ui/components/icon"
import { LocalizedText, useMessage } from "@workspace/i18n" import { LocalizedText, useMessage } from "@workspace/i18n"
import { import {
Select, Select,
@@ -1,4 +1,4 @@
import { MoonIcon, SunIcon } from "lucide-react" import { MoonIcon, SunIcon } from "@workspace/ui/components/icon"
import { LocalizedText } from "@workspace/i18n" import { LocalizedText } from "@workspace/i18n"
import { useUiState } from "./ui-state" import { useUiState } from "./ui-state"
import { Badge } from "@workspace/ui/components/badge" import { Badge } from "@workspace/ui/components/badge"
@@ -2,7 +2,7 @@ import React from "react"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { useUiState } from "./ui-state" import { useUiState } from "./ui-state"
import { Icon, Moon02Icon, Sun03Icon } from "@workspace/icons" import { Icon } from "@icones/react"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
type ThemeToggleButtonProps = Omit< type ThemeToggleButtonProps = Omit<
@@ -50,7 +50,7 @@ export function ThemeToggleButton({
> >
<Icon <Icon
strokeWidth={2.5} strokeWidth={2.5}
data={resolvedTheme === "dark" ? Sun03Icon : Moon02Icon} name={resolvedTheme === "dark" ? "huge:sun-03" : "huge:moon-02"}
/> />
</Button> </Button>
) )
@@ -27,7 +27,7 @@ import {
SendHorizontalIcon, SendHorizontalIcon,
SmileIcon, SmileIcon,
XIcon, XIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { customerServiceEmojiGroups, customerServiceEmojis } from "./emojis" import { customerServiceEmojiGroups, customerServiceEmojis } from "./emojis"
import { chatMessages } from "./messages" import { chatMessages } from "./messages"
@@ -6,7 +6,7 @@ import {
} from "@workspace/ui/components/avatar" } from "@workspace/ui/components/avatar"
import { Input } from "@workspace/ui/components/input" import { Input } from "@workspace/ui/components/input"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { SearchIcon } from "lucide-react" import { SearchIcon } from "@workspace/ui/components/icon"
import { chatMessages } from "./messages" import { chatMessages } from "./messages"
import type { ChatConversation } from "./types" import type { ChatConversation } from "./types"
@@ -34,7 +34,7 @@ import {
ImageIcon, ImageIcon,
LinkIcon, LinkIcon,
MessageCircleIcon, MessageCircleIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { chatMessages } from "./messages" import { chatMessages } from "./messages"
import type { import type {
@@ -10,7 +10,11 @@ import {
} from "@workspace/ui/components/empty" } from "@workspace/ui/components/empty"
import { useIsMobile } from "@workspace/ui/hooks/use-breakpoint" import { useIsMobile } from "@workspace/ui/hooks/use-breakpoint"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ArrowLeftIcon, InfoIcon, MessageCircleIcon } from "lucide-react" import {
ArrowLeftIcon,
InfoIcon,
MessageCircleIcon,
} from "@workspace/ui/components/icon"
import { ChatComposer } from "./chat-composer" import { ChatComposer } from "./chat-composer"
import { import {
@@ -1,6 +1,6 @@
import { Link } from "@tanstack/react-router" import { Link } from "@tanstack/react-router"
import * as React from "react" import * as React from "react"
import { Icon } from "@workspace/icons" import { Icon } from "@icones/react"
import { useMessage } from "@workspace/i18n" import { useMessage } from "@workspace/i18n"
import { import {
Breadcrumb, Breadcrumb,
@@ -102,24 +102,24 @@ function useVisibleEntryCount(entries: readonly BreadcrumbEntry[]) {
const breadcrumb = breadcrumbRef.current const breadcrumb = breadcrumbRef.current
const list = listRef.current const list = listRef.current
const measurement = measurementRef.current const measurementElement = measurementRef.current
if (!breadcrumb || !list || !measurement) { if (!breadcrumb || !list || !measurementElement) {
return return
} }
const updateVisibleCount = () => { const updateVisibleCount = () => {
const entryWidths = Array.from( const entryWidths = Array.from(
measurement.querySelectorAll<HTMLElement>( measurementElement.querySelectorAll<HTMLElement>(
"[data-breadcrumb-measure-entry]" "[data-breadcrumb-measure-entry]"
) )
).map((element) => element.getBoundingClientRect().width) ).map((element) => element.getBoundingClientRect().width)
const menuWidth = const menuWidth =
measurement measurementElement
.querySelector<HTMLElement>("[data-breadcrumb-measure-menu]") .querySelector<HTMLElement>("[data-breadcrumb-measure-menu]")
?.getBoundingClientRect().width ?? 0 ?.getBoundingClientRect().width ?? 0
const separatorWidth = const separatorWidth =
measurement measurementElement
.querySelector<HTMLElement>("[data-breadcrumb-measure-separator]") .querySelector<HTMLElement>("[data-breadcrumb-measure-separator]")
?.getBoundingClientRect().width ?? 0 ?.getBoundingClientRect().width ?? 0
const listStyle = window.getComputedStyle(list) const listStyle = window.getComputedStyle(list)
@@ -169,7 +169,7 @@ function useVisibleEntryCount(entries: readonly BreadcrumbEntry[]) {
const observer = new ResizeObserver(updateVisibleCount) const observer = new ResizeObserver(updateVisibleCount)
observer.observe(breadcrumb) observer.observe(breadcrumb)
observer.observe(measurement) observer.observe(measurementElement)
return () => observer.disconnect() return () => observer.disconnect()
}, [entries, entriesKey, maximumVisibleCount]) }, [entries, entriesKey, maximumVisibleCount])
@@ -190,7 +190,7 @@ function useVisibleEntryCount(entries: readonly BreadcrumbEntry[]) {
function BreadcrumbEntryContent({ entry }: { entry: BreadcrumbEntry }) { function BreadcrumbEntryContent({ entry }: { entry: BreadcrumbEntry }) {
return ( return (
<> <>
{entry.icon && <Icon data={entry.icon} className="size-4 shrink-0" />} {entry.icon && <Icon name={entry.icon} className="size-4 shrink-0" />}
<NavigationLabel label={entry.label} /> <NavigationLabel label={entry.label} />
</> </>
) )
@@ -326,7 +326,7 @@ function BreadcrumbMenu({ entries }: { entries: readonly BreadcrumbEntry[] }) {
const content = ( const content = (
<> <>
{entry.icon && ( {entry.icon && (
<Icon data={entry.icon} className="size-4 shrink-0" /> <Icon name={entry.icon} className="size-4 shrink-0" />
)} )}
<NavigationLabel label={entry.label} /> <NavigationLabel label={entry.label} />
</> </>
@@ -409,7 +409,7 @@ export function AppBreadcrumb() {
<BreadcrumbPage className="inline-flex min-w-0 items-center gap-1.5 text-primary"> <BreadcrumbPage className="inline-flex min-w-0 items-center gap-1.5 text-primary">
{item.entry.icon && ( {item.entry.icon && (
<Icon <Icon
data={item.entry.icon} name={item.entry.icon}
className="size-4 shrink-0" className="size-4 shrink-0"
/> />
)} )}
@@ -440,7 +440,7 @@ export function AppBreadcrumb() {
className="inline-flex items-center gap-1.5 font-normal" className="inline-flex items-center gap-1.5 font-normal"
> >
{entry.icon && ( {entry.icon && (
<Icon data={entry.icon} className="size-4 shrink-0" /> <Icon name={entry.icon} className="size-4 shrink-0" />
)} )}
<NavigationLabel label={entry.label} /> <NavigationLabel label={entry.label} />
</span> </span>
@@ -1,11 +1,10 @@
import * as React from "react" import * as React from "react"
import { ChevronLeftIcon, ChevronRightIcon, SearchIcon } from "lucide-react"
import { import {
BellIcon, ChevronLeftIcon,
Icon, ChevronRightIcon,
MessageMultiple01Icon, SearchIcon,
Search01Icon, } from "@workspace/ui/components/icon"
} from "@workspace/icons" import { Icon } from "@icones/react"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { Kbd } from "@workspace/ui/components/kbd" import { Kbd } from "@workspace/ui/components/kbd"
import { useIsTablet } from "@workspace/ui/hooks/use-breakpoint" import { useIsTablet } from "@workspace/ui/hooks/use-breakpoint"
@@ -153,12 +152,14 @@ function AppHeader({ actions }: { actions?: React.ReactNode }) {
<GlobalSearchTrigger /> <GlobalSearchTrigger />
{actions} {actions}
<NotificationCenterTrigger <NotificationCenterTrigger
render={<HeaderActionButton icon={BellIcon} showIndicator />} render={
<HeaderActionButton icon="huge:notification-01" showIndicator />
}
/> />
<ChatThreadTrigger <ChatThreadTrigger
render={ render={
<HeaderActionButton <HeaderActionButton
icon={MessageMultiple01Icon} icon="huge:message-multiple-01"
showIndicator showIndicator
/> />
} }
@@ -201,7 +202,7 @@ function GlobalSearchTrigger() {
variant="secondary" variant="secondary"
> >
<Icon <Icon
data={Search01Icon} name="huge:search-01"
className={cn( className={cn(
"pointer-event-none size-5 transition-all not-mobile:hidden", "pointer-event-none size-5 transition-all not-mobile:hidden",
headerActionIconClassName headerActionIconClassName
@@ -1,4 +1,3 @@
import { ReloadIcon } from "@workspace/icons"
import { useMessage } from "@workspace/i18n" import { useMessage } from "@workspace/i18n"
import { useRefresh } from "../../hooks/use-refresh" import { useRefresh } from "../../hooks/use-refresh"
import { import {
@@ -36,7 +35,7 @@ export function AppQueryIndicator({ className }: { className?: string }) {
aria-label={refreshLabel} aria-label={refreshLabel}
className={cn("[&_svg]:size-4.5", className)} className={cn("[&_svg]:size-4.5", className)}
disabled={!canRefresh} disabled={!canRefresh}
icon={ReloadIcon} icon="huge:reload"
onClick={refresh} onClick={refresh}
/> />
} }
@@ -1,4 +1,4 @@
import { Icon, type IconData } from "@workspace/icons" import { Icon, type IconName } from "@icones/react"
import { Button, type ButtonProps } from "@workspace/ui/components/button" import { Button, type ButtonProps } from "@workspace/ui/components/button"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
@@ -6,7 +6,7 @@ export const headerActionIconClassName =
"transition-all transform origin-center group-hover/button:scale-105" "transition-all transform origin-center group-hover/button:scale-105"
type HeaderActionButtonProps = ButtonProps & { type HeaderActionButtonProps = ButtonProps & {
icon?: IconData icon?: IconName<"huge">
showIndicator?: boolean showIndicator?: boolean
} }
@@ -20,7 +20,7 @@ export function HeaderActionButton({
return ( return (
<Button variant="ghost" size="icon-lg" className={cn(className)} {...props}> <Button variant="ghost" size="icon-lg" className={cn(className)} {...props}>
{icon ? ( {icon ? (
<Icon data={icon} className={cn("size-5", headerActionIconClassName)} /> <Icon name={icon} className={cn("size-5", headerActionIconClassName)} />
) : ( ) : (
children children
)} )}
@@ -1,12 +1,5 @@
import { formatForDisplay } from "@tanstack/react-hotkeys" import { formatForDisplay } from "@tanstack/react-hotkeys"
import { import { Icon, type IconName } from "@icones/react"
Icon,
type IconData,
KeyboardIcon,
LogoutCircle02Icon,
ShieldKeyIcon,
SwatchIcon,
} from "@workspace/icons"
import { useMessage } from "@workspace/i18n" import { useMessage } from "@workspace/i18n"
import { Button, type ButtonProps } from "@workspace/ui/components/button" import { Button, type ButtonProps } from "@workspace/ui/components/button"
import { import {
@@ -49,7 +42,7 @@ interface UserMenuItem {
id: string id: string
action?: NavigationAction action?: NavigationAction
shortcut?: string shortcut?: string
icon: IconData icon: IconName<"huge">
label: string label: string
} }
@@ -137,18 +130,18 @@ function UserMenuContent({ onItemSelect }: { onItemSelect: VoidFunction }) {
{ {
id: "appearance", id: "appearance",
action: navigationActions.appearance, action: navigationActions.appearance,
icon: SwatchIcon, icon: "huge:swatch",
label: appearanceLabel, label: appearanceLabel,
shortcut: "Mod+,", shortcut: "Mod+,",
}, },
{ {
id: "keybindings", id: "keybindings",
icon: KeyboardIcon, icon: "huge:keyboard",
label: keybindingsLabel, label: keybindingsLabel,
}, },
{ {
id: "account-password", id: "account-password",
icon: ShieldKeyIcon, icon: "huge:shield-key",
label: accountPasswordLabel, label: accountPasswordLabel,
shortcut: "Mod+P", shortcut: "Mod+P",
}, },
@@ -172,14 +165,14 @@ function UserMenuContent({ onItemSelect }: { onItemSelect: VoidFunction }) {
className="w-full justify-start font-normal" className="w-full justify-start font-normal"
size="lg" size="lg"
variant="ghost" variant="ghost"
nativeButton={item.action ? true : false} nativeButton={Boolean(item.action)}
render={item.action ? undefined : <a />} render={item.action ? undefined : <a />}
onClick={onItemSelect} onClick={onItemSelect}
{...(item.action {...(item.action
? getNavigationCommandProps(item.action) ? getNavigationCommandProps(item.action)
: undefined)} : undefined)}
> >
<Icon data={item.icon} size="sm" /> <Icon name={item.icon} size="sm" />
{item.label} {item.label}
{item.shortcut && <MenuShortcut shortcut={item.shortcut} />} {item.shortcut && <MenuShortcut shortcut={item.shortcut} />}
</Button> </Button>
@@ -189,7 +182,7 @@ function UserMenuContent({ onItemSelect }: { onItemSelect: VoidFunction }) {
</div> </div>
<div className="rounded-b-md border-t p-2"> <div className="rounded-b-md border-t p-2">
<Button className="w-full font-normal" variant="destructive" size="lg"> <Button className="w-full font-normal" variant="destructive" size="lg">
<Icon data={LogoutCircle02Icon} size="sm" /> <Icon name="huge:logout-circle-02" size="sm" />
{logoutLabel} {logoutLabel}
<MenuShortcutSequence shortcuts={["Q", "Q", "Q"]} /> <MenuShortcutSequence shortcuts={["Q", "Q", "Q"]} />
</Button> </Button>
@@ -0,0 +1,156 @@
import { Icon } from "@icones/react";
import { Button } from "@workspace/ui/components/button";
import { cn } from "@workspace/ui/lib/utils";
import React from "react";
type Props = {
children: React.ReactNode
className?: string
}
/*
+------------------+
| header |
+-------+-+--------+
| | | |
| aside | | main |
| | | |
+-------+-+--------+
^
|
gap
*/
export function Layout({ children, className }: Props) {
return (
<div
className={cn(
"isolate",
"[--app-header-height:--spacing(18)]",
"[--app-aside-width:--spacing(56)]",
"[--app-split-gap:--spacing(4)]",
className,
)}
data-slot="root"
>
<header className="z-10 sticky top-0 h-0" data-slot="header">
<div className="h-(--app-header-height)">
header
</div>
<div className="border-t h-0 absolute inset-x-0 top-(--app-header-height)" />
</header>
<div className="flex gap-(--app-split-gap)">
<aside
className="w-(--app-aside-width) h-svh pt-(--app-header-height) shrink-0"
data-slot="aside"
>
<div className="flex flex-col items-stretch h-full py-4">
<Navigation items={groups} />
<Navigation className="mt-auto" items={[links[1]]} />
</div>
</aside>
<main className="pt-(--app-header-height)" data-slot="main">
<div className="p-4">
{children}
</div>
</main>
</div>
</div>
)
}
const links = [
{ key: "inbox", label: "收件箱", icon: <Icon name="tabler:inbox" /> },
{ key: "starred", label: "已加星标", icon: <Icon name="tabler:star-filled" /> },
{ key: "sent", label: "已发送", icon: <Icon name="tabler:send" /> },
{ key: "drafts", label: "草稿", icon: <Icon name="tabler:edit" /> },
{ key: "deleted", label: "已删除", icon: <Icon name="tabler:trash" /> },
{ key: "sent-mail", label: "已发邮件", icon: <Icon name="tabler:send" /> },
]
const groups = [
{
key: "group-1",
label: "group 1",
items: [...links],
},
{
key: "group-2",
label: "group 2",
items: [...links],
},
...links.slice(2, 4),
]
type NavItem = { key: string; label: string; icon: React.ReactNode }
type NavGroup = { key: string; label: string; items: Array<NavItem> }
type NavItems = Array<NavGroup | NavItem>
function isGroup(item: NavGroup | NavItem): item is NavGroup {
return (item as NavGroup).items !== undefined
}
function Navigation({ items, className }: { items: NavItems; className?: string }) {
return (
<ul className={className}>
{items.map((item, index) => {
if (isGroup(item)) {
const previousItem = index > 0 ? items[index - 1] : undefined
return (
<li
key={item.key}
className={cn(
"not-last:mb-4",
previousItem && isGroup(previousItem)
? "mt-0"
: "not-first:mt-4",
)}
>
<span className="text-xs px-2.5 text-muted-foreground">{item.label}</span>
<ul>
{item.items.map(subItem => (
<li key={subItem.key}>
<NavigationItem
label={subItem.label}
icon={subItem.icon}
current={item.key === "drafts"}
/>
</li>
))}
</ul>
</li>
);
}
return (
<li key={item.key}>
<NavigationItem
label={item.label}
icon={item.icon}
current={item.key === "drafts"}
/>
</li>
);
})}
</ul>
)
}
function NavigationItem({ label, icon, current }: {
label: string
icon: React.ReactNode
current: boolean
}) {
return (
<Button
variant="ghost"
aria-current={current ? "page" : undefined}
className="flex w-full justify-start rounded-l-none rounded-r-full aria-[current=page]:text-red-600 aria-[current=page]:bg-current/10 [&_svg:not([class*='size-'])]:size-5"
size="lg"
>
{icon}
{label}
</Button>
)
}
@@ -11,7 +11,7 @@ import {
PencilIcon, PencilIcon,
Trash2Icon, Trash2Icon,
UploadIcon, UploadIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { import {
ContextMenu, ContextMenu,
@@ -49,6 +49,10 @@ export interface MediaContextMenuProps {
onUpload: (target: MediaStorageTarget) => void onUpload: (target: MediaStorageTarget) => void
} }
function runAfterClose(action: VoidFunction) {
window.setTimeout(action)
}
export function MediaContextMenu({ export function MediaContextMenu({
asset, asset,
children, children,
@@ -73,8 +77,6 @@ export function MediaContextMenu({
const cloudTargets = storageTargets.filter( const cloudTargets = storageTargets.filter(
(target) => target.kind === "cloud" (target) => target.kind === "cloud"
) )
const runAfterClose = (action: VoidFunction) => window.setTimeout(action)
const copy = async (text: string, successMessage: string) => { const copy = async (text: string, successMessage: string) => {
try { try {
await navigator.clipboard.writeText(text) await navigator.clipboard.writeText(text)
@@ -5,7 +5,7 @@ import {
HeartIcon, HeartIcon,
ImageIcon, ImageIcon,
Trash2Icon, Trash2Icon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
@@ -1,4 +1,4 @@
import { CheckIcon, FilmIcon, HeartIcon } from "lucide-react" import { CheckIcon, FilmIcon, HeartIcon } from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
@@ -7,7 +7,7 @@ import {
LoaderCircleIcon, LoaderCircleIcon,
SearchIcon, SearchIcon,
UploadIcon, UploadIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { import {
AlertDialog, AlertDialog,
@@ -57,7 +57,6 @@ import type {
MediaStorageTarget, MediaStorageTarget,
} from "./types" } from "./types"
import { import {
defaultMediaReference,
getMediaFolderPath, getMediaFolderPath,
isMediaFile, isMediaFile,
mediaKindForFile, mediaKindForFile,
@@ -67,7 +66,6 @@ import {
const PAGE_SIZE = 40 const PAGE_SIZE = 40
const EMPTY_ASSETS: readonly MediaAsset[] = [] const EMPTY_ASSETS: readonly MediaAsset[] = []
const EMPTY_FOLDERS: readonly MediaFolder[] = []
const DEFAULT_STORAGE_TARGET: MediaStorageTarget = { const DEFAULT_STORAGE_TARGET: MediaStorageTarget = {
id: "local", id: "local",
kind: "local", kind: "local",
@@ -216,15 +214,7 @@ export function MediaLibrary({
} finally { } finally {
if (assetRequestId.current === requestId) setIsLoadingAssets(false) if (assetRequestId.current === requestId) setIsLoadingAssets(false)
} }
}, [ }, [adapter, allowedKinds, deferredKeyword, filter, folder, t])
adapter,
allowedKinds,
allowedKindsKey,
deferredKeyword,
filter,
folder,
t,
])
React.useEffect(() => { React.useEffect(() => {
void refreshFolders() void refreshFolders()
+1 -1
View File
@@ -12,7 +12,7 @@ import {
PlusIcon, PlusIcon,
Trash2Icon, Trash2Icon,
UnlinkIcon, UnlinkIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
@@ -1,4 +1,4 @@
import { Icon } from "@workspace/icons" import { Icon } from "@icones/react"
import { import {
DropdownMenuItem, DropdownMenuItem,
DropdownMenuSub, DropdownMenuSub,
@@ -23,7 +23,7 @@ export function SidebarFlyoutMenuItems({
return items.map((item) => { return items.map((item) => {
const icon = resolveNavigationItemIcon(item) const icon = resolveNavigationItemIcon(item)
const iconElement = icon ? ( const iconElement = icon ? (
<Icon data={icon} className="size-5 shrink-0" /> <Icon name={icon} className="size-5 shrink-0" />
) : null ) : null
const routeState = getRouteState(item.to) const routeState = getRouteState(item.to)
@@ -1,10 +1,10 @@
import type { IconData } from "@workspace/icons" import type { IconName } from "@icones/react"
import type { NavigationItem } from "./types" import type { NavigationItem } from "./types"
export function resolveNavigationItemIcon( export function resolveNavigationItemIcon(
item: NavigationItem, item: NavigationItem,
visibleByDefault = false visibleByDefault = false
): IconData | undefined { ): IconName<"huge"> | undefined {
return (item.showIcon ?? visibleByDefault) ? item.icon : undefined return (item.showIcon ?? visibleByDefault) ? item.icon : undefined
} }
@@ -1,5 +1,6 @@
import { useLocation } from "@tanstack/react-router" import { useLocation } from "@tanstack/react-router"
import { Icon, Menu02Icon } from "@workspace/icons" import { Fragment } from "react"
import { Icon } from "@icones/react"
import { useMessage } from "@workspace/i18n" import { useMessage } from "@workspace/i18n"
import type { ButtonProps } from "@workspace/ui/components/button" import type { ButtonProps } from "@workspace/ui/components/button"
import { Separator } from "@workspace/ui/components/separator" import { Separator } from "@workspace/ui/components/separator"
@@ -13,8 +14,8 @@ import {
SheetTrigger, SheetTrigger,
} from "@workspace/ui/components/sheet" } from "@workspace/ui/components/sheet"
import { useOnBreakpoint } from "@workspace/ui/hooks/use-breakpoint" import { useOnBreakpoint } from "@workspace/ui/hooks/use-breakpoint"
import { cn, separate } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronRightIcon } from "lucide-react" import { ChevronRightIcon } from "@workspace/ui/components/icon"
import { HeaderActionButton } from "../layout/header-action-button" import { HeaderActionButton } from "../layout/header-action-button"
import { navigationMessages } from "./messages" import { navigationMessages } from "./messages"
@@ -50,7 +51,7 @@ export function MobileNavigationSheetTrigger({
} }
> >
<Icon <Icon
data={Menu02Icon} name="huge:menu-02"
strokeWidth={2.25} strokeWidth={2.25}
className="size-5 [&_path]:transition-all group-hover/button:[&_path]:not-first:not-last:opacity-40 [&_path]:first:opacity-40 group-hover/button:[&_path]:first:translate-x-1 group-hover/button:[&_path]:first:opacity-100 [&_path]:last:opacity-60 group-hover/button:[&_path]:last:translate-x-2 group-hover/button:[&_path]:last:opacity-100" className="size-5 [&_path]:transition-all group-hover/button:[&_path]:not-first:not-last:opacity-40 [&_path]:first:opacity-40 group-hover/button:[&_path]:first:translate-x-1 group-hover/button:[&_path]:first:opacity-100 [&_path]:last:opacity-60 group-hover/button:[&_path]:last:translate-x-2 group-hover/button:[&_path]:last:opacity-100"
/> />
@@ -136,14 +137,13 @@ function FlatNavigationGroupList({
<NavigationLabel label={group.label} /> <NavigationLabel label={group.label} />
</div> </div>
<div className="rounded-md ring ring-sidebar-border"> <div className="rounded-md ring ring-sidebar-border">
{separate({ {group.items.map((item, index) => {
items: group.items, const routeState = getRouteState(item.to)
iterator: (item) => {
const routeState = getRouteState(item.to)
return ( return (
<Fragment key={item.id}>
{index > 0 && <Separator className="ms-12 me-3 w-auto!" />}
<NavigationButton <NavigationButton
key={`item-${item.id}`}
label={item.label} label={item.label}
layout="inline" layout="inline"
icon={resolveNavigationItemIcon( icon={resolveNavigationItemIcon(
@@ -167,14 +167,8 @@ function FlatNavigationGroupList({
</> </>
} }
/> />
) </Fragment>
}, )
separator: (index) => (
<Separator
key={`separator-${index}`}
className="ms-12 me-3 w-auto!"
/>
),
})} })}
</div> </div>
</div> </div>
@@ -2,11 +2,11 @@ import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render" import { useRender } from "@base-ui/react/use-render"
import { Link } from "@tanstack/react-router" import { Link } from "@tanstack/react-router"
import * as React from "react" import * as React from "react"
import { Icon, type IconData } from "@workspace/icons" import { Icon, type IconName } from "@icones/react"
import { Badge } from "@workspace/ui/components/badge" import { Badge } from "@workspace/ui/components/badge"
import { useRippleRef } from "@workspace/ui/hooks/use-ripple" import { useRippleRef } from "@workspace/ui/hooks/use-ripple"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronRightIcon } from "lucide-react" import { ChevronRightIcon } from "@workspace/ui/components/icon"
import { NavigationLabel, TruncatedNavigationLabel } from "./navigation-label" import { NavigationLabel, TruncatedNavigationLabel } from "./navigation-label"
import type { NavigationLabelValue } from "./types" import type { NavigationLabelValue } from "./types"
@@ -15,7 +15,7 @@ export interface NavigationButtonProps extends Omit<
useRender.ComponentProps<"button", {}>, useRender.ComponentProps<"button", {}>,
"className" | "style" "className" | "style"
> { > {
icon?: IconData icon?: IconName<"huge">
isActive: boolean isActive: boolean
isCurrent: boolean isCurrent: boolean
label: NavigationLabelValue label: NavigationLabelValue
@@ -104,7 +104,7 @@ export function NavigationButton({
: undefined : undefined
)} )}
> >
<Icon data={icon} /> <Icon name={icon} />
</span> </span>
)} )}
<span <span
@@ -1,4 +1,4 @@
import type { IconData } from "@workspace/icons" import type { IconName } from "@icones/react"
import type { MessageDescriptor } from "@workspace/i18n" import type { MessageDescriptor } from "@workspace/i18n"
export type NavigationLabelValue = string | MessageDescriptor export type NavigationLabelValue = string | MessageDescriptor
@@ -7,7 +7,7 @@ export interface NavigationItem {
id: string id: string
to?: string to?: string
label: NavigationLabelValue label: NavigationLabelValue
icon?: IconData icon?: IconName<"huge">
showIcon?: boolean showIcon?: boolean
items?: readonly NavigationItem[] items?: readonly NavigationItem[]
} }
@@ -1,6 +1,6 @@
import { useLocation } from "@tanstack/react-router" import { useLocation } from "@tanstack/react-router"
import * as React from "react" import * as React from "react"
import type { IconData } from "@workspace/icons" import type { IconName } from "@icones/react"
import { resolveNavigationItemIcon } from "./item-icon" import { resolveNavigationItemIcon } from "./item-icon"
import type { import type {
@@ -13,7 +13,7 @@ export type NavigationKey = NavigationItem["id"]
export interface NavigationInfo { export interface NavigationInfo {
id: NavigationKey id: NavigationKey
icon?: IconData icon?: IconName<"huge">
items?: readonly NavigationInfo[] items?: readonly NavigationInfo[]
label: NavigationLabelValue label: NavigationLabelValue
to?: string to?: string
@@ -40,26 +40,25 @@ function normalizePathname(pathname: string) {
return pathname.replace(/\/+$/, "") return pathname.replace(/\/+$/, "")
} }
function createInfoItems(
items: readonly NavigationItem[],
showIconByDefault: boolean
): readonly NavigationInfo[] {
return items.map((item) => ({
id: item.id,
icon: resolveNavigationItemIcon(item, showIconByDefault),
items: item.items?.length ? createInfoItems(item.items, false) : undefined,
label: item.label,
to: item.to,
}))
}
function createNavigationIndex( function createNavigationIndex(
groups: readonly NavigationGroup[] groups: readonly NavigationGroup[]
): NavigationIndex { ): NavigationIndex {
const recordsByKey = new Map<NavigationKey, NavigationRecord>() const recordsByKey = new Map<NavigationKey, NavigationRecord>()
const recordsByPathname = new Map<string, NavigationRecord>() const recordsByPathname = new Map<string, NavigationRecord>()
const createInfoItems = (
items: readonly NavigationItem[],
showIconByDefault: boolean
): readonly NavigationInfo[] =>
items.map((item) => ({
id: item.id,
icon: resolveNavigationItemIcon(item, showIconByDefault),
items: item.items?.length
? createInfoItems(item.items, false)
: undefined,
label: item.label,
to: item.to,
}))
const indexInfoItems = ( const indexInfoItems = (
items: readonly NavigationInfo[], items: readonly NavigationInfo[],
parentStack: readonly NavigationInfo[] parentStack: readonly NavigationInfo[]
@@ -1,5 +1,5 @@
import * as React from "react" import * as React from "react"
import { CheckCheckIcon } from "lucide-react" import { CheckCheckIcon } from "@workspace/ui/components/icon"
import { useMessage } from "@workspace/i18n" import { useMessage } from "@workspace/i18n"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
@@ -1,6 +1,6 @@
import * as React from "react" import * as React from "react"
import { Link } from "@tanstack/react-router" import { Link } from "@tanstack/react-router"
import { Icon } from "@workspace/icons" import { Icon } from "@icones/react"
import { useFormatters, useMessage } from "@workspace/i18n" import { useFormatters, useMessage } from "@workspace/i18n"
import { import {
Avatar, Avatar,
@@ -109,7 +109,7 @@ function NotificationItemMedia({ media }: { media: NotificationMedia }) {
ICON_TONE_CLASSES[media.tone ?? "neutral"] ICON_TONE_CLASSES[media.tone ?? "neutral"]
)} )}
> >
<Icon data={media.icon} size="lg" /> <Icon name={media.icon} size="lg" />
</span> </span>
) )
} }
@@ -1,4 +1,4 @@
import type { IconData } from "@workspace/icons" import type { IconName } from "@icones/react"
export type NotificationTone = export type NotificationTone =
| "destructive" | "destructive"
@@ -15,7 +15,7 @@ export interface NotificationAvatarMedia {
} }
export interface NotificationIconMedia { export interface NotificationIconMedia {
icon: IconData icon: IconName<"huge">
kind: "icon" kind: "icon"
tone?: NotificationTone tone?: NotificationTone
} }
+1 -1
View File
@@ -26,9 +26,9 @@
"@lingui/core": "^6", "@lingui/core": "^6",
"@lingui/react": "^6", "@lingui/react": "^6",
"@vitejs/plugin-react": "^6", "@vitejs/plugin-react": "^6",
"@workspace/ui": "workspace:*",
"ansi-to-react": "^6.2.6", "ansi-to-react": "^6.2.6",
"cac": "^7.0.0", "cac": "^7.0.0",
"lucide-react": "^1.27.0",
"open": "^11.0.0", "open": "^11.0.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
@@ -3,7 +3,7 @@ import {
ChevronUpIcon, ChevronUpIcon,
TerminalIcon, TerminalIcon,
XIcon, XIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { AnsiText } from "./ansi-text" import { AnsiText } from "./ansi-text"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
@@ -4,7 +4,7 @@ import {
AlignLeftIcon, AlignLeftIcon,
AlignRightIcon, AlignRightIcon,
SettingsIcon, SettingsIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import type { import type {
I18nDevtoolPanelPlacement, I18nDevtoolPanelPlacement,
@@ -35,14 +35,8 @@ const panelPlacements = [
] as const ] as const
const interfaceLocaleLabels: Record<I18nDevtoolLocale, string> = { const interfaceLocaleLabels: Record<I18nDevtoolLocale, string> = {
de: "Deutsch", "en-US": "English",
en: "English",
es: "Español",
fr: "Français",
ja: "日本語",
ko: "한국어",
"zh-Hans": "简体中文", "zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
} }
export function DevtoolSettings({ export function DevtoolSettings({
@@ -1,4 +1,4 @@
import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react" import { MonitorIcon, MoonIcon, SunIcon } from "@workspace/ui/components/icon"
import type { I18nDevtoolTheme } from "./devtool-preferences" import type { I18nDevtoolTheme } from "./devtool-preferences"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
@@ -1,4 +1,4 @@
import { LanguagesIcon } from "lucide-react" import { LanguagesIcon } from "@workspace/ui/components/icon"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
import { useFloatingTrigger } from "./use-floating-trigger" import { useFloatingTrigger } from "./use-floating-trigger"
+6 -1
View File
@@ -1,5 +1,9 @@
import * as React from "react" import * as React from "react"
import { Maximize2Icon, Minimize2Icon, XIcon } from "lucide-react" import {
Maximize2Icon,
Minimize2Icon,
XIcon,
} from "@workspace/ui/components/icon"
import { createPortal } from "react-dom" import { createPortal } from "react-dom"
import { useLocale, useLocales } from "../runtime" import { useLocale, useLocales } from "../runtime"
@@ -25,6 +29,7 @@ import { DevtoolSettings } from "./devtool-settings"
import { I18nDevtoolTrigger } from "./i18n-devtool-trigger" import { I18nDevtoolTrigger } from "./i18n-devtool-trigger"
import { MessagePanel } from "./message-panel" import { MessagePanel } from "./message-panel"
import { MessageRepositoryProvider } from "./message-repository" import { MessageRepositoryProvider } from "./message-repository"
// oxlint-disable-next-line import/no-unassigned-import -- Loads the Devtool stylesheet.
import "./i18n-devtool.css" import "./i18n-devtool.css"
export interface I18nDevtoolProps { export interface I18nDevtoolProps {
+32 -34
View File
@@ -4,7 +4,7 @@ import {
ChevronDownIcon, ChevronDownIcon,
CopyIcon, CopyIcon,
TriangleAlertIcon, TriangleAlertIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
import type { DevtoolMessage, MessageOrigin } from "./types" import type { DevtoolMessage, MessageOrigin } from "./types"
@@ -53,6 +53,35 @@ async function writeClipboard(value: string) {
} }
} }
function handleMenuKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {
if (!["ArrowDown", "ArrowUp", "End", "Home"].includes(event.key)) {
return
}
event.preventDefault()
const items = Array.from(
event.currentTarget.querySelectorAll<HTMLButtonElement>(
'[role="menuitem"]:not(:disabled)'
)
)
if (items.length === 0) return
const currentIndex = items.indexOf(
document.activeElement as HTMLButtonElement
)
const nextIndex =
event.key === "Home"
? 0
: event.key === "End"
? items.length - 1
: event.key === "ArrowUp"
? (currentIndex - 1 + items.length) % items.length
: (currentIndex + 1) % items.length
items[nextIndex]?.focus()
}
export function MessageCopyMenu({ export function MessageCopyMenu({
message, message,
translation, translation,
@@ -132,37 +161,6 @@ export function MessageCopyMenu({
} }
} }
const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
if (!["ArrowDown", "ArrowUp", "End", "Home"].includes(event.key)) {
return
}
event.preventDefault()
const items = Array.from(
event.currentTarget.querySelectorAll<HTMLButtonElement>(
'[role="menuitem"]:not(:disabled)'
)
)
if (items.length === 0) {
return
}
const currentIndex = items.indexOf(
document.activeElement as HTMLButtonElement
)
const nextIndex =
event.key === "Home"
? 0
: event.key === "End"
? items.length - 1
: event.key === "ArrowUp"
? (currentIndex - 1 + items.length) % items.length
: (currentIndex + 1) % items.length
items[nextIndex]?.focus()
}
return ( return (
<div className="i18n-message-copy" ref={rootRef}> <div className="i18n-message-copy" ref={rootRef}>
<button <button
@@ -236,10 +234,10 @@ export function MessageCopyMenu({
<span className="i18n-message-copy__label"> <span className="i18n-message-copy__label">
{messages.messagePanel.sourceLocations} {messages.messagePanel.sourceLocations}
</span> </span>
{message.origins.map((origin, index) => ( {message.origins.map((origin) => (
<button <button
type="button" type="button"
key={`${getOriginLocation(origin)}:${index}`} key={getOriginLocation(origin)}
role="menuitem" role="menuitem"
title={getOriginLocation(origin)} title={getOriginLocation(origin)}
onClick={() => void copy(getOriginLocation(origin))} onClick={() => void copy(getOriginLocation(origin))}
@@ -1,5 +1,9 @@
import * as React from "react" import * as React from "react"
import { ChevronDownIcon, FolderIcon, PackageIcon } from "lucide-react" import {
ChevronDownIcon,
FolderIcon,
PackageIcon,
} from "@workspace/ui/components/icon"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
import type { DevtoolMessage, DevtoolMessagePackage } from "./types" import type { DevtoolMessage, DevtoolMessagePackage } from "./types"
@@ -137,19 +141,20 @@ function NamespaceBranch({
packageName: string packageName: string
selectedKey?: string selectedKey?: string
}) { }) {
const sortedNodes = Array.from(nodes.values())
sortedNodes.sort((left, right) => left.segment.localeCompare(right.segment))
return ( return (
<ul className="i18n-message-tree__branch"> <ul className="i18n-message-tree__branch">
{Array.from(nodes.values()) {sortedNodes.map((node) => (
.sort((left, right) => left.segment.localeCompare(right.segment)) <NamespaceNode
.map((node) => ( key={node.path}
<NamespaceNode node={node}
key={node.path} packageName={packageName}
node={node} selectedKey={selectedKey}
packageName={packageName} onSelect={onSelect}
selectedKey={selectedKey} />
onSelect={onSelect} ))}
/>
))}
</ul> </ul>
) )
} }
+6 -3
View File
@@ -6,7 +6,7 @@ import {
RotateCcwIcon, RotateCcwIcon,
SaveIcon, SaveIcon,
SearchIcon, SearchIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { useDevtoolLocalization } from "./devtool-localization" import { useDevtoolLocalization } from "./devtool-localization"
import { formatMessageOrigin, MessageCopyMenu } from "./message-copy-menu" import { formatMessageOrigin, MessageCopyMenu } from "./message-copy-menu"
@@ -20,6 +20,7 @@ import type {
DevtoolMessagePackage, DevtoolMessagePackage,
MessageRepository, MessageRepository,
} from "./types" } from "./types"
// oxlint-disable-next-line import/no-unassigned-import -- Loads the message panel stylesheet.
import "./message-panel.css" import "./message-panel.css"
type LoadState = type LoadState =
@@ -392,17 +393,19 @@ export function MessagePanel({
} }
} }
return Array.from(groups, ([packageName, group]) => ({ const packageGroups = Array.from(groups, ([packageName, group]) => ({
kind: group.kind, kind: group.kind,
messages: group.messages, messages: group.messages,
missingCount: group.messages.filter((message) => message.missing).length, missingCount: group.messages.filter((message) => message.missing).length,
packageName, packageName,
})).sort( }))
packageGroups.sort(
(left, right) => (left, right) =>
Number(right.kind === "application") - Number(right.kind === "application") -
Number(left.kind === "application") || Number(left.kind === "application") ||
left.packageName.localeCompare(right.packageName) left.packageName.localeCompare(right.packageName)
) )
return packageGroups
}, [missingOnly, query, state, visibleMessages]) }, [missingOnly, query, state, visibleMessages])
const navigationModel = React.useMemo( const navigationModel = React.useMemo(
() => createMessageNavigationModel(visiblePackageGroups), () => createMessageNavigationModel(visiblePackageGroups),
-22
View File
@@ -1,22 +0,0 @@
# @workspace/icons
Workspace icon primitives backed by Hugeicons.
## Usage
```tsx
import { Icon, Search01Icon } from "@workspace/icons"
export function SearchButton() {
return <Icon data={Search01Icon} size="lg" />
}
```
`Icon` defaults to the `md` size and inherits the current text color. A
Tailwind size class supplied through `className` overrides the size preset:
```tsx
<Icon data={Search01Icon} className="size-8 text-primary" />
```
Available presets are `xs`, `sm`, `md`, `lg`, and `xl`.
-22
View File
@@ -1,22 +0,0 @@
{
"name": "@workspace/icons",
"version": "0.0.0",
"type": "module",
"private": true,
"sideEffects": false,
"scripts": {
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@hugeicons/core-free-icons": "^4.2.3",
"@hugeicons/react": "^1.1.9",
"react": "^19.2.6"
},
"devDependencies": {
"@types/react": "^19",
"typescript": "~6"
},
"exports": {
".": "./src/index.tsx"
}
}
-33
View File
@@ -1,33 +0,0 @@
import { type HugeiconsIconProps, HugeiconsIcon } from "@hugeicons/react"
export * from "@hugeicons/core-free-icons"
export type IconData = HugeiconsIconProps["icon"]
export type IconSize = keyof typeof sizeValues
export type IconProps = Omit<HugeiconsIconProps, "icon" | "size"> & {
data: IconData
size?: IconSize
}
const sizeValues = {
xs: 12,
sm: 16,
md: 20,
lg: 24,
xl: 28,
}
export function Icon({ data, className, size = "md", ...props }: IconProps) {
return (
<HugeiconsIcon
icon={data}
size={sizeValues[size]}
color="currentColor"
aria-hidden="true"
strokeWidth={1.75}
className={className}
{...props}
/>
)
}
-17
View File
@@ -1,17 +0,0 @@
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"paths": {
"@workspace/icons": ["./src/index.tsx"]
}
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
-1
View File
@@ -19,7 +19,6 @@
"@workspace/i18n": "workspace:*", "@workspace/i18n": "workspace:*",
"@workspace/ui": "workspace:*", "@workspace/ui": "workspace:*",
"lexical": "^0.48.0", "lexical": "^0.48.0",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-dom": "^19.2.6" "react-dom": "^19.2.6"
}, },
+6 -1
View File
@@ -3,7 +3,12 @@
import * as React from "react" import * as React from "react"
import type { ComponentType, ReactElement, ReactNode } from "react" import type { ComponentType, ReactElement, ReactNode } from "react"
import type { Klass, LexicalNode } from "lexical" import type { Klass, LexicalNode } from "lexical"
import { AlignLeft, CaseSensitive, Pilcrow, Plus } from "lucide-react" import {
AlignLeft,
CaseSensitive,
Pilcrow,
Plus,
} from "@workspace/ui/components/icon"
import { import {
boldAction, boldAction,
+1 -1
View File
@@ -1,4 +1,4 @@
import { Check, ChevronDown } from "lucide-react" import { Check, ChevronDown } from "@workspace/ui/components/icon"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
DropdownMenu, DropdownMenu,
+6 -1
View File
@@ -1,4 +1,9 @@
import { AlignCenter, AlignJustify, AlignLeft, AlignRight } from "lucide-react" import {
AlignCenter,
AlignJustify,
AlignLeft,
AlignRight,
} from "@workspace/ui/components/icon"
import { import {
$getSelection, $getSelection,
$isRangeSelection, $isRangeSelection,
+7 -1
View File
@@ -8,7 +8,13 @@ import {
} from "@lexical/rich-text" } from "@lexical/rich-text"
import type { HeadingTagType } from "@lexical/rich-text" import type { HeadingTagType } from "@lexical/rich-text"
import { $setBlocksType } from "@lexical/selection" import { $setBlocksType } from "@lexical/selection"
import { Heading1, Heading2, Heading3, Pilcrow, Quote } from "lucide-react" import {
Heading1,
Heading2,
Heading3,
Pilcrow,
Quote,
} from "@workspace/ui/components/icon"
import { $createParagraphNode, $getSelection, $isRangeSelection } from "lexical" import { $createParagraphNode, $getSelection, $isRangeSelection } from "lexical"
import type { LexicalActionDefinition } from "../types" import type { LexicalActionDefinition } from "../types"
import { lexicalMessages } from "../messages" import { lexicalMessages } from "../messages"
@@ -1,7 +1,7 @@
import { TOGGLE_LINK_COMMAND } from "@lexical/link" import { TOGGLE_LINK_COMMAND } from "@lexical/link"
import { REMOVE_LIST_COMMAND } from "@lexical/list" import { REMOVE_LIST_COMMAND } from "@lexical/list"
import { $patchStyleText, $setBlocksType } from "@lexical/selection" import { $patchStyleText, $setBlocksType } from "@lexical/selection"
import { Eraser } from "lucide-react" import { Eraser } from "@workspace/ui/components/icon"
import { $createParagraphNode, $getSelection, $isRangeSelection } from "lexical" import { $createParagraphNode, $getSelection, $isRangeSelection } from "lexical"
import type { LexicalActionDefinition } from "../types" import type { LexicalActionDefinition } from "../types"
import { lexicalMessages } from "../messages" import { lexicalMessages } from "../messages"
@@ -2,7 +2,7 @@ import {
$getSelectionStyleValueForProperty, $getSelectionStyleValueForProperty,
$patchStyleText, $patchStyleText,
} from "@lexical/selection" } from "@lexical/selection"
import { Baseline, Pipette } from "lucide-react" import { Baseline, Pipette } from "@workspace/ui/components/icon"
import { $getSelection, $isRangeSelection, $setSelection } from "lexical" import { $getSelection, $isRangeSelection, $setSelection } from "lexical"
import type { LexicalEditor, RangeSelection } from "lexical" import type { LexicalEditor, RangeSelection } from "lexical"
import { useRef, useState } from "react" import { useRef, useState } from "react"
+1 -1
View File
@@ -1,4 +1,4 @@
import { CalendarDays } from "lucide-react" import { CalendarDays } from "@workspace/ui/components/icon"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { DropdownMenuItem } from "@workspace/ui/components/dropdown-menu" import { DropdownMenuItem } from "@workspace/ui/components/dropdown-menu"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
+1 -1
View File
@@ -2,7 +2,7 @@ import {
$getSelectionStyleValueForProperty, $getSelectionStyleValueForProperty,
$patchStyleText, $patchStyleText,
} from "@lexical/selection" } from "@lexical/selection"
import { ALargeSmall, ChevronDown } from "lucide-react" import { ALargeSmall, ChevronDown } from "@workspace/ui/components/icon"
import { $getSelection, $isRangeSelection } from "lexical" import { $getSelection, $isRangeSelection } from "lexical"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
+1 -1
View File
@@ -1,5 +1,5 @@
import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin" import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin"
import { Redo2, Undo2 } from "lucide-react" import { Redo2, Undo2 } from "@workspace/ui/components/icon"
import { REDO_COMMAND, UNDO_COMMAND } from "lexical" import { REDO_COMMAND, UNDO_COMMAND } from "lexical"
import type { LexicalActionDefinition } from "../types" import type { LexicalActionDefinition } from "../types"
import { lexicalMessages } from "../messages" import { lexicalMessages } from "../messages"
@@ -3,7 +3,7 @@ import {
HorizontalRuleNode, HorizontalRuleNode,
} from "@lexical/extension" } from "@lexical/extension"
import { $insertNodeToNearestRoot } from "@lexical/utils" import { $insertNodeToNearestRoot } from "@lexical/utils"
import { Minus } from "lucide-react" import { Minus } from "@workspace/ui/components/icon"
import { $getSelection, $isRangeSelection } from "lexical" import { $getSelection, $isRangeSelection } from "lexical"
import type { LexicalActionDefinition } from "../types" import type { LexicalActionDefinition } from "../types"
import { lexicalMessages } from "../messages" import { lexicalMessages } from "../messages"
+1 -1
View File
@@ -1,4 +1,4 @@
import { IndentDecrease, IndentIncrease } from "lucide-react" import { IndentDecrease, IndentIncrease } from "@workspace/ui/components/icon"
import { INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from "lexical" import { INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from "lexical"
import type { LexicalActionDefinition } from "../types" import type { LexicalActionDefinition } from "../types"
import { lexicalMessages } from "../messages" import { lexicalMessages } from "../messages"
+1 -1
View File
@@ -1,6 +1,6 @@
import { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link" import { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link"
import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin" import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin"
import { Link } from "lucide-react" import { Link } from "@workspace/ui/components/icon"
import { $findMatchingParent, $getSelection, $isRangeSelection } from "lexical" import { $findMatchingParent, $getSelection, $isRangeSelection } from "lexical"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { import {
+1 -1
View File
@@ -9,7 +9,7 @@ import {
} from "@lexical/list" } from "@lexical/list"
import { CheckListPlugin } from "@lexical/react/LexicalCheckListPlugin" import { CheckListPlugin } from "@lexical/react/LexicalCheckListPlugin"
import { ListPlugin } from "@lexical/react/LexicalListPlugin" import { ListPlugin } from "@lexical/react/LexicalListPlugin"
import { List, ListChecks, ListOrdered } from "lucide-react" import { List, ListChecks, ListOrdered } from "@workspace/ui/components/icon"
import { $getSelection, $isRangeSelection } from "lexical" import { $getSelection, $isRangeSelection } from "lexical"
import type { LexicalCommand, LexicalEditor } from "lexical" import type { LexicalCommand, LexicalEditor } from "lexical"
import type { LexicalActionDefinition, LexicalActionName } from "../types" import type { LexicalActionDefinition, LexicalActionName } from "../types"
+1 -1
View File
@@ -1,4 +1,4 @@
import { ImageIcon, VideoIcon } from "lucide-react" import { ImageIcon, VideoIcon } from "@workspace/ui/components/icon"
import { $insertNodes } from "lexical" import { $insertNodes } from "lexical"
import { import {
+1 -1
View File
@@ -8,7 +8,7 @@ import {
Subscript, Subscript,
Superscript, Superscript,
Underline, Underline,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND } from "lexical" import { $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND } from "lexical"
import type { TextFormatType } from "lexical" import type { TextFormatType } from "lexical"
import type { LexicalActionDefinition, LexicalActionName } from "../types" import type { LexicalActionDefinition, LexicalActionName } from "../types"
+6 -1
View File
@@ -22,7 +22,12 @@ import type {
Spread, Spread,
} from "lexical" } from "lexical"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { AlignCenter, AlignLeft, AlignRight, Trash2 } from "lucide-react" import {
AlignCenter,
AlignLeft,
AlignRight,
Trash2,
} from "@workspace/ui/components/icon"
import { useTranslate } from "@workspace/i18n" import { useTranslate } from "@workspace/i18n"
import { ImageResizer } from "../components/image-resizer" import { ImageResizer } from "../components/image-resizer"
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react" import { useEffect, useState } from "react"
import { Trash2 } from "lucide-react" import { Trash2 } from "@workspace/ui/components/icon"
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext" import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"
import { import {
$getNearestNodeFromDOMNode, $getNearestNodeFromDOMNode,
@@ -9,7 +9,7 @@ import {
} from "react" } from "react"
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext" import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"
import { DraggableBlockPlugin_EXPERIMENTAL } from "@lexical/react/LexicalDraggableBlockPlugin" import { DraggableBlockPlugin_EXPERIMENTAL } from "@lexical/react/LexicalDraggableBlockPlugin"
import { GripVertical } from "lucide-react" import { GripVertical } from "@workspace/ui/components/icon"
import { $getRoot, $isParagraphNode } from "lexical" import { $getRoot, $isParagraphNode } from "lexical"
import { useLexicalMessage } from "../i18n" import { useLexicalMessage } from "../i18n"
@@ -1,7 +1,7 @@
import { useEffect, useId, useRef, useState } from "react" import { useEffect, useId, useRef, useState } from "react"
import { $isLinkNode, $toggleLink } from "@lexical/link" import { $isLinkNode, $toggleLink } from "@lexical/link"
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext" import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"
import { Check, Pencil, Trash2 } from "lucide-react" import { Check, Pencil, Trash2 } from "@workspace/ui/components/icon"
import { import {
$findMatchingParent, $findMatchingParent,
$getNearestNodeFromDOMNode, $getNearestNodeFromDOMNode,
+2 -2
View File
@@ -1,6 +1,6 @@
import type { ComponentType, ReactNode } from "react" import type { ComponentType, ReactNode } from "react"
import type { Klass, LexicalEditor, LexicalNode } from "lexical" import type { Klass, LexicalEditor, LexicalNode } from "lexical"
import type { LucideIcon } from "lucide-react" import type { IconComponent } from "@workspace/ui/components/icon"
import type { LexicalActionState } from "./context" import type { LexicalActionState } from "./context"
import type { LexicalEmbedDefinition } from "./embed" import type { LexicalEmbedDefinition } from "./embed"
import type { LexicalMessage } from "./i18n" import type { LexicalMessage } from "./i18n"
@@ -54,7 +54,7 @@ export interface LexicalActionDefinition<Value = string> {
name: string name: string
label: LexicalMessage label: LexicalMessage
hidden?: boolean hidden?: boolean
icon?: LucideIcon icon?: IconComponent
group?: LexicalActionGroup group?: LexicalActionGroup
execute: (context: LexicalActionContext, value?: Value) => void execute: (context: LexicalActionContext, value?: Value) => void
isActive?: (context: LexicalActionContext) => boolean isActive?: (context: LexicalActionContext) => boolean
+1 -1
View File
@@ -10,6 +10,7 @@
"@base-ui/react": "^1.6.0", "@base-ui/react": "^1.6.0",
"@base-ui/utils": "^0.3.1", "@base-ui/utils": "^0.3.1",
"@fontsource-variable/inter": "^5.3.0", "@fontsource-variable/inter": "^5.3.0",
"@icones/react": "^0.0.1",
"@shadcn/react": "^0.2.1", "@shadcn/react": "^0.2.1",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
@@ -17,7 +18,6 @@
"date-fns": "^4.4.0", "date-fns": "^4.4.0",
"embla-carousel-react": "^8.6.0", "embla-carousel-react": "^8.6.0",
"input-otp": "^1.4.2", "input-otp": "^1.4.2",
"lucide-react": "^1.27.0",
"react": "^19.2.6", "react": "^19.2.6",
"react-day-picker": "^10.0.1", "react-day-picker": "^10.0.1",
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
+1 -1
View File
@@ -1,7 +1,7 @@
import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion" import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronDownIcon, ChevronUpIcon } from "lucide-react" import { ChevronDownIcon, ChevronUpIcon } from "@workspace/ui/components/icon"
function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) { function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {
return ( return (
+4 -1
View File
@@ -3,7 +3,10 @@ import { mergeProps } from "@base-ui/react/merge-props"
import { useRender } from "@base-ui/react/use-render" import { useRender } from "@base-ui/react/use-render"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react" import {
ChevronRightIcon,
MoreHorizontalIcon,
} from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages, useMessage } from "./i18n" import { LocalizedText, uiMessages, useMessage } from "./i18n"
function Breadcrumb({ function Breadcrumb({
+184 -159
View File
@@ -14,7 +14,68 @@ import {
ChevronLeftIcon, ChevronLeftIcon,
ChevronRightIcon, ChevronRightIcon,
ChevronDownIcon, ChevronDownIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
type CalendarComponents = NonNullable<
React.ComponentProps<typeof DayPicker>["components"]
>
const CalendarLocaleContext = React.createContext<string | undefined>(undefined)
const CalendarRoot: NonNullable<CalendarComponents["Root"]> = ({
className: rootClassName,
rootRef,
...rootProps
}) => (
<div
data-slot="calendar"
ref={rootRef}
className={cn(rootClassName)}
{...rootProps}
/>
)
const CalendarChevron: NonNullable<CalendarComponents["Chevron"]> = ({
className: chevronClassName,
orientation,
...chevronProps
}) => {
if (orientation === "left") {
return (
<ChevronLeftIcon
className={cn("size-4 rtl:rotate-180", chevronClassName)}
{...chevronProps}
/>
)
}
if (orientation === "right") {
return (
<ChevronRightIcon
className={cn("size-4 rtl:rotate-180", chevronClassName)}
{...chevronProps}
/>
)
}
return (
<ChevronDownIcon
className={cn("size-4", chevronClassName)}
{...chevronProps}
/>
)
}
const CalendarWeekNumber: NonNullable<CalendarComponents["WeekNumber"]> = ({
children,
...weekNumberProps
}) => (
<td {...weekNumberProps}>
<div className="flex size-(--cell-size) items-center justify-center text-center">
{children}
</div>
</td>
)
function Calendar({ function Calendar({
className, className,
@@ -37,162 +98,126 @@ function Calendar({
const localeCode = locale?.code ?? contextLocale const localeCode = locale?.code ?? contextLocale
return ( return (
<DayPicker <CalendarLocaleContext.Provider value={localeCode}>
showOutsideDays={showOutsideDays} <DayPicker
className={cn( showOutsideDays={showOutsideDays}
"group/calendar bg-background p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent", className={cn(
String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`, "group/calendar bg-background p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent",
String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`, String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
className String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
)} className
captionLayout={captionLayout} )}
locale={locale} captionLayout={captionLayout}
lang={lang ?? localeCode} locale={locale}
formatters={{ lang={lang ?? localeCode}
formatMonthDropdown: (date) => formatters={{
date.toLocaleString(localeCode, { month: "short" }), formatMonthDropdown: (date) =>
...formatters, date.toLocaleString(localeCode, { month: "short" }),
}} ...formatters,
classNames={{ }}
root: cn("w-fit", defaultClassNames.root), classNames={{
months: cn( root: cn("w-fit", defaultClassNames.root),
"relative flex flex-col gap-4 md:flex-row", months: cn(
defaultClassNames.months "relative flex flex-col gap-4 md:flex-row",
), defaultClassNames.months
month: cn("flex w-full flex-col gap-4", defaultClassNames.month), ),
nav: cn( month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1", nav: cn(
defaultClassNames.nav "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
), defaultClassNames.nav
button_previous: cn( ),
buttonVariants({ variant: buttonVariant }), button_previous: cn(
"size-(--cell-size) p-0 select-none aria-disabled:opacity-50", buttonVariants({ variant: buttonVariant }),
defaultClassNames.button_previous "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
), defaultClassNames.button_previous
button_next: cn( ),
buttonVariants({ variant: buttonVariant }), button_next: cn(
"size-(--cell-size) p-0 select-none aria-disabled:opacity-50", buttonVariants({ variant: buttonVariant }),
defaultClassNames.button_next "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
), defaultClassNames.button_next
month_caption: cn( ),
"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)", month_caption: cn(
defaultClassNames.month_caption "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
), defaultClassNames.month_caption
dropdowns: cn( ),
"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium", dropdowns: cn(
defaultClassNames.dropdowns "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium",
), defaultClassNames.dropdowns
dropdown_root: cn( ),
"relative rounded-(--cell-radius)", dropdown_root: cn(
defaultClassNames.dropdown_root "relative rounded-(--cell-radius)",
), defaultClassNames.dropdown_root
dropdown: cn( ),
"absolute inset-0 bg-popover opacity-0", dropdown: cn(
defaultClassNames.dropdown "absolute inset-0 bg-popover opacity-0",
), defaultClassNames.dropdown
caption_label: cn( ),
"font-medium select-none", caption_label: cn(
captionLayout === "label" "font-medium select-none",
? "text-sm" captionLayout === "label"
: "flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground", ? "text-sm"
defaultClassNames.caption_label : "flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
), defaultClassNames.caption_label
month_grid: cn("w-full border-collapse", defaultClassNames.month_grid), ),
weekdays: cn("flex", defaultClassNames.weekdays), month_grid: cn(
weekday: cn( "w-full border-collapse",
"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none", defaultClassNames.month_grid
defaultClassNames.weekday ),
), weekdays: cn("flex", defaultClassNames.weekdays),
week: cn("mt-2 flex w-full", defaultClassNames.week), weekday: cn(
week_number_header: cn( "flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none",
"w-(--cell-size) select-none", defaultClassNames.weekday
defaultClassNames.week_number_header ),
), week: cn("mt-2 flex w-full", defaultClassNames.week),
week_number: cn( week_number_header: cn(
"text-[0.8rem] text-muted-foreground select-none", "w-(--cell-size) select-none",
defaultClassNames.week_number defaultClassNames.week_number_header
), ),
day: cn( week_number: cn(
"group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)", "text-[0.8rem] text-muted-foreground select-none",
props.showWeekNumber defaultClassNames.week_number
? "[&:nth-child(2)[data-selected=true]_button]:rounded-s-(--cell-radius)" ),
: "[&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius)", day: cn(
defaultClassNames.day "group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)",
), props.showWeekNumber
range_start: cn( ? "[&:nth-child(2)[data-selected=true]_button]:rounded-s-(--cell-radius)"
"relative isolate z-0 rounded-s-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:end-0 after:w-4 after:bg-muted", : "[&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius)",
defaultClassNames.range_start defaultClassNames.day
), ),
range_middle: cn("rounded-none", defaultClassNames.range_middle), range_start: cn(
range_end: cn( "relative isolate z-0 rounded-s-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:end-0 after:w-4 after:bg-muted",
"relative isolate z-0 rounded-e-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:start-0 after:w-4 after:bg-muted", defaultClassNames.range_start
defaultClassNames.range_end ),
), range_middle: cn("rounded-none", defaultClassNames.range_middle),
today: cn( range_end: cn(
"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none", "relative isolate z-0 rounded-e-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:start-0 after:w-4 after:bg-muted",
defaultClassNames.today defaultClassNames.range_end
), ),
outside: cn( today: cn(
"text-muted-foreground aria-selected:text-muted-foreground", "rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none",
defaultClassNames.outside defaultClassNames.today
), ),
disabled: cn( outside: cn(
"text-muted-foreground opacity-50", "text-muted-foreground aria-selected:text-muted-foreground",
defaultClassNames.disabled defaultClassNames.outside
), ),
hidden: cn("invisible", defaultClassNames.hidden), disabled: cn(
...classNames, "text-muted-foreground opacity-50",
}} defaultClassNames.disabled
components={{ ),
Root: ({ className, rootRef, ...props }) => { hidden: cn("invisible", defaultClassNames.hidden),
return ( ...classNames,
<div }}
data-slot="calendar" components={{
ref={rootRef} Root: CalendarRoot,
className={cn(className)} Chevron: CalendarChevron,
{...props} DayButton: CalendarDayButton,
/> WeekNumber: CalendarWeekNumber,
) ...components,
}, }}
Chevron: ({ className, orientation, ...props }) => { {...props}
if (orientation === "left") { />
return ( </CalendarLocaleContext.Provider>
<ChevronLeftIcon
className={cn("size-4 rtl:rotate-180", className)}
{...props}
/>
)
}
if (orientation === "right") {
return (
<ChevronRightIcon
className={cn("size-4 rtl:rotate-180", className)}
{...props}
/>
)
}
return (
<ChevronDownIcon className={cn("size-4", className)} {...props} />
)
},
DayButton: ({ ...props }) => (
<CalendarDayButton locale={localeCode} {...props} />
),
WeekNumber: ({ children, ...props }) => {
return (
<td {...props}>
<div className="flex size-(--cell-size) items-center justify-center text-center">
{children}
</div>
</td>
)
},
...components,
}}
{...props}
/>
) )
} }
@@ -200,10 +225,10 @@ function CalendarDayButton({
className, className,
day, day,
modifiers, modifiers,
locale,
...props ...props
}: React.ComponentProps<typeof DayButton> & { locale?: string }) { }: React.ComponentProps<typeof DayButton>) {
const defaultClassNames = getDefaultClassNames() const defaultClassNames = getDefaultClassNames()
const locale = React.useContext(CalendarLocaleContext)
const ref = React.useRef<HTMLButtonElement>(null) const ref = React.useRef<HTMLButtonElement>(null)
React.useEffect(() => { React.useEffect(() => {
+37 -18
View File
@@ -5,7 +5,10 @@ import useEmblaCarousel, {
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react" import {
ChevronLeftIcon,
ChevronRightIcon,
} from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages } from "./i18n" import { LocalizedText, uiMessages } from "./i18n"
type CarouselApi = UseEmblaCarouselType[1] type CarouselApi = UseEmblaCarouselType[1]
@@ -60,10 +63,10 @@ function Carousel({
const [canScrollPrev, setCanScrollPrev] = React.useState(false) const [canScrollPrev, setCanScrollPrev] = React.useState(false)
const [canScrollNext, setCanScrollNext] = React.useState(false) const [canScrollNext, setCanScrollNext] = React.useState(false)
const onSelect = React.useCallback((api: CarouselApi) => { const onSelect = React.useCallback((carouselApi: CarouselApi) => {
if (!api) return if (!carouselApi) return
setCanScrollPrev(api.canScrollPrev()) setCanScrollPrev(carouselApi.canScrollPrev())
setCanScrollNext(api.canScrollNext()) setCanScrollNext(carouselApi.canScrollNext())
}, []) }, [])
const scrollPrev = React.useCallback(() => { const scrollPrev = React.useCallback(() => {
@@ -103,20 +106,36 @@ function Carousel({
} }
}, [api, onSelect]) }, [api, onSelect])
const contextValue = React.useMemo<CarouselContextProps>(
() => ({
carouselRef,
api,
opts,
orientation:
orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
scrollPrev,
scrollNext,
canScrollPrev,
canScrollNext,
plugins,
setApi,
}),
[
api,
canScrollNext,
canScrollPrev,
carouselRef,
opts,
orientation,
plugins,
scrollNext,
scrollPrev,
setApi,
]
)
return ( return (
<CarouselContext.Provider <CarouselContext.Provider value={contextValue}>
value={{
carouselRef,
api: api,
opts,
orientation:
orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
scrollPrev,
scrollNext,
canScrollPrev,
canScrollNext,
}}
>
<div <div
onKeyDownCapture={handleKeyDown} onKeyDownCapture={handleKeyDown}
className={cn("relative", className)} className={cn("relative", className)}
+1 -1
View File
@@ -3,7 +3,7 @@
import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox" import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { CheckIcon } from "lucide-react" import { CheckIcon } from "@workspace/ui/components/icon"
function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) { function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
return ( return (
+5 -1
View File
@@ -11,7 +11,11 @@ import {
InputGroupButton, InputGroupButton,
InputGroupInput, InputGroupInput,
} from "@workspace/ui/components/input-group" } from "@workspace/ui/components/input-group"
import { ChevronDownIcon, XIcon, CheckIcon } from "lucide-react" import {
ChevronDownIcon,
XIcon,
CheckIcon,
} from "@workspace/ui/components/icon"
const Combobox = ComboboxPrimitive.Root const Combobox = ComboboxPrimitive.Root
+1 -1
View File
@@ -13,7 +13,7 @@ import {
InputGroup, InputGroup,
InputGroupAddon, InputGroupAddon,
} from "@workspace/ui/components/input-group" } from "@workspace/ui/components/input-group"
import { SearchIcon, CheckIcon } from "lucide-react" import { SearchIcon, CheckIcon } from "@workspace/ui/components/icon"
function Command({ function Command({
className, className,
+1 -1
View File
@@ -4,7 +4,7 @@ import * as React from "react"
import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu" import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronRightIcon, CheckIcon } from "lucide-react" import { ChevronRightIcon, CheckIcon } from "@workspace/ui/components/icon"
function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) { function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {
return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} /> return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />
+1 -1
View File
@@ -5,7 +5,7 @@ import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { XIcon } from "lucide-react" import { XIcon } from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages } from "./i18n" import { LocalizedText, uiMessages } from "./i18n"
type DialogHandle<Payload> = DialogPrimitive.Handle<Payload> type DialogHandle<Payload> = DialogPrimitive.Handle<Payload>
+1 -1
View File
@@ -9,7 +9,7 @@ import {
getAnchoredSurfaceSideOffset, getAnchoredSurfaceSideOffset,
} from "@workspace/ui/components/anchored-surface" } from "@workspace/ui/components/anchored-surface"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronRightIcon, CheckIcon } from "lucide-react" import { ChevronRightIcon, CheckIcon } from "@workspace/ui/components/icon"
import { useRippleRef } from "../hooks/use-ripple" import { useRippleRef } from "../hooks/use-ripple"
function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) { function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {
+229
View File
@@ -0,0 +1,229 @@
import * as React from "react"
import { Icon, type IconName, type IconProps } from "@icones/react"
export type IconComponentProps = Omit<
Extract<IconProps, { name: string }>,
"name"
>
export type IconComponent = React.ComponentType<IconComponentProps>
function createIcon(name: IconName<"lucide">): IconComponent {
const Component = (props: IconComponentProps) => (
<Icon name={name} size={24} strokeWidth={2} {...props} />
)
Component.displayName = `Icon(${name})`
return Component
}
export const ALargeSmall = createIcon("lucide:a-large-small")
export const AlignCenter = createIcon("lucide:text-align-center")
export const AlignCenterIcon = AlignCenter
export const AlignJustify = createIcon("lucide:text-align-justify")
export const AlignLeft = createIcon("lucide:text-align-start")
export const AlignLeftIcon = AlignLeft
export const AlignRight = createIcon("lucide:text-align-end")
export const AlignRightIcon = AlignRight
export const AppWindowIcon = createIcon("lucide:app-window")
export const ArrowDownIcon = createIcon("lucide:arrow-down")
export const ArrowLeftIcon = createIcon("lucide:arrow-left")
export const Baseline = createIcon("lucide:baseline")
export const Bold = createIcon("lucide:bold")
export const CalendarDays = createIcon("lucide:calendar-days")
export const CaseLower = createIcon("lucide:case-lower")
export const CaseSensitive = createIcon("lucide:case-sensitive")
export const CaseUpper = createIcon("lucide:case-upper")
export const Check = createIcon("lucide:check")
export const CheckIcon = Check
export const CheckCheckIcon = createIcon("lucide:check-check")
export const ChevronDown = createIcon("lucide:chevron-down")
export const ChevronDownIcon = ChevronDown
export const ChevronLeftIcon = createIcon("lucide:chevron-left")
export const ChevronRightIcon = createIcon("lucide:chevron-right")
export const ChevronUpIcon = createIcon("lucide:chevron-up")
export const CircleAlertIcon = createIcon("lucide:circle-alert")
export const CircleCheckIcon = createIcon("lucide:circle-check")
export const ClipboardCopyIcon = createIcon("lucide:clipboard-copy")
export const CloudIcon = createIcon("lucide:cloud")
export const CloudUploadIcon = createIcon("lucide:cloud-upload")
export const CopyIcon = createIcon("lucide:copy")
export const CornerDownLeftIcon = createIcon("lucide:corner-down-left")
export const Eraser = createIcon("lucide:eraser")
export const ExternalLinkIcon = createIcon("lucide:external-link")
export const EyeIcon = createIcon("lucide:eye")
export const EyeOffIcon = createIcon("lucide:eye-off")
export const FileCode2Icon = createIcon("lucide:file-code-corner")
export const FileTextIcon = createIcon("lucide:file-text")
export const FilmIcon = createIcon("lucide:film")
export const FolderIcon = createIcon("lucide:folder")
export const FolderInputIcon = createIcon("lucide:folder-input")
export const FolderOpenIcon = createIcon("lucide:folder-open")
export const FolderPlusIcon = createIcon("lucide:folder-plus")
export const GlobeIcon = createIcon("lucide:globe")
export const GripVertical = createIcon("lucide:grip-vertical")
export const Heading1 = createIcon("lucide:heading-1")
export const Heading2 = createIcon("lucide:heading-2")
export const Heading3 = createIcon("lucide:heading-3")
export const HeartIcon = createIcon("lucide:heart")
export const HistoryIcon = createIcon("lucide:rotate-ccw-clock")
export const ImageIcon = createIcon("lucide:image")
export const ImagePlusIcon = createIcon("lucide:image-plus")
export const ImagesIcon = createIcon("lucide:images")
export const IndentDecrease = createIcon("lucide:list-indent-decrease")
export const IndentIncrease = createIcon("lucide:list-indent-increase")
export const InfoIcon = createIcon("lucide:info")
export const Italic = createIcon("lucide:italic")
export const LanguagesIcon = createIcon("lucide:languages")
export const LibraryIcon = createIcon("lucide:library")
export const Link = createIcon("lucide:link")
export const LinkIcon = Link
export const List = createIcon("lucide:list")
export const ListChecks = createIcon("lucide:list-checks")
export const ListOrdered = createIcon("lucide:list-ordered")
export const LoaderCircleIcon = createIcon("lucide:loader-circle")
export const Loader2Icon = LoaderCircleIcon
export const Maximize2Icon = createIcon("lucide:maximize-2")
export const MessageCircleIcon = createIcon("lucide:message-circle")
export const Minimize2Icon = createIcon("lucide:minimize-2")
export const Minus = createIcon("lucide:minus")
export const MinusIcon = Minus
export const MonitorIcon = createIcon("lucide:monitor")
export const MoonIcon = createIcon("lucide:moon")
export const MoreHorizontalIcon = createIcon("lucide:ellipsis")
export const OctagonXIcon = createIcon("lucide:octagon-x")
export const PackageIcon = createIcon("lucide:package")
export const PanelLeftIcon = createIcon("lucide:panel-left")
export const PaperclipIcon = createIcon("lucide:paperclip")
export const Pencil = createIcon("lucide:pencil")
export const PencilIcon = Pencil
export const Pilcrow = createIcon("lucide:pilcrow")
export const Pipette = createIcon("lucide:pipette")
export const Plus = createIcon("lucide:plus")
export const PlusIcon = Plus
export const Quote = createIcon("lucide:quote")
export const Redo2 = createIcon("lucide:redo-2")
export const RotateCcwIcon = createIcon("lucide:rotate-ccw")
export const SaveIcon = createIcon("lucide:save")
export const SearchIcon = createIcon("lucide:search")
export const SendHorizontalIcon = createIcon("lucide:send-horizontal")
export const SettingsIcon = createIcon("lucide:settings")
export const SmileIcon = createIcon("lucide:face-slightly-smiling")
export const Strikethrough = createIcon("lucide:strikethrough")
export const Subscript = createIcon("lucide:subscript")
export const SunIcon = createIcon("lucide:sun")
export const Superscript = createIcon("lucide:superscript")
export const TelescopeIcon = createIcon("lucide:telescope")
export const TerminalIcon = createIcon("lucide:terminal")
export const Trash2 = createIcon("lucide:trash")
export const Trash2Icon = Trash2
export const TriangleAlertIcon = createIcon("lucide:triangle-alert")
export const Underline = createIcon("lucide:underline")
export const Undo2 = createIcon("lucide:undo-2")
export const UnlinkIcon = createIcon("lucide:unlink")
export const UploadIcon = createIcon("lucide:upload")
export const VideoIcon = createIcon("lucide:video")
export const XIcon = createIcon("lucide:x")
// Literal references let @icones/vite emit assets for compatibility components.
export function IconAssetCatalog() {
return (
<>
<Icon name="lucide:a-large-small" />
<Icon name="lucide:text-align-center" />
<Icon name="lucide:text-align-justify" />
<Icon name="lucide:text-align-start" />
<Icon name="lucide:text-align-end" />
<Icon name="lucide:app-window" />
<Icon name="lucide:arrow-down" />
<Icon name="lucide:arrow-left" />
<Icon name="lucide:baseline" />
<Icon name="lucide:bold" />
<Icon name="lucide:calendar-days" />
<Icon name="lucide:case-lower" />
<Icon name="lucide:case-sensitive" />
<Icon name="lucide:case-upper" />
<Icon name="lucide:check" />
<Icon name="lucide:check-check" />
<Icon name="lucide:chevron-down" />
<Icon name="lucide:chevron-left" />
<Icon name="lucide:chevron-right" />
<Icon name="lucide:chevron-up" />
<Icon name="lucide:circle-alert" />
<Icon name="lucide:circle-check" />
<Icon name="lucide:clipboard-copy" />
<Icon name="lucide:cloud" />
<Icon name="lucide:cloud-upload" />
<Icon name="lucide:copy" />
<Icon name="lucide:corner-down-left" />
<Icon name="lucide:eraser" />
<Icon name="lucide:external-link" />
<Icon name="lucide:eye" />
<Icon name="lucide:eye-off" />
<Icon name="lucide:file-code-corner" />
<Icon name="lucide:file-text" />
<Icon name="lucide:film" />
<Icon name="lucide:folder" />
<Icon name="lucide:folder-input" />
<Icon name="lucide:folder-open" />
<Icon name="lucide:folder-plus" />
<Icon name="lucide:globe" />
<Icon name="lucide:grip-vertical" />
<Icon name="lucide:heading-1" />
<Icon name="lucide:heading-2" />
<Icon name="lucide:heading-3" />
<Icon name="lucide:heart" />
<Icon name="lucide:rotate-ccw-clock" />
<Icon name="lucide:image" />
<Icon name="lucide:image-plus" />
<Icon name="lucide:images" />
<Icon name="lucide:list-indent-decrease" />
<Icon name="lucide:list-indent-increase" />
<Icon name="lucide:info" />
<Icon name="lucide:italic" />
<Icon name="lucide:languages" />
<Icon name="lucide:library" />
<Icon name="lucide:link" />
<Icon name="lucide:list" />
<Icon name="lucide:list-checks" />
<Icon name="lucide:list-ordered" />
<Icon name="lucide:loader-circle" />
<Icon name="lucide:maximize-2" />
<Icon name="lucide:message-circle" />
<Icon name="lucide:minimize-2" />
<Icon name="lucide:minus" />
<Icon name="lucide:monitor" />
<Icon name="lucide:moon" />
<Icon name="lucide:ellipsis" />
<Icon name="lucide:octagon-x" />
<Icon name="lucide:package" />
<Icon name="lucide:panel-left" />
<Icon name="lucide:paperclip" />
<Icon name="lucide:pencil" />
<Icon name="lucide:pilcrow" />
<Icon name="lucide:pipette" />
<Icon name="lucide:plus" />
<Icon name="lucide:quote" />
<Icon name="lucide:redo-2" />
<Icon name="lucide:rotate-ccw" />
<Icon name="lucide:save" />
<Icon name="lucide:search" />
<Icon name="lucide:send-horizontal" />
<Icon name="lucide:settings" />
<Icon name="lucide:face-slightly-smiling" />
<Icon name="lucide:strikethrough" />
<Icon name="lucide:subscript" />
<Icon name="lucide:sun" />
<Icon name="lucide:superscript" />
<Icon name="lucide:telescope" />
<Icon name="lucide:terminal" />
<Icon name="lucide:trash" />
<Icon name="lucide:triangle-alert" />
<Icon name="lucide:underline" />
<Icon name="lucide:undo-2" />
<Icon name="lucide:unlink" />
<Icon name="lucide:upload" />
<Icon name="lucide:video" />
<Icon name="lucide:x" />
</>
)
}
+1 -1
View File
@@ -2,7 +2,7 @@ import * as React from "react"
import { OTPInput, OTPInputContext } from "input-otp" import { OTPInput, OTPInputContext } from "input-otp"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { MinusIcon } from "lucide-react" import { MinusIcon } from "@workspace/ui/components/icon"
function InputOTP({ function InputOTP({
className, className,
+1 -1
View File
@@ -18,7 +18,7 @@ import {
DropdownMenuSubTrigger, DropdownMenuSubTrigger,
DropdownMenuTrigger, DropdownMenuTrigger,
} from "@workspace/ui/components/dropdown-menu" } from "@workspace/ui/components/dropdown-menu"
import { CheckIcon } from "lucide-react" import { CheckIcon } from "@workspace/ui/components/icon"
function Menubar({ className, ...props }: MenubarPrimitive.Props) { function Menubar({ className, ...props }: MenubarPrimitive.Props) {
return ( return (
@@ -8,7 +8,7 @@ import {
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { ArrowDownIcon } from "lucide-react" import { ArrowDownIcon } from "@workspace/ui/components/icon"
function MessageScrollerProvider( function MessageScrollerProvider(
props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider> props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>
+1 -1
View File
@@ -1,7 +1,7 @@
import * as React from "react" import * as React from "react"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronDownIcon } from "lucide-react" import { ChevronDownIcon } from "@workspace/ui/components/icon"
type NativeSelectProps = Omit<React.ComponentProps<"select">, "size"> & { type NativeSelectProps = Omit<React.ComponentProps<"select">, "size"> & {
size?: "sm" | "default" size?: "sm" | "default"
@@ -2,7 +2,7 @@ import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/naviga
import { cva } from "class-variance-authority" import { cva } from "class-variance-authority"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronDownIcon } from "lucide-react" import { ChevronDownIcon } from "@workspace/ui/components/icon"
function NavigationMenu({ function NavigationMenu({
align = "start", align = "start",
+1 -1
View File
@@ -6,7 +6,7 @@ import {
ChevronLeftIcon, ChevronLeftIcon,
ChevronRightIcon, ChevronRightIcon,
MoreHorizontalIcon, MoreHorizontalIcon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages, useMessage } from "./i18n" import { LocalizedText, uiMessages, useMessage } from "./i18n"
function Pagination({ function Pagination({
+5 -1
View File
@@ -4,7 +4,11 @@ import * as React from "react"
import { Select as SelectPrimitive } from "@base-ui/react/select" import { Select as SelectPrimitive } from "@base-ui/react/select"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react" import {
ChevronDownIcon,
CheckIcon,
ChevronUpIcon,
} from "@workspace/ui/components/icon"
const Select = SelectPrimitive.Root const Select = SelectPrimitive.Root
+1 -1
View File
@@ -5,7 +5,7 @@ import { Dialog as SheetPrimitive } from "@base-ui/react/dialog"
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { Button } from "@workspace/ui/components/button" import { Button } from "@workspace/ui/components/button"
import { XIcon } from "lucide-react" import { XIcon } from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages } from "./i18n" import { LocalizedText, uiMessages } from "./i18n"
function createSheetHandle<Payload>(): SheetPrimitive.Handle<Payload> { function createSheetHandle<Payload>(): SheetPrimitive.Handle<Payload> {
+4 -2
View File
@@ -21,7 +21,7 @@ import {
TooltipContent, TooltipContent,
TooltipTrigger, TooltipTrigger,
} from "@workspace/ui/components/tooltip" } from "@workspace/ui/components/tooltip"
import { PanelLeftIcon } from "lucide-react" import { PanelLeftIcon } from "@workspace/ui/components/icon"
import { LocalizedText, uiMessages, useMessage } from "./i18n" import { LocalizedText, uiMessages, useMessage } from "./i18n"
const SIDEBAR_COOKIE_NAME = "sidebar_state" const SIDEBAR_COOKIE_NAME = "sidebar_state"
@@ -89,7 +89,9 @@ function SidebarProvider({
// Helper to toggle the sidebar. // Helper to toggle the sidebar.
const toggleSidebar = React.useCallback(() => { const toggleSidebar = React.useCallback(() => {
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open) return isMobile
? setOpenMobile((currentOpen) => !currentOpen)
: setOpen((currentOpen) => !currentOpen)
}, [isMobile, setOpen, setOpenMobile]) }, [isMobile, setOpen, setOpenMobile])
// Adds a keyboard shortcut to toggle the sidebar. // Adds a keyboard shortcut to toggle the sidebar.
+5 -2
View File
@@ -1,8 +1,11 @@
import { cn } from "@workspace/ui/lib/utils" import { cn } from "@workspace/ui/lib/utils"
import { Loader2Icon } from "lucide-react" import {
Loader2Icon,
type IconComponentProps,
} from "@workspace/ui/components/icon"
import { uiMessages, useMessage } from "./i18n" import { uiMessages, useMessage } from "./i18n"
function Spinner({ className, ...props }: React.ComponentProps<"svg">) { function Spinner({ className, ...props }: IconComponentProps) {
const loadingLabel = useMessage(uiMessages.loading) const loadingLabel = useMessage(uiMessages.loading)
return ( return (
+5 -3
View File
@@ -10,10 +10,12 @@ import {
TriangleAlertIcon, TriangleAlertIcon,
OctagonXIcon, OctagonXIcon,
Loader2Icon, Loader2Icon,
} from "lucide-react" } from "@workspace/ui/components/icon"
import { uiMessages, useMessage } from "./i18n" import { uiMessages, useMessage } from "./i18n"
const toast = ToastPrimitive.createToastManager() const toast = ToastPrimitive.createToastManager()
const defaultToastActionRender = <Button variant="outline" size="sm" />
const defaultToastCloseRender = <Button variant="ghost" size="icon-sm" />
function ToastProvider({ ...props }: ToastPrimitive.Provider.Props) { function ToastProvider({ ...props }: ToastPrimitive.Provider.Props) {
return <ToastPrimitive.Provider {...props} /> return <ToastPrimitive.Provider {...props} />
@@ -101,7 +103,7 @@ function ToastDescription({
function ToastAction({ function ToastAction({
className, className,
render = <Button variant="outline" size="sm" />, render = defaultToastActionRender,
...props ...props
}: ToastPrimitive.Action.Props) { }: ToastPrimitive.Action.Props) {
return ( return (
@@ -118,7 +120,7 @@ function ToastClose({
"aria-label": ariaLabel, "aria-label": ariaLabel,
className, className,
children, children,
render = <Button variant="ghost" size="icon-sm" />, render = defaultToastCloseRender,
...props ...props
}: ToastPrimitive.Close.Props) { }: ToastPrimitive.Close.Props) {
const closeLabel = useMessage(uiMessages.closeToast) const closeLabel = useMessage(uiMessages.closeToast)