@kungal/ui-core 0.18.1 → 0.19.1
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/index.cjs +20 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -100,6 +100,24 @@ var kunRingClasses = {
|
|
|
100
100
|
danger: "focus-within:ring-danger/40 focus:ring-danger/40",
|
|
101
101
|
info: "focus-within:ring-info/40 focus:ring-info/40"
|
|
102
102
|
};
|
|
103
|
+
var kunFocusRingClasses = {
|
|
104
|
+
default: "outline-none focus-visible:ring-2 focus-visible:ring-default/50",
|
|
105
|
+
primary: "outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
106
|
+
secondary: "outline-none focus-visible:ring-2 focus-visible:ring-secondary/50",
|
|
107
|
+
success: "outline-none focus-visible:ring-2 focus-visible:ring-success/50",
|
|
108
|
+
warning: "outline-none focus-visible:ring-2 focus-visible:ring-warning/50",
|
|
109
|
+
danger: "outline-none focus-visible:ring-2 focus-visible:ring-danger/50",
|
|
110
|
+
info: "outline-none focus-visible:ring-2 focus-visible:ring-info/50"
|
|
111
|
+
};
|
|
112
|
+
var kunFocusRingWithinClasses = {
|
|
113
|
+
default: "focus-within:ring-2 focus-within:ring-default/50",
|
|
114
|
+
primary: "focus-within:ring-2 focus-within:ring-primary/50",
|
|
115
|
+
secondary: "focus-within:ring-2 focus-within:ring-secondary/50",
|
|
116
|
+
success: "focus-within:ring-2 focus-within:ring-success/50",
|
|
117
|
+
warning: "focus-within:ring-2 focus-within:ring-warning/50",
|
|
118
|
+
danger: "focus-within:ring-2 focus-within:ring-danger/50",
|
|
119
|
+
info: "focus-within:ring-2 focus-within:ring-info/50"
|
|
120
|
+
};
|
|
103
121
|
var kunSoftBgClasses = {
|
|
104
122
|
default: "bg-default/5",
|
|
105
123
|
primary: "bg-primary/5",
|
|
@@ -222,6 +240,8 @@ exports.hasKunIcon = hasKunIcon;
|
|
|
222
240
|
exports.kunBgClasses = kunBgClasses;
|
|
223
241
|
exports.kunBorderClasses = kunBorderClasses;
|
|
224
242
|
exports.kunControlSizeClasses = kunControlSizeClasses;
|
|
243
|
+
exports.kunFocusRingClasses = kunFocusRingClasses;
|
|
244
|
+
exports.kunFocusRingWithinClasses = kunFocusRingWithinClasses;
|
|
225
245
|
exports.kunRingClasses = kunRingClasses;
|
|
226
246
|
exports.kunRoundedClasses = kunRoundedClasses;
|
|
227
247
|
exports.kunSelectionSizeClasses = kunSelectionSizeClasses;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/getRandomSticker.ts","../src/icons-data.ts","../src/icons.ts"],"names":["twMerge","clsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variants\n// (bordered / ghost) actually render — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n solid: {\n default: 'border border-transparent bg-default text-white',\n primary: 'border border-transparent bg-primary text-white',\n secondary: 'border border-transparent bg-secondary text-white',\n success: 'border border-transparent bg-success-600 text-white dark:bg-success-300',\n warning: 'border border-transparent bg-warning text-white',\n danger: 'border border-transparent bg-danger text-white',\n info: 'border border-transparent bg-info-600 text-white',\n },\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary',\n secondary: 'border border-secondary bg-transparent text-secondary',\n success: 'border border-success bg-transparent text-success',\n warning: 'border border-warning bg-transparent text-warning',\n danger: 'border border-danger bg-transparent text-danger',\n info: 'border border-info bg-transparent text-info',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-700',\n primary: 'border border-transparent bg-primary/20 text-primary-600',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-600',\n success: 'border border-transparent bg-success/20 text-success-700 dark:text-success',\n warning: 'border border-transparent bg-warning/20 text-warning-700 dark:text-warning',\n danger: 'border border-transparent bg-danger/20 text-danger-600 dark:text-danger-500',\n info: 'border border-transparent bg-info/20 text-info-700 dark:text-info-500',\n },\n shadow: {\n default: 'border border-transparent shadow-default/40 bg-default text-white',\n primary: 'border border-transparent shadow-primary/40 bg-primary text-white',\n secondary: 'border border-transparent shadow-secondary/40 bg-secondary text-white',\n success: 'border border-transparent shadow-success/40 bg-success-600 text-white',\n warning: 'border border-transparent shadow-warning/40 bg-warning text-white',\n danger: 'border border-transparent shadow-danger/40 bg-danger text-white',\n info: 'border border-transparent shadow-info/40 bg-info-600 text-white',\n },\n ghost: {\n default: 'border border-default bg-transparent hover:bg-default/10',\n primary: 'border border-primary bg-transparent text-primary hover:bg-primary/10',\n secondary: 'border border-secondary bg-transparent text-secondary hover:bg-secondary/10',\n success: 'border border-success bg-transparent text-success hover:bg-success/10',\n warning: 'border border-warning bg-transparent text-warning hover:bg-warning/10',\n danger: 'border border-danger bg-transparent text-danger hover:bg-danger/10',\n info: 'border border-info bg-transparent text-info hover:bg-info/10',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n secondary: 'text-secondary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n info: 'text-info',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// Deterministic sticker picker for fallback/empty states (avatars without\n// an image, KunNull's empty illustration, etc.).\n//\n// The original was random-per-call + Nuxt `useState` to freeze the pick\n// across SSR hydration. This version derives the URL deterministically from\n// the `id` (a cheap string hash) instead: the same id always yields the same\n// sticker on both server and client, so there is no hydration mismatch and\n// no framework state needed — fully portable.\n//\n// The CDN is the KunUI sticker host; consumers don't need to ship assets.\n\nconst KUN_STICKER_DOMAIN = 'https://sticker.kungal.com'\nconst PACKS = 5\nconst PER_PACK = 80\n\nconst hash = (s: string): number => {\n let h = 0\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(h, 31) + s.charCodeAt(i)) >>> 0\n }\n return h\n}\n\nexport const getRandomSticker = (id = ''): string => {\n const h = hash(id)\n const pack = (h % PACKS) + 1\n const sticker = (Math.floor(h / PACKS) % PER_PACK) + 1\n return `${KUN_STICKER_DOMAIN}/stickers/KUNgal${pack}/${sticker}.webp`\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/getRandomSticker.ts","../src/icons-data.ts","../src/icons.ts"],"names":["twMerge","clsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variants\n// (bordered / ghost) actually render — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n solid: {\n default: 'border border-transparent bg-default text-white',\n primary: 'border border-transparent bg-primary text-white',\n secondary: 'border border-transparent bg-secondary text-white',\n success: 'border border-transparent bg-success-600 text-white dark:bg-success-300',\n warning: 'border border-transparent bg-warning text-white',\n danger: 'border border-transparent bg-danger text-white',\n info: 'border border-transparent bg-info-600 text-white',\n },\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary',\n secondary: 'border border-secondary bg-transparent text-secondary',\n success: 'border border-success bg-transparent text-success',\n warning: 'border border-warning bg-transparent text-warning',\n danger: 'border border-danger bg-transparent text-danger',\n info: 'border border-info bg-transparent text-info',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-700',\n primary: 'border border-transparent bg-primary/20 text-primary-600',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-600',\n success: 'border border-transparent bg-success/20 text-success-700 dark:text-success',\n warning: 'border border-transparent bg-warning/20 text-warning-700 dark:text-warning',\n danger: 'border border-transparent bg-danger/20 text-danger-600 dark:text-danger-500',\n info: 'border border-transparent bg-info/20 text-info-700 dark:text-info-500',\n },\n shadow: {\n default: 'border border-transparent shadow-default/40 bg-default text-white',\n primary: 'border border-transparent shadow-primary/40 bg-primary text-white',\n secondary: 'border border-transparent shadow-secondary/40 bg-secondary text-white',\n success: 'border border-transparent shadow-success/40 bg-success-600 text-white',\n warning: 'border border-transparent shadow-warning/40 bg-warning text-white',\n danger: 'border border-transparent shadow-danger/40 bg-danger text-white',\n info: 'border border-transparent shadow-info/40 bg-info-600 text-white',\n },\n ghost: {\n default: 'border border-default bg-transparent hover:bg-default/10',\n primary: 'border border-primary bg-transparent text-primary hover:bg-primary/10',\n secondary: 'border border-secondary bg-transparent text-secondary hover:bg-secondary/10',\n success: 'border border-success bg-transparent text-success hover:bg-success/10',\n warning: 'border border-warning bg-transparent text-warning hover:bg-warning/10',\n danger: 'border border-danger bg-transparent text-danger hover:bg-danger/10',\n info: 'border border-info bg-transparent text-info hover:bg-info/10',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n secondary: 'text-secondary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n info: 'text-info',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\n/**\n * @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}\n * for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click\n * lit the ring, and used a different opacity from the rest of the library.\n */\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n/**\n * Unified focus ring — ONE recipe for every directly-focusable control (inputs,\n * textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).\n * Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no\n * ring; text fields still show it on click via the browser's focus-visible\n * heuristic). A flush 2px ring in the control's semantic color at 50% — replaces\n * the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.\n * Pair with `border-kun` at rest; on an invalid control use the `danger` entry.\n */\nexport const kunFocusRingClasses: Record<KunUIColor, string> = {\n default: 'outline-none focus-visible:ring-2 focus-visible:ring-default/50',\n primary: 'outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n secondary: 'outline-none focus-visible:ring-2 focus-visible:ring-secondary/50',\n success: 'outline-none focus-visible:ring-2 focus-visible:ring-success/50',\n warning: 'outline-none focus-visible:ring-2 focus-visible:ring-warning/50',\n danger: 'outline-none focus-visible:ring-2 focus-visible:ring-danger/50',\n info: 'outline-none focus-visible:ring-2 focus-visible:ring-info/50',\n}\n\n/**\n * Composite-widget variant of {@link kunFocusRingClasses}: the focusable element\n * is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the\n * wrapper and give the inner input `outline-none` (and no ring of its own) so\n * there's exactly one indicator. Used by KunNumberInput / KunTagInput.\n *\n * Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the\n * two are equivalent — a text input matches `:focus-visible` on click too — and\n * `focus-within` is a native variant that reliably compiles, whereas the\n * `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.\n */\nexport const kunFocusRingWithinClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-2 focus-within:ring-default/50',\n primary: 'focus-within:ring-2 focus-within:ring-primary/50',\n secondary: 'focus-within:ring-2 focus-within:ring-secondary/50',\n success: 'focus-within:ring-2 focus-within:ring-success/50',\n warning: 'focus-within:ring-2 focus-within:ring-warning/50',\n danger: 'focus-within:ring-2 focus-within:ring-danger/50',\n info: 'focus-within:ring-2 focus-within:ring-info/50',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// Deterministic sticker picker for fallback/empty states (avatars without\n// an image, KunNull's empty illustration, etc.).\n//\n// The original was random-per-call + Nuxt `useState` to freeze the pick\n// across SSR hydration. This version derives the URL deterministically from\n// the `id` (a cheap string hash) instead: the same id always yields the same\n// sticker on both server and client, so there is no hydration mismatch and\n// no framework state needed — fully portable.\n//\n// The CDN is the KunUI sticker host; consumers don't need to ship assets.\n\nconst KUN_STICKER_DOMAIN = 'https://sticker.kungal.com'\nconst PACKS = 5\nconst PER_PACK = 80\n\nconst hash = (s: string): number => {\n let h = 0\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(h, 31) + s.charCodeAt(i)) >>> 0\n }\n return h\n}\n\nexport const getRandomSticker = (id = ''): string => {\n const h = hash(id)\n const pack = (h % PACKS) + 1\n const sticker = (Math.floor(h / PACKS) % PER_PACK) + 1\n return `${KUN_STICKER_DOMAIN}/stickers/KUNgal${pack}/${sticker}.webp`\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -12,7 +12,34 @@ declare const kunVariantClasses: (variant: KunUIVariant, color: KunUIColor) => s
|
|
|
12
12
|
declare const kunBgClasses: Record<KunUIColor, string>;
|
|
13
13
|
declare const kunTextClasses: Record<KunUIColor, string>;
|
|
14
14
|
declare const kunBorderClasses: Record<KunUIColor, string>;
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}
|
|
17
|
+
* for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click
|
|
18
|
+
* lit the ring, and used a different opacity from the rest of the library.
|
|
19
|
+
*/
|
|
15
20
|
declare const kunRingClasses: Record<KunUIColor, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Unified focus ring — ONE recipe for every directly-focusable control (inputs,
|
|
23
|
+
* textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).
|
|
24
|
+
* Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no
|
|
25
|
+
* ring; text fields still show it on click via the browser's focus-visible
|
|
26
|
+
* heuristic). A flush 2px ring in the control's semantic color at 50% — replaces
|
|
27
|
+
* the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.
|
|
28
|
+
* Pair with `border-kun` at rest; on an invalid control use the `danger` entry.
|
|
29
|
+
*/
|
|
30
|
+
declare const kunFocusRingClasses: Record<KunUIColor, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Composite-widget variant of {@link kunFocusRingClasses}: the focusable element
|
|
33
|
+
* is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the
|
|
34
|
+
* wrapper and give the inner input `outline-none` (and no ring of its own) so
|
|
35
|
+
* there's exactly one indicator. Used by KunNumberInput / KunTagInput.
|
|
36
|
+
*
|
|
37
|
+
* Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the
|
|
38
|
+
* two are equivalent — a text input matches `:focus-visible` on click too — and
|
|
39
|
+
* `focus-within` is a native variant that reliably compiles, whereas the
|
|
40
|
+
* `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.
|
|
41
|
+
*/
|
|
42
|
+
declare const kunFocusRingWithinClasses: Record<KunUIColor, string>;
|
|
16
43
|
declare const kunSoftBgClasses: Record<KunUIColor, string>;
|
|
17
44
|
|
|
18
45
|
declare const kunRoundedClasses: Record<KunUIRounded, string>;
|
|
@@ -51,4 +78,4 @@ declare const registerKunIcons: (icons: Record<string, KunIconData>) => void;
|
|
|
51
78
|
declare const getKunIcon: (name: string) => KunIconData | undefined;
|
|
52
79
|
declare const hasKunIcon: (name: string) => boolean;
|
|
53
80
|
|
|
54
|
-
export { KUN_DEFAULT_ROUNDED, type KunIconData, type KunSelectionSize, type KunUIColor, type KunUIRounded, type KunUISize, type KunUIVariant, type KunUser, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
|
81
|
+
export { KUN_DEFAULT_ROUNDED, type KunIconData, type KunSelectionSize, type KunUIColor, type KunUIRounded, type KunUISize, type KunUIVariant, type KunUser, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunFocusRingClasses, kunFocusRingWithinClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,34 @@ declare const kunVariantClasses: (variant: KunUIVariant, color: KunUIColor) => s
|
|
|
12
12
|
declare const kunBgClasses: Record<KunUIColor, string>;
|
|
13
13
|
declare const kunTextClasses: Record<KunUIColor, string>;
|
|
14
14
|
declare const kunBorderClasses: Record<KunUIColor, string>;
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}
|
|
17
|
+
* for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click
|
|
18
|
+
* lit the ring, and used a different opacity from the rest of the library.
|
|
19
|
+
*/
|
|
15
20
|
declare const kunRingClasses: Record<KunUIColor, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Unified focus ring — ONE recipe for every directly-focusable control (inputs,
|
|
23
|
+
* textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).
|
|
24
|
+
* Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no
|
|
25
|
+
* ring; text fields still show it on click via the browser's focus-visible
|
|
26
|
+
* heuristic). A flush 2px ring in the control's semantic color at 50% — replaces
|
|
27
|
+
* the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.
|
|
28
|
+
* Pair with `border-kun` at rest; on an invalid control use the `danger` entry.
|
|
29
|
+
*/
|
|
30
|
+
declare const kunFocusRingClasses: Record<KunUIColor, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Composite-widget variant of {@link kunFocusRingClasses}: the focusable element
|
|
33
|
+
* is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the
|
|
34
|
+
* wrapper and give the inner input `outline-none` (and no ring of its own) so
|
|
35
|
+
* there's exactly one indicator. Used by KunNumberInput / KunTagInput.
|
|
36
|
+
*
|
|
37
|
+
* Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the
|
|
38
|
+
* two are equivalent — a text input matches `:focus-visible` on click too — and
|
|
39
|
+
* `focus-within` is a native variant that reliably compiles, whereas the
|
|
40
|
+
* `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.
|
|
41
|
+
*/
|
|
42
|
+
declare const kunFocusRingWithinClasses: Record<KunUIColor, string>;
|
|
16
43
|
declare const kunSoftBgClasses: Record<KunUIColor, string>;
|
|
17
44
|
|
|
18
45
|
declare const kunRoundedClasses: Record<KunUIRounded, string>;
|
|
@@ -51,4 +78,4 @@ declare const registerKunIcons: (icons: Record<string, KunIconData>) => void;
|
|
|
51
78
|
declare const getKunIcon: (name: string) => KunIconData | undefined;
|
|
52
79
|
declare const hasKunIcon: (name: string) => boolean;
|
|
53
80
|
|
|
54
|
-
export { KUN_DEFAULT_ROUNDED, type KunIconData, type KunSelectionSize, type KunUIColor, type KunUIRounded, type KunUISize, type KunUIVariant, type KunUser, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
|
81
|
+
export { KUN_DEFAULT_ROUNDED, type KunIconData, type KunSelectionSize, type KunUIColor, type KunUIRounded, type KunUISize, type KunUIVariant, type KunUser, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunFocusRingClasses, kunFocusRingWithinClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
package/dist/index.js
CHANGED
|
@@ -98,6 +98,24 @@ var kunRingClasses = {
|
|
|
98
98
|
danger: "focus-within:ring-danger/40 focus:ring-danger/40",
|
|
99
99
|
info: "focus-within:ring-info/40 focus:ring-info/40"
|
|
100
100
|
};
|
|
101
|
+
var kunFocusRingClasses = {
|
|
102
|
+
default: "outline-none focus-visible:ring-2 focus-visible:ring-default/50",
|
|
103
|
+
primary: "outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
104
|
+
secondary: "outline-none focus-visible:ring-2 focus-visible:ring-secondary/50",
|
|
105
|
+
success: "outline-none focus-visible:ring-2 focus-visible:ring-success/50",
|
|
106
|
+
warning: "outline-none focus-visible:ring-2 focus-visible:ring-warning/50",
|
|
107
|
+
danger: "outline-none focus-visible:ring-2 focus-visible:ring-danger/50",
|
|
108
|
+
info: "outline-none focus-visible:ring-2 focus-visible:ring-info/50"
|
|
109
|
+
};
|
|
110
|
+
var kunFocusRingWithinClasses = {
|
|
111
|
+
default: "focus-within:ring-2 focus-within:ring-default/50",
|
|
112
|
+
primary: "focus-within:ring-2 focus-within:ring-primary/50",
|
|
113
|
+
secondary: "focus-within:ring-2 focus-within:ring-secondary/50",
|
|
114
|
+
success: "focus-within:ring-2 focus-within:ring-success/50",
|
|
115
|
+
warning: "focus-within:ring-2 focus-within:ring-warning/50",
|
|
116
|
+
danger: "focus-within:ring-2 focus-within:ring-danger/50",
|
|
117
|
+
info: "focus-within:ring-2 focus-within:ring-info/50"
|
|
118
|
+
};
|
|
101
119
|
var kunSoftBgClasses = {
|
|
102
120
|
default: "bg-default/5",
|
|
103
121
|
primary: "bg-primary/5",
|
|
@@ -211,6 +229,6 @@ var registerKunIcons = (icons) => {
|
|
|
211
229
|
var getKunIcon = (name) => registry.get(name);
|
|
212
230
|
var hasKunIcon = (name) => registry.has(name);
|
|
213
231
|
|
|
214
|
-
export { KUN_DEFAULT_ROUNDED, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
|
232
|
+
export { KUN_DEFAULT_ROUNDED, cn, decodeIfEncoded, getKunIcon, getRandomSticker, hasKunIcon, kunBgClasses, kunBorderClasses, kunControlSizeClasses, kunFocusRingClasses, kunFocusRingWithinClasses, kunRingClasses, kunRoundedClasses, kunSelectionSizeClasses, kunSoftBgClasses, kunTextClasses, kunVariantClasses, randomNum, registerKunIcon, registerKunIcons, resolveRounded };
|
|
215
233
|
//# sourceMappingURL=index.js.map
|
|
216
234
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/getRandomSticker.ts","../src/icons-data.ts","../src/icons.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variants\n// (bordered / ghost) actually render — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n solid: {\n default: 'border border-transparent bg-default text-white',\n primary: 'border border-transparent bg-primary text-white',\n secondary: 'border border-transparent bg-secondary text-white',\n success: 'border border-transparent bg-success-600 text-white dark:bg-success-300',\n warning: 'border border-transparent bg-warning text-white',\n danger: 'border border-transparent bg-danger text-white',\n info: 'border border-transparent bg-info-600 text-white',\n },\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary',\n secondary: 'border border-secondary bg-transparent text-secondary',\n success: 'border border-success bg-transparent text-success',\n warning: 'border border-warning bg-transparent text-warning',\n danger: 'border border-danger bg-transparent text-danger',\n info: 'border border-info bg-transparent text-info',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-700',\n primary: 'border border-transparent bg-primary/20 text-primary-600',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-600',\n success: 'border border-transparent bg-success/20 text-success-700 dark:text-success',\n warning: 'border border-transparent bg-warning/20 text-warning-700 dark:text-warning',\n danger: 'border border-transparent bg-danger/20 text-danger-600 dark:text-danger-500',\n info: 'border border-transparent bg-info/20 text-info-700 dark:text-info-500',\n },\n shadow: {\n default: 'border border-transparent shadow-default/40 bg-default text-white',\n primary: 'border border-transparent shadow-primary/40 bg-primary text-white',\n secondary: 'border border-transparent shadow-secondary/40 bg-secondary text-white',\n success: 'border border-transparent shadow-success/40 bg-success-600 text-white',\n warning: 'border border-transparent shadow-warning/40 bg-warning text-white',\n danger: 'border border-transparent shadow-danger/40 bg-danger text-white',\n info: 'border border-transparent shadow-info/40 bg-info-600 text-white',\n },\n ghost: {\n default: 'border border-default bg-transparent hover:bg-default/10',\n primary: 'border border-primary bg-transparent text-primary hover:bg-primary/10',\n secondary: 'border border-secondary bg-transparent text-secondary hover:bg-secondary/10',\n success: 'border border-success bg-transparent text-success hover:bg-success/10',\n warning: 'border border-warning bg-transparent text-warning hover:bg-warning/10',\n danger: 'border border-danger bg-transparent text-danger hover:bg-danger/10',\n info: 'border border-info bg-transparent text-info hover:bg-info/10',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n secondary: 'text-secondary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n info: 'text-info',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// Deterministic sticker picker for fallback/empty states (avatars without\n// an image, KunNull's empty illustration, etc.).\n//\n// The original was random-per-call + Nuxt `useState` to freeze the pick\n// across SSR hydration. This version derives the URL deterministically from\n// the `id` (a cheap string hash) instead: the same id always yields the same\n// sticker on both server and client, so there is no hydration mismatch and\n// no framework state needed — fully portable.\n//\n// The CDN is the KunUI sticker host; consumers don't need to ship assets.\n\nconst KUN_STICKER_DOMAIN = 'https://sticker.kungal.com'\nconst PACKS = 5\nconst PER_PACK = 80\n\nconst hash = (s: string): number => {\n let h = 0\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(h, 31) + s.charCodeAt(i)) >>> 0\n }\n return h\n}\n\nexport const getRandomSticker = (id = ''): string => {\n const h = hash(id)\n const pack = (h % PACKS) + 1\n const sticker = (Math.floor(h / PACKS) % PER_PACK) + 1\n return `${KUN_STICKER_DOMAIN}/stickers/KUNgal${pack}/${sticker}.webp`\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/getRandomSticker.ts","../src/icons-data.ts","../src/icons.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variants\n// (bordered / ghost) actually render — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n solid: {\n default: 'border border-transparent bg-default text-white',\n primary: 'border border-transparent bg-primary text-white',\n secondary: 'border border-transparent bg-secondary text-white',\n success: 'border border-transparent bg-success-600 text-white dark:bg-success-300',\n warning: 'border border-transparent bg-warning text-white',\n danger: 'border border-transparent bg-danger text-white',\n info: 'border border-transparent bg-info-600 text-white',\n },\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary',\n secondary: 'border border-secondary bg-transparent text-secondary',\n success: 'border border-success bg-transparent text-success',\n warning: 'border border-warning bg-transparent text-warning',\n danger: 'border border-danger bg-transparent text-danger',\n info: 'border border-info bg-transparent text-info',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-700',\n primary: 'border border-transparent bg-primary/20 text-primary-600',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-600',\n success: 'border border-transparent bg-success/20 text-success-700 dark:text-success',\n warning: 'border border-transparent bg-warning/20 text-warning-700 dark:text-warning',\n danger: 'border border-transparent bg-danger/20 text-danger-600 dark:text-danger-500',\n info: 'border border-transparent bg-info/20 text-info-700 dark:text-info-500',\n },\n shadow: {\n default: 'border border-transparent shadow-default/40 bg-default text-white',\n primary: 'border border-transparent shadow-primary/40 bg-primary text-white',\n secondary: 'border border-transparent shadow-secondary/40 bg-secondary text-white',\n success: 'border border-transparent shadow-success/40 bg-success-600 text-white',\n warning: 'border border-transparent shadow-warning/40 bg-warning text-white',\n danger: 'border border-transparent shadow-danger/40 bg-danger text-white',\n info: 'border border-transparent shadow-info/40 bg-info-600 text-white',\n },\n ghost: {\n default: 'border border-default bg-transparent hover:bg-default/10',\n primary: 'border border-primary bg-transparent text-primary hover:bg-primary/10',\n secondary: 'border border-secondary bg-transparent text-secondary hover:bg-secondary/10',\n success: 'border border-success bg-transparent text-success hover:bg-success/10',\n warning: 'border border-warning bg-transparent text-warning hover:bg-warning/10',\n danger: 'border border-danger bg-transparent text-danger hover:bg-danger/10',\n info: 'border border-info bg-transparent text-info hover:bg-info/10',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n secondary: 'text-secondary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n info: 'text-info',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\n/**\n * @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}\n * for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click\n * lit the ring, and used a different opacity from the rest of the library.\n */\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n/**\n * Unified focus ring — ONE recipe for every directly-focusable control (inputs,\n * textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).\n * Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no\n * ring; text fields still show it on click via the browser's focus-visible\n * heuristic). A flush 2px ring in the control's semantic color at 50% — replaces\n * the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.\n * Pair with `border-kun` at rest; on an invalid control use the `danger` entry.\n */\nexport const kunFocusRingClasses: Record<KunUIColor, string> = {\n default: 'outline-none focus-visible:ring-2 focus-visible:ring-default/50',\n primary: 'outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n secondary: 'outline-none focus-visible:ring-2 focus-visible:ring-secondary/50',\n success: 'outline-none focus-visible:ring-2 focus-visible:ring-success/50',\n warning: 'outline-none focus-visible:ring-2 focus-visible:ring-warning/50',\n danger: 'outline-none focus-visible:ring-2 focus-visible:ring-danger/50',\n info: 'outline-none focus-visible:ring-2 focus-visible:ring-info/50',\n}\n\n/**\n * Composite-widget variant of {@link kunFocusRingClasses}: the focusable element\n * is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the\n * wrapper and give the inner input `outline-none` (and no ring of its own) so\n * there's exactly one indicator. Used by KunNumberInput / KunTagInput.\n *\n * Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the\n * two are equivalent — a text input matches `:focus-visible` on click too — and\n * `focus-within` is a native variant that reliably compiles, whereas the\n * `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.\n */\nexport const kunFocusRingWithinClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-2 focus-within:ring-default/50',\n primary: 'focus-within:ring-2 focus-within:ring-primary/50',\n secondary: 'focus-within:ring-2 focus-within:ring-secondary/50',\n success: 'focus-within:ring-2 focus-within:ring-success/50',\n warning: 'focus-within:ring-2 focus-within:ring-warning/50',\n danger: 'focus-within:ring-2 focus-within:ring-danger/50',\n info: 'focus-within:ring-2 focus-within:ring-info/50',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// Deterministic sticker picker for fallback/empty states (avatars without\n// an image, KunNull's empty illustration, etc.).\n//\n// The original was random-per-call + Nuxt `useState` to freeze the pick\n// across SSR hydration. This version derives the URL deterministically from\n// the `id` (a cheap string hash) instead: the same id always yields the same\n// sticker on both server and client, so there is no hydration mismatch and\n// no framework state needed — fully portable.\n//\n// The CDN is the KunUI sticker host; consumers don't need to ship assets.\n\nconst KUN_STICKER_DOMAIN = 'https://sticker.kungal.com'\nconst PACKS = 5\nconst PER_PACK = 80\n\nconst hash = (s: string): number => {\n let h = 0\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(h, 31) + s.charCodeAt(i)) >>> 0\n }\n return h\n}\n\nexport const getRandomSticker = (id = ''): string => {\n const h = hash(id)\n const pack = (h % PACKS) + 1\n const sticker = (Math.floor(h / PACKS) % PER_PACK) + 1\n return `${KUN_STICKER_DOMAIN}/stickers/KUNgal${pack}/${sticker}.webp`\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}
|