noorui-rtl 0.4.4 → 0.4.6

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,17 +7,44 @@ 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.6] - 2025-12-08
17
+
18
+ ### Fixed
19
+ - **Calendar Component**: Fixed form submission issue when used inside forms
20
+ - Added `type="button"` to all navigation buttons (previous month, next month, today)
21
+ - Added `type="button"` to all date selection buttons
22
+ - Prevents unintended form submissions when selecting dates or navigating months
23
+ - Resolves issue where clicking calendar buttons would trigger parent form submit handlers
24
+
25
+ ### Notes
26
+ This is a critical bugfix for forms containing Calendar components in range or single selection mode. Previously, clicking any button within the Calendar would trigger form submission, causing premature validation and unexpected behavior.
27
+
28
+ ---
29
+
30
+ ## [0.4.5] - 2025-12-07
31
+
32
+ ### Changed
33
+ - **Cozy Theme**: Removed opinionated spacing and padding rules for more flexibility
34
+ - Removed forced `margin-bottom: 1.5rem` from headings (h1, h2, h3, h4)
35
+ - Removed forced `padding: 2rem !important` from all card components
36
+ - Removed forced button padding (`padding: .75rem 1.5rem`)
37
+ - Theme now respects component-level spacing defaults
38
+ - Updated both `globals.css` and `package.css` for consistency
39
+
40
+ ### Notes
41
+ This release makes the Cozy theme less opinionated and more flexible, allowing developers to use standard component spacing without theme overrides.
42
+
43
+ ---
44
+
10
45
  ## [0.4.4] - 2025-12-06
11
46
 
12
47
  ### Fixed
13
- - **Popover Component**: Fixed RTL positioning issues by adding automatic direction detection (similar to DropdownMenu)
14
- - Added MutationObserver to detect document direction changes
15
- - Popover Root now automatically passes `dir` prop to Radix UI for proper RTL support
16
- - Fixes notification popups, time pickers, and all popover-based components appearing on wrong side in RTL mode
17
- - **NotificationCenter**: Fixed RTL positioning - popup now appears on correct side in RTL mode
18
- - Updated align logic to `direction === 'rtl' ? 'start' : 'end'` for consistent right-side positioning
19
- - **TimePicker & TimeRangePicker**: Fixed RTL positioning - popups now appear on correct side in RTL mode
20
- - Updated align logic from `isRTL ? 'end' : 'start'` to `isRTL ? 'start' : 'end'`
21
48
  - **Documentation Pages**: Fixed inconsistent section title spacing across component pages
22
49
  - **number-input**: Fixed Use Cases, API Reference, and Features sections
23
50
  - **date-picker**: Fixed Use Cases, Type Definition, API Reference (2x), and Features sections
@@ -25,11 +52,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
25
52
  - All sections now use standard pattern: `<section className="mb-16">` with `<h2 className="text-2xl font-bold tracking-tight mb-6">`
26
53
 
27
54
  ### Changed
28
- - **Popover Component**: Improved architecture to match DropdownMenu pattern for better RTL support
29
55
  - **Component Documentation**: Standardized section spacing for consistent visual hierarchy
30
56
 
31
57
  ### Notes
32
- This release focuses on fixing RTL positioning issues in portal-rendered components (Popover) and improving documentation consistency. All popover-based components (notifications, time pickers, etc.) now position correctly in RTL mode.
58
+ This release focuses on improving documentation consistency and visual hierarchy across all component pages.
33
59
 
34
60
  ## [0.4.3] - 2025-12-05
35
61
 
@@ -234,7 +260,7 @@ This release focuses on code quality improvements and documentation completeness
234
260
  - Updated homepage URL to noorui.com
235
261
 
236
262
  ### Added
237
- - Complete barrel export with all 64 components
263
+ - Complete barrel export with all 74+ components
238
264
  - CHANGELOG.md, CONTRIBUTING.md documentation
239
265
  - Improved package files configuration
240
266
 
@@ -271,7 +297,7 @@ Major update to Noor UI with significant component additions and improvements.
271
297
 
272
298
  **Features**
273
299
  - Complete RTL support with logical properties
274
- - 64 production-ready and experimental components
300
+ - 74+ production-ready and experimental components
275
301
  - Full TypeScript support with type definitions
276
302
  - Radix UI primitives for accessibility
277
303
  - Tailwind CSS with design tokens
@@ -280,7 +306,7 @@ Major update to Noor UI with significant component additions and improvements.
280
306
  - WCAG AA compliant
281
307
 
282
308
  ### Changed
283
- - Updated package structure to include all 64 components
309
+ - Updated package structure to include all 74+ components
284
310
  - Improved TypeScript types and exports
