@mesob/ui 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components.d.ts +790 -111
- package/dist/components.js +10727 -6518
- package/dist/components.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/locale.d.ts +2 -2
- package/dist/lib/locale.js.map +1 -1
- package/dist/providers.d.ts +2 -1
- package/dist/providers.js +13 -7
- package/dist/providers.js.map +1 -1
- package/package.json +9 -3
- package/src/styles/style-lyra.css +33 -0
- package/src/styles/style-maia.css +33 -0
- package/src/styles/style-mira.css +33 -0
- package/src/styles/style-nova.css +33 -0
- package/src/styles/style-vega.css +33 -0
- package/src/styles/themes.css +64 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/locale.ts","../src/lib/theme-config.ts","../src/lib/themes.ts","../src/lib/theme-schema.ts","../src/lib/utils.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.ZodEffects<z.ZodObject<SchemaAccumulator>> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of supportedLanguages) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n","/**\n * Theme configuration and building logic.\n * Converts user config (hex color + base color) into CSS variables.\n */\n\nimport { converter, wcagContrast } from 'culori';\nimport { getBaseColor, getRadius } from './themes';\n\nconst toOklch = converter('oklch');\n\nexport type StyleName = 'vega' | 'nova' | 'maia' | 'lyra' | 'mira';\n\nexport type ThemeConfig = {\n color: string; // hex like '#1199ee'\n baseColor?: 'neutral' | 'zinc' | 'stone' | 'gray'; // default 'zinc'\n style?: StyleName;\n radius?: 'default' | 'none' | 'small' | 'medium' | 'large';\n};\n\nexport type ThemeVars = {\n light: Record<string, string>;\n dark: Record<string, string>;\n};\n\n/**\n * Formats OKLCH color to CSS string format.\n * Input: { mode: 'oklch', l: 0.5, c: 0.1, h: 200 }\n * Output: 'oklch(0.5 0.1 200)'\n */\nfunction formatOklch(color: ReturnType<typeof toOklch>): string {\n if (!color) {\n return 'oklch(0 0 0)';\n }\n const l = color.l ?? 0;\n const c = color.c ?? 0;\n const h = color.h ?? 0;\n return `oklch(${l.toFixed(3)} ${c.toFixed(3)} ${h.toFixed(3)})`;\n}\n\n/**\n * Calculate contrast color (light or dark text) for a given background.\n * Returns either light or dark OKLCH based on WCAG contrast.\n */\nfunction _getContrastColor(bgHex: string): { light: string; dark: string } {\n const bgColor = toOklch(bgHex);\n if (!bgColor) {\n return {\n light: 'oklch(0.985 0 0)',\n dark: 'oklch(0.145 0 0)',\n };\n }\n\n const white = 'oklch(0.985 0 0)'; // near-white\n const black = 'oklch(0.145 0 0)'; // near-black\n\n // Check contrast with white and black\n const contrastWithWhite = wcagContrast(bgHex, '#fafafa') ?? 0;\n\n // Use the foreground color with better contrast (WCAG AA requires 4.5:1)\n // Use white text if contrast is good enough, otherwise use black\n const lightModeFg = contrastWithWhite >= 4.5 ? white : black;\n\n return {\n light: lightModeFg,\n dark: lightModeFg,\n };\n}\n\n/**\n * Generate 5 chart colors by adjusting lightness/chroma of primary.\n */\nfunction generateChartColors(primaryOklch: ReturnType<typeof toOklch>): {\n light: string[];\n dark: string[];\n} {\n if (!primaryOklch) {\n return {\n light: [\n 'oklch(0.646 0.222 41.116)',\n 'oklch(0.6 0.118 184.704)',\n 'oklch(0.398 0.07 227.392)',\n 'oklch(0.828 0.189 84.429)',\n 'oklch(0.769 0.188 70.08)',\n ],\n dark: [\n 'oklch(0.488 0.243 264.376)',\n 'oklch(0.696 0.17 162.48)',\n 'oklch(0.769 0.188 70.08)',\n 'oklch(0.627 0.265 303.9)',\n 'oklch(0.645 0.246 16.439)',\n ],\n };\n }\n\n const { l = 0.5, c = 0.1, h = 200 } = primaryOklch;\n\n // Light mode: varying lightness from lighter to darker\n const lightCharts = [\n formatOklch({ mode: 'oklch', l: Math.min(l + 0.15, 0.95), c, h }),\n formatOklch({ mode: 'oklch', l: Math.min(l + 0.05, 0.9), c, h }),\n formatOklch({ mode: 'oklch', l, c, h }),\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.1, 0.3), c: c * 0.9, h }),\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.15, 0.25), c: c * 0.8, h }),\n ];\n\n // Dark mode: adjust for better visibility\n const darkCharts = [\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.1, 0.4), c, h }),\n formatOklch({\n mode: 'oklch',\n l: Math.min(l + 0.1, 0.7),\n c: c * 0.8,\n h: (h + 30) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.min(l + 0.15, 0.75),\n c: c * 0.9,\n h: (h - 30 + 360) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.max(l, 0.6),\n c: c * 1.1,\n h: (h + 60) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.max(l + 0.05, 0.62),\n c: c * 1.05,\n h: (h - 60 + 360) % 360,\n }),\n ];\n\n return { light: lightCharts, dark: darkCharts };\n}\n\n/**\n * Build theme CSS variables from config.\n * Merges base color with primary color derived from user hex.\n */\nexport function buildTheme(config: ThemeConfig): ThemeVars {\n const baseColorName = config.baseColor ?? 'zinc';\n const base = getBaseColor(baseColorName);\n\n if (!base) {\n throw new Error(`Base color \"${baseColorName}\" not found`);\n }\n\n // Start with base color vars\n const lightVars = { ...base.cssVars.light };\n const darkVars = { ...base.cssVars.dark };\n\n // Convert user hex to OKLCH\n const primaryOklch = toOklch(config.color);\n\n if (primaryOklch) {\n const { l = 0.5, c = 0.1, h = 200 } = primaryOklch;\n\n // Light mode primary: use user color as-is or slightly adjusted\n lightVars.primary = formatOklch({ mode: 'oklch', l, c, h });\n\n // Light mode foreground: ALWAYS white for primary buttons\n lightVars['primary-foreground'] = 'oklch(0.985 0 0)';\n\n // Dark mode primary: increase lightness for visibility on dark bg\n const darkL = Math.min(l + 0.2, 0.9);\n darkVars.primary = formatOklch({ mode: 'oklch', l: darkL, c, h });\n\n // Dark mode foreground: check contrast for lightened primary\n // Since we lighten the primary in dark mode, we may need dark text\n const darkPrimaryLightness = darkL;\n const contrastDark =\n darkPrimaryLightness > 0.6 ? 'oklch(0.145 0 0)' : 'oklch(0.985 0 0)';\n darkVars['primary-foreground'] = contrastDark;\n\n // Sidebar primary (same as primary)\n lightVars['sidebar-primary'] = lightVars.primary;\n lightVars['sidebar-primary-foreground'] = lightVars['primary-foreground'];\n darkVars['sidebar-primary'] = darkVars.primary;\n darkVars['sidebar-primary-foreground'] = darkVars['primary-foreground'];\n\n // Generate chart colors\n const charts = generateChartColors(primaryOklch);\n for (let i = 0; i < 5; i++) {\n lightVars[`chart-${i + 1}`] = charts.light[i];\n darkVars[`chart-${i + 1}`] = charts.dark[i];\n }\n }\n\n // Apply radius override\n if (config.radius && config.radius !== 'default') {\n const radius = getRadius(config.radius);\n if (radius?.value) {\n lightVars.radius = radius.value;\n darkVars.radius = radius.value;\n }\n }\n\n return { light: lightVars, dark: darkVars };\n}\n","/**\n * Base color definitions ported from shadcn/ui.\n * Each base color provides full semantic tokens for neutral tones.\n */\n\nexport type BaseColorTheme = {\n name: string;\n title: string;\n cssVars: {\n light: Record<string, string>;\n dark: Record<string, string>;\n };\n};\n\nexport const BASE_COLORS: BaseColorTheme[] = [\n {\n name: 'neutral',\n title: 'Neutral',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.145 0 0)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.145 0 0)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.145 0 0)',\n primary: 'oklch(0.205 0 0)',\n 'primary-foreground': 'oklch(0.985 0 0)',\n secondary: 'oklch(0.97 0 0)',\n 'secondary-foreground': 'oklch(0.205 0 0)',\n muted: 'oklch(0.97 0 0)',\n 'muted-foreground': 'oklch(0.556 0 0)',\n accent: 'oklch(0.97 0 0)',\n 'accent-foreground': 'oklch(0.205 0 0)',\n destructive: 'oklch(0.58 0.22 27)',\n border: 'oklch(0.922 0 0)',\n input: 'oklch(0.922 0 0)',\n ring: 'oklch(0.708 0 0)',\n 'chart-1': 'oklch(0.809 0.105 251.813)',\n 'chart-2': 'oklch(0.623 0.214 259.815)',\n 'chart-3': 'oklch(0.546 0.245 262.881)',\n 'chart-4': 'oklch(0.488 0.243 264.376)',\n 'chart-5': 'oklch(0.424 0.199 265.638)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0 0)',\n 'sidebar-foreground': 'oklch(0.145 0 0)',\n 'sidebar-primary': 'oklch(0.205 0 0)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.97 0 0)',\n 'sidebar-accent-foreground': 'oklch(0.205 0 0)',\n 'sidebar-border': 'oklch(0.922 0 0)',\n 'sidebar-ring': 'oklch(0.708 0 0)',\n },\n dark: {\n background: 'oklch(0.145 0 0)',\n foreground: 'oklch(0.985 0 0)',\n card: 'oklch(0.205 0 0)',\n 'card-foreground': 'oklch(0.985 0 0)',\n popover: 'oklch(0.205 0 0)',\n 'popover-foreground': 'oklch(0.985 0 0)',\n primary: 'oklch(0.87 0.00 0)',\n 'primary-foreground': 'oklch(0.205 0 0)',\n secondary: 'oklch(0.269 0 0)',\n 'secondary-foreground': 'oklch(0.985 0 0)',\n muted: 'oklch(0.269 0 0)',\n 'muted-foreground': 'oklch(0.708 0 0)',\n accent: 'oklch(0.371 0 0)',\n 'accent-foreground': 'oklch(0.985 0 0)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.556 0 0)',\n 'chart-1': 'oklch(0.809 0.105 251.813)',\n 'chart-2': 'oklch(0.623 0.214 259.815)',\n 'chart-3': 'oklch(0.546 0.245 262.881)',\n 'chart-4': 'oklch(0.488 0.243 264.376)',\n 'chart-5': 'oklch(0.424 0.199 265.638)',\n sidebar: 'oklch(0.205 0 0)',\n 'sidebar-foreground': 'oklch(0.985 0 0)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.269 0 0)',\n 'sidebar-accent-foreground': 'oklch(0.985 0 0)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.556 0 0)',\n },\n },\n },\n {\n name: 'stone',\n title: 'Stone',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.147 0.004 49.25)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.147 0.004 49.25)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.147 0.004 49.25)',\n primary: 'oklch(0.216 0.006 56.043)',\n 'primary-foreground': 'oklch(0.985 0.001 106.423)',\n secondary: 'oklch(0.97 0.001 106.424)',\n 'secondary-foreground': 'oklch(0.216 0.006 56.043)',\n muted: 'oklch(0.97 0.001 106.424)',\n 'muted-foreground': 'oklch(0.553 0.013 58.071)',\n accent: 'oklch(0.97 0.001 106.424)',\n 'accent-foreground': 'oklch(0.216 0.006 56.043)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.923 0.003 48.717)',\n input: 'oklch(0.923 0.003 48.717)',\n ring: 'oklch(0.709 0.01 56.259)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0.001 106.423)',\n 'sidebar-foreground': 'oklch(0.147 0.004 49.25)',\n 'sidebar-primary': 'oklch(0.216 0.006 56.043)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-accent': 'oklch(0.97 0.001 106.424)',\n 'sidebar-accent-foreground': 'oklch(0.216 0.006 56.043)',\n 'sidebar-border': 'oklch(0.923 0.003 48.717)',\n 'sidebar-ring': 'oklch(0.709 0.01 56.259)',\n },\n dark: {\n background: 'oklch(0.147 0.004 49.25)',\n foreground: 'oklch(0.985 0.001 106.423)',\n card: 'oklch(0.216 0.006 56.043)',\n 'card-foreground': 'oklch(0.985 0.001 106.423)',\n popover: 'oklch(0.216 0.006 56.043)',\n 'popover-foreground': 'oklch(0.985 0.001 106.423)',\n primary: 'oklch(0.923 0.003 48.717)',\n 'primary-foreground': 'oklch(0.216 0.006 56.043)',\n secondary: 'oklch(0.268 0.007 34.298)',\n 'secondary-foreground': 'oklch(0.985 0.001 106.423)',\n muted: 'oklch(0.268 0.007 34.298)',\n 'muted-foreground': 'oklch(0.709 0.01 56.259)',\n accent: 'oklch(0.268 0.007 34.298)',\n 'accent-foreground': 'oklch(0.985 0.001 106.423)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.553 0.013 58.071)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.216 0.006 56.043)',\n 'sidebar-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-accent': 'oklch(0.268 0.007 34.298)',\n 'sidebar-accent-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.553 0.013 58.071)',\n },\n },\n },\n {\n name: 'zinc',\n title: 'Zinc',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.141 0.005 285.823)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.141 0.005 285.823)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.141 0.005 285.823)',\n primary: 'oklch(0.21 0.006 285.885)',\n 'primary-foreground': 'oklch(0.985 0 0)',\n secondary: 'oklch(0.967 0.001 286.375)',\n 'secondary-foreground': 'oklch(0.21 0.006 285.885)',\n muted: 'oklch(0.967 0.001 286.375)',\n 'muted-foreground': 'oklch(0.552 0.016 285.938)',\n accent: 'oklch(0.967 0.001 286.375)',\n 'accent-foreground': 'oklch(0.21 0.006 285.885)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.92 0.004 286.32)',\n input: 'oklch(0.92 0.004 286.32)',\n ring: 'oklch(0.705 0.015 286.067)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0 0)',\n 'sidebar-foreground': 'oklch(0.141 0.005 285.823)',\n 'sidebar-primary': 'oklch(0.21 0.006 285.885)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.967 0.001 286.375)',\n 'sidebar-accent-foreground': 'oklch(0.21 0.006 285.885)',\n 'sidebar-border': 'oklch(0.92 0.004 286.32)',\n 'sidebar-ring': 'oklch(0.705 0.015 286.067)',\n },\n dark: {\n background: 'oklch(0.141 0.005 285.823)',\n foreground: 'oklch(0.985 0 0)',\n card: 'oklch(0.21 0.006 285.885)',\n 'card-foreground': 'oklch(0.985 0 0)',\n popover: 'oklch(0.21 0.006 285.885)',\n 'popover-foreground': 'oklch(0.985 0 0)',\n primary: 'oklch(0.92 0.004 286.32)',\n 'primary-foreground': 'oklch(0.21 0.006 285.885)',\n secondary: 'oklch(0.274 0.006 286.033)',\n 'secondary-foreground': 'oklch(0.985 0 0)',\n muted: 'oklch(0.274 0.006 286.033)',\n 'muted-foreground': 'oklch(0.705 0.015 286.067)',\n accent: 'oklch(0.274 0.006 286.033)',\n 'accent-foreground': 'oklch(0.985 0 0)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.552 0.016 285.938)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.21 0.006 285.885)',\n 'sidebar-foreground': 'oklch(0.985 0 0)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.274 0.006 286.033)',\n 'sidebar-accent-foreground': 'oklch(0.985 0 0)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.552 0.016 285.938)',\n },\n },\n },\n {\n name: 'gray',\n title: 'Gray',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.13 0.028 261.692)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.13 0.028 261.692)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.13 0.028 261.692)',\n primary: 'oklch(0.21 0.034 264.665)',\n 'primary-foreground': 'oklch(0.985 0.002 247.839)',\n secondary: 'oklch(0.967 0.003 264.542)',\n 'secondary-foreground': 'oklch(0.21 0.034 264.665)',\n muted: 'oklch(0.967 0.003 264.542)',\n 'muted-foreground': 'oklch(0.551 0.027 264.364)',\n accent: 'oklch(0.967 0.003 264.542)',\n 'accent-foreground': 'oklch(0.21 0.034 264.665)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.928 0.006 264.531)',\n input: 'oklch(0.928 0.006 264.531)',\n ring: 'oklch(0.707 0.022 261.325)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0.002 247.839)',\n 'sidebar-foreground': 'oklch(0.13 0.028 261.692)',\n 'sidebar-primary': 'oklch(0.21 0.034 264.665)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-accent': 'oklch(0.967 0.003 264.542)',\n 'sidebar-accent-foreground': 'oklch(0.21 0.034 264.665)',\n 'sidebar-border': 'oklch(0.928 0.006 264.531)',\n 'sidebar-ring': 'oklch(0.707 0.022 261.325)',\n },\n dark: {\n background: 'oklch(0.13 0.028 261.692)',\n foreground: 'oklch(0.985 0.002 247.839)',\n card: 'oklch(0.21 0.034 264.665)',\n 'card-foreground': 'oklch(0.985 0.002 247.839)',\n popover: 'oklch(0.21 0.034 264.665)',\n 'popover-foreground': 'oklch(0.985 0.002 247.839)',\n primary: 'oklch(0.928 0.006 264.531)',\n 'primary-foreground': 'oklch(0.21 0.034 264.665)',\n secondary: 'oklch(0.278 0.033 256.848)',\n 'secondary-foreground': 'oklch(0.985 0.002 247.839)',\n muted: 'oklch(0.278 0.033 256.848)',\n 'muted-foreground': 'oklch(0.707 0.022 261.325)',\n accent: 'oklch(0.278 0.033 256.848)',\n 'accent-foreground': 'oklch(0.985 0.002 247.839)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.551 0.027 264.364)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.21 0.034 264.665)',\n 'sidebar-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-accent': 'oklch(0.278 0.033 256.848)',\n 'sidebar-accent-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.551 0.027 264.364)',\n },\n },\n },\n];\n\nexport type RadiusOption = {\n name: 'default' | 'none' | 'small' | 'medium' | 'large';\n label: string;\n value: string;\n};\n\nexport const RADII: RadiusOption[] = [\n { name: 'default', label: 'Default', value: '' },\n { name: 'none', label: 'None', value: '0' },\n { name: 'small', label: 'Small', value: '0.45rem' },\n { name: 'medium', label: 'Medium', value: '0.625rem' },\n { name: 'large', label: 'Large', value: '0.875rem' },\n];\n\nexport function getBaseColor(name: string): BaseColorTheme | undefined {\n return BASE_COLORS.find((c) => c.name === name);\n}\n\nexport function getRadius(name: string): RadiusOption | undefined {\n return RADII.find((r) => r.name === name);\n}\n","/**\n * Canonical theme variable names aligned with shadcn/ui semantic tokens.\n * UI components depend on these CSS vars; consumer defines them.\n */\n\nexport const THEME_VAR_NAMES = [\n '--background',\n '--foreground',\n '--card',\n '--card-foreground',\n '--popover',\n '--popover-foreground',\n '--primary',\n '--primary-foreground',\n '--secondary',\n '--secondary-foreground',\n '--muted',\n '--muted-foreground',\n '--accent',\n '--accent-foreground',\n '--destructive',\n '--destructive-foreground',\n '--border',\n '--input',\n '--ring',\n '--chart-1',\n '--chart-2',\n '--chart-3',\n '--chart-4',\n '--chart-5',\n '--radius',\n '--sidebar',\n '--sidebar-foreground',\n '--sidebar-primary',\n '--sidebar-primary-foreground',\n '--sidebar-accent',\n '--sidebar-accent-foreground',\n '--sidebar-border',\n '--sidebar-ring',\n '--sidebar-active', // mesob extension\n '--overlay', // mesob extension\n] as const;\n\nexport type ThemeVarName = (typeof THEME_VAR_NAMES)[number];\n\nconst THEME_VAR_SET = new Set<string>(THEME_VAR_NAMES);\n\n/** Vars that buildTheme provides (minimal required set). */\nexport const REQUIRED_THEME_VARS: readonly string[] = [\n '--background',\n '--foreground',\n '--primary',\n '--primary-foreground',\n '--radius',\n];\n\nexport type ThemeValidation = {\n valid: boolean;\n unknown: string[];\n missing: string[];\n};\n\n/**\n * Validates a theme object against the consumer theme contract.\n * - unknown: keys not in THEME_VAR_NAMES (typos / unsupported).\n * - missing: required vars absent (for full theme override).\n */\nexport function validateTheme(theme: Record<string, string>): ThemeValidation {\n const keys = new Set(Object.keys(theme));\n const unknown: string[] = [];\n const missing: string[] = [];\n\n for (const key of keys) {\n if (!THEME_VAR_SET.has(key)) {\n unknown.push(key);\n }\n }\n for (const key of REQUIRED_THEME_VARS) {\n if (!keys.has(key)) {\n missing.push(key);\n }\n }\n\n return {\n valid: unknown.length === 0 && missing.length === 0,\n unknown,\n missing,\n };\n}\n\n/** Shared component size scale (xs–xl) aligned with Mantine */\nexport type ComponentSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Shared component radius scale aligned with Mantine */\nexport type ComponentRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/** Order of Input.Wrapper elements (Mantine-like) */\nexport type InputWrapperOrder = ('label' | 'input' | 'description' | 'error')[];\n\n/** Shared component color (theme key) */\nexport type ComponentColor =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'destructive'\n | string;\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/locale.ts","../src/lib/theme-config.ts","../src/lib/themes.ts","../src/lib/theme-schema.ts","../src/lib/utils.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.ZodTypeAny {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of supportedLanguages) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n","/**\n * Theme configuration and building logic.\n * Converts user config (hex color + base color) into CSS variables.\n */\n\nimport { converter, wcagContrast } from 'culori';\nimport { getBaseColor, getRadius } from './themes';\n\nconst toOklch = converter('oklch');\n\nexport type StyleName = 'vega' | 'nova' | 'maia' | 'lyra' | 'mira';\n\nexport type ThemeConfig = {\n color: string; // hex like '#1199ee'\n baseColor?: 'neutral' | 'zinc' | 'stone' | 'gray'; // default 'zinc'\n style?: StyleName;\n radius?: 'default' | 'none' | 'small' | 'medium' | 'large';\n};\n\nexport type ThemeVars = {\n light: Record<string, string>;\n dark: Record<string, string>;\n};\n\n/**\n * Formats OKLCH color to CSS string format.\n * Input: { mode: 'oklch', l: 0.5, c: 0.1, h: 200 }\n * Output: 'oklch(0.5 0.1 200)'\n */\nfunction formatOklch(color: ReturnType<typeof toOklch>): string {\n if (!color) {\n return 'oklch(0 0 0)';\n }\n const l = color.l ?? 0;\n const c = color.c ?? 0;\n const h = color.h ?? 0;\n return `oklch(${l.toFixed(3)} ${c.toFixed(3)} ${h.toFixed(3)})`;\n}\n\n/**\n * Calculate contrast color (light or dark text) for a given background.\n * Returns either light or dark OKLCH based on WCAG contrast.\n */\nfunction _getContrastColor(bgHex: string): { light: string; dark: string } {\n const bgColor = toOklch(bgHex);\n if (!bgColor) {\n return {\n light: 'oklch(0.985 0 0)',\n dark: 'oklch(0.145 0 0)',\n };\n }\n\n const white = 'oklch(0.985 0 0)'; // near-white\n const black = 'oklch(0.145 0 0)'; // near-black\n\n // Check contrast with white and black\n const contrastWithWhite = wcagContrast(bgHex, '#fafafa') ?? 0;\n\n // Use the foreground color with better contrast (WCAG AA requires 4.5:1)\n // Use white text if contrast is good enough, otherwise use black\n const lightModeFg = contrastWithWhite >= 4.5 ? white : black;\n\n return {\n light: lightModeFg,\n dark: lightModeFg,\n };\n}\n\n/**\n * Generate 5 chart colors by adjusting lightness/chroma of primary.\n */\nfunction generateChartColors(primaryOklch: ReturnType<typeof toOklch>): {\n light: string[];\n dark: string[];\n} {\n if (!primaryOklch) {\n return {\n light: [\n 'oklch(0.646 0.222 41.116)',\n 'oklch(0.6 0.118 184.704)',\n 'oklch(0.398 0.07 227.392)',\n 'oklch(0.828 0.189 84.429)',\n 'oklch(0.769 0.188 70.08)',\n ],\n dark: [\n 'oklch(0.488 0.243 264.376)',\n 'oklch(0.696 0.17 162.48)',\n 'oklch(0.769 0.188 70.08)',\n 'oklch(0.627 0.265 303.9)',\n 'oklch(0.645 0.246 16.439)',\n ],\n };\n }\n\n const { l = 0.5, c = 0.1, h = 200 } = primaryOklch;\n\n // Light mode: varying lightness from lighter to darker\n const lightCharts = [\n formatOklch({ mode: 'oklch', l: Math.min(l + 0.15, 0.95), c, h }),\n formatOklch({ mode: 'oklch', l: Math.min(l + 0.05, 0.9), c, h }),\n formatOklch({ mode: 'oklch', l, c, h }),\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.1, 0.3), c: c * 0.9, h }),\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.15, 0.25), c: c * 0.8, h }),\n ];\n\n // Dark mode: adjust for better visibility\n const darkCharts = [\n formatOklch({ mode: 'oklch', l: Math.max(l - 0.1, 0.4), c, h }),\n formatOklch({\n mode: 'oklch',\n l: Math.min(l + 0.1, 0.7),\n c: c * 0.8,\n h: (h + 30) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.min(l + 0.15, 0.75),\n c: c * 0.9,\n h: (h - 30 + 360) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.max(l, 0.6),\n c: c * 1.1,\n h: (h + 60) % 360,\n }),\n formatOklch({\n mode: 'oklch',\n l: Math.max(l + 0.05, 0.62),\n c: c * 1.05,\n h: (h - 60 + 360) % 360,\n }),\n ];\n\n return { light: lightCharts, dark: darkCharts };\n}\n\n/**\n * Build theme CSS variables from config.\n * Merges base color with primary color derived from user hex.\n */\nexport function buildTheme(config: ThemeConfig): ThemeVars {\n const baseColorName = config.baseColor ?? 'zinc';\n const base = getBaseColor(baseColorName);\n\n if (!base) {\n throw new Error(`Base color \"${baseColorName}\" not found`);\n }\n\n // Start with base color vars\n const lightVars = { ...base.cssVars.light };\n const darkVars = { ...base.cssVars.dark };\n\n // Convert user hex to OKLCH\n const primaryOklch = toOklch(config.color);\n\n if (primaryOklch) {\n const { l = 0.5, c = 0.1, h = 200 } = primaryOklch;\n\n // Light mode primary: use user color as-is or slightly adjusted\n lightVars.primary = formatOklch({ mode: 'oklch', l, c, h });\n\n // Light mode foreground: ALWAYS white for primary buttons\n lightVars['primary-foreground'] = 'oklch(0.985 0 0)';\n\n // Dark mode primary: increase lightness for visibility on dark bg\n const darkL = Math.min(l + 0.2, 0.9);\n darkVars.primary = formatOklch({ mode: 'oklch', l: darkL, c, h });\n\n // Dark mode foreground: check contrast for lightened primary\n // Since we lighten the primary in dark mode, we may need dark text\n const darkPrimaryLightness = darkL;\n const contrastDark =\n darkPrimaryLightness > 0.6 ? 'oklch(0.145 0 0)' : 'oklch(0.985 0 0)';\n darkVars['primary-foreground'] = contrastDark;\n\n // Sidebar primary (same as primary)\n lightVars['sidebar-primary'] = lightVars.primary;\n lightVars['sidebar-primary-foreground'] = lightVars['primary-foreground'];\n darkVars['sidebar-primary'] = darkVars.primary;\n darkVars['sidebar-primary-foreground'] = darkVars['primary-foreground'];\n\n // Generate chart colors\n const charts = generateChartColors(primaryOklch);\n for (let i = 0; i < 5; i++) {\n lightVars[`chart-${i + 1}`] = charts.light[i];\n darkVars[`chart-${i + 1}`] = charts.dark[i];\n }\n }\n\n // Apply radius override\n if (config.radius && config.radius !== 'default') {\n const radius = getRadius(config.radius);\n if (radius?.value) {\n lightVars.radius = radius.value;\n darkVars.radius = radius.value;\n }\n }\n\n return { light: lightVars, dark: darkVars };\n}\n","/**\n * Base color definitions ported from shadcn/ui.\n * Each base color provides full semantic tokens for neutral tones.\n */\n\nexport type BaseColorTheme = {\n name: string;\n title: string;\n cssVars: {\n light: Record<string, string>;\n dark: Record<string, string>;\n };\n};\n\nexport const BASE_COLORS: BaseColorTheme[] = [\n {\n name: 'neutral',\n title: 'Neutral',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.145 0 0)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.145 0 0)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.145 0 0)',\n primary: 'oklch(0.205 0 0)',\n 'primary-foreground': 'oklch(0.985 0 0)',\n secondary: 'oklch(0.97 0 0)',\n 'secondary-foreground': 'oklch(0.205 0 0)',\n muted: 'oklch(0.97 0 0)',\n 'muted-foreground': 'oklch(0.556 0 0)',\n accent: 'oklch(0.97 0 0)',\n 'accent-foreground': 'oklch(0.205 0 0)',\n destructive: 'oklch(0.58 0.22 27)',\n border: 'oklch(0.922 0 0)',\n input: 'oklch(0.922 0 0)',\n ring: 'oklch(0.708 0 0)',\n 'chart-1': 'oklch(0.809 0.105 251.813)',\n 'chart-2': 'oklch(0.623 0.214 259.815)',\n 'chart-3': 'oklch(0.546 0.245 262.881)',\n 'chart-4': 'oklch(0.488 0.243 264.376)',\n 'chart-5': 'oklch(0.424 0.199 265.638)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0 0)',\n 'sidebar-foreground': 'oklch(0.145 0 0)',\n 'sidebar-primary': 'oklch(0.205 0 0)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.97 0 0)',\n 'sidebar-accent-foreground': 'oklch(0.205 0 0)',\n 'sidebar-border': 'oklch(0.922 0 0)',\n 'sidebar-ring': 'oklch(0.708 0 0)',\n },\n dark: {\n background: 'oklch(0.145 0 0)',\n foreground: 'oklch(0.985 0 0)',\n card: 'oklch(0.205 0 0)',\n 'card-foreground': 'oklch(0.985 0 0)',\n popover: 'oklch(0.205 0 0)',\n 'popover-foreground': 'oklch(0.985 0 0)',\n primary: 'oklch(0.87 0.00 0)',\n 'primary-foreground': 'oklch(0.205 0 0)',\n secondary: 'oklch(0.269 0 0)',\n 'secondary-foreground': 'oklch(0.985 0 0)',\n muted: 'oklch(0.269 0 0)',\n 'muted-foreground': 'oklch(0.708 0 0)',\n accent: 'oklch(0.371 0 0)',\n 'accent-foreground': 'oklch(0.985 0 0)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.556 0 0)',\n 'chart-1': 'oklch(0.809 0.105 251.813)',\n 'chart-2': 'oklch(0.623 0.214 259.815)',\n 'chart-3': 'oklch(0.546 0.245 262.881)',\n 'chart-4': 'oklch(0.488 0.243 264.376)',\n 'chart-5': 'oklch(0.424 0.199 265.638)',\n sidebar: 'oklch(0.205 0 0)',\n 'sidebar-foreground': 'oklch(0.985 0 0)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.269 0 0)',\n 'sidebar-accent-foreground': 'oklch(0.985 0 0)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.556 0 0)',\n },\n },\n },\n {\n name: 'stone',\n title: 'Stone',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.147 0.004 49.25)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.147 0.004 49.25)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.147 0.004 49.25)',\n primary: 'oklch(0.216 0.006 56.043)',\n 'primary-foreground': 'oklch(0.985 0.001 106.423)',\n secondary: 'oklch(0.97 0.001 106.424)',\n 'secondary-foreground': 'oklch(0.216 0.006 56.043)',\n muted: 'oklch(0.97 0.001 106.424)',\n 'muted-foreground': 'oklch(0.553 0.013 58.071)',\n accent: 'oklch(0.97 0.001 106.424)',\n 'accent-foreground': 'oklch(0.216 0.006 56.043)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.923 0.003 48.717)',\n input: 'oklch(0.923 0.003 48.717)',\n ring: 'oklch(0.709 0.01 56.259)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0.001 106.423)',\n 'sidebar-foreground': 'oklch(0.147 0.004 49.25)',\n 'sidebar-primary': 'oklch(0.216 0.006 56.043)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-accent': 'oklch(0.97 0.001 106.424)',\n 'sidebar-accent-foreground': 'oklch(0.216 0.006 56.043)',\n 'sidebar-border': 'oklch(0.923 0.003 48.717)',\n 'sidebar-ring': 'oklch(0.709 0.01 56.259)',\n },\n dark: {\n background: 'oklch(0.147 0.004 49.25)',\n foreground: 'oklch(0.985 0.001 106.423)',\n card: 'oklch(0.216 0.006 56.043)',\n 'card-foreground': 'oklch(0.985 0.001 106.423)',\n popover: 'oklch(0.216 0.006 56.043)',\n 'popover-foreground': 'oklch(0.985 0.001 106.423)',\n primary: 'oklch(0.923 0.003 48.717)',\n 'primary-foreground': 'oklch(0.216 0.006 56.043)',\n secondary: 'oklch(0.268 0.007 34.298)',\n 'secondary-foreground': 'oklch(0.985 0.001 106.423)',\n muted: 'oklch(0.268 0.007 34.298)',\n 'muted-foreground': 'oklch(0.709 0.01 56.259)',\n accent: 'oklch(0.268 0.007 34.298)',\n 'accent-foreground': 'oklch(0.985 0.001 106.423)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.553 0.013 58.071)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.216 0.006 56.043)',\n 'sidebar-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-accent': 'oklch(0.268 0.007 34.298)',\n 'sidebar-accent-foreground': 'oklch(0.985 0.001 106.423)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.553 0.013 58.071)',\n },\n },\n },\n {\n name: 'zinc',\n title: 'Zinc',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.141 0.005 285.823)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.141 0.005 285.823)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.141 0.005 285.823)',\n primary: 'oklch(0.21 0.006 285.885)',\n 'primary-foreground': 'oklch(0.985 0 0)',\n secondary: 'oklch(0.967 0.001 286.375)',\n 'secondary-foreground': 'oklch(0.21 0.006 285.885)',\n muted: 'oklch(0.967 0.001 286.375)',\n 'muted-foreground': 'oklch(0.552 0.016 285.938)',\n accent: 'oklch(0.967 0.001 286.375)',\n 'accent-foreground': 'oklch(0.21 0.006 285.885)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.92 0.004 286.32)',\n input: 'oklch(0.92 0.004 286.32)',\n ring: 'oklch(0.705 0.015 286.067)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0 0)',\n 'sidebar-foreground': 'oklch(0.141 0.005 285.823)',\n 'sidebar-primary': 'oklch(0.21 0.006 285.885)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.967 0.001 286.375)',\n 'sidebar-accent-foreground': 'oklch(0.21 0.006 285.885)',\n 'sidebar-border': 'oklch(0.92 0.004 286.32)',\n 'sidebar-ring': 'oklch(0.705 0.015 286.067)',\n },\n dark: {\n background: 'oklch(0.141 0.005 285.823)',\n foreground: 'oklch(0.985 0 0)',\n card: 'oklch(0.21 0.006 285.885)',\n 'card-foreground': 'oklch(0.985 0 0)',\n popover: 'oklch(0.21 0.006 285.885)',\n 'popover-foreground': 'oklch(0.985 0 0)',\n primary: 'oklch(0.92 0.004 286.32)',\n 'primary-foreground': 'oklch(0.21 0.006 285.885)',\n secondary: 'oklch(0.274 0.006 286.033)',\n 'secondary-foreground': 'oklch(0.985 0 0)',\n muted: 'oklch(0.274 0.006 286.033)',\n 'muted-foreground': 'oklch(0.705 0.015 286.067)',\n accent: 'oklch(0.274 0.006 286.033)',\n 'accent-foreground': 'oklch(0.985 0 0)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.552 0.016 285.938)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.21 0.006 285.885)',\n 'sidebar-foreground': 'oklch(0.985 0 0)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0 0)',\n 'sidebar-accent': 'oklch(0.274 0.006 286.033)',\n 'sidebar-accent-foreground': 'oklch(0.985 0 0)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.552 0.016 285.938)',\n },\n },\n },\n {\n name: 'gray',\n title: 'Gray',\n cssVars: {\n light: {\n background: 'oklch(1 0 0)',\n foreground: 'oklch(0.13 0.028 261.692)',\n card: 'oklch(1 0 0)',\n 'card-foreground': 'oklch(0.13 0.028 261.692)',\n popover: 'oklch(1 0 0)',\n 'popover-foreground': 'oklch(0.13 0.028 261.692)',\n primary: 'oklch(0.21 0.034 264.665)',\n 'primary-foreground': 'oklch(0.985 0.002 247.839)',\n secondary: 'oklch(0.967 0.003 264.542)',\n 'secondary-foreground': 'oklch(0.21 0.034 264.665)',\n muted: 'oklch(0.967 0.003 264.542)',\n 'muted-foreground': 'oklch(0.551 0.027 264.364)',\n accent: 'oklch(0.967 0.003 264.542)',\n 'accent-foreground': 'oklch(0.21 0.034 264.665)',\n destructive: 'oklch(0.577 0.245 27.325)',\n border: 'oklch(0.928 0.006 264.531)',\n input: 'oklch(0.928 0.006 264.531)',\n ring: 'oklch(0.707 0.022 261.325)',\n 'chart-1': 'oklch(0.646 0.222 41.116)',\n 'chart-2': 'oklch(0.6 0.118 184.704)',\n 'chart-3': 'oklch(0.398 0.07 227.392)',\n 'chart-4': 'oklch(0.828 0.189 84.429)',\n 'chart-5': 'oklch(0.769 0.188 70.08)',\n radius: '0.625rem',\n sidebar: 'oklch(0.985 0.002 247.839)',\n 'sidebar-foreground': 'oklch(0.13 0.028 261.692)',\n 'sidebar-primary': 'oklch(0.21 0.034 264.665)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-accent': 'oklch(0.967 0.003 264.542)',\n 'sidebar-accent-foreground': 'oklch(0.21 0.034 264.665)',\n 'sidebar-border': 'oklch(0.928 0.006 264.531)',\n 'sidebar-ring': 'oklch(0.707 0.022 261.325)',\n },\n dark: {\n background: 'oklch(0.13 0.028 261.692)',\n foreground: 'oklch(0.985 0.002 247.839)',\n card: 'oklch(0.21 0.034 264.665)',\n 'card-foreground': 'oklch(0.985 0.002 247.839)',\n popover: 'oklch(0.21 0.034 264.665)',\n 'popover-foreground': 'oklch(0.985 0.002 247.839)',\n primary: 'oklch(0.928 0.006 264.531)',\n 'primary-foreground': 'oklch(0.21 0.034 264.665)',\n secondary: 'oklch(0.278 0.033 256.848)',\n 'secondary-foreground': 'oklch(0.985 0.002 247.839)',\n muted: 'oklch(0.278 0.033 256.848)',\n 'muted-foreground': 'oklch(0.707 0.022 261.325)',\n accent: 'oklch(0.278 0.033 256.848)',\n 'accent-foreground': 'oklch(0.985 0.002 247.839)',\n destructive: 'oklch(0.704 0.191 22.216)',\n border: 'oklch(1 0 0 / 10%)',\n input: 'oklch(1 0 0 / 15%)',\n ring: 'oklch(0.551 0.027 264.364)',\n 'chart-1': 'oklch(0.488 0.243 264.376)',\n 'chart-2': 'oklch(0.696 0.17 162.48)',\n 'chart-3': 'oklch(0.769 0.188 70.08)',\n 'chart-4': 'oklch(0.627 0.265 303.9)',\n 'chart-5': 'oklch(0.645 0.246 16.439)',\n sidebar: 'oklch(0.21 0.034 264.665)',\n 'sidebar-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-primary': 'oklch(0.488 0.243 264.376)',\n 'sidebar-primary-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-accent': 'oklch(0.278 0.033 256.848)',\n 'sidebar-accent-foreground': 'oklch(0.985 0.002 247.839)',\n 'sidebar-border': 'oklch(1 0 0 / 10%)',\n 'sidebar-ring': 'oklch(0.551 0.027 264.364)',\n },\n },\n },\n];\n\nexport type RadiusOption = {\n name: 'default' | 'none' | 'small' | 'medium' | 'large';\n label: string;\n value: string;\n};\n\nexport const RADII: RadiusOption[] = [\n { name: 'default', label: 'Default', value: '' },\n { name: 'none', label: 'None', value: '0' },\n { name: 'small', label: 'Small', value: '0.45rem' },\n { name: 'medium', label: 'Medium', value: '0.625rem' },\n { name: 'large', label: 'Large', value: '0.875rem' },\n];\n\nexport function getBaseColor(name: string): BaseColorTheme | undefined {\n return BASE_COLORS.find((c) => c.name === name);\n}\n\nexport function getRadius(name: string): RadiusOption | undefined {\n return RADII.find((r) => r.name === name);\n}\n","/**\n * Canonical theme variable names aligned with shadcn/ui semantic tokens.\n * UI components depend on these CSS vars; consumer defines them.\n */\n\nexport const THEME_VAR_NAMES = [\n '--background',\n '--foreground',\n '--card',\n '--card-foreground',\n '--popover',\n '--popover-foreground',\n '--primary',\n '--primary-foreground',\n '--secondary',\n '--secondary-foreground',\n '--muted',\n '--muted-foreground',\n '--accent',\n '--accent-foreground',\n '--destructive',\n '--destructive-foreground',\n '--border',\n '--input',\n '--ring',\n '--chart-1',\n '--chart-2',\n '--chart-3',\n '--chart-4',\n '--chart-5',\n '--radius',\n '--sidebar',\n '--sidebar-foreground',\n '--sidebar-primary',\n '--sidebar-primary-foreground',\n '--sidebar-accent',\n '--sidebar-accent-foreground',\n '--sidebar-border',\n '--sidebar-ring',\n '--sidebar-active', // mesob extension\n '--overlay', // mesob extension\n] as const;\n\nexport type ThemeVarName = (typeof THEME_VAR_NAMES)[number];\n\nconst THEME_VAR_SET = new Set<string>(THEME_VAR_NAMES);\n\n/** Vars that buildTheme provides (minimal required set). */\nexport const REQUIRED_THEME_VARS: readonly string[] = [\n '--background',\n '--foreground',\n '--primary',\n '--primary-foreground',\n '--radius',\n];\n\nexport type ThemeValidation = {\n valid: boolean;\n unknown: string[];\n missing: string[];\n};\n\n/**\n * Validates a theme object against the consumer theme contract.\n * - unknown: keys not in THEME_VAR_NAMES (typos / unsupported).\n * - missing: required vars absent (for full theme override).\n */\nexport function validateTheme(theme: Record<string, string>): ThemeValidation {\n const keys = new Set(Object.keys(theme));\n const unknown: string[] = [];\n const missing: string[] = [];\n\n for (const key of keys) {\n if (!THEME_VAR_SET.has(key)) {\n unknown.push(key);\n }\n }\n for (const key of REQUIRED_THEME_VARS) {\n if (!keys.has(key)) {\n missing.push(key);\n }\n }\n\n return {\n valid: unknown.length === 0 && missing.length === 0,\n unknown,\n missing,\n };\n}\n\n/** Shared component size scale (xs–xl) aligned with Mantine */\nexport type ComponentSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Shared component radius scale aligned with Mantine */\nexport type ComponentRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/** Order of Input.Wrapper elements (Mantine-like) */\nexport type InputWrapperOrder = ('label' | 'input' | 'description' | 'error')[];\n\n/** Shared component color (theme key) */\nexport type ComponentColor =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'destructive'\n | string;\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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","names":[]}
|
package/dist/lib/locale.d.ts
CHANGED
|
@@ -15,13 +15,13 @@ type SupportedLanguage = {
|
|
|
15
15
|
/** Fallback when MesobProvider does not receive supportedLanguages */
|
|
16
16
|
declare const SUPPORTED_LANGUAGES: SupportedLanguage[];
|
|
17
17
|
declare const LOCALE_INPUT_DEFAULT: Locale;
|
|
18
|
-
declare const LOCALE_REQUIRED_INPUT_SCHEMA: z.
|
|
18
|
+
declare const LOCALE_REQUIRED_INPUT_SCHEMA: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
19
19
|
declare const LOCALE_OPTIONAL_INPUT_SCHEMA: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
20
20
|
declare function getLocaleInputDefault(supportedLanguages: SupportedLanguage[]): Record<string, string>;
|
|
21
21
|
type SchemaAccumulator = {
|
|
22
22
|
[key: string]: z.ZodTypeAny;
|
|
23
23
|
};
|
|
24
24
|
declare function createLocalInputSchema(defaultLanguage: string, supportedLanguages: SupportedLanguage[], defaultValidation: z.ZodTypeAny, otherValidation: z.ZodTypeAny): z.ZodObject<SchemaAccumulator>;
|
|
25
|
-
declare function createLocalRequiredInputSchema(supportedLanguages: SupportedLanguage[], validation: z.ZodTypeAny): z.
|
|
25
|
+
declare function createLocalRequiredInputSchema(supportedLanguages: SupportedLanguage[], validation: z.ZodTypeAny): z.ZodTypeAny;
|
|
26
26
|
|
|
27
27
|
export { DEFAULT_LANGUAGE, LOCALE_INPUT_DEFAULT, LOCALE_OPTIONAL_INPUT_SCHEMA, LOCALE_REQUIRED_INPUT_SCHEMA, type Locale, type LocaleKey, SUPPORTED_LANGUAGES, type SupportedLanguage, type Translation, createLocalInputSchema, createLocalRequiredInputSchema, getLocaleInputDefault };
|
package/dist/lib/locale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/locale.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.
|
|
1
|
+
{"version":3,"sources":["../../src/lib/locale.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.ZodTypeAny {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of supportedLanguages) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAWX,IAAM,mBAAmB;AAKzB,IAAM,sBAA2C;AAAA,EACtD,EAAE,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AAAA,EAC3C,EAAE,OAAO,MAAM,OAAO,4BAAQ,KAAK,eAAK;AAC1C;AAEA,IAAM,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC7C,IAAM,uBAA+B,CAAC;AACtC,IAAM,+BAA+B,aAAa;AAAA,EACvD,CAAC,MAAM,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA,EAC/B,EAAE,SAAS,+BAA+B;AAC5C;AACO,IAAM,+BAA+B;AAErC,SAAS,sBACd,oBACwB;AACxB,SAAO,OAAO,YAAY,mBAAmB,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9E;AAMO,SAAS,uBACd,iBACA,oBACA,mBACA,iBACgC;AAChC,QAAM,mBACJ,mBAAmB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAC/D,QAAI,KAAK,IACP,UAAU,kBAAkB,oBAAoB;AAClD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB;AAClC;AAEO,SAAS,+BACd,oBACA,YACc;AACd,QAAM,mBACJ,mBAAmB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAC/D,QAAI,KAAK,IAAI;AACb,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB,EAAE,YAAY,CAAC,MAAM,QAAQ;AAC3D,UAAM,WAAW,OAAO,OAAO,IAAI,EAAE;AAAA,MACnC,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,IAChE;AAEA,QAAI,CAAC,UAAU;AACb,iBAAW,EAAE,MAAM,KAAK,oBAAoB;AAC1C,YAAI,SAAS;AAAA,UACX,MAAM,EAAE,aAAa;AAAA,UACrB,SAAS;AAAA,UACT,MAAM,CAAC,KAAK;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/dist/providers.d.ts
CHANGED
|
@@ -20,10 +20,11 @@ type MesobProviderProps = {
|
|
|
20
20
|
children: ReactNode;
|
|
21
21
|
routing: Parameters<typeof createNavigation>[0];
|
|
22
22
|
linkComponent?: Navigation['Link'];
|
|
23
|
+
locale?: string;
|
|
23
24
|
defaultLanguage?: string;
|
|
24
25
|
supportedLanguages?: SupportedLanguage[];
|
|
25
26
|
};
|
|
26
|
-
declare function MesobProvider({ children, routing, linkComponent: linkComponentProp, defaultLanguage, supportedLanguages, }: MesobProviderProps): react_jsx_runtime.JSX.Element;
|
|
27
|
+
declare function MesobProvider({ children, routing, linkComponent: linkComponentProp, locale: localeProp, defaultLanguage, supportedLanguages, }: MesobProviderProps): react_jsx_runtime.JSX.Element;
|
|
27
28
|
declare function useMesob(): MesobContextValue | null;
|
|
28
29
|
declare function useLocaleConfig(): {
|
|
29
30
|
defaultLanguage: string;
|
package/dist/providers.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// src/provider/mesob-provider.tsx
|
|
2
|
-
import { useLocale } from "next-intl";
|
|
3
2
|
import { createNavigation } from "next-intl/navigation";
|
|
4
3
|
import { createContext, useContext, useMemo } from "react";
|
|
5
4
|
import { z as z2 } from "zod";
|
|
@@ -78,16 +77,16 @@ function MesobProvider({
|
|
|
78
77
|
children,
|
|
79
78
|
routing,
|
|
80
79
|
linkComponent: linkComponentProp,
|
|
80
|
+
locale: localeProp,
|
|
81
81
|
defaultLanguage = DEFAULT_LANGUAGE,
|
|
82
82
|
supportedLanguages = SUPPORTED_LANGUAGES
|
|
83
83
|
}) {
|
|
84
84
|
if (!routing) {
|
|
85
85
|
throw new Error(`${MESOB_ERR} routing is required`);
|
|
86
86
|
}
|
|
87
|
-
const locale =
|
|
87
|
+
const locale = localeProp ?? defaultLanguage;
|
|
88
88
|
const navigation = useMemo(() => createNavigation(routing), [routing]);
|
|
89
|
-
const
|
|
90
|
-
const pathname = navigation.usePathname();
|
|
89
|
+
const pathname = typeof window === "undefined" ? "/" : window.location.pathname;
|
|
91
90
|
const value = useMemo(() => {
|
|
92
91
|
const linkComponent = linkComponentProp ?? navigation?.Link;
|
|
93
92
|
if (!linkComponent) {
|
|
@@ -98,8 +97,16 @@ function MesobProvider({
|
|
|
98
97
|
return {
|
|
99
98
|
navigation,
|
|
100
99
|
linkComponent,
|
|
101
|
-
goBack: () =>
|
|
102
|
-
|
|
100
|
+
goBack: () => {
|
|
101
|
+
if (typeof window !== "undefined") {
|
|
102
|
+
window.history.back();
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
navigate: (href) => {
|
|
106
|
+
if (typeof window !== "undefined") {
|
|
107
|
+
window.location.assign(href);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
103
110
|
pathname,
|
|
104
111
|
locale,
|
|
105
112
|
defaultLanguage,
|
|
@@ -108,7 +115,6 @@ function MesobProvider({
|
|
|
108
115
|
}, [
|
|
109
116
|
navigation,
|
|
110
117
|
linkComponentProp,
|
|
111
|
-
router,
|
|
112
118
|
pathname,
|
|
113
119
|
locale,
|
|
114
120
|
defaultLanguage,
|
package/dist/providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/mesob-provider.tsx","../src/components/ui/tooltip.tsx","../src/lib/utils.ts","../src/lib/locale.ts"],"sourcesContent":["'use client';\n\nimport { useLocale } from 'next-intl';\nimport { createNavigation } from 'next-intl/navigation';\nimport { createContext, type ReactNode, useContext, useMemo } from 'react';\nimport { z } from 'zod';\nimport { TooltipProvider } from '../components/ui/tooltip';\nimport {\n createLocalInputSchema,\n createLocalRequiredInputSchema,\n DEFAULT_LANGUAGE,\n getLocaleInputDefault,\n SUPPORTED_LANGUAGES,\n type SupportedLanguage,\n} from '../lib/locale';\n\ntype Navigation = ReturnType<typeof createNavigation>;\n\ntype MesobContextValue = {\n navigation: Navigation;\n linkComponent: Navigation['Link'];\n goBack: () => void;\n navigate: (href: string) => void;\n pathname: string;\n locale: string;\n defaultLanguage: string;\n supportedLanguages: SupportedLanguage[];\n t?: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nconst MESOB_ERR = '[MesobProvider]';\n\nexport type MesobProviderProps = {\n children: ReactNode;\n routing: Parameters<typeof createNavigation>[0];\n linkComponent?: Navigation['Link'];\n defaultLanguage?: string;\n supportedLanguages?: SupportedLanguage[];\n};\n\nexport function MesobProvider({\n children,\n routing,\n linkComponent: linkComponentProp,\n defaultLanguage = DEFAULT_LANGUAGE,\n supportedLanguages = SUPPORTED_LANGUAGES,\n}: MesobProviderProps) {\n if (!routing) {\n throw new Error(`${MESOB_ERR} routing is required`);\n }\n\n const locale = useLocale();\n const navigation = useMemo(() => createNavigation(routing), [routing]);\n const router = navigation.useRouter();\n const pathname = navigation.usePathname();\n\n const value = useMemo(() => {\n const linkComponent = linkComponentProp ?? navigation?.Link;\n if (!linkComponent) {\n throw new Error(\n `${MESOB_ERR} linkComponent or valid createNavigation required`,\n );\n }\n return {\n navigation,\n linkComponent,\n goBack: () => router.back(),\n navigate: (href: string) => router.push(href),\n pathname,\n locale,\n defaultLanguage,\n supportedLanguages,\n };\n }, [\n navigation,\n linkComponentProp,\n router,\n pathname,\n locale,\n defaultLanguage,\n supportedLanguages,\n ]);\n\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delay={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n\nexport function useLocaleConfig(): {\n defaultLanguage: string;\n supportedLanguages: SupportedLanguage[];\n} {\n const mesob = useMesob();\n return {\n defaultLanguage: mesob?.defaultLanguage ?? DEFAULT_LANGUAGE,\n supportedLanguages: mesob?.supportedLanguages ?? SUPPORTED_LANGUAGES,\n };\n}\n\nexport function useLocaleSchemas(): {\n localeInputDefault: Record<string, string>;\n requiredSchema: ReturnType<typeof createLocalRequiredInputSchema>;\n optionalSchema: ReturnType<typeof createLocalInputSchema>;\n} {\n const { defaultLanguage, supportedLanguages } = useLocaleConfig();\n return useMemo(\n () => ({\n localeInputDefault: getLocaleInputDefault(supportedLanguages),\n requiredSchema: createLocalRequiredInputSchema(\n supportedLanguages,\n z.string().optional(),\n ),\n optionalSchema: createLocalInputSchema(\n defaultLanguage,\n supportedLanguages,\n z.string().optional(),\n z.string().optional(),\n ),\n }),\n [defaultLanguage, supportedLanguages],\n );\n}\n","'use client';\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\n\nimport { cn } from '../../lib/utils';\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n side = 'top',\n sideOffset = 4,\n align = 'center',\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<\n TooltipPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'side' | 'sideOffset'\n >) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n 'cn-tooltip-content cn-tooltip-content-logical bg-foreground text-background z-50 w-fit max-w-xs origin-(--transform-origin)',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"cn-tooltip-arrow cn-tooltip-arrow-logical bg-foreground fill-foreground z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.ZodEffects<z.ZodObject<SchemaAccumulator>> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of supportedLanguages) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n"],"mappings":"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","names":["z","jsx","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider/mesob-provider.tsx","../src/components/ui/tooltip.tsx","../src/lib/utils.ts","../src/lib/locale.ts"],"sourcesContent":["'use client';\n\nimport { createNavigation } from 'next-intl/navigation';\nimport { createContext, type ReactNode, useContext, useMemo } from 'react';\nimport { z } from 'zod';\nimport { TooltipProvider } from '../components/ui/tooltip';\nimport {\n createLocalInputSchema,\n createLocalRequiredInputSchema,\n DEFAULT_LANGUAGE,\n getLocaleInputDefault,\n SUPPORTED_LANGUAGES,\n type SupportedLanguage,\n} from '../lib/locale';\n\ntype Navigation = ReturnType<typeof createNavigation>;\n\ntype MesobContextValue = {\n navigation: Navigation;\n linkComponent: Navigation['Link'];\n goBack: () => void;\n navigate: (href: string) => void;\n pathname: string;\n locale: string;\n defaultLanguage: string;\n supportedLanguages: SupportedLanguage[];\n t?: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst MesobContext = createContext<MesobContextValue | null>(null);\n\nconst MESOB_ERR = '[MesobProvider]';\n\nexport type MesobProviderProps = {\n children: ReactNode;\n routing: Parameters<typeof createNavigation>[0];\n linkComponent?: Navigation['Link'];\n locale?: string;\n defaultLanguage?: string;\n supportedLanguages?: SupportedLanguage[];\n};\n\nexport function MesobProvider({\n children,\n routing,\n linkComponent: linkComponentProp,\n locale: localeProp,\n defaultLanguage = DEFAULT_LANGUAGE,\n supportedLanguages = SUPPORTED_LANGUAGES,\n}: MesobProviderProps) {\n if (!routing) {\n throw new Error(`${MESOB_ERR} routing is required`);\n }\n\n const locale = localeProp ?? defaultLanguage;\n const navigation = useMemo(() => createNavigation(routing), [routing]);\n const pathname =\n typeof window === 'undefined' ? '/' : window.location.pathname;\n\n const value = useMemo(() => {\n const linkComponent = linkComponentProp ?? navigation?.Link;\n if (!linkComponent) {\n throw new Error(\n `${MESOB_ERR} linkComponent or valid createNavigation required`,\n );\n }\n return {\n navigation,\n linkComponent,\n goBack: () => {\n if (typeof window !== 'undefined') {\n window.history.back();\n }\n },\n navigate: (href: string) => {\n if (typeof window !== 'undefined') {\n window.location.assign(href);\n }\n },\n pathname,\n locale,\n defaultLanguage,\n supportedLanguages,\n };\n }, [\n navigation,\n linkComponentProp,\n pathname,\n locale,\n defaultLanguage,\n supportedLanguages,\n ]);\n\n return (\n <MesobContext.Provider value={value}>\n <TooltipProvider delay={0}>{children}</TooltipProvider>\n </MesobContext.Provider>\n );\n}\n\nexport function useMesob(): MesobContextValue | null {\n return useContext(MesobContext);\n}\n\nexport function useLocaleConfig(): {\n defaultLanguage: string;\n supportedLanguages: SupportedLanguage[];\n} {\n const mesob = useMesob();\n return {\n defaultLanguage: mesob?.defaultLanguage ?? DEFAULT_LANGUAGE,\n supportedLanguages: mesob?.supportedLanguages ?? SUPPORTED_LANGUAGES,\n };\n}\n\nexport function useLocaleSchemas(): {\n localeInputDefault: Record<string, string>;\n requiredSchema: ReturnType<typeof createLocalRequiredInputSchema>;\n optionalSchema: ReturnType<typeof createLocalInputSchema>;\n} {\n const { defaultLanguage, supportedLanguages } = useLocaleConfig();\n return useMemo(\n () => ({\n localeInputDefault: getLocaleInputDefault(supportedLanguages),\n requiredSchema: createLocalRequiredInputSchema(\n supportedLanguages,\n z.string().optional(),\n ),\n optionalSchema: createLocalInputSchema(\n defaultLanguage,\n supportedLanguages,\n z.string().optional(),\n z.string().optional(),\n ),\n }),\n [defaultLanguage, supportedLanguages],\n );\n}\n","'use client';\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\n\nimport { cn } from '../../lib/utils';\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n side = 'top',\n sideOffset = 4,\n align = 'center',\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<\n TooltipPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'side' | 'sideOffset'\n >) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n 'cn-tooltip-content cn-tooltip-content-logical bg-foreground text-background z-50 w-fit max-w-xs origin-(--transform-origin)',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"cn-tooltip-arrow cn-tooltip-arrow-logical bg-foreground fill-foreground z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [Key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\n/** Fallback when MesobProvider does not receive defaultLanguage/supportedLanguages */\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\n/** Fallback when MesobProvider does not receive supportedLanguages */\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nconst localeRecord = z.record(z.string(), z.string());\nexport const LOCALE_INPUT_DEFAULT: Locale = {};\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = localeRecord.refine(\n (o) => Object.keys(o).length > 0,\n { message: 'At least one locale required' },\n);\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = localeRecord;\n\nexport function getLocaleInputDefault(\n supportedLanguages: SupportedLanguage[],\n): Record<string, string> {\n return Object.fromEntries(supportedLanguages.map(({ value }) => [value, '']));\n}\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultLanguage: string,\n supportedLanguages: SupportedLanguage[],\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === defaultLanguage ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n supportedLanguages: SupportedLanguage[],\n validation: z.ZodTypeAny,\n): z.ZodTypeAny {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n supportedLanguages.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of supportedLanguages) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n"],"mappings":"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","names":["z","jsx","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mesob/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
"sonner": "^2.0.7",
|
|
80
80
|
"tailwind-merge": "^3.3.1",
|
|
81
81
|
"tw-animate-css": "^1.4.0",
|
|
82
|
-
"zod": "^3.
|
|
83
|
-
"@mesob/common": "0.
|
|
82
|
+
"zod": "^4.3.6",
|
|
83
|
+
"@mesob/common": "0.5.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
86
|
"@tailwindcss/postcss": "^4.1.11",
|
|
@@ -93,12 +93,18 @@
|
|
|
93
93
|
"typescript": "^5.7.2"
|
|
94
94
|
},
|
|
95
95
|
"peerDependencies": {
|
|
96
|
+
"disable-devtool": "*",
|
|
96
97
|
"next-intl": "^4.5.6",
|
|
97
98
|
"nuqs": "^2.8.1",
|
|
98
99
|
"react": "^19.2.0",
|
|
99
100
|
"react-dom": "^19.2.0",
|
|
100
101
|
"use-debounce": "^10.0.6"
|
|
101
102
|
},
|
|
103
|
+
"peerDependenciesMeta": {
|
|
104
|
+
"disable-devtool": {
|
|
105
|
+
"optional": true
|
|
106
|
+
}
|
|
107
|
+
},
|
|
102
108
|
"publishConfig": {
|
|
103
109
|
"access": "public"
|
|
104
110
|
},
|
|
@@ -2342,3 +2342,36 @@
|
|
|
2342
2342
|
@apply hover:bg-accent hover:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground rounded-none;
|
|
2343
2343
|
}
|
|
2344
2344
|
}
|
|
2345
|
+
|
|
2346
|
+
/* MARK: AI Trigger */
|
|
2347
|
+
.ai-fill-button:hover .ai-fill-ring {
|
|
2348
|
+
animation: ai-fill-ring-visibility 2400ms linear 1 forwards;
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
|
+
.ai-fill-button:hover .ai-fill-ring-stroke {
|
|
2352
|
+
animation: ai-fill-ring-stroke 1200ms linear 2;
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
@keyframes ai-fill-ring-visibility {
|
|
2356
|
+
0% {
|
|
2357
|
+
opacity: 0;
|
|
2358
|
+
}
|
|
2359
|
+
8% {
|
|
2360
|
+
opacity: 1;
|
|
2361
|
+
}
|
|
2362
|
+
85% {
|
|
2363
|
+
opacity: 1;
|
|
2364
|
+
}
|
|
2365
|
+
100% {
|
|
2366
|
+
opacity: 0;
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2370
|
+
@keyframes ai-fill-ring-stroke {
|
|
2371
|
+
from {
|
|
2372
|
+
stroke-dashoffset: 0;
|
|
2373
|
+
}
|
|
2374
|
+
to {
|
|
2375
|
+
stroke-dashoffset: -68;
|
|
2376
|
+
}
|
|
2377
|
+
}
|
|
@@ -2379,3 +2379,36 @@
|
|
|
2379
2379
|
@apply hover:bg-accent hover:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground rounded-[var(--radius-sm)];
|
|
2380
2380
|
}
|
|
2381
2381
|
}
|
|
2382
|
+
|
|
2383
|
+
/* MARK: AI Trigger */
|
|
2384
|
+
.ai-fill-button:hover .ai-fill-ring {
|
|
2385
|
+
animation: ai-fill-ring-visibility 2400ms linear 1 forwards;
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
.ai-fill-button:hover .ai-fill-ring-stroke {
|
|
2389
|
+
animation: ai-fill-ring-stroke 1200ms linear 2;
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
@keyframes ai-fill-ring-visibility {
|
|
2393
|
+
0% {
|
|
2394
|
+
opacity: 0;
|
|
2395
|
+
}
|
|
2396
|
+
8% {
|
|
2397
|
+
opacity: 1;
|
|
2398
|
+
}
|
|
2399
|
+
85% {
|
|
2400
|
+
opacity: 1;
|
|
2401
|
+
}
|
|
2402
|
+
100% {
|
|
2403
|
+
opacity: 0;
|
|
2404
|
+
}
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2407
|
+
@keyframes ai-fill-ring-stroke {
|
|
2408
|
+
from {
|
|
2409
|
+
stroke-dashoffset: 0;
|
|
2410
|
+
}
|
|
2411
|
+
to {
|
|
2412
|
+
stroke-dashoffset: -68;
|
|
2413
|
+
}
|
|
2414
|
+
}
|
|
@@ -2381,3 +2381,36 @@
|
|
|
2381
2381
|
@apply hover:bg-accent hover:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground rounded-[var(--radius-sm)];
|
|
2382
2382
|
}
|
|
2383
2383
|
}
|
|
2384
|
+
|
|
2385
|
+
/* MARK: AI Trigger */
|
|
2386
|
+
.ai-fill-button:hover .ai-fill-ring {
|
|
2387
|
+
animation: ai-fill-ring-visibility 2400ms linear 1 forwards;
|
|
2388
|
+
}
|
|
2389
|
+
|
|
2390
|
+
.ai-fill-button:hover .ai-fill-ring-stroke {
|
|
2391
|
+
animation: ai-fill-ring-stroke 1200ms linear 2;
|
|
2392
|
+
}
|
|
2393
|
+
|
|
2394
|
+
@keyframes ai-fill-ring-visibility {
|
|
2395
|
+
0% {
|
|
2396
|
+
opacity: 0;
|
|
2397
|
+
}
|
|
2398
|
+
8% {
|
|
2399
|
+
opacity: 1;
|
|
2400
|
+
}
|
|
2401
|
+
85% {
|
|
2402
|
+
opacity: 1;
|
|
2403
|
+
}
|
|
2404
|
+
100% {
|
|
2405
|
+
opacity: 0;
|
|
2406
|
+
}
|
|
2407
|
+
}
|
|
2408
|
+
|
|
2409
|
+
@keyframes ai-fill-ring-stroke {
|
|
2410
|
+
from {
|
|
2411
|
+
stroke-dashoffset: 0;
|
|
2412
|
+
}
|
|
2413
|
+
to {
|
|
2414
|
+
stroke-dashoffset: -68;
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
@@ -2482,3 +2482,36 @@
|
|
|
2482
2482
|
@apply hover:bg-accent hover:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground rounded-[var(--radius-sm)];
|
|
2483
2483
|
}
|
|
2484
2484
|
}
|
|
2485
|
+
|
|
2486
|
+
/* MARK: AI Trigger */
|
|
2487
|
+
.ai-fill-button:hover .ai-fill-ring {
|
|
2488
|
+
animation: ai-fill-ring-visibility 2400ms linear 1 forwards;
|
|
2489
|
+
}
|
|
2490
|
+
|
|
2491
|
+
.ai-fill-button:hover .ai-fill-ring-stroke {
|
|
2492
|
+
animation: ai-fill-ring-stroke 1200ms linear 2;
|
|
2493
|
+
}
|
|
2494
|
+
|
|
2495
|
+
@keyframes ai-fill-ring-visibility {
|
|
2496
|
+
0% {
|
|
2497
|
+
opacity: 0;
|
|
2498
|
+
}
|
|
2499
|
+
8% {
|
|
2500
|
+
opacity: 1;
|
|
2501
|
+
}
|
|
2502
|
+
85% {
|
|
2503
|
+
opacity: 1;
|
|
2504
|
+
}
|
|
2505
|
+
100% {
|
|
2506
|
+
opacity: 0;
|
|
2507
|
+
}
|
|
2508
|
+
}
|
|
2509
|
+
|
|
2510
|
+
@keyframes ai-fill-ring-stroke {
|
|
2511
|
+
from {
|
|
2512
|
+
stroke-dashoffset: 0;
|
|
2513
|
+
}
|
|
2514
|
+
to {
|
|
2515
|
+
stroke-dashoffset: -68;
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
@@ -2478,3 +2478,36 @@
|
|
|
2478
2478
|
@apply hover:bg-accent hover:text-accent-foreground data-[active=true]:bg-accent data-[active=true]:text-accent-foreground rounded-[var(--radius-sm)];
|
|
2479
2479
|
}
|
|
2480
2480
|
}
|
|
2481
|
+
|
|
2482
|
+
/* MARK: AI Trigger */
|
|
2483
|
+
.ai-fill-button:hover .ai-fill-ring {
|
|
2484
|
+
animation: ai-fill-ring-visibility 2400ms linear 1 forwards;
|
|
2485
|
+
}
|
|
2486
|
+
|
|
2487
|
+
.ai-fill-button:hover .ai-fill-ring-stroke {
|
|
2488
|
+
animation: ai-fill-ring-stroke 1200ms linear 2;
|
|
2489
|
+
}
|
|
2490
|
+
|
|
2491
|
+
@keyframes ai-fill-ring-visibility {
|
|
2492
|
+
0% {
|
|
2493
|
+
opacity: 0;
|
|
2494
|
+
}
|
|
2495
|
+
8% {
|
|
2496
|
+
opacity: 1;
|
|
2497
|
+
}
|
|
2498
|
+
85% {
|
|
2499
|
+
opacity: 1;
|
|
2500
|
+
}
|
|
2501
|
+
100% {
|
|
2502
|
+
opacity: 0;
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
2505
|
+
|
|
2506
|
+
@keyframes ai-fill-ring-stroke {
|
|
2507
|
+
from {
|
|
2508
|
+
stroke-dashoffset: 0;
|
|
2509
|
+
}
|
|
2510
|
+
to {
|
|
2511
|
+
stroke-dashoffset: -68;
|
|
2512
|
+
}
|
|
2513
|
+
}
|