@qumra/fanar 0.0.13 → 0.0.15

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.d.ts CHANGED
@@ -180,21 +180,6 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
180
180
  }
181
181
  declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
182
182
 
183
- /**
184
- * Sets the display language for every Qumra component in the tree.
185
- *
186
- * ── نفس الاسم على المنصّتين ────────────────────────────────────────────
187
- * النيتف مافيهوش `<html lang>`، فـ`lang.native.ts` بيمسك التبديل في
188
- * مخزن جوّه الموديول. والويب مصدره الـDOM — فالتبديل هنا **بيكتب في
189
- * المصدر نفسه** بدل ما يعمل مخزن تاني جنبه.
190
- *
191
- * والنتيجة إن `setLang('en-US')` بتشتغل زي بعضها على الاتنين، وإن الويب
192
- * مافيهوش مصدرين للحقيقة يتخانقوا: `langStore` بيراقب السمة وبيعيد
193
- * الرسم لوحده.
194
- *
195
- * `null` بترجّع للافتراضي (`ar-EG`).
196
- */
197
- declare function setLang(tag: string | null): void;
198
183
  /**
199
184
  * لغة الصفحة كاملةً — لا `boolean`.
200
185
  *
@@ -242,12 +227,14 @@ declare const TEXT: {
242
227
  readonly search: readonly ["ابحث…", "Search…"];
243
228
  readonly searchEverything: readonly ["ابحث في كل حاجة…", "Search everything…"];
244
229
  readonly noResults: readonly ["مافيش نتايج", "No results"];
230
+ readonly noData: readonly ["لا بيانات بعد", "No data yet"];
245
231
  readonly searchOrAdd: readonly ["ابحث أو أضف…", "Search or add…"];
246
232
  readonly now: readonly ["الآن", "Now"];
247
233
  readonly videoPlayer: readonly ["مشغّل الفيديو", "Video player"];
248
234
  readonly rating: readonly ["التقييم", "Rating"];
249
235
  readonly activeFilters: readonly ["الفلاتر المطبّقة:", "Active filters:"];
250
236
  readonly clearAll: readonly ["مسح الكل", "Clear all"];
237
+ readonly remove: readonly ["إزالة", "Remove"];
251
238
  readonly row: readonly ["صفّ", "row"];
252
239
  readonly dropImages: readonly ["اسحب الصور هنا", "Drop images here"];
253
240
  readonly chooseFromDevice: readonly ["اختر من الجهاز", "Choose from device"];
@@ -310,10 +297,9 @@ type UITextKey = keyof typeof TEXT;
310
297
  * …
311
298
  * aria-label={closeLabel ?? ui.close}
312
299
  */
313
- declare function useUIText(): Record<"select" | "search" | "row" | "from" | "close" | "searchEverything" | "noResults" | "searchOrAdd" | "now" | "videoPlayer" | "rating" | "activeFilters" | "clearAll" | "dropImages" | "chooseFromDevice" | "previousPeriod" | "less" | "more" | "totalSales" | "netToYou" | "verifiedAccount" | "grabHint" | "notifications" | "dismiss" | "unread" | "noNotifications" | "noNotificationsDesc" | "markAllRead" | "viewAllNotifications" | "newNotifications" | "reloadPreview" | "previousMonth" | "nextMonth" | "whatIsThisNumber" | "explainToMe" | "clearSearch" | "alerts" | "whatIsThisOption" | "shouldBeHere" | "closeExplainer" | "cancelRecording" | "sendRecording" | "attachFile" | "recordVoice" | "playbackPosition" | "volume" | "hideSuggestions" | "askShehab" | "shehabThinking" | "undo" | "tryAnotherReply" | "helpfulReply" | "unhelpfulReply" | "aiDisclaimer" | "back10" | "forward10" | "playbackSpeed" | "arabic" | "seeMore" | "pictureInPicture", string>;
300
+ declare function useUIText(): Record<"select" | "search" | "row" | "from" | "close" | "searchEverything" | "noResults" | "noData" | "searchOrAdd" | "now" | "videoPlayer" | "rating" | "activeFilters" | "clearAll" | "remove" | "dropImages" | "chooseFromDevice" | "previousPeriod" | "less" | "more" | "totalSales" | "netToYou" | "verifiedAccount" | "grabHint" | "notifications" | "dismiss" | "unread" | "noNotifications" | "noNotificationsDesc" | "markAllRead" | "viewAllNotifications" | "newNotifications" | "reloadPreview" | "previousMonth" | "nextMonth" | "whatIsThisNumber" | "explainToMe" | "clearSearch" | "alerts" | "whatIsThisOption" | "shouldBeHere" | "closeExplainer" | "cancelRecording" | "sendRecording" | "attachFile" | "recordVoice" | "playbackPosition" | "volume" | "hideSuggestions" | "askShehab" | "shehabThinking" | "undo" | "tryAnotherReply" | "helpfulReply" | "unhelpfulReply" | "aiDisclaimer" | "back10" | "forward10" | "playbackSpeed" | "arabic" | "seeMore" | "pictureInPicture", string>;
314
301
 
315
302
  type FieldSize = 'sm' | 'md' | 'lg';
316
-
317
303
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
318
304
  label?: ReactNode;
319
305
  /** فعل ثانوي جنب التسمية — «سجّل بالبريد بدل الهاتف» مثلاً */
@@ -390,30 +376,13 @@ declare function Switch({ checked, onCheckedChange, label, description, disabled
390
376
  id?: string;
391
377
  }): react.JSX.Element;
392
378
 
