noorui-rtl 0.4.3 → 0.4.5

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/CHANGELOG.md CHANGED
@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### To Be Fixed
11
+ - **Popover Component**: RTL positioning issues in portal-rendered components
12
+ - NotificationCenter popup appears on wrong side in RTL mode
13
+ - TimePicker & TimeRangePicker popups appear on wrong side in RTL mode
14
+ - Need to add automatic direction detection (similar to DropdownMenu pattern)
15
+
16
+ ## [0.4.5] - 2025-12-07
17
+
18
+ ### Changed
19
+ - **Cozy Theme**: Removed opinionated spacing and padding rules for more flexibility
20
+ - Removed forced `margin-bottom: 1.5rem` from headings (h1, h2, h3, h4)
21
+ - Removed forced `padding: 2rem !important` from all card components
22
+ - Removed forced button padding (`padding: .75rem 1.5rem`)
23
+ - Theme now respects component-level spacing defaults
24
+ - Updated both `globals.css` and `package.css` for consistency
25
+
26
+ ### Notes
27
+ This release makes the Cozy theme less opinionated and more flexible, allowing developers to use standard component spacing without theme overrides.
28
+
29
+ ---
30
+
31
+ ## [0.4.4] - 2025-12-06
32
+
33
+ ### Fixed
34
+ - **Documentation Pages**: Fixed inconsistent section title spacing across component pages
35
+ - **number-input**: Fixed Use Cases, API Reference, and Features sections
36
+ - **date-picker**: Fixed Use Cases, Type Definition, API Reference (2x), and Features sections
37
+ - **time-picker**: Fixed Use Cases, Type Definition, API Reference (2x), and Features sections
38
+ - All sections now use standard pattern: `<section className="mb-16">` with `<h2 className="text-2xl font-bold tracking-tight mb-6">`
39
+
40
+ ### Changed
41
+ - **Component Documentation**: Standardized section spacing for consistent visual hierarchy
42
+
43
+ ### Notes
44
+ This release focuses on improving documentation consistency and visual hierarchy across all component pages.
45
+
46
+ ## [0.4.3] - 2025-12-05
47
+
48
+ ### Fixed
49
+ - **Code Quality**: Resolved all React Hooks exhaustive-deps warnings (zero warnings achieved)
50
+ - **DataTable**: Wrapped `sampleUsers` in `useMemo` and added to dependency arrays in sorting, filtering, and pagination hooks
51
+ - **useRelativeTime Hook**: Wrapped `targetDate` in `useMemo` and `getRelativeTime` in `useCallback` with proper dependencies
52
+ - **Calendar**: Wrapped calendar days generation in `useMemo` with complete dependencies including `getHijriDate`
53
+ - **Translations**: Fixed missing i18n keys across 11+ experimental component pages
54
+ - Added `rtlDemo` object with `ltr` and `rtl` keys to common.ts (EN/AR)
55
+ - Added missing example keys: `fullFeatured`, `compactMode`, `withPresets`, `customPresets`, `withoutPresets`, `inContext`
56
+ - Fixed incorrect key references: `rtl` → `rtlSupport`, `interface` → `typeDefinitions`, `sizes` → `examples.sizes`, `inContext` → `examples.inContext`
57
+ - **NotificationCenter**: Fixed PropDefinition type error by changing `defaultValue` to `default` property
58
+ - **WorkflowCanvas & WorkflowNode**: Fixed missing imports for `useDirection` and `content` from i18n
59
+ - **ThinkingIndicator**: Fixed incorrect translation key references in examples section
60
+ - **ParameterSlider**: Fixed non-existent translation key reference
61
+
10
62
  ### Added
11
63
  - **Website**: Added "Starters" link to main navigation (both desktop and mobile)
12
64
  - **Website**: Added i18n translations for "Starters" menu item (English: "Starters", Arabic: "نماذج البداية")
@@ -20,6 +72,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
20
72
  - **Documentation**: Updated README.md to include Starters page in documentation links
21
73
  - **Documentation**: Updated ROADMAP.md to highlight Kitab as completed deliverable
22
74
  - **Documentation**: Updated starters/README.md with full Kitab feature list
75
+ - **Code Standards**: Added ESLint disable comments for intentional img usage (component library design decision)
76
+ - NotificationCenter: Avatar display using dynamic user-provided URLs
77
+ - ListingCard: Product image display
78
+ - FileUpload: Image preview using blob URLs from FileReader
23
79
 
24
80
  ### Changed
25
81
  - **Website**: Improved visibility of /starters page through navigation integration
