@qumra/fanar 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * دمج كلاسات — المتأخّر بيكسب المتعارِض معه، والباقي بيفضل.
3
+ * بيقبل أي قيمة falsy عشان `cond && 'class'` يشتغل حتى لو cond رقم أو نص.
4
+ */
5
+ type ClassValue = string | false | 0 | 0n | null | undefined;
6
+ declare function cn(...parts: ClassValue[]): string;
7
+ type Tone = 'neutral' | 'brand' | 'amber' | 'green' | 'red' | 'violet';
8
+ declare const TONE_SOFT: Record<Tone, string>;
9
+ declare const TONE_SOLID: Record<Tone, string>;
10
+ /** أيقونة داخل مربع ملوّن — النمط ده متكرر في كل كرت إحصائي وصف */
11
+ declare const TONE_ICON: Record<Tone, string>;
12
+ /**
13
+ * يحوّل الأرقام العربية-الهندية للاتينية.
14
+ *
15
+ * ── ليه ده لازم ────────────────────────────────────────────────────────
16
+ * لوحة المفاتيح العربية على الموبايل بتكتب `٥٦٤٦`، والمتصفّح مابيعرفش
17
+ * إنها أرقام: `Number('٥٦٤٦')` بيدّي `NaN`، و`type="number"` بيرفضها
18
+ * ويفضّي الحقل من غير ما يقول ليه.
19
+ *
20
+ * فالمستخدم بيكتب رقم صح والحقل بيبان فاضي — وأسوأ حاجة في ده إنه
21
+ * **مابيرميش خطأ**: مفيش رسالة ولا تحقّق، الرقم بيختفي وبس.
22
+ *
23
+ * ── والتحويل فوري ──────────────────────────────────────────────────────
24
+ * وهو بيكتب مش عند الحفظ. لو اتأخّر للحفظ، الحقل بيفضل يعرض `٥٦٤٦`
25
+ * والحسابات اللي بتتفرّج عليه (الربح، الإجمالي) بتشتغل على `NaN` —
26
+ * فالشاشة بتقول رقم والحساب بيقول لأ.
27
+ *
28
+ * بيغطّي التلات مجموعات: العربية-الهندية (٠-٩) والفارسية-الأردية
29
+ * (۰-۹) وعلامتَي العشرية والآلاف العربيتين.
30
+ */
31
+ declare function toLatinDigits(s: string): string;
32
+ type ButtonVariant = 'primary' | 'soft' | 'outline' | 'ghost' | 'danger' | 'link';
33
+ type ButtonSize = 'sm' | 'md' | 'lg' | 'xl';
34
+ /**
35
+ * كلاسات الزرار من غير العنصر نفسه.
36
+ *
37
+ * موجودة عشان اللينك اللي شكله زرار: `<Button>` بيطلّع `<button>`
38
+ * دايماً، والحاجة اللي بتوَدّي لصفحة تانية لازم تبقى `<a>` — الوسط
39
+ * بيضغط عليها يفتح تبويب، وقارئ الشاشة بيقول «رابط» مش «زر».
40
+ * صفحة الهبوط كلها من النوع ده، فالبديل كان نسخ خرايط الأنماط.
41
+ */
42
+ declare function buttonClasses(variant?: ButtonVariant, size?: ButtonSize, extra?: string): string;
43
+
44
+ export { type ButtonSize, type ButtonVariant, TONE_ICON, TONE_SOFT, TONE_SOLID, type Tone, buttonClasses, cn, toLatinDigits };
package/dist/lib.js ADDED
@@ -0,0 +1,92 @@
1
+ import {
2
+ ANIMATE_SCALE,
3
+ CONTAINER_SCALE,
4
+ RADIUS_SCALE,
5
+ SHADOW_SCALE,
6
+ TEXT_SCALE
7
+ } from "./chunk-SFA2EQFK.js";
8
+
9
+ // src/lib.ts
10
+ import { extendTailwindMerge } from "tailwind-merge";
11
+ var twMerge = extendTailwindMerge({
12
+ extend: {
13
+ classGroups: {
14
+ "font-size": [{ text: TEXT_SCALE }],
15
+ rounded: [{ rounded: RADIUS_SCALE }],
16
+ shadow: [{ shadow: SHADOW_SCALE }],
17
+ "max-w": [{ "max-w": CONTAINER_SCALE }],
18
+ animate: [{ animate: ANIMATE_SCALE }]
19
+ }
20
+ }
21
+ });
22
+ function cn(...parts) {
23
+ return twMerge(parts.filter((p) => typeof p === "string" && p.length > 0).join(" "));
24
+ }
25
+ var TONE_SOFT = {
26
+ neutral: "bg-hover text-muted",
27
+ brand: "bg-soft text-brand-ink",
28
+ amber: "bg-amber-bg text-amber-ink",
29
+ green: "bg-green-bg2 text-green",
30
+ red: "bg-red-bg text-red",
31
+ violet: "bg-violet-bg text-violet"
32
+ };
33
+ var TONE_SOLID = {
34
+ neutral: "bg-ink2 text-surface",
35
+ brand: "bg-brand text-white",
36
+ amber: "bg-amber text-amber-900",
37
+ green: "bg-green-solid text-white",
38
+ red: "bg-danger text-white",
39
+ violet: "bg-violet-solid text-white"
40
+ };
41
+ var TONE_ICON = TONE_SOFT;
42
+ function toLatinDigits(s) {
43
+ return s.replace(/[٠-٩۰-۹٫٬]/g, (c) => {
44
+ const code = c.charCodeAt(0);
45
+ if (code === 1643) return ".";
46
+ if (code === 1644) return "";
47
+ const base = code >= 1776 ? 1776 : 1632;
48
+ return String(code - base);
49
+ });
50
+ }
51
+ var VARIANTS = {
52
+ primary: "bg-brand border-brand text-white hover:bg-brand-hover",
53
+ soft: "bg-soft border-soft2 text-brand-ink hover:bg-soft2",
54
+ outline: "bg-surface border-border text-ink2 hover:border-brand hover:text-brand-ink",
55
+ ghost: "bg-transparent border-transparent text-ink2 hover:bg-hover",
56
+ /* `hover:bg-danger-hover` مش `hover:bg-red` — والفرق بق مقيس.
57
+
58
+ `--color-red` بيتقلب في الوضع الداكن من `#8e2b20` (أحمر غامق)
59
+ لـ`#f3a79e` (وردي فاتح)، لأنه لون **نص** هناك لا تعبئة. فزرّ الحذف
60
+ في الداكن كان بيبقى أبيض على وردي فاتح = **1.94** أول ما الماوس
61
+ يعدّي عليه.
62
+
63
+ و`danger` كان الشاذ الوحيد: `brand` و`amber` كلٌّ منهم له `-hover`
64
+ مخصّص. بقى ليه واحد كمان. */
65
+ danger: "bg-danger border-danger text-white hover:bg-danger-hover",
66
+ link: "bg-transparent border-transparent text-brand-ink hover:underline underline-offset-4 px-0!"
67
+ };
68
+ var SIZES = {
69
+ sm: "h-9 px-3.5 gap-1.5 text-ui rounded-sm",
70
+ /* ٤٤ — نفس ارتفاع الحقل، فالزرّ بجانبه يقف على نفس الخطّ */
71
+ md: "h-11 px-4 gap-2 text-body rounded-field",
72
+ lg: "h-12 px-5 gap-2 text-lead rounded-card",
73
+ xl: "h-14 px-5.5 gap-4 text-h3 font-extrabold rounded-field"
74
+ };
75
+ function buttonClasses(variant = "primary", size = "md", extra) {
76
+ return cn(
77
+ "inline-flex items-center justify-center border font-bold whitespace-nowrap",
78
+ "cursor-pointer transition-colors duration-150 select-none",
79
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand",
80
+ SIZES[size],
81
+ VARIANTS[variant],
82
+ extra
83
+ );
84
+ }
85
+ export {
86
+ TONE_ICON,
87
+ TONE_SOFT,
88
+ TONE_SOLID,
89
+ buttonClasses,
90
+ cn,
91
+ toLatinDigits
92
+ };