393
- /**
394
- * قواعد المبالغ ورموزها — **مشتركة بين الويب والنيتف**.
395
- *
396
- * التنسيق (`format`) واختيار الشكل (`resolve`) **منطق خالص**، ونسخهم
397
- * معناه إن مبلغ يتكتب `١٬٢٥٠٫٥٠` على الويب و`1,250.50` على الموبايل.
398
- * الشرح الكامل لكل قرار في `Money.tsx`.
399
- */
400
-
401
- /** الشكل المعروض للوحدة */
402
- type Base = 'short' | 'word' | 'code' | 'sign';
403
- /**
404
- * الشكل المطلوب — و`best` رأي المكتبة لكل عملة.
405
- *
406
- * `short` الاختصار العربي · `word` الكلمة · `code` رمز ISO ·
407
- * `sign` الرمز المرسوم.
408
- */
409
- type SymbolStyle = Base | 'best';
410
379
  declare const CURRENCY: {
411
380
  SAR: {
412
381
  short: string;
413
382
  word: string;
414
383
  best: "sign";
415
384
  code: string;
416
- sign: "riyal";
385
+ sign: react.JSX.Element;
417
386
  name: string;
418
387
  en: string;
419
388
  decimals: number;
@@ -473,7 +442,7 @@ declare const CURRENCY: {
473
442
  word: string;
474
443
  best: "word";
475
444
  code: string;
476
- sign: "egp";
445
+ sign: react.JSX.Element;
477
446
  name: string;
478
447
  en: string;
479
448
  decimals: number;
@@ -623,7 +592,7 @@ declare const CURRENCY: {
623
592
  word: string;
624
593
  best: "sign";
625
594
  code: string;
626
- sign: "dollar";
595
+ sign: react.JSX.Element;
627
596
  name: string;
628
597
  en: string;
629
598
  decimals: number;
@@ -633,7 +602,7 @@ declare const CURRENCY: {
633
602
  word: string;
634
603
  best: "sign";
635
604
  code: string;
636
- sign: "euro";
605
+ sign: react.JSX.Element;
637
606
  name: string;
638
607
  en: string;
639
608
  decimals: number;
@@ -643,29 +612,65 @@ declare const CURRENCY: {
643
612
  word: string;
644
613
  best: "sign";
645
614
  code: string;
646
- sign: "pound";
615
+ sign: react.JSX.Element;
647
616
  name: string;
648
617
  en: string;
649
618
  decimals: number;
650
619
  };
651
620
  };
621
+ /** The displayed unit form */
622
+ /** The explicit forms — each names one exact shape */
623
+ type Base = 'short' | 'word' | 'code' | 'sign';
624
+ /**
625
+ * The displayed unit form.
626
+ *
627
+ * `short` Arabic abbreviation · `word` the word · `code` the ISO code ·
628
+ * `sign` the graphic symbol · `best` whatever the library picks.
629
+ *
630
+ * ## `best` is an opinion, not an algorithm
631
+ *
632
+ * Every currency has a row in the table saying which form reads fastest **for
633
+ * that currency**, because the answer differs between them:
634
+ *
635
+ * - Saudi riyal → its symbol, because it has an official one its readers know
636
+ * - Pound, dinar, dirham → the word, because they have no official symbol
637
+ * and the abbreviation takes two characters before it means anything
638
+ * - Dollar, euro, sterling → their symbols, which read worldwide and are
639
+ * shorter than spelling them out
640
+ *
641
+ * Derive these from one rule ("symbol if there is one") and the Egyptian
642
+ * pound comes out as `£` — technically correct, and read as *sterling* in
643
+ * Egypt. A written opinion per currency is truer than a rule that looks
644
+ * tidier.
645
+ *
646
+ * ## In English
647
+ *
648
+ * `best` becomes the symbol where one exists and the ISO code otherwise. The
649
+ * Arabic word means nothing on an English page, and «جنيه» is not rendered as
650
+ * "pound" because that conflates it with sterling.
651
+ */
652
+ type SymbolStyle = Base | 'best';
652
653
  type Currency = keyof typeof CURRENCY;
654
+ /**
655
+ * Checks a currency code coming from the server before passing it to `Money`.
656
+ *
657
+ * ## Why a guard and not `as`
658
+ *
659
+ * `Money.currency` is a closed union and servers return `string`, so every
660
+ * caller was writing `code as Currency` — which **silences rather than
661
+ * checks**: an unknown code (`XYZ`, or an empty field) passes through and
662
+ * then fails at the table lookup.
663
+ *
664
+ * The guard turns the unknown into `undefined`, and `Money` then falls back
665
+ * to the store currency from `MoneyProvider` — which is the **right**
666
+ * behaviour: showing the amount in the dashboard's currency does less damage
667
+ * than showing it with the wrong symbol, or none.
668
+ *
669
+ * ```tsx
670
+ * <Money value={total} currency={isCurrency(code) ? code : undefined} />
671
+ * ```
672
+ */
653
673
  declare function isCurrency(c?: string | null): c is Currency;
654
- declare const SIZE$1: {
655
- readonly inherit: "";
656
- readonly sm: "text-caption";
657
- readonly md: "text-ui";
658
- readonly lg: "text-body font-extrabold";
659
- readonly xl: "text-h2 font-black";
660
- };
661
- declare const TONE: {
662
- readonly inherit: "";
663
- readonly muted: "text-muted";
664
- readonly ink: "text-ink";
665
- readonly green: "text-green";
666
- readonly red: "text-red";
667
- };
668
-
669
674
  declare function MoneyProvider({ currency, locale, children, }: {
670
675
  currency: Currency;
671
676
  /**
@@ -686,40 +691,26 @@ declare function MoneyProvider({ currency, locale, children, }: {
686
691
  * header, the "priced in …" line.
687
692
  */
688
693
  declare function useCurrency(): Currency;
689
- /**
690
- * The unit's weight and size for each form.
691
- *
692
- * ## The word is two steps lighter than the number
693
- *
694
- * "١٢٠ جنيه" at one weight reads as a **sentence**, and the eye passes over
695
- * the word the way it passes over the number. Two steps lighter it reads as a
696
- * **mark**: the number is the information and the word is its suffix — which
697
- * is what the `£` symbol achieves by its shape rather than its weight.
698
- *
699
- * ## But not much smaller
700
- *
701
- * `0.86`, not `0.7`: the word is four letters, three of them undotted, and
702
- * shrinking it further turns it into an unreadable smudge. The abbreviation
703
- * survives being small because it is two characters, and the symbol survives
704
- * because it is a single shape.
705
- *
706
- * ## And the letters are slightly tracked
707
- *
708
- * `tracking-wide` separates the word from the number visually without adding
709
- * a space — so it reads as an attached unit, not as the next word in the line.
710
- */
711
- /**
712
- * Resolves `best` into an explicit form — the one place that holds the opinion.
713
- *
714
- * Kept out of `Money` because `currencySymbol` needs it too: a column header
715
- * and a field suffix have to match what their own rows display.
716
- */
694
+ declare const SIZE: {
695
+ readonly inherit: "";
696
+ readonly sm: "text-caption";
697
+ readonly md: "text-ui";
698
+ readonly lg: "text-body font-extrabold";
699
+ readonly xl: "text-h2 font-black";
700
+ };
701
+ declare const TONE: {
702
+ readonly inherit: "";
703
+ readonly muted: "text-muted";
704
+ readonly ink: "text-ink";
705
+ readonly green: "text-green";
706
+ readonly red: "text-red";
707
+ };
717
708
  interface MoneyProps {
718
709
  /** The amount in major units — pounds, not piastres */
719
710
  value: number;
720
711
  /** A local override that beats the store currency — a dollar price in an Egyptian store */
721
712
  currency?: Currency;
722
- size?: keyof typeof SIZE$1;
713
+ size?: keyof typeof SIZE;
723
714
  /**
724
715
  * The colour.
725
716
  *
@@ -798,19 +789,14 @@ declare const currencyName: (c?: Currency) => string;
798
789
  */
799
790
  declare function useCurrencySymbol(c?: Currency, style?: SymbolStyle): ReactNode;
800
791
 
801
- /**
802
- * أنماط العدّاد — **مشتركة بين الويب والنيتف**.
803
- * نفس سبب `Display.variants.ts`.
804
- */
805
- type StepperSize = 'sm' | 'md' | 'lg';
806
-
792
+ type Size = 'sm' | 'md' | 'lg';
807
793
  interface NumberStepperProps {
808
794
  value: number;
809
795
  onChange: (v: number) => void;
810
796
  min?: number;
811
797
  max?: number;
812
798
  step?: number;
813
- size?: StepperSize;
799
+ size?: Size;
814
800
  /** وحدة صغيرة بجانب الرقم — «قطعة»، «كجم» */
815
801
  unit?: ReactNode;
816
802
  /**
@@ -828,6 +814,22 @@ interface NumberStepperProps {
828
814
  }
829
815
  declare function NumberStepper({ value, onChange, min, max, step, size, unit, onRemove, disabled, label, className, }: NumberStepperProps): react.JSX.Element;
830
816
 
817
+ /**
818
+ * علامة واتساب.
819
+ *
820
+ * ── لماذا مرسومة ولماذا مصمتة ───────────────────────────────────────────
821
+ * كانت `MessageCircle` من lucide، وهي فقاعة كلام عامّة. وفقاعة عامّة
822
+ * بجانب فقاعة الرسائل النصّيّة تجعل الزرّين متشابهين، والمستخدم يقرأ
823
+ * «رسالة» و«رسالة» فيتردّد قبل كلّ ضغطة.
824
+ *
825
+ * والعلامة مصمتة بين أيقونات محدّدة الخطوط عن قصد: علامة الخدمة تُعرف
826
+ * بشكلها لا بأسلوب المجموعة، وتحويلها إلى خطوط لتناسب البقيّة يفقدها
827
+ * الشيء الوحيد الذي تؤدّيه. والمسار من `simple-icons` — لا مرسوم
828
+ * بالتقدير، لأن علامة خدمة تُخمَّن تخرج علامةً أخرى.
829
+ */
830
+ declare function WhatsAppIcon({ size, ...rest }: React.SVGProps<SVGSVGElement> & {
831
+ size?: number;
832
+ }): react.JSX.Element;
831
833
  interface PhoneParts {
832
834
  /** المفتاح الدوليّ بلا `+` — فارغ إن لم يُعرف */
833
835
  dial: string;
@@ -855,44 +857,6 @@ declare function parsePhone(raw: string, defaultDial?: string): PhoneParts;
855
857
  * و`spaces` لمن يريد الصورة الدوليّة الخام: `101 234 5678`.
856
858
  */
857
859
  type PhoneFormat = 'parens' | 'spaces';
858
- /**
859
- * `inherit` لا مقاس ولا وزن ولا لون — للرقم داخل صفّ يحدّد تنسيقه
860
- * أصلاً. والمكوّن هناك للاتّجاه والتقطيع لا للحجم.
861
- */
862
- declare const SIZE: {
863
- readonly inherit: "";
864
- readonly sm: "text-caption";
865
- readonly md: "text-ui";
866
- };
867
- type PhoneSize = keyof typeof SIZE;
868
-
869
- /**
870
- * علامة واتساب.
871
- *
872
- * ── لماذا مرسومة ولماذا مصمتة ───────────────────────────────────────────
873
- * كانت `MessageCircle` من lucide، وهي فقاعة كلام عامّة. وفقاعة عامّة
874
- * بجانب فقاعة الرسائل النصّيّة تجعل الزرّين متشابهين، والمستخدم يقرأ
875
- * «رسالة» و«رسالة» فيتردّد قبل كلّ ضغطة.
876
- *
877
- * والعلامة مصمتة بين أيقونات محدّدة الخطوط عن قصد: علامة الخدمة تُعرف
878
- * بشكلها لا بأسلوب المجموعة، وتحويلها إلى خطوط لتناسب البقيّة يفقدها
879
- * الشيء الوحيد الذي تؤدّيه. والمسار من `simple-icons` — لا مرسوم
880
- * بالتقدير، لأن علامة خدمة تُخمَّن تخرج علامةً أخرى.
881
- */
882
- declare function WhatsAppIcon({ size, ...rest }: React.SVGProps<SVGSVGElement> & {
883
- size?: number;
884
- }): react.JSX.Element;
885
- /**
886
- * قواعد التجميع لكل مفتاح دوليّ.
887
- *
888
- * المجموعات من الطول المحلّيّ **بعد** المفتاح وبعد نزع الصفر الوطنيّ:
889
- * `+20 112 505 2692` محلّيّه `1125052692` فقاعدته `[3, 3, 4]` لا
890
- * `[3, 4, 4]` — والفرق أن الصفر يُكتب في `01125052692` ولا يُكتب في
891
- * الصورة الدوليّة، فمن يعدّه في القاعدة يُزيح كل مجموعة بعده.
892
- *
893
- * وما زاد على القاعدة يُجمَّع ثلاثات: أفضل من سطر متّصل، وأصدق من
894
- * ادّعاء قاعدة بلد لا نعرفها.
895
- */
896
860
  interface PhoneProps {
897
861
  /** الرقم كما هو في البيانات — منسَّقاً أو خاماً */
898
862
  value: string;
@@ -913,7 +877,7 @@ interface PhoneProps {
913
877
  * تنسيقه أصلاً: سطر ثانٍ تحت اسم عميل، أو سطر عنوان فرع.
914
878
  * والمكوّن هناك للاتّجاه والتقطيع لا للحجم.
915
879
  */
916
- size?: PhoneSize;
880
+ size?: 'inherit' | 'sm' | 'md';
917
881
  className?: string;
918
882
  }
919
883
  /**
@@ -930,17 +894,6 @@ interface PhoneProps {
930
894
  */
931
895
  declare function Phone({ value, defaultDial, format, mask, call, sms, whatsapp, size, className, }: PhoneProps): react.JSX.Element;
932
896
 
933
- /**
934
- * قواعد القيم التقنية وأنماطها — **مشتركة بين الويب والنيتف**.
935
- *
936
- * `normalizeHex` **منطق خالص** وبيتنادى من المكوّن ومن التطبيق —
937
- * ونسخته معناها إن `#abc` بتتفكّ لستّ خانات في منصّة وتفضل تلاتة في
938
- * التانية.
939
- */
940
- type TechnicalKind = 'hex' | 'url' | 'slug' | 'code' | 'id';
941
- /** يرجّع `#RRGGBB` بحروف كبيرة، أو `null` لو القيمة ليست لوناً بعد */
942
- declare function normalizeHex(input: string): string | null;
943
-
944
897
  /**
945
898
  * القيم التقنية داخل واجهة عربية.
946
899
  *
@@ -962,6 +915,7 @@ declare function normalizeHex(input: string): string | null;
962
915
  * `[dir=rtl]_&` لا `rtl:` — لأن `dir="ltr"` موضوع على العنصر نفسه،
963
916
  * فسمة `rtl:` لن تنطبق عليه أبداً؛ والاستعلام لا بدّ أن يسأل عن **جدّه**.
964
917
  */
918
+ type TechnicalKind = 'hex' | 'url' | 'slug' | 'code' | 'id';
965
919
  interface TechnicalInputProps extends Omit<InputProps, 'numeric' | 'type' | 'dir'> {
966
920
  /** نوع القيمة — يضبط لوحة المفاتيح والتلميح فقط، لا يفرض تحقّقاً */
967
921
  kind?: TechnicalKind;
@@ -995,6 +949,8 @@ declare function ColorField({ label, note, value, onChange, disabled, id: idProp
995
949
  disabled?: boolean;
996
950
  id?: string;
997
951
  }): react.JSX.Element;
952
+ /** يرجّع `#RRGGBB` بحروف كبيرة، أو `null` لو القيمة ليست لوناً بعد */
953
+ declare function normalizeHex(input: string): string | null;
998
954
 
999
955
  interface Product3DViewerProps {
1000
956
  /** رابط الموديل — GLB أو GLTF */
@@ -1038,7 +994,6 @@ interface TabItem {
1038
994
  count?: number;
1039
995
  icon?: ComponentType<{
1040
996
  size?: number;
1041
- color?: string;
1042
997
  }>;
1043
998
  }
1044
999
  /**
@@ -1076,23 +1031,6 @@ declare function FilterChips({ chips, onClearAll, label, clearAllLabel, }: {
1076
1031
  clearAllLabel?: string;
1077
1032
  }): react.JSX.Element | null;
1078
1033
 
1079
- /**
1080
- * أنماط الأسطح — **مشتركة بين الويب والنيتف**.
1081
- * نفس سبب `Display.variants.ts`.
1082
- *
1083
- * ── واللي بيخصّ الويب مفصول صراحةً ───────────────────────────────────────
1084
- * التموضع الثابت (`fixed inset-0 z-50`) والتبلير والحركات كلها بتخصّ
1085
- * المتصفّح — RN بيرسم الأسطح جوّه `<Modal>` وهو بيتكفّل بالطبقة. الثوابت
1086
- * اللي فيها `WEB` في اسمها هي دي.
1087
- */
1088
-
1089
- declare const MODAL_WIDTHS: {
1090
- readonly sm: "max-w-md";
1091
- readonly md: "max-w-xl";
1092
- readonly lg: "max-w-3xl";
1093
- };
1094
- type ModalSize = keyof typeof MODAL_WIDTHS;
1095
-
1096
1034
  /**
1097
1035
  * الـaction sheet — كل حاجة بتطلع من تحت على الموبايل.
1098
1036
  *
@@ -1116,7 +1054,7 @@ declare function Modal({ open, title, description, onClose, footer, children, si
1116
1054
  onClose: () => void;
1117
1055
  footer?: ReactNode;
1118
1056
  children?: ReactNode;
1119
- size?: ModalSize;
1057
+ size?: 'sm' | 'md' | 'lg';
1120
1058
  closeLabel?: string;
1121
1059
  }): react.JSX.Element | null;
1122
1060
  /** بيفتح من inline-end — الشمال في العربي واليمين في الإنجليزي، لوحده */
@@ -1149,20 +1087,13 @@ declare function Toast({ children, action, icon, }: {
1149
1087
  declare function EmptyState({ icon: Icon, title, description, action, }: {
1150
1088
  icon?: ComponentType<{
1151
1089
  size?: number;
1152
- color?: string;
1153
1090
  }>;
1154
1091
  title: ReactNode;
1155
1092
  description?: ReactNode;
1156
1093
  action?: ReactNode;
1157
1094
  }): react.JSX.Element;
1158
1095
 
1159
- /**
1160
- * أنماط التوستات والتلميحة — **مشتركة بين الويب والنيتف**.
1161
- * نفس سبب `Display.variants.ts`.
1162
- */
1163
-
1164
1096
  type ToastTone = Extract<Tone, 'brand' | 'green' | 'amber' | 'red'> | 'neutral';
1165
-
1166
1097
  interface ToastItem {
1167
1098
  id: number;
1168
1099
  tone: ToastTone;
@@ -1246,15 +1177,6 @@ declare function Tooltip({ content, children, side, }: {
1246
1177
  side?: 'top' | 'bottom';
1247
1178
  }): react.JSX.Element;
1248
1179
 
1249
- /**
1250
- * أنماط القوايم وفلترتها — **مشتركة بين الويب والنيتف**.
1251
- *
1252
- * القاعدة اللي المكتبة الأصلية بتقولها في قسم ٠٣:
1253
- * أقل من ٦ خيارات → أزرار مجزّأة (`Tabs variant="segmented"`)
1254
- * ٦ لـ١٥ خيار → `Dropdown` من غير بحث
1255
- * أكتر من ١٥ → `Combobox` ببحث
1256
- */
1257
-
1258
1180
  interface Option {
1259
1181
  value: string;
1260
1182
  label: string;
@@ -1263,15 +1185,6 @@ interface Option {
1263
1185
  icon?: ReactNode;
1264
1186
  disabled?: boolean;
1265
1187
  }
1266
- interface CommandItem {
1267
- id: string;
1268
- title: string;
1269
- meta?: string;
1270
- icon?: ReactNode;
1271
- group: string;
1272
- onRun?: () => void;
1273
- }
1274
-
1275
1188
  declare function Dropdown({ label, value, onChange, options, placeholder, className, }: {
1276
1189
  label?: ReactNode;
1277
1190
  value: string | null;
@@ -1305,6 +1218,14 @@ declare function MultiSelect({ label, values, onChange, options, placeholder, cr
1305
1218
  onCreate?: (query: string) => void;
1306
1219
  className?: string;
1307
1220
  }): react.JSX.Element;
1221
+ interface CommandItem {
1222
+ id: string;
1223
+ title: string;
1224
+ meta?: string;
1225
+ icon?: ReactNode;
1226
+ group: string;
1227
+ onRun?: () => void;
1228
+ }
1308
1229
  /**
1309
1230
  * لوحة الأوامر — ⌘K.
1310
1231
  *
@@ -1325,7 +1246,6 @@ interface AccordionItem {
1325
1246
  description?: ReactNode;
1326
1247
  icon?: ComponentType<{
1327
1248
  size?: number;
1328
- color?: string;
1329
1249
  }>;
1330
1250
  children: ReactNode;
1331
1251
  }
@@ -1478,7 +1398,6 @@ declare function presets(today: Date): {
1478
1398
  label: string;
1479
1399
  range: Range;
1480
1400
  }[];
1481
-
1482
1401
  declare function DateRangePicker({ value, onChange, month, onMonthChange, today, className, }: {
1483
1402
  value: Range;
1484
1403
  onChange: (range: Range) => void;
@@ -1490,10 +1409,6 @@ declare function DateRangePicker({ value, onChange, month, onMonthChange, today,
1490
1409
  className?: string;
1491
1410
  }): react.JSX.Element;
1492
1411
 
1493
- /**
1494
- * أنماط الرفع وصيغته — **مشتركة بين الويب والنيتف**.
1495
- * نفس سبب `Display.variants.ts`.
1496
- */
1497
1412
  type UploadState = 'uploading' | 'done' | 'rejected';
1498
1413
  interface UploadFile {
1499
1414
  id: string;
@@ -1505,11 +1420,10 @@ interface UploadFile {
1505
1420
  progress?: number;
1506
1421
  /** سبب الرفض — لازم يتكتب، «فشل» لوحدها مش معلومة */
1507
1422
  error?: string;
1508
- /** رابط معاينة — `object URL` على الويب و`uri` من المنتقي على النيتف */
1423
+ /** رابط معاينة (object URL أو data URI) */
1509
1424
  preview?: string;
1510
1425
  }
1511
1426
  declare function formatBytes(bytes: number): string;
1512
-
1513
1427
  declare function Dropzone({ onFiles, accept, multiple, disabled, title, hint, buttonLabel, className, }: {
1514
1428
  onFiles: (files: File[]) => void;
1515
1429
  accept?: string;
@@ -1731,8 +1645,6 @@ interface BrowserFrameProps {
1731
1645
  }
1732
1646
  declare function BrowserFrame({ url, device, tab, nav, loading, contentWidth, onScale, onReload, children, className, }: BrowserFrameProps): react.JSX.Element;
1733
1647
 
1734
- type ShareTone = 'brand' | 'amber' | 'red' | 'muted';
1735
-
1736
1648
  interface BarSeries {
1737
1649
  label: string;
1738
1650
  values: number[];
@@ -1744,12 +1656,32 @@ interface BarSeries {
1744
1656
  *
1745
1657
  * السلسلتان جنب بعضهما لا فوق بعض: التكديس يخفي أن أحدهما تراجع
1746
1658
  * حين يرتفع الآخر.
1659
+ *
1660
+ * ── ⚠️ كان رسماً يُنظر إليه، فصار رسماً يُقرأ منه ────────────────────────
1661
+ * النسخة الأولى كانت أعمدةً بلا محور ولا أرقام: تقول «الخميس أطول من
1662
+ * الاثنين» ولا تقول بكم. والفرق بين ٩٥ و٦٦ قرارٌ يُتّخذ، وبين ٩٥ و٩٣
1663
+ * لا شيء — والعين لا تفرّق بينهما في عمودين.
1664
+ *
1665
+ * فأُضيف ثلاثة:
1666
+ * ١. **علامات المحور** — الأعلى والنصف والصفر، كما في `TrendChart`.
1667
+ * ٢. **الرقم فوق كل عمود** حين تكون سلسلةً واحدة؛ فإن كانتا سلسلتين
1668
+ * فالأرقام ستّة عشر رقماً في صفّ فتُقرأ ضجيجاً، ومكانها التلميح.
1669
+ * ٣. **عمودٌ نشط** بالمؤشّر أو بالأسهم، وتلميحٌ يعرض كل السلاسل عنده.
1670
+ *
1671
+ * والتنقّل بلوحة المفاتيح ليس زينة: القيم هنا هي كلّ ما في الرسم، ومن لا
1672
+ * يستعمل الفأرة لا يصل إليها بغيره.
1747
1673
  */
1748
- declare function BarChart({ labels, series, height, formatValue, className, }: {
1674
+ declare function BarChart({ labels, series, height, formatValue, showValues, className, }: {
1749
1675
  labels: string[];
1750
1676
  series: BarSeries[];
1751
1677
  height?: number;
1752
1678
  formatValue?: (v: number) => string;
1679
+ /**
1680
+ * الرقم فوق كل عمود.
1681
+ *
1682
+ * افتراضه: نعم للسلسلة الواحدة، لا لأكثر — والشرح فوق.
1683
+ */
1684
+ showValues?: boolean;
1753
1685
  className?: string;
1754
1686
  }): react.JSX.Element;
1755
1687
  /**
@@ -1829,7 +1761,7 @@ interface ShareItem {
1829
1761
  */
1830
1762
  trailing?: ReactNode;
1831
1763
  /** لون الشريط — الافتراضي لون العلامة */
1832
- tone?: ShareTone;
1764
+ tone?: 'brand' | 'amber' | 'red' | 'muted';
1833
1765
  }
1834
1766
  /**
1835
1767
  * قائمة بحصص — للفئات المرتّبة (المصادر، المنتجات، المدن).
@@ -1867,14 +1799,6 @@ declare function ShareList({ items, total, layout, showPercent, labelWidth, form
1867
1799
  className?: string;
1868
1800
  }): react.JSX.Element;
1869
1801
 
1870
- /**
1871
- * حسابات رسوم التجارة وأنماطها — **مشتركة بين الويب والنيتف**.
1872
- *
1873
- * الحسابات هنا **إجابات على أسئلة تاجر**، لا أشكال: «أكبر خصم فين؟»
1874
- * و«كام صنف بيعمل ٨٠٪؟» و«المخزن هيكفي كام يوم؟». نسخها معناها إن
1875
- * الرقم اللي التاجر بيتصرّف على أساسه يفرق بين شاشة وشاشة.
1876
- */
1877
-
1878
1802
  interface WaterfallStep {
1879
1803
  key: string;
1880
1804
  label: ReactNode;
@@ -1883,36 +1807,6 @@ interface WaterfallStep {
1883
1807
  /** سطر يشرح الخصم — «٤٪ عمولة بوّابة الدفع» */
1884
1808
  meta?: ReactNode;
1885
1809
  }
1886
- interface ParetoItem {
1887
- key: string;
1888
- label: ReactNode;
1889
- value: number;
1890
- }
1891
- interface RunwayItem {
1892
- key: string;
1893
- label: ReactNode;
1894
- /** ما في المخزن الآن */
1895
- stock: number;
1896
- /** متوسّط ما يُباع في اليوم */
1897
- perDay: number;
1898
- }
1899
-
1900
- /**
1901
- * الشلّال — من إجمالي البيع إلى ما يصل جيبك.
1902
- *
1903
- * ── لماذا هو أهمّ رسم للتاجر ───────────────────────────────────────────
1904
- * التاجر يعرف كم باع ولا يعرف كم كسب. «بعت ٧١ ألفاً» رقم يُقال، و«وصلك
1905
- * ٢٧» رقم يُتصرّف بناءً عليه — والفرق بينهما هو الشلّال كلّه.
1906
- *
1907
- * ── ولماذا مدرّج لا أعمدة ──────────────────────────────────────────────
1908
- * كل خطوة تبدأ من حيث انتهت السابقة، فالنزول **يُرى** لا يُحسب. الأعمدة
1909
- * المستقلّة تجعل العين تطرح الأرقام بنفسها، وهذا بالضبط ما جاء الرسم
1910
- * ليوفّره.
1911
- *
1912
- * ── وأكبر خصم يُعلَّم ──────────────────────────────────────────────────
1913
- * كما في `FunnelChart`: البند الذي يأكل أكثر من غيره هو المكان الوحيد
1914
- * الذي يستحقّ عملاً هذا الشهر، والباقي يبقى محايداً حتى لا يزاحمه.
1915
- */
1916
1810
  declare function WaterfallChart({ total, steps, totalLabel, netLabel, formatValue, className, }: {
1917
1811
  /** نقطة البداية — إجمالي المبيعات قبل أي خصم */
1918
1812
  total: number;
@@ -1941,6 +1835,11 @@ pace, label, formatValue, className, }: {
1941
1835
  formatValue?: (v: number) => string;
1942
1836
  className?: string;
1943
1837
  }): react.JSX.Element;
1838
+ interface ParetoItem {
1839
+ key: string;
1840
+ label: ReactNode;
1841
+ value: number;
1842
+ }
1944
1843
  /**
1945
1844
  * كم صنفاً يصنع معظم المبيعات.
1946
1845
  *
@@ -1959,6 +1858,14 @@ declare function ParetoChart({ items, height, threshold, formatValue, className,
1959
1858
  formatValue?: (v: number) => string;
1960
1859
  className?: string;
1961
1860
  }): react.JSX.Element;
1861
+ interface RunwayItem {
1862
+ key: string;
1863
+ label: ReactNode;
1864
+ /** ما في المخزن الآن */
1865
+ stock: number;
1866
+ /** متوسّط ما يُباع في اليوم */
1867
+ perDay: number;
1868
+ }
1962
1869
  /**
1963
1870
  * كم يوماً يكفي المخزون.
1964
1871
  *
@@ -2116,26 +2023,6 @@ declare function useAudioLevel(ref: RefObject<HTMLMediaElement | null>, { bands,
2116
2023
  }): AudioLevel;
2117
2024
 
2118
2025
  type ProviderLevel = 1 | 2 | 3;
2119
- declare const PROVIDER_LEVEL_LABEL: Record<ProviderLevel, string>;
2120
- declare const PROVIDER_LEVEL_LABEL_EN: Record<ProviderLevel, string>;
2121
- /**
2122
- * المقاسين.
2123
- *
2124
- * `sm` أربعة وعشرين — وده **حدّ الهدف اللمسي** لا رقم مختار. الشارة
2125
- * بتاخد تركيز، واللي بياخد تركيز بيتضغط عليه. وعلى الموبايل ده أهمّ لا أقلّ.
2126
- */
2127
- declare const SIZES: {
2128
- readonly sm: {
2129
- readonly box: "size-6";
2130
- readonly mark: 14;
2131
- };
2132
- readonly md: {
2133
- readonly box: "size-7";
2134
- readonly mark: 16;
2135
- };
2136
- };
2137
- type ProviderBadgeSize = keyof typeof SIZES;
2138
-
2139
2026
  /**
2140
2027
  * التسميات جوّه المكتبة لا في التطبيق.
2141
2028
  *
@@ -2144,6 +2031,8 @@ type ProviderBadgeSize = keyof typeof SIZES;
2144
2031
  * المكوّن زي أسماء العملات في `Money` بالظبط — وهنا هو **الاسم
2145
2032
  * المتاح الوحيد**، فتفرّقه بيدّي شارتين مالهمش علاقة ببعض.
2146
2033
  */
2034
+ declare const PROVIDER_LEVEL_LABEL: Record<ProviderLevel, string>;
2035
+ declare const PROVIDER_LEVEL_LABEL_EN: Record<ProviderLevel, string>;
2147
2036
  interface ProviderMarkProps {
2148
2037
  level: ProviderLevel;
2149
2038
  /** ضلع المربّع بالبكسل */
@@ -2156,6 +2045,23 @@ interface ProviderMarkProps {
2156
2045
  * بلا `aria-label`: العلامة زينة جوّه `ProviderBadge` اللي بيحمل الاسم.
2157
2046
  */
2158
2047
  declare function ProviderMark({ level, size, className }: ProviderMarkProps): react.JSX.Element;
2048
+ /**
2049
+ * المقاسين.
2050
+ *
2051
+ * `sm` أربعة وعشرين — وده **حدّ الهدف اللمسي** لا رقم مختار. الشارة
2052
+ * بتاخد تركيز (تحت)، واللي بياخد تركيز بيتضغط عليه.
2053
+ */
2054
+ declare const SIZES: {
2055
+ readonly sm: {
2056
+ readonly box: "size-6";
2057
+ readonly mark: 14;
2058
+ };
2059
+ readonly md: {
2060
+ readonly box: "size-7";
2061
+ readonly mark: 16;
2062
+ };
2063
+ };
2064
+ type ProviderBadgeSize = keyof typeof SIZES;
2159
2065
  interface ProviderBadgeProps {
2160
2066
  level: ProviderLevel;
2161
2067
  /**
@@ -2319,13 +2225,6 @@ declare function Coach({ id, asChild, children, }: {
2319
2225
  children: ReactNode;
2320
2226
  }): react.JSX.Element;
2321
2227
 
2322
- /**
2323
- * أنماط كروت الاختيار والسبارك‑لاين — **مشتركة بين الويب والنيتف**.
2324
- * نفس سبب `Display.variants.ts`.
2325
- */
2326
-
2327
- type SparkTone = 'brand' | 'green' | 'red' | 'muted';
2328
-
2329
2228
  interface ChoiceOption {
2330
2229
  value: string;
2331
2230
  label: ReactNode;
@@ -2335,7 +2234,6 @@ interface ChoiceOption {
2335
2234
  icon?: ComponentType<{
2336
2235
  size?: number;
2337
2236
  strokeWidth?: number;
2338
- color?: string;
2339
2237
  }>;
2340
2238
  disabled?: boolean;
2341
2239
  /** سبب التعطيل — «معطّل» من غير سبب بيسيب المستخدم واقف */
@@ -2392,45 +2290,30 @@ declare function ChoiceCards({ name, value, onChange, options, columns, hideMark
2392
2290
  * و`preserveAspectRatio="none"` بيمطّ أفقياً. وعشان المطّ ده السُمك
2393
2291
  * بيتحسب من الشاشة لا من المقاس (`vectorEffect`)، وإلا الخط بيرفع
2394
2292
  * على الشاشة العريضة ويرفع أكتر على الضيقة.
2293
+ *
2294
+ * ── والقيمة تُقرأ بالمرور ───────────────────────────────────────────────
2295
+ * القاعدة فوق («مش يتقري منه قيمة») تبقى صحيحةً في **الشكل الساكن**:
2296
+ * مافيش محاور ولا أرقام مرسومة. لكن الخط اللي جوّه كرت لوحة بيجاوب
2297
+ * سؤالاً تانياً لمّا المؤشّر يقف عليه: «الجمعة كام؟» — والجواب ده كان
2298
+ * بيحتاج فتح شاشة تانية.
2299
+ *
2300
+ * فالمرور بيظهر نقطةً وفقاعةً بقيمة اليوم واسمه إن اتبعت `labels`.
2301
+ * والرسم بيفضل `aria-hidden` وجنبه قائمة `sr-only` بالقيم لمّا يكون
2302
+ * ليها أسماء — الشكل مايوصلش لقارئ الشاشة أصلاً.
2395
2303
  */
2396
- declare function Sparkline({ values, width, height, tone, fluid, className, }: {
2304
+ declare function Sparkline({ values, width, height, tone, fluid, labels, formatValue, className, }: {
2397
2305
  values: number[];
2398
2306
  width?: number;
2399
2307
  height?: number;
2400
- tone?: SparkTone;
2308
+ tone?: 'brand' | 'green' | 'red' | 'muted';
2401
2309
  /** يملا عرض الحاوية بدل المقاس الثابت — `width` بيبقى نسبة الرسم */
2402
2310
  fluid?: boolean;
2311
+ /** اسم كل نقطة — بيظهر في الفقاعة وفي قائمة قارئ الشاشة */
2312
+ labels?: string[];
2313
+ formatValue?: (v: number) => string;
2403
2314
  className?: string;
2404
2315
  }): react.JSX.Element | null;
2405
2316
 
2406
- /**
2407
- * أنماط مكوّنات العرض — **مشتركة بين الويب والنيتف**.
2408
- *
2409
- * ══ ليه الملف ده موجود ═══════════════════════════════════════════════════
2410
- * `buttonClasses` كانت في `lib.ts` من الأول، فـ`Button.tsx` و
2411
- * `Button.native.tsx` بيوصلوا لنفس السلسلة بلا مجهود.
2412
- *
2413
- * باقي المكوّنات مكانتش كده: أنماط `Badge` و`Card` و`Progress` كانت
2414
- * **مكتوبة جوّه `Display.tsx`** — وهي المكان الصح ما دام فيه منصّة واحدة.
2415
- *
2416
- * وأول ما بقى فيه اتنين، الكتابة جوّه المكوّن معناها **نسختين**: تغيير
2417
- * حشوة الشارة بيتعمل مرتين، وأول مرة حد ينسى واحدة الشارة بتفرق بين
2418
- * الويب والموبايل — من غير خطأ ولا تحذير.
2419
- *
2420
- * ودي بالظبط الحتة اللي الطلب اتكتب عشانها: «تعديل في التوكنز أو
2421
- * الأنماط أو المقاسات يوصل لكل المنصّات من مصدر واحد».
2422
- *
2423
- * ── والملف ده مالوش React ────────────────────────────────────────────────
2424
- * نصوص وخرايط وبس — زي `lib.ts` بالظبط. يعني بيعدّي حدّ RSC بلا
2425
- * `"use client"`، والنيتف بياخده من غير ما يجرّ DOM.
2426
- *
2427
- * ── والقاعدة: أي نمط بيتشاف على المنصّتين مكانه هنا ─────────────────────
2428
- * اللي بيفضل جوّه ملف المنصّة هو اللي **بيخصّها هي**: `overflow-clip`
2429
- * بتاعة الويب مثلاً، أو تخطيط `<Modal>` بتاع RN.
2430
- */
2431
-
2432
- type AvatarSize = 'xs' | 'sm' | 'md' | 'lg';
2433
-
2434
2317
  interface BadgeProps {
2435
2318
  children: ReactNode;
2436
2319
  tone?: Tone;
@@ -2447,6 +2330,7 @@ declare function Counter({ value, max }: {
2447
2330
  value: number;
2448
2331
  max?: number;
2449
2332
  }): react.JSX.Element | null;
2333
+ type AvatarSize = 'xs' | 'sm' | 'md' | 'lg';
2450
2334
  declare function Avatar({ name, src, size, square, className, }: {
2451
2335
  name: string;
2452
2336
  src?: string;
@@ -2459,7 +2343,6 @@ interface StatCardProps {
2459
2343
  icon?: ComponentType<{
2460
2344
  size?: number;
2461
2345
  strokeWidth?: number;
2462
- color?: string;
2463
2346
  }>;
2464
2347
  tone?: Tone;
2465
2348
  label: ReactNode;
@@ -2529,4 +2412,4 @@ declare function Skeleton({ variant, width, className, }: {
2529
2412
  className?: string;
2530
2413
  }): react.JSX.Element;
2531
2414
 
2532
- export { ANIMATE_SCALE, Accordion, type AccordionItem, Alert, type Animation, type AudioLevel, AudioPlayer, type AudioPlayerProps, Avatar, type AvatarSize, Badge, type BadgeProps, BarChart, type BarSeries, BrowserFrame, type BrowserFrameProps, Button, type ButtonProps, ButtonSize, ButtonVariant, COLOR_SCALE, CONTAINER_SCALE, Card, CardHeader, Carousel, type CarouselProps, type Chapter, Checkbox, ChoiceCards, type ChoiceOption, type ChoiceProps, Coach, type CoachApi, type CoachAudio, type CoachHint, type CoachItem, type CoachLine, type CoachOrb, CoachProvider, type CoachProviderProps, type CoachRegion, type CoachWhen, type CoachWhere, ColorField, type ColorToken, type Column, Combobox, type CommandItem, CommandPalette, type Container, Counter, type Currency, DARK_TOKENS, DataTable, type DataTableProps, DateRangePicker, Drawer, Dropdown, Dropzone, EmptyState, type FieldSize, FileRow, type FilterChip, FilterChips, FunnelChart, type FunnelStage, Gallery, type GalleryImage, type GalleryProps, GoalBar, Heatmap, Input, type InputProps, Lightbox, type LightboxProps, LocaleCtx, type MediaState, Modal, Money, type MoneyProps, MoneyProvider, MultiSelect, NumberStepper, type NumberStepperProps, type Option, PROVIDER_LEVEL_LABEL, PROVIDER_LEVEL_LABEL_EN, PageHeader, ParetoChart, type ParetoItem, Phone, type PhoneFormat, type PhoneParts, type PhoneProps, Product3DViewer, type Product3DViewerProps, Progress, ProviderBadge, type ProviderBadgeProps, type ProviderBadgeSize, type ProviderLevel, ProviderMark, type ProviderMarkProps, RADIUS_SCALE, Radio, RadioGroup, type Radius, type Range, RatingInput, type RatingInputProps, type RunwayItem, SHADOW_SCALE, Scrubber, SearchInput, Select, type SelectProps, type Shadow, type ShareItem, ShareList, Sheet, Skeleton, type SortableApi, type SortableItemProps, SortableStatus, Sparkline, Stars, type StarsProps, StatCard, type StatCardProps, Stepper, type StepperStep, StockRunway, Switch, type SymbolStyle, TEXT_SCALE, TOKENS, type TabItem, Tabs, TechnicalInput, type TechnicalInputProps, type TechnicalKind, TechnicalText, type TextSize, Textarea, type TextareaProps, Timeline, type TimelineStep, Toast, ToastHost, type ToastInput, type ToastItem, type ToastTone, type TokenName, Tone, Tooltip, TrendChart, type UITextKey, type UploadFile, type UploadState, type UseSortableOptions, VerifiedBadge, type VerifiedBadgeProps, VideoPlayer, type VideoPlayerProps, type VideoSuggestion, WaterfallChart, type WaterfallStep, WhatsAppIcon, coachSeconds, currencyName, currencySymbol, daysBetween, formatBytes, formatDate, formatRange, formatTime, isCurrency, normalizeHex, parsePhone, presets, setLang, useAudioLevel, useCoach, useCoachOptional, useCurrency, useCurrencySymbol, useMedia, useMoneyLang, useMoneyLocale, useSortable, useToasts, useUIText };
2415
+ export { ANIMATE_SCALE, Accordion, type AccordionItem, Alert, type Animation, type AudioLevel, AudioPlayer, type AudioPlayerProps, Avatar, type AvatarSize, Badge, type BadgeProps, BarChart, type BarSeries, BrowserFrame, type BrowserFrameProps, Button, type ButtonProps, ButtonSize, ButtonVariant, COLOR_SCALE, CONTAINER_SCALE, Card, CardHeader, Carousel, type CarouselProps, type Chapter, Checkbox, ChoiceCards, type ChoiceOption, type ChoiceProps, Coach, type CoachApi, type CoachAudio, type CoachHint, type CoachItem, type CoachLine, type CoachOrb, CoachProvider, type CoachProviderProps, type CoachRegion, type CoachWhen, type CoachWhere, ColorField, type ColorToken, type Column, Combobox, type CommandItem, CommandPalette, type Container, Counter, type Currency, DARK_TOKENS, DataTable, type DataTableProps, DateRangePicker, Drawer, Dropdown, Dropzone, EmptyState, type FieldSize, FileRow, type FilterChip, FilterChips, FunnelChart, type FunnelStage, Gallery, type GalleryImage, type GalleryProps, GoalBar, Heatmap, Input, type InputProps, Lightbox, type LightboxProps, LocaleCtx, type MediaState, Modal, Money, type MoneyProps, MoneyProvider, MultiSelect, NumberStepper, type NumberStepperProps, type Option, PROVIDER_LEVEL_LABEL, PROVIDER_LEVEL_LABEL_EN, PageHeader, ParetoChart, type ParetoItem, Phone, type PhoneFormat, type PhoneParts, type PhoneProps, Product3DViewer, type Product3DViewerProps, Progress, ProviderBadge, type ProviderBadgeProps, type ProviderBadgeSize, type ProviderLevel, ProviderMark, type ProviderMarkProps, RADIUS_SCALE, Radio, RadioGroup, type Radius, type Range, RatingInput, type RatingInputProps, type RunwayItem, SHADOW_SCALE, Scrubber, SearchInput, Select, type SelectProps, type Shadow, type ShareItem, ShareList, Sheet, Skeleton, type SortableApi, type SortableItemProps, SortableStatus, Sparkline, Stars, type StarsProps, StatCard, type StatCardProps, Stepper, type StepperStep, StockRunway, Switch, type SymbolStyle, TEXT_SCALE, TOKENS, type TabItem, Tabs, TechnicalInput, type TechnicalInputProps, type TechnicalKind, TechnicalText, type TextSize, Textarea, type TextareaProps, Timeline, type TimelineStep, Toast, ToastHost, type ToastInput, type ToastItem, type ToastTone, type TokenName, Tone, Tooltip, TrendChart, type UITextKey, type UploadFile, type UploadState, type UseSortableOptions, VerifiedBadge, type VerifiedBadgeProps, VideoPlayer, type VideoPlayerProps, type VideoSuggestion, WaterfallChart, type WaterfallStep, WhatsAppIcon, coachSeconds, currencyName, currencySymbol, daysBetween, formatBytes, formatDate, formatRange, formatTime, isCurrency, normalizeHex, parsePhone, presets, useAudioLevel, useCoach, useCoachOptional, useCurrency, useCurrencySymbol, useMedia, useMoneyLang, useMoneyLocale, useSortable, useToasts, useUIText };