@@ -27,6 +83,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27
83
  - **Starters Page**: Updated GitHub button to link to https://github.com/topics/noor-ui for broader project discovery
28
84
  - **Roadmap**: Updated current status to "READY FOR PUBLIC LAUNCH" with technical pre-launch checklist completed
29
85
  - **Roadmap**: Added Kitab to recent wins and next actions focused on marketing launch
86
+ - **Website**: Updated all version references from v0.4.2 to v0.4.3
87
+ - Homepage (app/page.tsx)
88
+ - English home translations (lib/i18n/en/home.ts)
89
+ - Arabic home translations (lib/i18n/ar/home.ts)
90
+ - Launch plan documentation (LAUNCH_PLAN.md - 7 references)
91
+ - Roadmap documentation (ROADMAP.md - 4 references)
92
+ - **Build Process**: Achieved zero build warnings and zero compilation errors
93
+ - **Code Quality**: Improved React performance patterns with proper memoization and callback usage
94
+
95
+ ### Notes
96
+ This release focuses on code quality improvements and documentation completeness. All 74+ components maintain full RTL/LTR support with zero build warnings. The codebase is now optimized for production use with proper React performance patterns.
30
97
 
31
98
  ## [0.4.2] - 2025-11-29
32
99
 
@@ -179,7 +246,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
179
246
  - Updated homepage URL to noorui.com
180
247
 
181
248
  ### Added
182
- - Complete barrel export with all 64 components
249
+ - Complete barrel export with all 74+ components
183
250
  - CHANGELOG.md, CONTRIBUTING.md documentation
184
251
  - Improved package files configuration
185
252
 
@@ -216,7 +283,7 @@ Major update to Noor UI with significant component additions and improvements.
216
283
 
217
284
  **Features**
218
285
  - Complete RTL support with logical properties
219
- - 64 production-ready and experimental components
286
+ - 74+ production-ready and experimental components
220
287
  - Full TypeScript support with type definitions
221
288
  - Radix UI primitives for accessibility
222
289
  - Tailwind CSS with design tokens
@@ -225,7 +292,7 @@ Major update to Noor UI with significant component additions and improvements.
225
292
  - WCAG AA compliant
226
293
 
227
294
  ### Changed
228
- - Updated package structure to include all 64 components
295
+ - Updated package structure to include all 74+ components
229
296
  - Improved TypeScript types and exports
230
297
  - Enhanced documentation
231
298
 
package/README.md CHANGED
@@ -14,7 +14,7 @@ Beautiful RTL-first React components for bilingual applications. Built with Radi
14
14
  ## ✨ Features
15
15
 
16
16
  - 🌍 **RTL-First**: Perfect Arabic/Persian support with logical properties
17
- - 🎨 **65 Components**: Complete UI toolkit for modern applications
17
+ - 🎨 **74+ Components**: Complete UI toolkit for modern applications
18
18
  - ♿ **Accessible**: WCAG AA compliant with full keyboard navigation
19
19
  - 🎯 **TypeScript**: Full type safety and IntelliSense support
20
20
  - 🎭 **Themeable**: Light/dark mode with customizable design tokens
package/dist/index.d.mts CHANGED
@@ -345,11 +345,11 @@ declare const CollapsibleContent: React$1.ForwardRefExoticComponent<CollapsibleP
345
345
 
346
346
  declare const Command: React$1.ForwardRefExoticComponent<Omit<{
347
347
  children?: React$1.ReactNode;
348
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
348
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
349
349
  ref?: React$1.Ref<HTMLDivElement>;
350
350
  } & {
351
351
  asChild?: boolean;
352
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
352
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
353
353
  label?: string;
354
354
  shouldFilter?: boolean;
355
355
  filter?: (value: string, search: string, keywords?: string[]) => number;
@@ -373,45 +373,45 @@ declare const CommandInput: React$1.ForwardRefExoticComponent<Omit<Omit<Pick<Pic
373
373
  } & React$1.RefAttributes<HTMLInputElement>, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