285
311
  - Enhanced documentation
286
312
 
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.js CHANGED
@@ -3375,7 +3375,7 @@ var home = {
3375
3375
  },
3376
3376
  recentWins: {
3377
3377
  title: "Recent Wins",
3378
- performance: "NPM package published (noorui-rtl v0.4.3)",
3378
+ performance: "NPM package published (noorui-rtl v0.4.5)",
3379
3379
  skeletons: "74+ production-ready components with full documentation",
3380
3380
  components: "10+ complete demo projects (Blog, Marketplace, AI workflows)",
3381
3381
  rebranding: "Full RTL/LTR support for ALL RTL languages (Arabic, Hebrew, Urdu, Farsi) + WCAG AA accessibility"
@@ -11779,7 +11779,7 @@ var home2 = {
11779
11779
  },
11780
11780
  recentWins: {
11781
11781
  title: "\u0627\u0644\u0625\u0646\u062C\u0627\u0632\u0627\u062A \u0627\u0644\u0623\u062E\u064A\u0631\u0629",
11782
- performance: "\u062A\u0645 \u0646\u0634\u0631 \u062D\u0632\u0645\u0629 NPM (noorui-rtl v0.4.3)",
11782
+ performance: "\u062A\u0645 \u0646\u0634\u0631 \u062D\u0632\u0645\u0629 NPM (noorui-rtl v0.4.5)",
11783
11783
  skeletons: "\u0623\u0643\u062B\u0631 \u0645\u0646 74 \u0645\u0643\u0648\u0646 \u062C\u0627\u0647\u0632 \u0644\u0644\u0625\u0646\u062A\u0627\u062C \u0645\u0639 \u062A\u0648\u062B\u064A\u0642 \u0643\u0627\u0645\u0644",
11784
11784
  components: "\u0623\u0643\u062B\u0631 \u0645\u0646 10 \u0645\u0634\u0627\u0631\u064A\u0639 \u0639\u0631\u0636 \u0643\u0627\u0645\u0644\u0629 (\u0645\u062F\u0648\u0646\u0629\u060C \u0633\u0648\u0642\u060C \u0633\u064A\u0631 \u0639\u0645\u0644 AI)",
11785
11785
  rebranding: "\u062F\u0639\u0645 \u0643\u0627\u0645\u0644 \u0644\u062C\u0645\u064A\u0639 \u0627\u0644\u0644\u063A\u0627\u062A RTL (\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u060C \u0627\u0644\u0639\u0628\u0631\u064A\u0629\u060C \u0627\u0644\u0623\u0631\u062F\u064A\u0629\u060C \u0627\u0644\u0641\u0627\u0631\u0633\u064A\u0629) + \u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 WCAG AA"
@@ -17691,7 +17691,7 @@ var components_experimental2 = {
17691
17691
  },
17692
17692
  tokenCounterComponent: {
17693
17693
  title: "\u0639\u062F\u0627\u062F \u0627\u0644\u0631\u0645\u0648\u0632",
17694
- description: "\u0639\u062F\u0627\u062F \u0631\u0645\u0648\u0632 \u0641\u064A \u0627\u0644\u0648\u0642\u062A \u0627\u0644\u0641\u0639\u0644\u064A \u0645\u0639 \u062A\u0642\u062F\u064A\u0631\u0627\u062A \u0627\u0644\u062A\u0643\u0644\u0641\u0629 \u0648\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u062D\u062F. \u0636\u0631\u0648\u0631\u064A \u0644\u0625\u062F\u0627\u0631\u0629 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 API \u0644\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0648\u0627\u0644\u062A\u0643\u0627\u0644\u064A\u0641. \u064A\u0639\u0631\u0636 \u0639\u062F\u062F \u0627\u0644\u0631\u0645\u0648\u0632 \u0648\u0627\u0644\u062A\u0633\u0639\u064A\u0631 \u0648\u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0628\u0635\u0631\u064A\u0629 \u0639\u0646\u062F \u0627\u0644\u0627\u0642\u062A\u0631\u0627\u0628 \u0645\u0646 \u0627\u0644\u062D\u062F\u0648\u062F.",
17694
+ description: "\u0639\u0631\u0636 \u0648\u062A\u062A\u0628\u0639 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0631\u0645\u0648\u0632 \u0645\u0639 \u062A\u0642\u062F\u064A\u0631 \u0627\u0644\u062A\u0643\u0644\u0641\u0629 \u0644\u062A\u0641\u0627\u0639\u0644\u0627\u062A \u0646\u0645\u0648\u0630\u062C \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A. \u064A\u062A\u0636\u0645\u0646 \u0634\u0631\u064A\u0637 \u0627\u0644\u062A\u0642\u062F\u0645\u060C \u0627\u0644\u062A\u0641\u0635\u064A\u0644 \u062D\u0633\u0628 \u0627\u0644\u0625\u062F\u062E\u0627\u0644/\u0627\u0644\u0625\u062E\u0631\u0627\u062C\u060C \u0648\u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0626\u064A\u0629 \u0639\u0646\u062F \u0627\u0644\u0627\u0642\u062A\u0631\u0627\u0628 \u0645\u0646 \u0627\u0644\u062D\u062F\u0648\u062F.",
17695
17695
  preview: "\u0645\u0639\u0627\u064A\u0646\u0629",
17696
17696
  installation: "\u0627\u0644\u062A\u062B\u0628\u064A\u062A",
17697
17697
  usage: "\u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645",
@@ -17725,12 +17725,12 @@ var components_experimental2 = {
17725
17725
  },
17726
17726
  accessibility: {
17727
17727
  title: "\u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u0627\u0644\u0648\u0635\u0648\u0644",
17728
- liveRegion: "\u0645\u0646\u0637\u0642\u0629 \u0645\u0628\u0627\u0634\u0631\u0629",
17729
- liveRegionDesc: "\u064A\u062A\u0645 \u0627\u0644\u0625\u0639\u0644\u0627\u0646 \u0639\u0646 \u062A\u062D\u062F\u064A\u062B\u0627\u062A \u0639\u062F\u062F \u0627\u0644\u0631\u0645\u0648\u0632 \u0644\u0642\u0627\u0631\u0626\u0627\u062A \u0627\u0644\u0634\u0627\u0634\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0645\u0646\u0627\u0637\u0642 aria-live.",
17730
- warningAnnouncements: "\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0627\u0644\u062A\u062D\u0630\u064A\u0631",
17731
- warningAnnouncementsDesc: "\u064A\u062A\u0645 \u0627\u0644\u0625\u0639\u0644\u0627\u0646 \u0639\u0646 \u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u062D\u062F \u0628\u0634\u0643\u0644 \u0628\u0627\u0631\u0632 \u0645\u0639 \u0633\u0645\u0627\u062A ARIA \u0627\u0644\u0645\u0646\u0627\u0633\u0628\u0629.",
17728
+ screenReader: "\u0642\u0627\u0631\u0626 \u0627\u0644\u0634\u0627\u0634\u0629",
17729
+ screenReaderDesc: "\u064A\u062A\u0636\u0645\u0646 \u0627\u0644\u0645\u0643\u0648\u0646 \u062A\u0633\u0645\u064A\u0627\u062A \u0648\u0646\u0635\u0627\u0626\u062D \u0623\u062F\u0648\u0627\u062A \u0648\u0635\u0641\u064A\u0629. \u064A\u062A\u0645 \u062A\u0646\u0633\u064A\u0642 \u0639\u062F\u062F \u0627\u0644\u0631\u0645\u0648\u0632 \u0648\u0627\u0644\u062A\u0643\u0627\u0644\u064A\u0641 \u0628\u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u0646\u0627\u0633\u0628 \u0644\u0642\u0627\u0631\u0626\u0627\u062A \u0627\u0644\u0634\u0627\u0634\u0629.",
17732
17730
  visualIndicators: "\u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062A \u0627\u0644\u0628\u0635\u0631\u064A\u0629",
17733
- visualIndicatorsDesc: "\u062A\u0648\u0641\u0631 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0641\u0631\u0629 \u0628\u0627\u0644\u0623\u0644\u0648\u0627\u0646 (\u0623\u0635\u0641\u0631 \u0644\u0644\u062A\u062D\u0630\u064A\u0631\u060C \u0623\u062D\u0645\u0631 \u0644\u0644\u062A\u062C\u0627\u0648\u0632) \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0628\u0635\u0631\u064A\u0629 \u0648\u0627\u0636\u062D\u0629."
17731
+ visualIndicatorsDesc: "\u062A\u0634\u064A\u0631 \u0625\u0634\u0627\u0631\u0627\u062A \u0628\u0635\u0631\u064A\u0629 \u0645\u062A\u0639\u062F\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0644\u0629: \u0644\u0648\u0646 \u0634\u0631\u064A\u0637 \u0627\u0644\u062A\u0642\u062F\u0645\u060C \u0634\u0627\u0631\u0629 \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u060C \u0648\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u0644\u0648\u0646 \u0627\u0644\u062D\u062F\u0648\u062F. \u0647\u0630\u0627 \u064A\u0636\u0645\u0646 \u0623\u0646 \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0645\u0631\u0626\u064A\u0629 \u062D\u062A\u0649 \u062F\u0648\u0646 \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0641\u0642\u0637 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u0646.",
17732
+ tooltips: "\u0646\u0635\u0627\u0626\u062D \u0627\u0644\u0623\u062F\u0648\u0627\u062A",
17733
+ tooltipsDesc: "\u062A\u0648\u0641\u0631 \u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0633\u064A\u0627\u0642\u064B\u0627 \u062D\u0648\u0644 \u0627\u0644\u0631\u0645\u0648\u0632. \u062A\u0642\u0648\u0645 \u0646\u0635\u064A\u062D\u0629 \u0627\u0644\u062A\u0643\u0644\u0641\u0629 \u0628\u062A\u0641\u0635\u064A\u0644 \u062A\u0643\u0627\u0644\u064A\u0641 \u0627\u0644\u0625\u062F\u062E\u0627\u0644/\u0627\u0644\u0625\u062E\u0631\u0627\u062C \u0628\u0634\u0643\u0644 \u0645\u0646\u0641\u0635\u0644 \u0644\u0644\u0634\u0641\u0627\u0641\u064A\u0629."
17734
17734
  },
17735
17735
  rtl: {
17736
17736
  title: "\u0627\u0639\u062A\u0628\u0627\u0631\u0627\u062A RTL",
@@ -18273,6 +18273,7 @@ var Calendar2 = React74__namespace.forwardRef(
18273
18273
  return /* @__PURE__ */ React74__namespace.createElement("div", { ref, className: cn("w-full p-4", className), ...props }, /* @__PURE__ */ React74__namespace.createElement("div", { className: "flex items-center justify-between mb-4" }, /* @__PURE__ */ React74__namespace.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React74__namespace.createElement(
18274
18274
  Button,
18275
18275
  {
18276
+ type: "button",
18276
18277
  variant: "outline",
18277
18278
  size: "icon",
18278
18279
  onClick: isRTL ? goToNextMonth : goToPreviousMonth,
@@ -18282,13 +18283,14 @@ var Calendar2 = React74__namespace.forwardRef(
18282
18283
  ), /* @__PURE__ */ React74__namespace.createElement(
18283
18284
  Button,
18284
18285
  {
18286
+ type: "button",
18285
18287
  variant: "outline",
18286
18288
  size: "icon",
18287
18289
  onClick: isRTL ? goToPreviousMonth : goToNextMonth,
18288
18290
  className: "h-8 w-8"
18289
18291
  },
18290
18292
  /* @__PURE__ */ React74__namespace.createElement(lucideReact.ChevronRight, { className: "h-4 w-4" })
18291
- )), /* @__PURE__ */ React74__namespace.createElement("div", { className: "text-center" }, /* @__PURE__ */ React74__namespace.createElement("h2", { className: "text-lg font-semibold" }, monthName), showHijri && hijriMonthYear && /* @__PURE__ */ React74__namespace.createElement("p", { className: "text-sm text-muted-foreground" }, hijriMonthYear)), /* @__PURE__ */ React74__namespace.createElement(Button, { variant: "outline", size: "sm", onClick: goToToday }, t.ui.components.today)), /* @__PURE__ */ React74__namespace.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React74__namespace.createElement("div", { className: "grid grid-cols-7 gap-1" }, weekDays.map((day, index) => /* @__PURE__ */ React74__namespace.createElement(
18293
+ )), /* @__PURE__ */ React74__namespace.createElement("div", { className: "text-center" }, /* @__PURE__ */ React74__namespace.createElement("h2", { className: "text-lg font-semibold" }, monthName), showHijri && hijriMonthYear && /* @__PURE__ */ React74__namespace.createElement("p", { className: "text-sm text-muted-foreground" }, hijriMonthYear)), /* @__PURE__ */ React74__namespace.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: goToToday }, t.ui.components.today)), /* @__PURE__ */ React74__namespace.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React74__namespace.createElement("div", { className: "grid grid-cols-7 gap-1" }, weekDays.map((day, index) => /* @__PURE__ */ React74__namespace.createElement(
18292
18294
  "div",
18293
18295
  {
18294
18296
  key: index,
@@ -18308,6 +18310,7 @@ var Calendar2 = React74__namespace.forwardRef(
18308
18310
  return /* @__PURE__ */ React74__namespace.createElement(
18309
18311
  "button",
18310
18312
  {
18313
+ type: "button",
18311
18314
  key: index,
18312
18315
  onClick: () => handleDateClick(gregorian),
18313
18316
  disabled: isDisabled,