374
374
  declare const CommandList: React$1.ForwardRefExoticComponent<Omit<{
375
375
  children?: React$1.ReactNode;
376
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
376
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
377
377
  ref?: React$1.Ref<HTMLDivElement>;
378
378
  } & {
379
379
  asChild?: boolean;
380
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
380
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
381
381
  label?: string;
382
382
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
383
383
  declare const CommandEmpty: React$1.ForwardRefExoticComponent<Omit<{
384
384
  children?: React$1.ReactNode;
385
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
385
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
386
386
  ref?: React$1.Ref<HTMLDivElement>;
387
387
  } & {
388
388
  asChild?: boolean;
389
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
389
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
390
390
  declare const CommandGroup: React$1.ForwardRefExoticComponent<Omit<{
391
391
  children?: React$1.ReactNode;
392
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
392
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
393
393
  ref?: React$1.Ref<HTMLDivElement>;
394
394
  } & {
395
395
  asChild?: boolean;
396
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key">, "value" | "heading"> & {
396
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>>, "value" | "heading"> & {
397
397
  heading?: React$1.ReactNode;
398
398
  value?: string;
399
399
  forceMount?: boolean;
400
400
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
401
- declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
401
+ declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
402
402
  ref?: React$1.Ref<HTMLDivElement>;
403
403
  } & {
404
404
  asChild?: boolean;
405
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
405
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
406
406
  alwaysRender?: boolean;
407
407
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
408
408
  declare const CommandItem: React$1.ForwardRefExoticComponent<Omit<{
409
409
  children?: React$1.ReactNode;
410
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
410
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
411
411
  ref?: React$1.Ref<HTMLDivElement>;
412
412
  } & {
413
413
  asChild?: boolean;
414
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key">, "value" | "disabled" | "onSelect"> & {
414
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>>, "value" | "disabled" | "onSelect"> & {
415
415
  disabled?: boolean;
416
416
  onSelect?: (value: string) => void;
417
417
  value?: string;
package/dist/index.d.ts CHANGED
@@ -345,11 +345,11 @@ declare const CollapsibleContent: React$1.ForwardRefExoticComponent<CollapsibleP
345
345
 
346
346
  declare const Command: React$1.ForwardRefExoticComponent<Omit<{
347
347
  children?: React$1.ReactNode;
348
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
348
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
349
349
  ref?: React$1.Ref<HTMLDivElement>;
350
350
  } & {
351
351
  asChild?: boolean;
352
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
352
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
353
353
  label?: string;
354
354
  shouldFilter?: boolean;
355
355
  filter?: (value: string, search: string, keywords?: string[]) => number;
@@ -373,45 +373,45 @@ declare const CommandInput: React$1.ForwardRefExoticComponent<Omit<Omit<Pick<Pic
373
373
  } & React$1.RefAttributes<HTMLInputElement>, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
374
374
  declare const CommandList: React$1.ForwardRefExoticComponent<Omit<{
375
375
  children?: React$1.ReactNode;
376
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
376
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
377
377
  ref?: React$1.Ref<HTMLDivElement>;
378
378
  } & {
379
379
  asChild?: boolean;
380
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
380
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
381
381
  label?: string;
382
382
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
383
383
  declare const CommandEmpty: React$1.ForwardRefExoticComponent<Omit<{
384
384
  children?: React$1.ReactNode;
385
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
385
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
386
386
  ref?: React$1.Ref<HTMLDivElement>;
387
387
  } & {
388
388
  asChild?: boolean;
389
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
389
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
390
390
  declare const CommandGroup: React$1.ForwardRefExoticComponent<Omit<{
391
391
  children?: React$1.ReactNode;
392
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
392
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
393
393
  ref?: React$1.Ref<HTMLDivElement>;
394
394
  } & {
395
395
  asChild?: boolean;
396
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key">, "value" | "heading"> & {
396
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>>, "value" | "heading"> & {
397
397
  heading?: React$1.ReactNode;
398
398
  value?: string;
399
399
  forceMount?: boolean;
400
400
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
401
- declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
401
+ declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
402
402
  ref?: React$1.Ref<HTMLDivElement>;
403
403
  } & {
404
404
  asChild?: boolean;
405
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
405
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
406
406
  alwaysRender?: boolean;
407
407
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
408
408
  declare const CommandItem: React$1.ForwardRefExoticComponent<Omit<{
409
409
  children?: React$1.ReactNode;
410
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
410
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
411
411
  ref?: React$1.Ref<HTMLDivElement>;
412
412
  } & {
413
413
  asChild?: boolean;
414
- }, "asChild" | keyof React$1.HTMLAttributes<HTMLDivElement> | "key">, "value" | "disabled" | "onSelect"> & {
414
+ }, "asChild" | "key" | keyof React$1.HTMLAttributes<HTMLDivElement>>, "value" | "disabled" | "onSelect"> & {
415
415
  disabled?: boolean;
416
416
  onSelect?: (value: string) => void;
417
417
  value?: string;