@adelalawdi/fnon2 2.0.4 → 2.0.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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Fnon.js v2.0.4 🚀
1
+ # Fnon.js v2.0.5 🚀
2
2
 
3
3
  **Lightweight modal, toast, spinner, date picker, and context menu library.**
4
4
  No dependencies. 42 KB minified (12 KB gzip). Works in all modern browsers.
@@ -16,8 +16,14 @@ No dependencies. 42 KB minified (12 KB gzip). Works in all modern browsers.
16
16
 
17
17
  ---
18
18
 
19
+ > ### [Github](https://github.com/superawdi/Fnon2)
20
+
21
+ ---
22
+
19
23
  > ### [Live Demo](https://superawdi.github.io/Fnon2/)
20
24
 
25
+ ---
26
+
21
27
  ## Table of Contents
22
28
 
23
29
  - [Installation](#installation)
@@ -126,6 +132,7 @@ The `Fnon` object is the single entry point. It exposes:
126
132
  | `Wait` | object | Full-page spinner methods |
127
133
  | `Box` | object | Container-targeted spinner methods |
128
134
  | `DatePicker(options?)` | function | Date picker modal (alias: `DP`) |
135
+ | `DatePicker.setLocale(locale)` | function | Set global date picker locale (language) |
129
136
  | `ContextMenu(event, items, onClick?)` | function | Context menu (alias: `CM`) |
130
137
  | `AddLogo(name, html)` | function | Register custom spinner |
131
138
  | `AddTheme(name, config)` | function | Register custom theme |
@@ -646,7 +653,9 @@ Fnon.Box.MyLogo('#target', 'Custom');
646
653
 
647
654
  ## DatePicker
648
655
 
649
- A calendar modal that returns a Promise with the selected date(s).
656
+ A calendar modal that returns a Promise with the selected date(s).
657
+ Supports **1-month**, **6-month**, and **auto-responsive** layout.
658
+ Fully localizable with built-in English, Korean, and custom locale support.
650
659
 
651
660
  ```ts
652
661
  Fnon.DatePicker(options?: DatePickerOptions): Promise<Date | { start: Date; end: Date } | null>
@@ -668,6 +677,18 @@ if (range) console.log('From:', range.start, 'To:', range.end);
668
677
  // With time picker
669
678
  const dt = await Fnon.DatePicker({ withTime: true });
670
679
 
680
+ // 6-month layout
681
+ const range = await Fnon.DatePicker({ layout: 6, dateRange: true });
682
+
683
+ // With custom language
684
+ const arLocale = {
685
+ days: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
686
+ months: ['يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر'],
687
+ today: 'اليوم', ok: 'موافق', prevMonth: 'الشهر السابق', nextMonth: 'الشهر التالي',
688
+ digits: '٠١٢٣٤٥٦٧٨٩'
689
+ };
690
+ const d = await Fnon.DatePicker({ language: arLocale, dir: 'rtl' });
691
+
671
692
  // With constraints
672
693
  const d = await Fnon.DatePicker({
673
694
  minDate: new Date(2024, 0, 1),
@@ -686,11 +707,66 @@ The Promise resolves `null` if the user closes the modal without selecting (X bu
686
707
  | `withTime` | `boolean` | `false` | Show time input (ignored if `dateRange` is `true`) |
687
708
  | `minDate` | `Date` | — | Earliest selectable date |
688
709
  | `maxDate` | `Date` | — | Latest selectable date |
710
+ | `layout` | `1 \| 6 \| 'auto'` | `1` | Number of month columns: `1` (single), `6` (6-month grid), `'auto'` (responsive — 1 on mobile, 6 on 768px+) |
711
+ | `language` | `DatePickerLocale` | — | Per-instance locale override (see [DatePickerLocale](#datepickerlocale) below) |
689
712
  | `title` | `FnonContent` | — | Modal title |
690
713
  | `isDark` | `boolean \| (() => boolean)` | — | Dark mode |
691
714
  | `darkBgColor` | `string` | — | Dark background |
692
715
  | `dir` | `'ltr' \| 'rtl'` | `'ltr'` | Text direction |
693
716
 
717
+ ### DatePickerLocale
718
+
719
+ Override display text and digit characters for any language. Pass via `language` option or set globally with `Fnon.DatePicker.setLocale()`.
720
+
721
+ ```ts
722
+ interface DatePickerLocale {
723
+ days?: string[]; // 7 short day names (default: ['Su','Mo','Tu','We','Th','Fr','Sa'])
724
+ daysLong?: string[]; // 7 long day names for tooltips
725
+ months?: string[]; // 12 month names (default: English)
726
+ monthsShort?: string[]; // 12 short month names
727
+ today?: string; // "Today" button text (default: 'Today')
728
+ ok?: string; // OK button text (default: 'OK')
729
+ prevMonth?: string; // Tooltip for prev button (default: 'Previous month')
730
+ nextMonth?: string; // Tooltip for next button (default: 'Next month')
731
+ rangeLabel?: string; // Template for multi-month header — use {fromMonth}, {toMonth}, {year} placeholders
732
+ digits?: string; // 10 characters for numeral replacement — index 0 = '0', index 9 = '9'
733
+ }
734
+ ```
735
+
736
+ **`digits` example** — Arabic-Indic numerals:
737
+
738
+ ```ts
739
+ digits: '٠١٢٣٤٥٦٧٨٩'
740
+ // 2025 → ٢٠٢٥
741
+ ```
742
+
743
+ **`rangeLabel` example** — custom header format:
744
+
745
+ ```ts
746
+ rangeLabel: '{fromMonth} – {toMonth} {year}'
747
+ // "January – June 2025"
748
+ ```
749
+
750
+ **Global locale via `Fnon.DatePicker.setLocale()`:**
751
+
752
+ ```ts
753
+ Fnon.DatePicker.setLocale({
754
+ months: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
755
+ days: ['일','월','화','수','목','금','토']
756
+ });
757
+ ```
758
+
759
+ **Global locale via `Fnon.Init()`:**
760
+
761
+ ```ts
762
+ Fnon.Init({
763
+ datePickerLocale: {
764
+ months: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
765
+ days: ['일','월','화','수','목','금','토']
766
+ }
767
+ });
768
+ ```
769
+
694
770
  ### Return Value
695
771
 
696
772
  | Mode | Resolves to | Rejects when |
@@ -1040,6 +1116,10 @@ Set these on `:root` to customize globally:
1040
1116
  |-------|---------|
1041
1117
  | `.fnon-dp` | DatePicker container |
1042
1118
  | `.fnon-dp-dark` | Dark mode |
1119
+ | `.fnon-dp-layout-auto` | Responsive layout mode (media query) |
1120
+ | `.fnon-dp-months` | Multi-month grid container (3 columns) |
1121
+ | `.fnon-dp-month` | Individual month card in multi-layout |
1122
+ | `.fnon-dp-month-name` | Month card title |
1043
1123
  | `.fnon-dp-header` | Header row |
1044
1124
  | `.fnon-dp-nav` | Nav button |
1045
1125
  | `.fnon-dp-nav-disabled` | Disabled nav |
@@ -1057,9 +1137,9 @@ Set these on `:root` to customize globally:
1057
1137
  | `.fnon-dp-range-start` | Range start |
1058
1138
  | `.fnon-dp-range-end` | Range end |
1059
1139
  | `.fnon-dp-range-preview` | Hover preview |
1060
- | `.fnon-dp-actions` | Action buttons |
1061
- | `.fnon-dp-btn` | Action button |
1062
- | `.fnon-dp-btn-primary` | Primary action |
1140
+ | `.fnon-dp-btn-group` | Action button group |
1141
+ | `.fnon-dp-btn-ok` | OK button |
1142
+ | `.fnon-dp-btn-cancel` | Cancel button |
1063
1143
  | `.fnon-dp-popup` | Year/month popup |
1064
1144
  | `.fnon-dp-popup-nav` | Popup nav bar |
1065
1145
  | `.fnon-dp-popup-nav-btn` | Popup nav button |
package/fnon.min.css CHANGED
@@ -1 +1 @@
1
- :root{--fnon-font: "Quicksand", sans-serif;--fnon-z-overlay: 4080;--fnon-z-modal: 4050;--fnon-z-hint: 5000;--fnon-z-wait: 6000;--fnon-radius: 10px;--fnon-transition: .25s ease}.fnon-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--fnon-z-overlay);background:#0006;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity var(--fnon-transition);pointer-events:none}.fnon-overlay.fnon-active{opacity:1;pointer-events:all}.fnon-overlay-hidden{pointer-events:none!important;opacity:0!important}.fnon-overlay-nobg{background:transparent!important;pointer-events:none!important}.fnon-overlay-nobg>.fnon-modal{pointer-events:auto!important}.fnon-task-bar{position:fixed;bottom:0;left:0;right:0;z-index:calc(var(--fnon-z-modal) + 10);display:flex;align-items:center;gap:4px;padding:4px 8px;background:#2d3748;box-shadow:0 -2px 8px #0003;font-family:var(--fnon-font)}.fnon-task-bar-btn{font-family:var(--fnon-font);font-size:.78rem;padding:4px 12px;border:none;border-radius:4px;background:#ffffff26;color:#fff;cursor:pointer;transition:background .15s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.fnon-task-bar-btn:hover{background:#ffffff40}.fnon-modal{font-family:var(--fnon-font);background:var(--fnon-bg, #fff);border-radius:var(--fnon-radius);border:2px solid var(--fnon-title-background, #029eff);box-shadow:0 20px 60px #0003;max-width:480px;width:90%;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;transform:translateY(30px) scale(.97);transition:transform var(--fnon-transition),opacity var(--fnon-transition);opacity:0}.fnon-modal.fnon-active{transform:translateY(0) scale(1);opacity:1}.fnon-modal.fnon-minimized{display:none!important}.fnon-modal-title{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:var(--fnon-title-background, #029eff);color:var(--fnon-title-color, #fff);font-weight:600;font-size:1rem;-webkit-user-select:none;user-select:none;cursor:grab}.fnon-modal-title:active{cursor:grabbing}.fnon-dragging{transition:none!important}.fnon-dragging .fnon-modal-title{cursor:grabbing}.fnon-modal-title-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fnon-modal-controls{display:flex;align-items:center;gap:4px;margin-left:12px}.fnon-modal-controls button{background:none;border:none;color:inherit;cursor:pointer;padding:2px 6px;font-size:14px;line-height:1;border-radius:4px;opacity:.8;transition:opacity .15s}.fnon-modal-controls button:hover{opacity:1;background:#ffffff26}.fnon-modal-controls button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.fnon-modal-body{padding:20px;font-size:.95rem;line-height:1.6;color:#2d3748;overflow-y:auto;flex:1}.fnon-modal-footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid #e2e8f0}.fnon-btn{font-family:var(--fnon-font);font-size:.82rem;font-weight:600;padding:8px 20px;border:none;border-radius:6px;cursor:pointer;transition:opacity .15s,transform .1s}.fnon-btn:hover{opacity:.88;transform:translateY(-1px)}.fnon-btn:active{transform:translateY(0)}.fnon-btn:focus-visible{outline:2px solid #c53030;outline-offset:2px}.fnon-btn{background:var(--fnon-btn-ok-background, #029eff);color:var(--fnon-btn-ok-color, #fff);box-shadow:0 2px 6px #00000026}.fnon-btn-light{background:#f8f9fa;color:#2d3748;box-shadow:0 1px 3px #0000001a}.fnon-btn-light:focus-visible{outline:2px solid #029eff;outline-offset:2px}.fnon-btn-danger{background:#ff6b6b;color:#fff}.fnon-btn-success{background:#39da8a;color:#fff}.fnon-btn-warning{background:#fdd347;color:#2d3748}.fnon-btn-info{background:#48dbfb;color:#2d3748}.fnon-btn-dark{background:#222f3e;color:#fff}.fnon-breaking{position:fixed;left:0;right:0;z-index:calc(var(--fnon-z-modal) + 20);font-family:var(--fnon-font);background:var(--fnon-title-background, #ff6b6b);color:var(--fnon-title-color, #fff);box-shadow:0 4px 20px #0003;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s;opacity:0}.fnon-breaking.fnon-breaking-top{top:0;transform:translateY(-100%)}.fnon-breaking.fnon-breaking-bottom{bottom:0;transform:translateY(100%);box-shadow:0 -4px 20px #0003}.fnon-breaking.fnon-breaking-active{transform:translateY(0)!important;opacity:1}.fnon-breaking-inner{display:flex;align-items:center;gap:16px;padding:12px 20px;max-width:1100px;margin:0 auto;flex-wrap:wrap}.fnon-breaking-headline{font-weight:700;font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;background:#0003;padding:4px 10px;border-radius:4px;white-space:nowrap}.fnon-breaking-body{flex:1;font-size:.92rem;line-height:1.5}.fnon-breaking-buttons{display:flex;gap:6px}.fnon-breaking-buttons .fnon-btn{font-size:.78rem;padding:5px 14px}.fnon-breaking-close{background:none;border:none;color:inherit;cursor:pointer;padding:4px;opacity:.7;transition:opacity .15s;line-height:0}.fnon-breaking-close:hover{opacity:1}.fnon-breaking-close svg{width:18px;height:18px;fill:currentColor}.fnon-hint-container{position:fixed;z-index:var(--fnon-z-hint);pointer-events:none}.fnon-hint-container.right-top{top:16px;right:16px}.fnon-hint-container.right-center{top:50%;right:16px;transform:translateY(-50%)}.fnon-hint-container.right-bottom{bottom:16px;right:16px}.fnon-hint-container.left-top{top:16px;left:16px}.fnon-hint-container.left-center{top:50%;left:16px;transform:translateY(-50%)}.fnon-hint-container.left-bottom{bottom:16px;left:16px}.fnon-hint-container.center-top{top:16px;left:50%;transform:translate(-50%)}.fnon-hint-container.center-center{top:50%;left:50%;transform:translate(-50%,-50%)}.fnon-hint-container.center-bottom{bottom:16px;left:50%;transform:translate(-50%)}.fnon-hint{font-family:var(--fnon-font);display:flex;align-items:flex-start;gap:10px;padding:12px 16px;margin-bottom:8px;border-radius:8px;box-shadow:0 4px 14px #0000001a;pointer-events:all;max-width:360px;font-size:.88rem;line-height:1.5;transition:transform .3s ease,opacity .3s ease;opacity:0;transform:translate(40px)}.fnon-hint.fnon-hint-active{opacity:1;transform:translate(0)}.fnon-hint.fnon-hint-left-top,.fnon-hint.fnon-hint-left-center,.fnon-hint.fnon-hint-left-bottom{transform:translate(-40px)}.fnon-hint.fnon-hint-left-top.fnon-hint-active,.fnon-hint.fnon-hint-left-center.fnon-hint-active,.fnon-hint.fnon-hint-left-bottom.fnon-hint-active{transform:translate(0)}.fnon-hint.fnon-hint-right-top,.fnon-hint.fnon-hint-right-center,.fnon-hint.fnon-hint-right-bottom{transform:translate(40px)}.fnon-hint.fnon-hint-right-top.fnon-hint-active,.fnon-hint.fnon-hint-right-center.fnon-hint-active,.fnon-hint.fnon-hint-right-bottom.fnon-hint-active{transform:translate(0)}.fnon-hint.fnon-hint-center-top,.fnon-hint.fnon-hint-center-bottom,.fnon-hint.fnon-hint-center-center{transform:translateY(-20px)}.fnon-hint.fnon-hint-center-top.fnon-hint-active,.fnon-hint.fnon-hint-center-bottom.fnon-hint-active,.fnon-hint.fnon-hint-center-center.fnon-hint-active{transform:translateY(0)}.fnon-hint-icon{flex-shrink:0}.fnon-hint-icon svg{width:var(--fnon-icon-w, 20px);height:var(--fnon-icon-h, 20px);display:block}.fnon-hint-progress{position:absolute;bottom:0;left:0;height:3px;border-radius:0 0 0 8px;animation:fnon-hint-progress-shrink var(--display-dur, 4s) linear forwards}@keyframes fnon-hint-progress-shrink{0%{width:100%}to{width:0%}}.fnon-hint-content{flex:1;min-width:0}.fnon-hint-title{font-weight:600;font-size:.9rem;margin-bottom:2px}.fnon-hint-message{font-size:.85rem}.fnon-hint-close{background:none;border:none;cursor:pointer;padding:2px;opacity:.5;font-size:18px;line-height:1;transition:opacity .15s;color:inherit}.fnon-hint-close:hover{opacity:.8}.fnon-hint-close:focus-visible{outline:2px solid currentColor;outline-offset:2px}.fnon-wait-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--fnon-z-wait);background:#fff9;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s;pointer-events:none}.fnon-wait-overlay.fnon-wait-active{opacity:1;pointer-events:all}.fnon-wait-box{text-align:center;display:flex;flex-direction:column;align-items:center;gap:16px}.fnon-wait-text{font-family:var(--fnon-font);font-size:1rem;color:#2d3748;font-weight:500}.fnon-box-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffb3;display:flex;align-items:center;justify-content:center;z-index:10;border-radius:inherit}.fnon-box-inner{text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.fnon-box-label{font-family:var(--fnon-font);font-size:.85rem;color:#2d3748}.fnon-sp-orbit{--fnon-sp-size: 48px;width:var(--fnon-sp-size);height:var(--fnon-sp-size);position:relative}.fnon-sp-orbit-dot{position:absolute;width:100%;height:100%;border-radius:50%;border:3px solid transparent;border-top-color:var(--fnon-sp-color, #029eff);animation:fnon-spin .8s linear infinite}.fnon-sp-orbit-dot:after{content:"";position:absolute;top:4px;left:4px;right:4px;bottom:4px;border-radius:50%;border:3px solid transparent;border-bottom-color:var(--fnon-sp-color, #029eff);animation:fnon-spin .5s linear infinite reverse}.fnon-sp-pulse{--fnon-sp-size: 48px;display:flex;align-items:center;justify-content:center;gap:5px;height:var(--fnon-sp-size)}.fnon-sp-pulse-bar{width:5px;height:60%;background:var(--fnon-sp-color, #39DA8A);border-radius:3px;animation:fnon-pulse .6s ease-in-out infinite alternate}.fnon-sp-pulse-bar:nth-child(2){animation-delay:.2s;height:90%}.fnon-sp-pulse-bar:nth-child(3){animation-delay:.4s;height:60%}.fnon-sp-spin{--fnon-sp-size: 48px;width:var(--fnon-sp-size);height:var(--fnon-sp-size)}.fnon-sp-spin-ring{width:100%;height:100%;border:4px solid #e2e8f0;border-top-color:var(--fnon-sp-color, #029eff);border-radius:50%;animation:fnon-spin .75s linear infinite}@keyframes fnon-spin{to{transform:rotate(360deg)}}@keyframes fnon-pulse{0%{transform:scaleY(.6)}to{transform:scaleY(1)}}.fnon-modal-sm{max-width:360px}.fnon-modal-nl{max-width:480px}.fnon-modal-lg{max-width:640px}.fnon-modal-xl{max-width:800px}.fnon-modal-fl{position:fixed!important;top:0!important;right:0!important;bottom:0!important;left:0!important;max-width:none!important;width:100%!important;max-height:var(--fnon-fl-max-height, none)!important;height:100%!important;margin:0!important;border-radius:0!important;box-shadow:none!important}.fnon-hidden{display:none!important}.fnon-dp{font-family:var(--fnon-font, "Quicksand", sans-serif);-webkit-user-select:none;user-select:none;background:var(--dp-bg);--dp-accent: #029eff;--dp-bg: #fff;--dp-text: #2d3748;--dp-border: #e2e8f0;--dp-hover: #ebf8ff;--dp-other: #a0aec0;--dp-disabled: #e2e8f0;--dp-selected: #029eff;--dp-selected-text: #fff;--dp-range: #ebf8ff;--dp-popup-bg: #fff;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.12);--dp-today-ring: #029eff}.fnon-dp.fnon-dp-dark{--dp-bg: #0f172a;--dp-text: #e2e8f0;--dp-border: #334155;--dp-hover: #1e293b;--dp-other: #64748b;--dp-disabled: #334155;--dp-selected: #0284c7;--dp-selected-text: #fff;--dp-range: #1e3a5f;--dp-popup-bg: #1e293b;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.4);--dp-today-ring: #38bdf8}.fnon-dp-header{display:flex;align-items:center;gap:4px;padding:.75rem .75rem 0;position:relative}.fnon-dp-nav{background:none;border:1px solid var(--dp-border);border-radius:6px;width:32px;height:32px;font-size:1.2rem;cursor:pointer;color:var(--dp-text);display:flex;align-items:center;justify-content:center;transition:all .15s;flex-shrink:0;line-height:1}.fnon-dp-nav:hover{background:var(--dp-hover);border-color:var(--dp-accent);color:var(--dp-accent)}.fnon-dp-nav:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-nav.fnon-dp-nav-disabled{opacity:.25;cursor:not-allowed;pointer-events:none}.fnon-dp-label{flex:1;text-align:center;background:none;border:1px solid transparent;border-radius:6px;padding:.3rem .5rem;font-size:.9rem;font-weight:600;cursor:pointer;color:var(--dp-text);transition:all .15s;font-family:inherit}.fnon-dp-label:hover{background:var(--dp-hover);border-color:var(--dp-border)}.fnon-dp-label:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;padding:.5rem .75rem .25rem}.fnon-dp-dow{text-align:center;font-size:.65rem;font-weight:600;text-transform:uppercase;color:var(--dp-other);padding:.3rem 0;letter-spacing:.03em}.fnon-dp-day{text-align:center;padding:.4rem 0;font-size:.8rem;border-radius:6px;cursor:pointer;transition:all .12s;color:var(--dp-text);position:relative}.fnon-dp-day:hover:not(.fnon-dp-disabled):not(.fnon-dp-other){background:var(--dp-hover)}.fnon-dp-day:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-day.fnon-dp-other{color:var(--dp-other);cursor:default}.fnon-dp-day.fnon-dp-disabled{color:var(--dp-disabled);cursor:not-allowed}.fnon-dp-day.fnon-dp-today{font-weight:700;box-shadow:inset 0 0 0 1.5px var(--dp-today-ring)}.fnon-dp-day.fnon-dp-selected{background:var(--dp-selected);color:var(--dp-selected-text);font-weight:600;box-shadow:none}.fnon-dp-day.fnon-dp-range{background:var(--dp-range);border-radius:0}.fnon-dp-day.fnon-dp-range-start{background:var(--dp-selected);color:var(--dp-selected-text);border-radius:6px 0 0 6px;font-weight:600}.fnon-dp-day.fnon-dp-range-end{background:var(--dp-selected);color:var(--dp-selected-text);border-radius:0 6px 6px 0;font-weight:600}.fnon-dp-day.fnon-dp-range-preview{background:var(--dp-range);border-radius:0;opacity:.55}.fnon-dp-time{display:flex;align-items:center;gap:8px;padding:.25rem .75rem .5rem}.fnon-dp-time label{font-size:.75rem;font-weight:600;color:var(--dp-text)}.fnon-dp-time-input{font-family:inherit;font-size:.8rem;padding:.25rem .5rem;border:1px solid var(--dp-border);border-radius:5px;background:transparent;color:var(--dp-text);outline:none}.fnon-dp-time-input:focus{border-color:var(--dp-accent)}.fnon-dp-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;padding:.25rem .75rem .75rem}.fnon-dp-btn{font-family:inherit;font-size:.75rem;padding:.35rem .75rem;border:1px solid var(--dp-border);border-radius:6px;background:transparent;color:var(--dp-text);cursor:pointer;transition:all .15s}.fnon-dp-btn:hover{border-color:var(--dp-accent);color:var(--dp-accent);background:var(--dp-hover)}.fnon-dp-btn:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-btn.fnon-dp-btn-primary{background:var(--dp-selected);color:var(--dp-selected-text);border-color:var(--dp-selected)}.fnon-dp-btn.fnon-dp-btn-primary:hover{opacity:.88}.fnon-dp-popup{--dp-popup-bg: #fff;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.12);--dp-border: #e2e8f0;--dp-hover: #ebf8ff;--dp-accent: #029eff;--dp-text: #2d3748;--dp-selected: #029eff;--dp-selected-text: #fff;--dp-today-ring: #029eff;position:fixed;z-index:7000;background:var(--dp-popup-bg);border:1px solid var(--dp-border);border-radius:10px;box-shadow:var(--dp-popup-shadow);padding:.5rem;overflow:hidden;animation:fnon-dp-popup-in .15s ease-out}.fnon-dp-popup.fnon-dp-dark{--dp-popup-bg: #1e293b;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.4);--dp-border: #334155;--dp-hover: #1e293b;--dp-accent: #0284c7;--dp-text: #e2e8f0;--dp-selected: #0284c7;--dp-selected-text: #fff;--dp-today-ring: #38bdf8}@keyframes fnon-dp-popup-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}[dir=rtl] .fnon-hint-container.right-top,[dir=rtl] .fnon-hint-container.right-center,[dir=rtl] .fnon-hint-container.right-bottom{right:auto;left:16px}[dir=rtl] .fnon-hint-container.left-top,[dir=rtl] .fnon-hint-container.left-center,[dir=rtl] .fnon-hint-container.left-bottom{left:auto;right:16px}[dir=rtl] .fnon-hint{transform:translate(-40px)}[dir=rtl] .fnon-hint.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-left-top,[dir=rtl] .fnon-hint-left-center,[dir=rtl] .fnon-hint-left-bottom{transform:translate(40px)}[dir=rtl] .fnon-hint-left-top.fnon-hint-active,[dir=rtl] .fnon-hint-left-center.fnon-hint-active,[dir=rtl] .fnon-hint-left-bottom.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-right-top,[dir=rtl] .fnon-hint-right-center,[dir=rtl] .fnon-hint-right-bottom{transform:translate(-40px)}[dir=rtl] .fnon-hint-right-top.fnon-hint-active,[dir=rtl] .fnon-hint-right-center.fnon-hint-active,[dir=rtl] .fnon-hint-right-bottom.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-progress{left:auto;right:0;border-radius:0 0 8px}[dir=rtl] .fnon-modal-controls{margin-left:0;margin-right:12px}[dir=rtl] .fnon-dp-range-start{border-radius:0 6px 6px 0}[dir=rtl] .fnon-dp-range-end{border-radius:6px 0 0 6px}.fnon-dp-popup-row{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;margin-bottom:4px}.fnon-dp-popup-row:last-child{margin-bottom:0}.fnon-dp-popup-cell{text-align:center;padding:.4rem .2rem;font-size:.78rem;border-radius:6px;cursor:pointer;color:var(--dp-text);transition:all .1s}.fnon-dp-popup-cell:hover{background:var(--dp-hover);color:var(--dp-accent)}.fnon-dp-popup-cell.fnon-dp-popup-active{background:var(--dp-selected);color:var(--dp-selected-text);font-weight:600}.fnon-dp-popup-cell:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-popup-nav{display:flex;align-items:center;gap:4px;margin-bottom:6px}.fnon-dp-popup-nav-btn{background:none;border:1px solid var(--dp-border);border-radius:5px;width:28px;height:28px;font-size:1rem;line-height:1;padding:0;font-family:inherit;cursor:pointer;color:var(--dp-text);display:flex;align-items:center;justify-content:center;flex-shrink:0}.fnon-dp-popup-nav-btn:hover{background:var(--dp-hover);border-color:var(--dp-accent);color:var(--dp-accent)}.fnon-dp-popup-nav-btn:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-popup-nav-label{flex:1;text-align:center;font-size:.8rem;font-weight:600;color:var(--dp-text)}.fnon-cm{position:fixed;z-index:999999;min-width:180px;max-width:300px;max-height:min(100vh - 16px,420px);overflow-y:auto;background:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 16px #0000001f,0 1px 3px #00000014;padding:4px 0;font-family:inherit;font-size:13px;line-height:1.4;color:#1f2937;user-select:none;-webkit-user-select:none}.fnon-cm::-webkit-scrollbar{width:6px}.fnon-cm::-webkit-scrollbar-track{background:transparent}.fnon-cm::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.fnon-cm-dark{background:#1e293b;border-color:#334155;color:#e2e8f0}.fnon-cm-dark::-webkit-scrollbar-thumb{background:#475569}.fnon-cm-item{display:flex;align-items:center;padding:6px 16px;cursor:pointer;white-space:nowrap;gap:12px;outline:none}.fnon-cm-item:hover,.fnon-cm-item:focus-visible{background:#f3f4f6}.fnon-cm-item:focus-visible{outline:2px solid #029eff;outline-offset:-2px}.fnon-cm-dark .fnon-cm-item:hover,.fnon-cm-dark .fnon-cm-item:focus-visible{background:#334155}.fnon-cm-item-disabled{opacity:.4;cursor:default;pointer-events:none}.fnon-cm-item-text{flex:1;overflow:hidden;text-overflow:ellipsis}.fnon-cm-arrow{font-size:10px;color:#9ca3af;flex-shrink:0}.fnon-cm-dark .fnon-cm-arrow{color:#64748b}.fnon-cm-submenu{position:fixed;z-index:999999;max-width:320px;max-height:min(100vh - 16px,420px);min-width:180px}
1
+ :root{--fnon-font: "Quicksand", sans-serif;--fnon-z-overlay: 4080;--fnon-z-modal: 4050;--fnon-z-hint: 5000;--fnon-z-wait: 6000;--fnon-radius: 10px;--fnon-transition: .25s ease}.fnon-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--fnon-z-overlay);background:#0006;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity var(--fnon-transition);pointer-events:none}.fnon-overlay.fnon-active{opacity:1;pointer-events:all}.fnon-overlay-hidden{pointer-events:none!important;opacity:0!important}.fnon-overlay-nobg{background:transparent!important;pointer-events:none!important}.fnon-overlay-nobg>.fnon-modal{pointer-events:auto!important}.fnon-task-bar{position:fixed;bottom:0;left:0;right:0;z-index:calc(var(--fnon-z-modal) + 10);display:flex;align-items:center;gap:4px;padding:4px 8px;background:#2d3748;box-shadow:0 -2px 8px #0003;font-family:var(--fnon-font)}.fnon-task-bar-btn{font-family:var(--fnon-font);font-size:.78rem;padding:4px 12px;border:none;border-radius:4px;background:#ffffff26;color:#fff;cursor:pointer;transition:background .15s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.fnon-task-bar-btn:hover{background:#ffffff40}.fnon-modal{font-family:var(--fnon-font);background:var(--fnon-bg, #fff);border-radius:var(--fnon-radius);border:2px solid var(--fnon-title-background, #029eff);box-shadow:0 20px 60px #0003;max-width:480px;width:90%;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;transform:translateY(30px) scale(.97);transition:transform var(--fnon-transition),opacity var(--fnon-transition);opacity:0}.fnon-modal.fnon-active{transform:translateY(0) scale(1);opacity:1}.fnon-modal.fnon-minimized{display:none!important}.fnon-modal-title{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:var(--fnon-title-background, #029eff);color:var(--fnon-title-color, #fff);font-weight:600;font-size:1rem;-webkit-user-select:none;user-select:none;cursor:grab}.fnon-modal-title:active{cursor:grabbing}.fnon-dragging{transition:none!important}.fnon-dragging .fnon-modal-title{cursor:grabbing}.fnon-modal-title-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fnon-modal-controls{display:flex;align-items:center;gap:4px;margin-left:12px}.fnon-modal-controls button{background:none;border:none;color:inherit;cursor:pointer;padding:2px 6px;font-size:14px;line-height:1;border-radius:4px;opacity:.8;transition:opacity .15s}.fnon-modal-controls button:hover{opacity:1;background:#ffffff26}.fnon-modal-controls button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.fnon-modal-body{padding:20px;font-size:.95rem;line-height:1.6;color:#2d3748;overflow-y:auto;flex:1}.fnon-modal-footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid #e2e8f0}.fnon-btn{font-family:var(--fnon-font);font-size:.82rem;font-weight:600;padding:8px 20px;border:none;border-radius:6px;cursor:pointer;transition:opacity .15s,transform .1s}.fnon-btn:hover{opacity:.88;transform:translateY(-1px)}.fnon-btn:active{transform:translateY(0)}.fnon-btn:focus-visible{outline:2px solid #c53030;outline-offset:2px}.fnon-btn{background:var(--fnon-btn-ok-background, #029eff);color:var(--fnon-btn-ok-color, #fff);box-shadow:0 2px 6px #00000026}.fnon-btn-light{background:#f8f9fa;color:#2d3748;box-shadow:0 1px 3px #0000001a}.fnon-btn-light:focus-visible{outline:2px solid #029eff;outline-offset:2px}.fnon-btn-danger{background:#ff6b6b;color:#fff}.fnon-btn-success{background:#39da8a;color:#fff}.fnon-btn-warning{background:#fdd347;color:#2d3748}.fnon-btn-info{background:#48dbfb;color:#2d3748}.fnon-btn-dark{background:#222f3e;color:#fff}.fnon-breaking{position:fixed;left:0;right:0;z-index:calc(var(--fnon-z-modal) + 20);font-family:var(--fnon-font);background:var(--fnon-title-background, #ff6b6b);color:var(--fnon-title-color, #fff);box-shadow:0 4px 20px #0003;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s;opacity:0}.fnon-breaking.fnon-breaking-top{top:0;transform:translateY(-100%)}.fnon-breaking.fnon-breaking-bottom{bottom:0;transform:translateY(100%);box-shadow:0 -4px 20px #0003}.fnon-breaking.fnon-breaking-active{transform:translateY(0)!important;opacity:1}.fnon-breaking-inner{display:flex;align-items:center;gap:16px;padding:12px 20px;max-width:1100px;margin:0 auto;flex-wrap:wrap}.fnon-breaking-headline{font-weight:700;font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;background:#0003;padding:4px 10px;border-radius:4px;white-space:nowrap}.fnon-breaking-body{flex:1;font-size:.92rem;line-height:1.5}.fnon-breaking-buttons{display:flex;gap:6px}.fnon-breaking-buttons .fnon-btn{font-size:.78rem;padding:5px 14px}.fnon-breaking-close{background:none;border:none;color:inherit;cursor:pointer;padding:4px;opacity:.7;transition:opacity .15s;line-height:0}.fnon-breaking-close:hover{opacity:1}.fnon-breaking-close svg{width:18px;height:18px;fill:currentColor}.fnon-hint-container{position:fixed;z-index:var(--fnon-z-hint);pointer-events:none}.fnon-hint-container.right-top{top:16px;right:16px}.fnon-hint-container.right-center{top:50%;right:16px;transform:translateY(-50%)}.fnon-hint-container.right-bottom{bottom:16px;right:16px}.fnon-hint-container.left-top{top:16px;left:16px}.fnon-hint-container.left-center{top:50%;left:16px;transform:translateY(-50%)}.fnon-hint-container.left-bottom{bottom:16px;left:16px}.fnon-hint-container.center-top{top:16px;left:50%;transform:translate(-50%)}.fnon-hint-container.center-center{top:50%;left:50%;transform:translate(-50%,-50%)}.fnon-hint-container.center-bottom{bottom:16px;left:50%;transform:translate(-50%)}.fnon-hint{font-family:var(--fnon-font);display:flex;align-items:flex-start;gap:10px;padding:12px 16px;margin-bottom:8px;border-radius:8px;box-shadow:0 4px 14px #0000001a;pointer-events:all;max-width:360px;font-size:.88rem;line-height:1.5;transition:transform .3s ease,opacity .3s ease;opacity:0;transform:translate(40px)}.fnon-hint.fnon-hint-active{opacity:1;transform:translate(0)}.fnon-hint.fnon-hint-left-top,.fnon-hint.fnon-hint-left-center,.fnon-hint.fnon-hint-left-bottom{transform:translate(-40px)}.fnon-hint.fnon-hint-left-top.fnon-hint-active,.fnon-hint.fnon-hint-left-center.fnon-hint-active,.fnon-hint.fnon-hint-left-bottom.fnon-hint-active{transform:translate(0)}.fnon-hint.fnon-hint-right-top,.fnon-hint.fnon-hint-right-center,.fnon-hint.fnon-hint-right-bottom{transform:translate(40px)}.fnon-hint.fnon-hint-right-top.fnon-hint-active,.fnon-hint.fnon-hint-right-center.fnon-hint-active,.fnon-hint.fnon-hint-right-bottom.fnon-hint-active{transform:translate(0)}.fnon-hint.fnon-hint-center-top,.fnon-hint.fnon-hint-center-bottom,.fnon-hint.fnon-hint-center-center{transform:translateY(-20px)}.fnon-hint.fnon-hint-center-top.fnon-hint-active,.fnon-hint.fnon-hint-center-bottom.fnon-hint-active,.fnon-hint.fnon-hint-center-center.fnon-hint-active{transform:translateY(0)}.fnon-hint-icon{flex-shrink:0}.fnon-hint-icon svg{width:var(--fnon-icon-w, 20px);height:var(--fnon-icon-h, 20px);display:block}.fnon-hint-progress{position:absolute;bottom:0;left:0;height:3px;border-radius:0 0 0 8px;animation:fnon-hint-progress-shrink var(--display-dur, 4s) linear forwards}@keyframes fnon-hint-progress-shrink{0%{width:100%}to{width:0%}}.fnon-hint-content{flex:1;min-width:0}.fnon-hint-title{font-weight:600;font-size:.9rem;margin-bottom:2px}.fnon-hint-message{font-size:.85rem}.fnon-hint-close{background:none;border:none;cursor:pointer;padding:2px;opacity:.5;font-size:18px;line-height:1;transition:opacity .15s;color:inherit}.fnon-hint-close:hover{opacity:.8}.fnon-hint-close:focus-visible{outline:2px solid currentColor;outline-offset:2px}.fnon-wait-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--fnon-z-wait);background:#fff9;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s;pointer-events:none}.fnon-wait-overlay.fnon-wait-active{opacity:1;pointer-events:all}.fnon-wait-box{text-align:center;display:flex;flex-direction:column;align-items:center;gap:16px}.fnon-wait-text{font-family:var(--fnon-font);font-size:1rem;color:#2d3748;font-weight:500}.fnon-box-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffb3;display:flex;align-items:center;justify-content:center;z-index:10;border-radius:inherit}.fnon-box-inner{text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.fnon-box-label{font-family:var(--fnon-font);font-size:.85rem;color:#2d3748}.fnon-sp-orbit{--fnon-sp-size: 48px;width:var(--fnon-sp-size);height:var(--fnon-sp-size);position:relative}.fnon-sp-orbit-dot{position:absolute;width:100%;height:100%;border-radius:50%;border:3px solid transparent;border-top-color:var(--fnon-sp-color, #029eff);animation:fnon-spin .8s linear infinite}.fnon-sp-orbit-dot:after{content:"";position:absolute;top:4px;left:4px;right:4px;bottom:4px;border-radius:50%;border:3px solid transparent;border-bottom-color:var(--fnon-sp-color, #029eff);animation:fnon-spin .5s linear infinite reverse}.fnon-sp-pulse{--fnon-sp-size: 48px;display:flex;align-items:center;justify-content:center;gap:5px;height:var(--fnon-sp-size)}.fnon-sp-pulse-bar{width:5px;height:60%;background:var(--fnon-sp-color, #39DA8A);border-radius:3px;animation:fnon-pulse .6s ease-in-out infinite alternate}.fnon-sp-pulse-bar:nth-child(2){animation-delay:.2s;height:90%}.fnon-sp-pulse-bar:nth-child(3){animation-delay:.4s;height:60%}.fnon-sp-spin{--fnon-sp-size: 48px;width:var(--fnon-sp-size);height:var(--fnon-sp-size)}.fnon-sp-spin-ring{width:100%;height:100%;border:4px solid #e2e8f0;border-top-color:var(--fnon-sp-color, #029eff);border-radius:50%;animation:fnon-spin .75s linear infinite}@keyframes fnon-spin{to{transform:rotate(360deg)}}@keyframes fnon-pulse{0%{transform:scaleY(.6)}to{transform:scaleY(1)}}.fnon-modal-sm{max-width:360px}.fnon-modal-nl{max-width:480px}.fnon-modal-lg{max-width:640px}.fnon-modal-xl{max-width:800px}.fnon-modal-fl{position:fixed!important;top:0!important;right:0!important;bottom:0!important;left:0!important;max-width:none!important;width:100%!important;max-height:var(--fnon-fl-max-height, none)!important;height:100%!important;margin:0!important;border-radius:0!important;box-shadow:none!important}.fnon-hidden{display:none!important}.fnon-dp{font-family:var(--fnon-font, "Quicksand", sans-serif);-webkit-user-select:none;user-select:none;background:var(--dp-bg);--dp-accent: #029eff;--dp-bg: #fff;--dp-text: #2d3748;--dp-border: #e2e8f0;--dp-hover: #ebf8ff;--dp-other: #a0aec0;--dp-disabled: #e2e8f0;--dp-selected: #029eff;--dp-selected-text: #fff;--dp-range: #ebf8ff;--dp-popup-bg: #fff;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.12);--dp-today-ring: #029eff}.fnon-dp.fnon-dp-dark{--dp-bg: #0f172a;--dp-text: #e2e8f0;--dp-border: #334155;--dp-hover: #1e293b;--dp-other: #64748b;--dp-disabled: #334155;--dp-selected: #0284c7;--dp-selected-text: #fff;--dp-range: #1e3a5f;--dp-popup-bg: #1e293b;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.4);--dp-today-ring: #38bdf8}.fnon-dp-header{display:flex;align-items:center;gap:4px;padding:.75rem .75rem 0;position:relative}.fnon-dp-nav{background:none;border:1px solid var(--dp-border);border-radius:6px;width:32px;height:32px;font-size:1.2rem;cursor:pointer;color:var(--dp-text);display:flex;align-items:center;justify-content:center;transition:all .15s;flex-shrink:0;line-height:1}.fnon-dp-nav:hover{background:var(--dp-hover);border-color:var(--dp-accent);color:var(--dp-accent)}.fnon-dp-nav:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-nav.fnon-dp-nav-disabled{opacity:.25;cursor:not-allowed;pointer-events:none}.fnon-dp-label{flex:1;text-align:center;background:none;border:1px solid transparent;border-radius:6px;padding:.3rem .5rem;font-size:.9rem;font-weight:600;cursor:pointer;color:var(--dp-text);transition:all .15s;font-family:inherit}.fnon-dp-label:hover{background:var(--dp-hover);border-color:var(--dp-border)}.fnon-dp-label:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;padding:.5rem .75rem .25rem}.fnon-dp-dow{text-align:center;font-size:.65rem;font-weight:600;text-transform:uppercase;color:var(--dp-other);padding:.3rem 0;letter-spacing:.03em}.fnon-dp-day{text-align:center;padding:.4rem 0;font-size:.8rem;border-radius:6px;cursor:pointer;transition:all .12s;color:var(--dp-text);position:relative}.fnon-dp-day:hover:not(.fnon-dp-disabled):not(.fnon-dp-other){background:var(--dp-hover)}.fnon-dp-day:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-day.fnon-dp-other{color:var(--dp-other);cursor:default}.fnon-dp-day.fnon-dp-disabled{color:var(--dp-disabled);cursor:not-allowed}.fnon-dp-day.fnon-dp-today{font-weight:700;box-shadow:inset 0 0 0 1.5px var(--dp-today-ring)}.fnon-dp-day.fnon-dp-selected{background:var(--dp-selected);color:var(--dp-selected-text);font-weight:600;box-shadow:none}.fnon-dp-day.fnon-dp-range{background:var(--dp-range);border-radius:0}.fnon-dp-day.fnon-dp-range-start{background:var(--dp-selected);color:var(--dp-selected-text);border-radius:6px 0 0 6px;font-weight:600}.fnon-dp-day.fnon-dp-range-end{background:var(--dp-selected);color:var(--dp-selected-text);border-radius:0 6px 6px 0;font-weight:600}.fnon-dp-day.fnon-dp-range-preview{background:var(--dp-range);border-radius:0;opacity:.55}.fnon-dp-time{display:flex;align-items:center;gap:8px;padding:.25rem .75rem .5rem}.fnon-dp-time label{font-size:.75rem;font-weight:600;color:var(--dp-text)}.fnon-dp-time-input{font-family:inherit;font-size:.8rem;padding:.25rem .5rem;border:1px solid var(--dp-border);border-radius:5px;background:transparent;color:var(--dp-text);outline:none}.fnon-dp-time-input:focus{border-color:var(--dp-accent)}.fnon-dp-actions{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:6px;padding:.25rem .75rem .75rem}.fnon-dp-btn-group{display:flex}.fnon-dp-btn-group>.fnon-dp-btn{border-radius:0;margin-left:-1px}.fnon-dp-btn-group>.fnon-dp-btn:first-child{margin-left:0;border-radius:6px 0 0 6px}.fnon-dp-btn-group>.fnon-dp-btn:last-child{border-radius:0 6px 6px 0}.fnon-dp-btn-group>.fnon-dp-btn:hover{z-index:1;position:relative}.fnon-dp-btn{font-family:inherit;font-size:.75rem;padding:.35rem .75rem;border:1px solid var(--dp-border);border-radius:6px;background:transparent;color:var(--dp-text);cursor:pointer;transition:all .15s}.fnon-dp-btn:hover{border-color:var(--dp-accent);color:var(--dp-accent);background:var(--dp-hover)}.fnon-dp-btn:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-btn{z-index:0}.fnon-dp-btn.fnon-dp-btn-primary{background:var(--dp-selected);color:var(--dp-selected-text);border-color:var(--dp-selected)}.fnon-dp-btn.fnon-dp-btn-primary:hover{opacity:.88}.fnon-dp-btn.fnon-dp-nav-disabled{opacity:.35;cursor:not-allowed;pointer-events:none}.fnon-dp-months{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding:.35rem .6rem .25rem}.fnon-dp-month{border:1px solid var(--dp-border);border-radius:8px;padding:.35rem .25rem;background:var(--dp-bg)}.fnon-dp-month-name{text-align:center;font-weight:600;font-size:.75rem;padding:.2rem 0 .25rem;color:var(--dp-text)}.fnon-dp-month .fnon-dp-grid{gap:1px;padding:.15rem .15rem .1rem}.fnon-dp-month .fnon-dp-dow{font-size:.55rem;padding:.15rem 0}.fnon-dp-month .fnon-dp-day{padding:.25rem 0;font-size:.7rem}.fnon-dp-layout-auto .fnon-dp-month{display:none}.fnon-dp-layout-auto .fnon-dp-month:first-child{display:block}@media(min-width:768px){.fnon-dp-layout-auto .fnon-dp-month{display:block}.fnon-dp-layout-auto.fnon-dp-months{grid-template-columns:repeat(3,1fr)}}.fnon-dp-popup{--dp-popup-bg: #fff;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.12);--dp-border: #e2e8f0;--dp-hover: #ebf8ff;--dp-accent: #029eff;--dp-text: #2d3748;--dp-selected: #029eff;--dp-selected-text: #fff;--dp-today-ring: #029eff;position:fixed;z-index:7000;background:var(--dp-popup-bg);border:1px solid var(--dp-border);border-radius:10px;box-shadow:var(--dp-popup-shadow);padding:.5rem;overflow:hidden;animation:fnon-dp-popup-in .15s ease-out}.fnon-dp-popup.fnon-dp-dark{--dp-popup-bg: #1e293b;--dp-popup-shadow: 0 8px 25px rgba(0,0,0,.4);--dp-border: #334155;--dp-hover: #1e293b;--dp-accent: #0284c7;--dp-text: #e2e8f0;--dp-selected: #0284c7;--dp-selected-text: #fff;--dp-today-ring: #38bdf8}@keyframes fnon-dp-popup-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}[dir=rtl] .fnon-hint-container.right-top,[dir=rtl] .fnon-hint-container.right-center,[dir=rtl] .fnon-hint-container.right-bottom{right:auto;left:16px}[dir=rtl] .fnon-hint-container.left-top,[dir=rtl] .fnon-hint-container.left-center,[dir=rtl] .fnon-hint-container.left-bottom{left:auto;right:16px}[dir=rtl] .fnon-hint{transform:translate(-40px)}[dir=rtl] .fnon-hint.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-left-top,[dir=rtl] .fnon-hint-left-center,[dir=rtl] .fnon-hint-left-bottom{transform:translate(40px)}[dir=rtl] .fnon-hint-left-top.fnon-hint-active,[dir=rtl] .fnon-hint-left-center.fnon-hint-active,[dir=rtl] .fnon-hint-left-bottom.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-right-top,[dir=rtl] .fnon-hint-right-center,[dir=rtl] .fnon-hint-right-bottom{transform:translate(-40px)}[dir=rtl] .fnon-hint-right-top.fnon-hint-active,[dir=rtl] .fnon-hint-right-center.fnon-hint-active,[dir=rtl] .fnon-hint-right-bottom.fnon-hint-active{transform:translate(0)}[dir=rtl] .fnon-hint-progress{left:auto;right:0;border-radius:0 0 8px}[dir=rtl] .fnon-modal-controls{margin-left:0;margin-right:12px}[dir=rtl] .fnon-dp-range-start{border-radius:0 6px 6px 0}[dir=rtl] .fnon-dp-range-end{border-radius:6px 0 0 6px}.fnon-dp-popup-row{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;margin-bottom:4px}.fnon-dp-popup-row:last-child{margin-bottom:0}.fnon-dp-popup-cell{text-align:center;padding:.4rem .2rem;font-size:.78rem;border-radius:6px;cursor:pointer;color:var(--dp-text);transition:all .1s}.fnon-dp-popup-cell:hover{background:var(--dp-hover);color:var(--dp-accent)}.fnon-dp-popup-cell.fnon-dp-popup-active{background:var(--dp-selected);color:var(--dp-selected-text);font-weight:600}.fnon-dp-popup-cell:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-popup-nav{display:flex;align-items:center;gap:4px;margin-bottom:6px}.fnon-dp-popup-nav-btn{background:none;border:1px solid var(--dp-border);border-radius:5px;width:28px;height:28px;font-size:1rem;line-height:1;padding:0;font-family:inherit;cursor:pointer;color:var(--dp-text);display:flex;align-items:center;justify-content:center;flex-shrink:0}.fnon-dp-popup-nav-btn:hover{background:var(--dp-hover);border-color:var(--dp-accent);color:var(--dp-accent)}.fnon-dp-popup-nav-btn:focus-visible{outline:2px solid var(--dp-accent);outline-offset:1px}.fnon-dp-popup-nav-label{flex:1;text-align:center;font-size:.8rem;font-weight:600;color:var(--dp-text)}.fnon-cm{position:fixed;z-index:999999;min-width:180px;max-width:300px;max-height:min(100vh - 16px,420px);overflow-y:auto;background:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 16px #0000001f,0 1px 3px #00000014;padding:4px 0;font-family:inherit;font-size:13px;line-height:1.4;color:#1f2937;user-select:none;-webkit-user-select:none}.fnon-cm::-webkit-scrollbar{width:6px}.fnon-cm::-webkit-scrollbar-track{background:transparent}.fnon-cm::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.fnon-cm-dark{background:#1e293b;border-color:#334155;color:#e2e8f0}.fnon-cm-dark::-webkit-scrollbar-thumb{background:#475569}.fnon-cm-item{display:flex;align-items:center;padding:6px 16px;cursor:pointer;white-space:nowrap;gap:12px;outline:none}.fnon-cm-item:hover,.fnon-cm-item:focus-visible{background:#f3f4f6}.fnon-cm-item:focus-visible{outline:2px solid #029eff;outline-offset:-2px}.fnon-cm-dark .fnon-cm-item:hover,.fnon-cm-dark .fnon-cm-item:focus-visible{background:#334155}.fnon-cm-item-disabled{opacity:.4;cursor:default;pointer-events:none}.fnon-cm-item-text{flex:1;overflow:hidden;text-overflow:ellipsis}.fnon-cm-arrow{font-size:10px;color:#9ca3af;flex-shrink:0}.fnon-cm-dark .fnon-cm-arrow{color:#64748b}.fnon-cm-submenu{position:fixed;z-index:999999;max-width:320px;max-height:min(100vh - 16px,420px);min-width:180px}
package/fnon.min.js CHANGED
@@ -1 +1 @@
1
- var Fnon=(function(){"use strict";function x(e){typeof console<"u"&&console.error("[Fnon]",e)}function ce(e){return typeof e=="string"?document.querySelector(e):e instanceof HTMLElement?e:null}function we(e){return typeof e=="string"?e:e instanceof HTMLElement?e.outerHTML:String(e)}function de(e){const t=document.createElement("div");t.style.color=e,document.body.appendChild(t);const n=getComputedStyle(t).color;document.body.removeChild(t);const o=n.match(/rgb(a)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return o?{r:+o[2],g:+o[3],b:+o[4]}:null}function He(e,t){const n=de(e);if(!n)return e;const o=1-t;return`rgb(${n.r*o|0},${n.g*o|0},${n.b*o|0})`}function yn(e,t){const n=de(e);if(!n)return e;const o=1-t;return`rgb(${255-(255-n.r)*o|0},${255-(255-n.g)*o|0},${255-(255-n.b)*o|0})`}function xe(e,t=4){if(t===4)return de(e)?[e,yn(e,.3),He(e,.15),He(e,.3)]:[e,e,e,e];const n=de(e);if(!n)return Array(t).fill(e);const o=[e];let r=n.r,a=n.g,s=n.b;for(let i=0;i<t-1;i++)r=Math.max(0,r-33),a=Math.max(0,a-33),s=Math.max(0,s-33),o.push(`rgb(${r},${a},${s})`);return o}function Oe(){return"&times;"}function kn(e){const t=e.replace("#","");let n,o,r;if(t.length===3)n=parseInt(t[0]+t[0],16),o=parseInt(t[1]+t[1],16),r=parseInt(t[2]+t[2],16);else if(t.length===6)n=parseInt(t.substring(0,2),16),o=parseInt(t.substring(2,4),16),r=parseInt(t.substring(4,6),16);else return"#2d3748";return(.299*n+.587*o+.114*r)/255>.55?"#2d3748":"#fff"}const fe={Primary:{titleBackground:"#029eff",titleColor:"#fff",btnOkBackground:"#029eff",btnOkColor:"#fff",btnOkBorderColor:"#029eff",backgroundColor:"#fff"},Success:{titleBackground:"#39DA8A",titleColor:"#fff",btnOkBackground:"#39DA8A",btnOkColor:"#fff",btnOkBorderColor:"#39DA8A",backgroundColor:"#fff"},Warning:{titleBackground:"#fdd347",titleColor:"#2d3748",btnOkBackground:"#fdd347",btnOkColor:"#2d3748",btnOkBorderColor:"#fdd347",backgroundColor:"#fff"},Danger:{titleBackground:"#ff6b6b",titleColor:"#fff",btnOkBackground:"#ff6b6b",btnOkColor:"#fff",btnOkBorderColor:"#ff6b6b",backgroundColor:"#fff"},Info:{titleBackground:"#48dbfb",titleColor:"#2d3748",btnOkBackground:"#48dbfb",btnOkColor:"#2d3748",btnOkBorderColor:"#48dbfb",backgroundColor:"#fff"},Light:{titleBackground:"#f8f9fa",titleColor:"#2d3748",btnOkBackground:"#f8f9fa",btnOkColor:"#2d3748",btnOkBorderColor:"#ced4da",backgroundColor:"#fff"},Dark:{titleBackground:"#222f3e",titleColor:"#fff",btnOkBackground:"#222f3e",btnOkColor:"#fff",btnOkBorderColor:"#222f3e",backgroundColor:"#fff"}};let ue={};function Cn(e,t){ue[e]={...ue[e],...t}}function Ye(e){return ue[e]?{...fe[e],...ue[e]}:fe[e]?fe[e]:null}function qe(e){const t=Ye(e)||fe.Primary,n=[];for(const[a,s]of Object.entries(t)){const i=a.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(`--fnon-${i}: ${s};`)}const o=t.titleBackground||"#029eff",r=xe(o);return n.push(`--fnon-title-shade-light: ${r[1]};`),n.push(`--fnon-title-shade-dark: ${r[2]};`),n.push(`--fnon-title-shade-border: ${r[3]};`),n.join(" ")}let Le=null;const U=[],Me=new Map;function wn(e){Le=e}function ze(e,t,n){if(!Le)return!1;try{return Le(e,t,n)===!0}catch(o){return x(`Renderer failed: ${o}`),!1}}function xn(e,t){U.push({modalId:e,fn:t})}function Ln(e,t){Me.set(e,t)}function Mn(e){const t=Me.get(e);return Me.delete(e),t}function je(e){for(let n=U.length-1;n>=0;n--)if(U[n].modalId===e){try{U[n].fn()}catch(o){x(`Cleanup failed: ${o}`)}U.splice(n,1)}const t=Mn(e);if(t&&typeof t.unmount=="function")try{t.unmount()}catch{}}function En(e){if(!e)return"";if(e instanceof HTMLElement)return e.textContent||"";if(typeof e=="string")return e.replace(/<[^>]*>/g,"");const t=e;return typeof t.innerHTML=="string"?t.innerHTML.replace(/<[^>]*>/g,""):String(e)}let Sn=0;const $=[],H=new Map,V=new Map,O=new Map,X=new Map,Dn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Tn(e,t,n){const o=document.activeElement,r=a=>{if(a.key!=="Tab")return;const s=t.querySelectorAll(Dn);if(s.length===0)return;const i=s[0],u=s[s.length-1];a.shiftKey?document.activeElement===i&&(a.preventDefault(),u.focus()):document.activeElement===u&&(a.preventDefault(),i.focus())};n.addEventListener("keydown",r),X.set(e,{previousFocus:o,handler:r})}function Nn(e){const t=X.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.removeEventListener("keydown",t.handler),t.previousFocus&&typeof t.previousFocus.focus=="function"&&t.previousFocus.focus(),X.delete(e)}function Bn(e){const t=X.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.removeEventListener("keydown",t.handler)}function We(e){const t=X.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.addEventListener("keydown",t.handler)}const Q="fnon-task-bar";function An(){let e=document.getElementById(Q);return e||(e=document.createElement("div"),e.id=Q,e.className="fnon-task-bar",document.body.appendChild(e)),e}function In(e,t,n,o){const r=An(),a=document.createElement("button");a.className="fnon-task-bar-btn",a.textContent=t||"Minimized",a.dataset.modalId=e,a.addEventListener("click",()=>{if(n.classList.remove("fnon-minimized"),o.classList.remove("fnon-overlay-hidden"),We(e),o.parentNode.appendChild(o),a.remove(),O.delete(e),O.size===0){const i=document.getElementById(Q);i&&i.remove()}const s=H.get(e);me(n,o,s==null?void 0:s.showMaxMin)}),r.appendChild(a)}function Fn(){const e=document.getElementById(Q);e&&O.size===0&&e.remove()}function Pn(){const e=document.getElementById(Q);return!e||e.children.length===0?0:e.getBoundingClientRect().height}function me(e,t,n){if(!e.classList.contains("fnon-modal-fl")){e.style.removeProperty("--fnon-fl-max-height");return}if(n){const r=Pn();r>0?e.style.setProperty("--fnon-fl-max-height",`calc(100vh - ${r}px)`):e.style.removeProperty("--fnon-fl-max-height")}else e.style.removeProperty("--fnon-fl-max-height")}function Ke(){return`fnon-modal-${++Sn}`}const Rn={closeButton:!0,autoFocus:!1,autoFocusTag:"input:not([disabled])",autoFocusDelay:0,focusTrap:!0,appendTarget:"body",layout:"hbf",fontFamily:"'Quicksand', sans-serif",animation:"slide-top",color:"#2b2b2b",background:"rgba(0, 0, 0, 0.4)",zIndex:4e3,showIcon:!1,delButtons:!1};function _n(e,t){let n=!1,o=0,r=0,a=0,s=0,i=0;function u(){return e.closest('[dir="rtl"]')!==null||document.documentElement.dir==="rtl"}t.addEventListener("mousedown",l=>{if(e.classList.contains("fnon-modal-fl"))return;n=!0,o=l.clientX,r=l.clientY;const c=e.getBoundingClientRect();a=c.left,i=c.right,s=c.top,e.style.position="fixed",e.style.margin="0",e.style.bottom="auto",u()?(e.style.right=window.innerWidth-i+"px",e.style.left="auto"):(e.style.left=a+"px",e.style.right="auto"),e.style.top=s+"px",e.classList.add("fnon-dragging"),l.preventDefault()}),document.addEventListener("mousemove",l=>{if(!n)return;const c=l.clientX-o,d=l.clientY-r;u()?e.style.right=window.innerWidth-i-c+"px":e.style.left=a+c+"px",e.style.top=s+d+"px"}),document.addEventListener("mouseup",()=>{n&&(n=!1,e.classList.remove("fnon-dragging"))})}function Y(e,t){const n={...Rn,...t},o=Ke();n.showClose!==void 0&&(n.closeButton=n.showClose),H.set(o,n);const r=n.data||{};r.__modalId=o,V.set(o,r);let a;n.appendTarget?(a=ce(n.appendTarget),a||(x(`appendTarget "${n.appendTarget}" not found; falling back to body`),a=document.body)):a=document.body;const s=document.createElement("div");s.className="fnon-overlay",s.dataset.modalId=o,n.zIndex&&(s.style.zIndex=String(n.zIndex)),n.background&&(s.style.background=n.background),n.dir&&(s.dir=n.dir);const i=document.createElement("div");i.className=`fnon-modal fnon-theme-${e.toLowerCase()}`,i.dataset.modalId=o,i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),n.fontFamily&&(i.style.fontFamily=n.fontFamily),n.width&&i.classList.add(`fnon-modal-${n.width.toLowerCase()}`);let u=qe(e);n.titleColor&&(u+=` --fnon-title-color: ${n.titleColor};`),n.titleBackground&&(u+=` --fnon-title-background: ${n.titleBackground};`),n.color&&(u+=` --fnon-body-color: ${n.color};`),i.setAttribute("style",u);const l=document.createElement("div");l.className="fnon-modal-title",n.titleBackground&&(l.style.background=n.titleBackground),n.titleColor&&(l.style.color=n.titleColor);const c=document.createElement("span");c.className="fnon-modal-title-text",n.title instanceof HTMLElement?c.appendChild(n.title):n.title!==void 0&&n.title!==null&&(c.innerHTML=we(n.title)),l.appendChild(c);const d=document.createElement("div");d.className="fnon-modal-controls";const f=[];if(n.showMin){const p=document.createElement("button");p.className="fnon-btn-min",p.innerHTML="_",p.title="Minimize",p.addEventListener("click",()=>{const h=i.classList.contains("fnon-minimized");if(i.classList.toggle("fnon-minimized"),s.classList.toggle("fnon-overlay-hidden"),!h)Bn(o),O.set(o,{modalEl:i,title:n.title||""}),In(o,En(n.title)||"",i,s);else{if(We(o),s.parentNode.appendChild(s),O.get(o)){const W=document.querySelector(`.fnon-task-bar-btn[data-modal-id="${o}"]`);W&&W.remove(),O.delete(o),Fn()}me(i,s,n.showMaxMin)}}),f.push(p)}if(n.showMaxMin){const p=document.createElement("button");p.className="fnon-btn-max",p.innerHTML="⛶",p.title="Maximize",p.addEventListener("click",()=>{n.width==="fl"?(i.classList.toggle("fnon-modal-fl"),i.classList.toggle("fnon-modal-xl")):i.classList.toggle("fnon-modal-fl"),me(i,s,n.showMaxMin),i.classList.remove("fnon-minimized"),s.classList.remove("fnon-overlay-hidden")}),f.push(p)}if(n.closeButton!==!1){const p=document.createElement("button");p.className="fnon-btn-close",p.innerHTML=Oe(),p.title="Close",p.addEventListener("click",()=>q(o)),f.push(p)}n.dir==="rtl"&&f.reverse(),f.forEach(p=>d.appendChild(p)),l.appendChild(d);const m=document.createElement("div");if(m.className="fnon-modal-body",n.color&&(m.style.color=n.color),n.showIcon&&n.icon){const p=document.createElement("div");p.className="fnon-modal-icon",p.innerHTML=n.icon,n.iconColor&&(p.style.color=n.iconColor),m.appendChild(p)}const g={id:o,theme:e};n.message!==void 0&&n.message!==null&&(ze(n.message,m,g)||(m.innerHTML=we(n.message)));const b=document.createElement("div");if(n.buttons&&n.buttons.length>0&&!n.delButtons){b.className="fnon-modal-footer";for(const p of n.buttons){const h=Ge(p,o,m,r);b.appendChild(h)}}if(typeof n.isDark=="function"?n.isDark():n.isDark){const p=n.darkBgColor||"#1a202c";i.style.setProperty("--fnon-bg",p),m.style.background=p,b.style.background=p,b.style.borderTopColor="#2d3748",t.color||(m.style.color="#e2e8f0")}const w={h:l,b:m,f:b},k=(n.layout||"hbf").toLowerCase().replace(/[^hbf]/g,"");if(k&&k!=="hbf"){const p=new Set;for(const h of k)!p.has(h)&&w[h]&&(i.appendChild(w[h]),p.add(h));for(const h of"hbf")!p.has(h)&&w[h]&&i.appendChild(w[h])}else i.appendChild(l),i.appendChild(m),i.appendChild(b);if(s.appendChild(i),me(i,s,n.showMaxMin),n.overlay===!1&&(s.classList.add("fnon-overlay-nobg"),i.addEventListener("mousedown",p=>{p.target.closest("button, input, textarea, select, a, [tabindex]")||s.parentNode.appendChild(s)})),_n(i,l),n.onInit&&n.onInit(i,r),n.defaultBefore&&n.defaultBefore(i,r),n.beforeShow&&n.beforeShow(i,r),a.appendChild(s),n.defaultAfter&&n.defaultAfter(i,r),n.afterShow&&n.afterShow(i,r),requestAnimationFrame(()=>{s.classList.add("fnon-active"),i.classList.add("fnon-active")}),n.autoFocus){const p=n.autoFocusTag||"button",h=n.autoFocusDelay||0;requestAnimationFrame(()=>{const S=i.querySelector(p);S&&(h>0?setTimeout(()=>S.focus(),h):S.focus())})}return n.focusTrap!==!1&&Tn(o,i,s),n.onOpen&&n.onOpen(i,r),$.push(s),{close:()=>q(o),modalEl:i,id:o}}function q(e){const t=H.get(e),n=V.get(e)||{},o=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);if(!o){H.delete(e),V.delete(e),x(`Modal ${e} not found in DOM`);return}const r=o.querySelector(".fnon-modal");t!=null&&t.onClosing&&r&&t.onClosing(r,n),Nn(e),je(e),o.classList.remove("fnon-active"),r&&r.classList.remove("fnon-active"),t!=null&&t.onClose&&t.onClose(n),setTimeout(()=>{o.parentNode&&o.parentNode.removeChild(o),t!=null&&t.onClosed&&t.onClosed(n),H.delete(e),V.delete(e)},300);const a=$.indexOf(o);a!==-1&&$.splice(a,1)}function $n(){if($.length===0)return;const t=$[$.length-1].dataset.modalId;t&&q(t)}function Ge(e,t,n,o){var s;const r=document.createElement("button");r.className=`fnon-btn fnon-btn-${((s=e.style)==null?void 0:s.toLowerCase())||"light"}`,e.css&&(r.className+=" "+e.css),r.textContent=e.text,e.color&&(r.style.color=e.color),e.background&&(r.style.background=e.background);const a=e.boxShadow||e.shadow;return a&&(r.style.boxShadow=a),e.borderColor&&(r.style.borderColor=e.borderColor),e.callback?r.addEventListener("click",()=>{let i=!1;e.callback(()=>{i=!0,q(t)},n,o)!==!1&&(i||q(t))}):r.addEventListener("click",()=>q(t)),r}function Hn(e,t){let n,o;if(typeof e=="string"){n=e;const l=document.querySelector(`.fnon-overlay[data-modal-id="${n}"]`);if(!l)return x(`addModalButton: modal "${n}" not found`),null;if(o=l.querySelector(".fnon-modal"),!o)return x(`addModalButton: modal element for "${n}" not found`),null}else if(o=e,n=o.dataset.modalId||"",!n)return x("addModalButton: HTMLElement has no data-modal-id"),null;const r=H.get(n);if(!r)return x(`addModalButton: options for modal "${n}" not found`),null;let a=o.querySelector(".fnon-modal-footer");if(!a){if(a=document.createElement("div"),a.className="fnon-modal-footer",typeof r.isDark=="function"?r.isDark():r.isDark){const c=r.darkBgColor||"#1a202c";a.style.background=c,a.style.borderTopColor="#2d3748"}o.appendChild(a)}const s=o.querySelector(".fnon-modal-body"),i=V.get(n)||{},u=Ge(t,n,s,i);return a.appendChild(u),u}document.addEventListener("keydown",e=>{e.key==="Escape"&&$n()});const Ee={};function D(e){const t=function(n,o,r,a,s){let i;if(typeof n=="object"?(i={...Ee,...n},o!==void 0&&(i.title=o)):(i={...Ee,message:n,title:o||""},r!==void 0&&(i.btnOkText=r),s!==void 0&&(i.onClose=s)),!i.buttons||i.buttons.length===0){const u=a||i.callback,l=i.btnOkText||"OK",c=i.btnOkShadow;i.buttons=[{text:l,style:e,color:i.btnOkColor,background:i.btnOkBackground,boxShadow:c,shadow:c,borderColor:i.btnOkBorderColor,callback:d=>{u&&u(),d()}}]}Y(e,i)};return t.Async=function(n,o,r){return new Promise(a=>{const s=()=>a();typeof n=="object"?(n.callback=s,n.onClose=s,t(n,o,r)):t(n,o,r,s,s)})},t}const pe={Primary:D("Primary"),Success:D("Success"),Warning:D("Warning"),Danger:D("Danger"),Info:D("Info"),Light:D("Light"),Dark:D("Dark"),Init(e){Object.assign(Ee,e)}},Se={};function T(e){const t=function(n,o,r,a,s,i,u){let l,c;if(typeof n=="object"?(l={...Se,...n},o!==void 0&&(l.title=o),c=i||l.cancelCallback):(l={...Se,message:n,title:o||""},r!==void 0&&(l.btnOkText=r),a!==void 0&&(l.btnCancelText=a),c=i,u!==void 0&&(l.onClose=u)),!l.buttons||l.buttons.length===0){const d=s||l.callback;c=c||l.cancelCallback;const f=l.btnOkText||"OK",m=l.btnCancelText||"Cancel",g=l.btnOkShadow,b=l.btnCancelShadow;l.buttons=[{text:m,style:"Light",color:l.btnCancelColor,background:l.btnCancelBackground,boxShadow:b,shadow:b,borderColor:l.btnCancelBorderColor,callback:y=>{c&&c(!1),y()}},{text:f,style:e,color:l.btnOkColor,background:l.btnOkBackground,boxShadow:g,shadow:g,borderColor:l.btnOkBorderColor,callback:y=>{d&&d(!0),y()}}]}Y(e,l)};return t.Async=function(n,o,r,a){return new Promise(s=>{const i=()=>s(!0),u=()=>s(!1),l=()=>s(!1);typeof n=="object"?(n.callback=i,n.cancelCallback=u,n.onClose=l,t(n,o,r,a)):t(n,o,r,a,i,u,l)})},t}const De={Primary:T("Primary"),Success:T("Success"),Warning:T("Warning"),Danger:T("Danger"),Info:T("Info"),Light:T("Light"),Dark:T("Dark"),Init(e){Object.assign(Se,e)}},ge={};function J(e){return Y("Primary",{...ge,...e})}J.Init=function(e){Object.assign(ge,e)};function N(e){const t=function(n,o,r,a,s,i,u){let l,c,d;if(typeof n=="object"?(l={...ge,...n},o!==void 0&&(l.title=o),c=s||l.callback,d=i||l.cancelCallback):(l={...ge,message:n,title:o||""},r!==void 0&&(l.btnOkText=r),a!==void 0&&(l.btnCancelText=a),c=s,d=i,u!==void 0&&(l.onClose=u)),!l.buttons||l.buttons.length===0){let f=null;const m=l.btnOkText||"OK",g=l.btnCancelText||"Cancel",b=l.btnOkShadow,y=l.btnCancelShadow;l.buttons=[{text:g,style:"Light",color:l.btnCancelColor,background:l.btnCancelBackground,boxShadow:y,shadow:y,borderColor:l.btnCancelBorderColor,callback:(k,p,h)=>{d&&d(k,f,h)===!1||k()}},{text:m,style:e,color:l.btnOkColor,background:l.btnOkBackground,boxShadow:b,shadow:b,borderColor:l.btnOkBorderColor,callback:(k,p,h)=>{c&&c(k,f,h)===!1||k()}}],f=Y(e,l).modalEl.querySelector(".fnon-modal-body")}else Y(e,l)};return t.Async=function(n,o,r,a){return new Promise(s=>{const i=(c,d,f)=>{s(!0)},u=(c,d,f)=>{s(!1)},l=()=>s(!1);typeof n=="object"?(n.callback=i,n.cancelCallback=u,n.onClose=l,t(n,o,r,a)):t(n,o,r,a,i,u,l)})},t}Object.assign(J,{Primary:N("Primary"),Success:N("Success"),Warning:N("Warning"),Danger:N("Danger"),Info:N("Info"),Light:N("Light"),Dark:N("Dark")});const Ue={headline:"BREAKING",theme:"Danger",anchor:"top",timeout:5e3,closable:!0,appendTarget:"body",fontFamily:"'Quicksand', sans-serif"};function z(e){var d;const t={...Ue,...e},n=Ke();let o;t.appendTarget?(o=ce(t.appendTarget),o||(x(`appendTarget "${t.appendTarget}" not found; falling back to body`),o=document.body)):o=document.body;const r=t.theme||"Danger",a=document.createElement("div");a.className=`fnon-breaking fnon-breaking-${t.anchor}`,a.dataset.modalId=n,a.setAttribute("role","alert");let s=qe(r);t.fontFamily&&(s+=`; font-family: ${t.fontFamily}`),a.setAttribute("style",s);const i=document.createElement("div");if(i.className="fnon-breaking-inner",t.headline){const f=document.createElement("span");f.className="fnon-breaking-headline",f.textContent=t.headline,i.appendChild(f)}const u=document.createElement("div");u.className="fnon-breaking-body";const l={id:n,type:"breaking"};if(t.message!==void 0&&t.message!==null&&(ze(t.message,u,l)||(u.innerHTML=typeof t.message=="string"?t.message:t.message instanceof HTMLElement?t.message.outerHTML:String(t.message))),i.appendChild(u),t.buttons&&t.buttons.length>0){const f=document.createElement("div");f.className="fnon-breaking-buttons";for(const m of t.buttons){const g=document.createElement("button");g.className=`fnon-btn fnon-btn-${((d=m.style)==null?void 0:d.toLowerCase())||r.toLowerCase()}`,m.css&&(g.className+=" "+m.css),g.textContent=m.text,m.color&&(g.style.color=m.color),m.background&&(g.style.background=m.background);const b=m.boxShadow||m.shadow;b&&(g.style.boxShadow=b),m.borderColor&&(g.style.borderColor=m.borderColor),m.callback&&g.addEventListener("click",()=>m.callback(()=>c(n))),f.appendChild(g)}i.appendChild(f)}if(t.closable!==!1){const f=document.createElement("button");f.className="fnon-breaking-close",f.innerHTML=Oe(),f.title="Dismiss",f.addEventListener("click",()=>c(n)),i.appendChild(f)}a.appendChild(i),o.appendChild(a),requestAnimationFrame(()=>a.classList.add("fnon-breaking-active")),t.timeout&&t.timeout>0&&setTimeout(()=>c(n),t.timeout);function c(f){je(f);const m=document.querySelector(`.fnon-breaking[data-modal-id="${f}"]`);m&&(m.classList.remove("fnon-breaking-active"),t.onClose&&t.onClose(),setTimeout(()=>{m.parentNode&&m.parentNode.removeChild(m)},400))}return{close:()=>c(n),el:a,id:n}}function B(e){const t=function(n,o){return z(typeof o=="object"&&o!==null?{...o,theme:e,message:n}:{headline:o,message:n,theme:e})};return t.Async=function(n,o){return new Promise(r=>{const a=typeof o=="object"&&o!==null?{...o,theme:e,message:n,onClose:r}:{headline:o,message:n,theme:e,onClose:r};z(a)})},t}z.Init=function(e){Object.assign(Ue,e)};const Te=Object.assign(z,{Primary:B("Primary"),Success:B("Success"),Warning:B("Warning"),Danger:B("Danger"),Info:B("Info"),Light:B("Light"),Dark:B("Dark"),Init:z.Init}),Ve="fnon-hint-container-",be='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>',On='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 9v4M12 17h.01"/><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/></svg>',Yn='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>',qn='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/></svg>';function zn(e,t){return t&&{"right-top":"left-top","right-center":"left-center","right-bottom":"left-bottom","left-top":"right-top","left-center":"right-center","left-bottom":"right-bottom"}[e]||e}const Xe={type:"Primary",position:"right-top",animation:"slide-left",timeOut:4e3,closable:!0,spacing:"8px",svgSize:{w:20,h:20},fontSize:"0.88rem",width:"360px",animationDuration:"0.3s",progressColor:void 0,title:void 0,fontFamily:"'Quicksand', sans-serif"};let he={Primary:{titleColor:"#029eff",backgroundColor:"#ebf8ff",borderColor:"#029eff",svg:be},Success:{titleColor:"#39DA8A",backgroundColor:"#f0fff4",borderColor:"#39DA8A",svg:be},Warning:{titleColor:"#fdd347",backgroundColor:"#fffbe5",borderColor:"#fdd347",svg:On},Danger:{titleColor:"#ff6b6b",backgroundColor:"#fff5f5",borderColor:"#ff6b6b",svg:Yn},Info:{titleColor:"#48dbfb",backgroundColor:"#e5faff",borderColor:"#48dbfb",svg:qn},Light:{titleColor:"#2d3748",backgroundColor:"#f8f9fa",borderColor:"#ced4da",svg:be},Dark:{titleColor:"#fff",backgroundColor:"#222f3e",borderColor:"#222f3e",svg:be}};function jn(e,t){he[e]={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff",svg:void 0}}function Wn(e){if(he[e])return he[e];const t=Ye(e);if(t){const n={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff"};return he[e]=n,n}return null}function Kn(e){const t=document.querySelector(`#${Ve}${e}`);if(t)return t;const n=document.createElement("div");return n.id=`${Ve}${e}`,n.className=`fnon-hint-container ${e}`,document.body.appendChild(n),n}function Gn(e){e.children.length===0&&e.parentNode&&e.parentNode.removeChild(e)}function Z(e,t){const n={...Xe};let o="";typeof t=="string"?o=t:t&&typeof t=="object"&&(Object.assign(n,t),o=n.title||"");const r=n.type||"Primary",a=Wn(r);if(!a)return x(`Unknown hint type: ${r}`),{close:()=>{}};const s=n.position||"right-top",i=n.dir==="rtl",u=zn(s,i),l=n.animation||"slide-left",c=Kn(u);i&&(c.dir="rtl");const d=document.createElement("div");if(d.className=`fnon-hint fnon-hint-${u} fnon-hint-anim-${l} fnon-hint-${r.toLowerCase()}`,d.setAttribute("data-hint-id",Date.now().toString()),n.width&&(d.style.maxWidth=n.width),n.fontSize&&(d.style.fontSize=n.fontSize),n.fontFamily&&(d.style.fontFamily=n.fontFamily),n.spacing&&(d.style.marginBottom=n.spacing),n.animationDuration&&(d.style.transitionDuration=n.animationDuration),a.svg){const p=document.createElement("div");p.className="fnon-hint-icon";const h=n.svgSize||{w:20,h:20};p.style.setProperty("--fnon-icon-w",h.w+"px"),p.style.setProperty("--fnon-icon-h",h.h+"px"),p.innerHTML=a.svg,d.appendChild(p)}const f=document.createElement("div");if(f.className="fnon-hint-content",o){const p=document.createElement("div");p.className="fnon-hint-title",p.textContent=o,f.appendChild(p)}const m=document.createElement("div");if(m.className="fnon-hint-message",m.innerHTML=e,f.appendChild(m),d.appendChild(f),n.closable!==!1){const p=document.createElement("button");p.className="fnon-hint-close",p.innerHTML="&times;",p.addEventListener("click",()=>k(d)),d.appendChild(p)}if(n.timeOut&&n.timeOut>0){const p=n.progressColor||a.borderColor,h=document.createElement("div");h.className="fnon-hint-progress",h.style.setProperty("--display-dur",n.timeOut+"ms"),h.style.background=p,d.style.position="relative",d.style.overflow="hidden",d.appendChild(h)}xe(a.borderColor);const g=i?"borderRight":"borderLeft";d.style[g]=`4px solid ${a.borderColor}`,d.style.backgroundColor=a.backgroundColor;const b=typeof n.isDark=="function"?n.isDark():n.isDark;if(b){const p=n.darkBgColor||"#1a202c";d.style.backgroundColor=p}const y=b?n.darkBgColor||"#1a202c":a.backgroundColor;d.style.color=kn(y),c.appendChild(d),requestAnimationFrame(()=>{d.classList.add("fnon-hint-active")});let w=null;n.timeOut&&n.timeOut>0&&(w=setTimeout(()=>k(d),n.timeOut));function k(p){w&&clearTimeout(w),p.classList.remove("fnon-hint-active"),n.onClose&&n.onClose(),n.onclosed&&n.onclosed(),setTimeout(()=>{p.parentNode&&p.parentNode.removeChild(p),Gn(c)},300)}return{close:()=>k(d)}}Z.Init=function(e){Object.assign(Xe,e)};function A(e){const t=function(n,o){return Z(n,typeof o=="string"?{type:e,title:o}:{...o,type:e})};return t.Async=function(n,o){return new Promise(r=>{const a=typeof o=="string"?{type:e,title:o,onClose:r}:{...o,type:e,onClose:r};Z(n,a)})},t}const Ne={Primary:A("Primary"),Success:A("Success"),Warning:A("Warning"),Danger:A("Danger"),Info:A("Info"),Light:A("Light"),Dark:A("Dark"),show:Z,Init:Z.Init},Be={...{Orbit:{html:e=>`<div class="fnon-sp-orbit" style="--fnon-sp-color: ${e||"#029eff"}"><div class="fnon-sp-orbit-dot"></div></div>`,css:!0},Spin:{html:e=>`<div class="fnon-sp-spin" style="--fnon-sp-color: ${e||"#029eff"}"><div class="fnon-sp-spin-ring"></div></div>`,css:!0}},...{Infinity:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><path fill="none" stroke="${e[0]}" stroke-width="4" stroke-dasharray="133.42624267578125 123.162685546875" d="M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z" stroke-linecap="round" style="transform:scale(0.8);transform-origin:50px 50px"><animate attributeName="stroke-dashoffset" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="0;256"></animate></path></svg>`},Ripple:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="50" cy="50" r="0" fill="none" stroke="${e[0]}" stroke-width="6"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;40" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline" begin="-0.5s"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline" begin="-0.5s"></animate></circle><circle cx="50" cy="50" r="0" fill="none" stroke="${e[1]}" stroke-width="6"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;40" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline"></animate></circle></svg>`},Typing:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="27.5" cy="57.5" r="5" fill="${e[0]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.6s"></animate></circle> <circle cx="42.5" cy="57.5" r="5" fill="${e[1]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.44999999999999996s"></animate></circle> <circle cx="57.5" cy="57.5" r="5" fill="${e[2]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.3s"></animate></circle> <circle cx="72.5" cy="57.5" r="5" fill="${e[3]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.15s"></animate></circle></svg>`}}};function Qe(e,t){const n=Be[e];if("css"in n&&n.css)return n.html(t);const o=xe(t,9);return n.html(o)}const Je={text:"",clickToClose:!1,svgColor:"#029eff",containerSize:void 0,fontFamily:"'Quicksand', sans-serif"},Ze={text:"",svgColor:"#029eff",containerSize:void 0,svgSize:void 0,fontFamily:"'Quicksand', sans-serif"};let Ae=!1,ve=null;function en(e,t,n){if(Ae){x("A wait overlay is already active. Remove it first.");return}const o={...Je,...n};t!==void 0&&(o.text=t);const r=o.svgColor||"#029eff",a=Qe(e,r),s=document.createElement("div");s.className="fnon-wait-overlay",s.id="fnon-wait-overlay",o.fontFamily&&(s.style.fontFamily=o.fontFamily);const i=document.createElement("div");if(i.className="fnon-wait-box",o.containerSize&&(i.style.width=o.containerSize),i.innerHTML=a,o.text){const l=document.createElement("div");l.className="fnon-wait-text",l.textContent=o.text,i.appendChild(l)}if(typeof o.isDark=="function"?o.isDark():o.isDark){const l=o.darkBgColor||"#1a202c";s.style.background="rgba(0, 0, 0, 0.85)",i.style.background=l,i.style.padding="1.5rem",i.style.borderRadius="8px"}s.appendChild(i),document.body.appendChild(s),requestAnimationFrame(()=>s.classList.add("fnon-wait-active")),o.clickToClose&&s.addEventListener("click",()=>nn()),Ae=!0}function nn(e){const t=document.getElementById("fnon-wait-overlay");if(!t)return;const n=typeof e=="number"?e:0,o=()=>{t.classList.remove("fnon-wait-active"),ve&&(ve(!0),ve=null),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),Ae=!1},300)};n>0?setTimeout(o,n):o()}function Un(e){const t=document.querySelector("#fnon-wait-overlay .fnon-wait-text");t&&(t.textContent=e)}function Vn(e){const t=function(n,o){en(e,n,o)};return t.Async=function(n,o){return new Promise(r=>{ve=r,en(e,n,o)})},t}const j={Remove:nn,Change:Un,Init:function(e){Object.assign(Je,e)}};for(const e of Object.keys(Be))j[e]=Vn(e);let ye=null;function tn(e,t,n,o){var f;const r=ce(t);if(!r){x(`Box target not found: ${t}`);return}const a={...Ze,...o},s=a.svgColor||"#029eff",i=Qe(e,s),u=r.querySelector(".fnon-box-overlay");u&&((f=u.parentNode)==null||f.removeChild(u));const l=document.createElement("div");l.className="fnon-box-overlay",a.fontFamily&&(l.style.fontFamily=a.fontFamily);const c=document.createElement("div");if(c.className="fnon-box-inner",a.containerSize&&(c.style.width=a.containerSize),a.svgSize&&(c.style.setProperty("--fnon-box-svg-w",a.svgSize.w+"px"),c.style.setProperty("--fnon-box-svg-h",a.svgSize.h+"px")),c.innerHTML=i,a.text){const m=document.createElement("div");m.className="fnon-box-label",m.textContent=a.text,c.appendChild(m)}if(typeof a.isDark=="function"?a.isDark():a.isDark){const m=a.darkBgColor||"#1a202c";l.style.background="rgba(0, 0, 0, 0.7)",c.style.background=m,c.style.padding="1.5rem",c.style.borderRadius="8px"}l.appendChild(c),r.style.position="relative",r.appendChild(l)}function Xn(e){const t=ce(e);if(!t)return;const n=t.querySelector(".fnon-box-overlay");n&&n.parentNode&&n.parentNode.removeChild(n),ye&&(ye(!0),ye=null)}function Qn(e){const t=function(n,o,r){tn(e,n,o,r)};return t.Async=function(n,o,r){return new Promise(a=>{ye=a,tn(e,n,o,r)})},t}const ke={Remove:Xn,Init:function(e){Object.assign(Ze,e)}};for(const e of Object.keys(Be))ke[e]=Qn(e);function on(){return document.documentElement.dir==="rtl"}const Jn=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],rn=["January","February","March","April","May","June","July","August","September","October","November","December"];function an(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function Ie(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function sn(e,t){return new Date(e,t+1,0).getDate()}function Zn(e,t){return new Date(e,t,1).getDay()}function L(e){return e.getFullYear()*1e4+e.getMonth()*100+e.getDate()}function I(e,t){let n=e.viewMonth+t,o=e.viewYear;for(;n<0;)n+=12,o--;for(;n>11;)n-=12,o++;if(e.minDate!==null){const r=new Date(o,n+1,0);if(L(r)<e.minDate)return!1}if(e.maxDate!==null){const r=new Date(o,n,1);if(L(r)>e.maxDate)return!1}return!0}function ln(e){if(e.minDate===null)return!0;const t=e.viewMonth-1,n=t<0?e.viewYear-1:e.viewYear,o=t<0?11:t,r=new Date(n,o+1,0);return L(r)>=e.minDate}function cn(e){if(e.maxDate===null)return!0;const t=e.viewMonth+1,n=t>11?e.viewYear+1:e.viewYear,o=t>11?0:t,r=new Date(n,o,1);return L(r)<=e.maxDate}function Ce(e){if(!e.bodyEl)return;const t=e.bodyEl.querySelectorAll(".fnon-dp-day");for(const n of t)n.classList.remove("fnon-dp-range-preview")}function et(e,t){if(!e.bodyEl)return;const n=e.bodyEl.querySelectorAll(".fnon-dp-day"),o=L(t);for(const r of n){const a=parseInt(r.dataset.ts||"0",10);r.classList.toggle("fnon-dp-selected",a===o),r.classList.remove("fnon-dp-range","fnon-dp-range-start","fnon-dp-range-end")}}function dn(e={}){const t=new Date,n=e.initDate||t,o=!!e.dateRange,r=o?!1:!!e.withTime,a=e.minDate?L(an(e.minDate)):null,s=e.maxDate?L(an(e.maxDate)):null,i=typeof e.isDark=="function"?e.isDark():e.isDark,u={viewYear:n.getFullYear(),viewMonth:n.getMonth(),start:null,end:null,rangeMode:o,withTime:r,minDate:a,maxDate:s,initDate:n,hour:t.getHours(),minute:t.getMinutes(),resolve:null,reject:null,bodyEl:null,closeModal:null,dark:!!i,darkBg:e.darkBgColor||"#1a202c"};return new Promise((l,c)=>{u.resolve=l,u.reject=c;const d={title:e.title||(o?"Select Date Range":"Select Date"),closeButton:!0,delButtons:!0,layout:"hb",isDark:u.dark,darkBgColor:u.darkBg,width:"sm",autoFocus:!1,color:u.dark?"#e2e8f0":void 0},f=Y("Primary",d);u.closeModal=f.close,u.bodyEl=f.modalEl.querySelector(".fnon-modal-body"),u.bodyEl&&(u.bodyEl.style.padding="0",M(u))})}const nt=dn;function M(e){const t=e.bodyEl;if(!t)return;t.innerHTML="";const n=document.createElement("div");n.className="fnon-dp"+(e.dark?" fnon-dp-dark":"");const o=on();o&&(n.dir="rtl");const r=document.createElement("div");r.className="fnon-dp-header";const a=o?"›":"‹",s=o?"‹":"›",i=document.createElement("button");i.className="fnon-dp-nav",i.innerHTML=a,i.title=o?"Next month":"Previous month",ln(e)||i.classList.add("fnon-dp-nav-disabled"),i.addEventListener("click",()=>{ln(e)&&(e.viewMonth--,e.viewMonth<0&&(e.viewMonth=11,e.viewYear--),M(e))});const u=document.createElement("button");u.className="fnon-dp-label",u.textContent=rn[e.viewMonth]+" "+e.viewYear,u.addEventListener("click",C=>{C.stopPropagation(),it(e,u)});const l=document.createElement("button");l.className="fnon-dp-nav",l.innerHTML=s,l.title=o?"Previous month":"Next month",cn(e)||l.classList.add("fnon-dp-nav-disabled"),l.addEventListener("click",()=>{cn(e)&&(e.viewMonth++,e.viewMonth>11&&(e.viewMonth=0,e.viewYear++),M(e))}),r.appendChild(i),r.appendChild(u),r.appendChild(l),n.appendChild(r);const c=document.createElement("div");c.className="fnon-dp-time",e.withTime||(c.style.display="none"),c.innerHTML="<label>Time</label>";const d=document.createElement("input");d.type="time",d.className="fnon-dp-time-input";const f=String(e.hour).padStart(2,"0"),m=String(e.minute).padStart(2,"0");d.value=f+":"+m,d.addEventListener("change",()=>{const C=d.value.split(":");e.hour=parseInt(C[0],10)||0,e.minute=parseInt(C[1],10)||0}),c.appendChild(d),n.appendChild(c);const g=document.createElement("div");g.className="fnon-dp-grid";for(const C of Jn){const v=document.createElement("div");v.className="fnon-dp-dow",v.textContent=C,g.appendChild(v)}const b=e.viewYear,y=e.viewMonth,w=sn(b,y),k=Zn(b,y),p=y===0?11:y-1,h=y===0?b-1:b,S=sn(h,p),W=42,dt=new Date;for(let C=0;C<W;C++){const v=document.createElement("div");v.className="fnon-dp-day";let K,ae,se,le;C<k?(K=S-k+C+1,ae=y-1<0?11:y-1,se=y-1<0?b-1:b,le=!0):C>=k+w?(K=C-k-w+1,ae=y+1>11?0:y+1,se=y+1>11?b+1:b,le=!0):(K=C-k+1,ae=y,se=b,le=!1);const G=new Date(se,ae,K),_=L(G);if(v.textContent=String(K),v.dataset.year=String(se),v.dataset.month=String(ae),v.dataset.day=String(K),v.dataset.ts=String(_),le&&v.classList.add("fnon-dp-other"),Ie(G,dt)&&v.classList.add("fnon-dp-today"),e.minDate!==null&&_<e.minDate&&v.classList.add("fnon-dp-disabled"),e.maxDate!==null&&_>e.maxDate&&v.classList.add("fnon-dp-disabled"),e.start&&Ie(G,e.start)&&v.classList.add("fnon-dp-selected"),e.end&&Ie(G,e.end)&&v.classList.add("fnon-dp-selected"),e.rangeMode&&e.start&&e.end){const hn=L(e.start),vn=L(e.end);_>hn&&_<vn&&v.classList.add("fnon-dp-range"),_===hn&&v.classList.add("fnon-dp-range-start"),_===vn&&v.classList.add("fnon-dp-range-end")}!v.classList.contains("fnon-dp-disabled")&&!le&&(v.addEventListener("click",()=>ot(e,G)),v.addEventListener("mouseenter",()=>tt(e,G)),v.addEventListener("mouseleave",()=>Ce(e))),g.appendChild(v)}n.appendChild(g);const P=document.createElement("div");P.className="fnon-dp-actions";function ft(){ne.classList.toggle("fnon-dp-nav-disabled",!I(e,-12)),te.classList.toggle("fnon-dp-nav-disabled",!I(e,-6)),ie.classList.toggle("fnon-dp-nav-disabled",!I(e,6)),re.classList.toggle("fnon-dp-nav-disabled",!I(e,12));const C=L(new Date);oe.classList.toggle("fnon-dp-nav-disabled",e.minDate!==null&&C<e.minDate||e.maxDate!==null&&C>e.maxDate)}const ne=document.createElement("button");ne.className="fnon-dp-btn",ne.textContent="-1 Year",ne.addEventListener("click",()=>{I(e,-12)&&(e.viewYear-=1,M(e))}),P.appendChild(ne);const te=document.createElement("button");te.className="fnon-dp-btn",te.textContent="-6 Months",te.addEventListener("click",()=>{I(e,-6)&&(e.viewMonth-=6,e.viewMonth<0&&(e.viewMonth+=12,e.viewYear-=1),M(e))}),P.appendChild(te);const oe=document.createElement("button");oe.className="fnon-dp-btn",oe.textContent="Today",oe.addEventListener("click",()=>{const C=new Date,v=L(C);e.minDate!==null&&v<e.minDate||e.maxDate!==null&&v>e.maxDate||(e.viewYear=C.getFullYear(),e.viewMonth=C.getMonth(),M(e))}),P.appendChild(oe);const ie=document.createElement("button");ie.className="fnon-dp-btn",ie.textContent="+6 Months",ie.addEventListener("click",()=>{I(e,6)&&(e.viewMonth+=6,e.viewMonth>11&&(e.viewMonth-=12,e.viewYear+=1),M(e))}),P.appendChild(ie);const re=document.createElement("button");if(re.className="fnon-dp-btn",re.textContent="+1 Year",re.addEventListener("click",()=>{I(e,12)&&(e.viewYear+=1,M(e))}),P.appendChild(re),ft(),!e.rangeMode&&e.withTime){const C=document.createElement("button");C.className="fnon-dp-btn fnon-dp-btn-primary",C.textContent="OK",C.addEventListener("click",()=>{if(e.start&&e.resolve){const v=new Date(e.start);e.withTime&&v.setHours(e.hour,e.minute,0,0),e.resolve(v),e.closeModal&&e.closeModal()}}),P.appendChild(C)}n.appendChild(P),t.appendChild(n)}function tt(e,t){if(!e.rangeMode||!e.start||e.end||!e.bodyEl)return;const n=L(e.start),o=L(t),r=Math.min(n,o),a=Math.max(n,o);Ce(e);const s=e.bodyEl.querySelectorAll(".fnon-dp-day");for(const i of s){const u=parseInt(i.dataset.ts||"0",10);u>r&&u<a&&i.classList.add("fnon-dp-range-preview")}}function ot(e,t,n){if(e.rangeMode){if(!e.start||e.start&&e.end){e.start=t,e.end=null,Ce(e),M(e);return}if(e.start&&!e.end){Ce(e),L(t)<L(e.start)?(e.end=e.start,e.start=t):e.end=t,M(e),e.resolve&&(e.resolve({start:new Date(e.start),end:new Date(e.end)}),e.closeModal&&e.closeModal());return}}if(e.start=t,e.withTime){et(e,t);return}e.resolve&&(e.resolve(t),e.closeModal&&e.closeModal())}function it(e,t){const n=document.querySelector(".fnon-dp-popup");if(n){n.remove();return}const o=t.closest(".fnon-dp"),r=o?o.getBoundingClientRect():t.getBoundingClientRect(),a=t.getBoundingClientRect(),s=Math.min(Math.max(240,r.width*.85),320),i=document.createElement("div");i.className="fnon-dp-popup"+(e.dark?" fnon-dp-dark":""),i.style.top=a.bottom+4+"px",i.style.left=r.left+(r.width-s)/2+"px",i.style.width=s+"px";const u=on();let l="year",c=e.viewYear;const d=()=>{if(i.innerHTML="",l==="year"){const f=document.createElement("div");f.className="fnon-dp-popup-nav";const m=document.createElement("button");m.className="fnon-dp-popup-nav-btn",m.textContent=u?"›":"‹",m.addEventListener("click",w=>{w.stopPropagation(),c-=12,d()});const g=document.createElement("span");g.className="fnon-dp-popup-nav-label",g.textContent=c-5+"–"+(c+6);const b=document.createElement("button");b.className="fnon-dp-popup-nav-btn",b.textContent=u?"‹":"›",b.addEventListener("click",w=>{w.stopPropagation(),c+=12,d()}),f.appendChild(m),f.appendChild(g),f.appendChild(b),i.appendChild(f);const y=c-5;for(let w=0;w<3;w++){const k=document.createElement("div");k.className="fnon-dp-popup-row";for(let p=0;p<4;p++){const h=y+w*4+p,S=document.createElement("div");S.className="fnon-dp-popup-cell"+(h===e.viewYear?" fnon-dp-popup-active":""),S.textContent=String(h),S.addEventListener("click",W=>{W.stopPropagation(),c=h,l="month",d()}),k.appendChild(S)}i.appendChild(k)}}else{const f=document.createElement("div");f.className="fnon-dp-popup-nav";const m=document.createElement("button");m.className="fnon-dp-popup-nav-btn",m.textContent=u?"›":"‹",m.addEventListener("click",b=>{b.stopPropagation(),l="year",d()});const g=document.createElement("span");g.className="fnon-dp-popup-nav-label",g.textContent=String(c),f.appendChild(m),f.appendChild(g),i.appendChild(f);for(let b=0;b<3;b++){const y=document.createElement("div");y.className="fnon-dp-popup-row";for(let w=0;w<4;w++){const k=b*4+w,p=document.createElement("div");p.className="fnon-dp-popup-cell"+(k===e.viewMonth&&c===e.viewYear?" fnon-dp-popup-active":""),p.textContent=rn[k].substring(0,3),p.addEventListener("click",h=>{h.stopPropagation(),e.viewYear=c,e.viewMonth=k,i.remove(),M(e)}),y.appendChild(p)}i.appendChild(y)}}};d(),setTimeout(()=>{document.addEventListener("click",f=>{i.parentNode&&!i.contains(f.target)&&i.remove()},{once:!0})},0),i.addEventListener("click",f=>f.stopPropagation()),document.body.appendChild(i)}let fn=!1;function ee(){return document.documentElement.dir==="rtl"}const E=new Set;let Fe=[];function rt(e){return"clientX"in e?{x:e.clientX,y:e.clientY}:{x:e.x,y:e.y}}function at(){return fn}function st(e){fn=e}function F(){E.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),E.clear(),Fe.forEach(e=>e()),Fe=[]}function un(e){E.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)>e&&(t.parentNode&&t.parentNode.removeChild(t),E.delete(t))})}function Pe(e){E.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)===e&&(t.parentNode&&t.parentNode.removeChild(t),E.delete(t))})}function Re(e){const t=e.querySelectorAll(".fnon-cm-item:not(.fnon-cm-item-disabled)");t.length>0&&t[0].focus()}function R(e){return parseInt(e.getAttribute("data-parent-level")||"0",10)}function mn(e){for(;e;){if(e.classList.contains("fnon-cm"))return e;e=e.parentElement}return null}function pn(e){const t=mn(e);return t?Array.from(t.querySelectorAll(".fnon-cm-item:not(.fnon-cm-item-disabled)")):[]}function lt(e){for(const t of E)if(R(t)===e)return t;return null}function _e(e){const t=R(e)-1,n=lt(t);if(!n)return null;const o=n.querySelectorAll(".fnon-cm-item"),r=e.getBoundingClientRect();for(const a of o){const s=a.getBoundingClientRect();if((Math.abs(s.right-r.left)<20||Math.abs(s.left-r.right)<20)&&Math.abs(s.top-r.top)<50)return a}return null}function ct(e,t,n){document.body.appendChild(e),E.add(e);const o=e.getBoundingClientRect(),r=window.innerWidth,a=window.innerHeight;let s=t,i=n;s+o.width>r-4&&(s=r-o.width-4),i+o.height>a-4&&(i=a-o.height-4),s<4&&(s=4),i<4&&(i=4),e.style.left=s+"px",e.style.top=i+"px"}function gn(e,t){document.body.appendChild(t),E.add(t);const n=e.getBoundingClientRect(),o=t.getBoundingClientRect(),r=window.innerWidth,a=window.innerHeight;let s,i=n.top;ee()?(s=n.left-o.width,s<4&&(s=n.right)):(s=n.right,s+o.width>r-4&&(s=n.left-o.width)),i+o.height>a-4&&(i=a-o.height-4),i<4&&(i=4),t.style.left=s+"px",t.style.top=i+"px"}function $e(e,t,n){const o=document.createElement("div");o.className="fnon-cm"+(at()?" fnon-cm-dark":""),o.setAttribute("data-parent-level",String(t)),ee()&&(o.dir="rtl");for(const r of e){const a=document.createElement("div");a.className="fnon-cm-item",r.disabled&&a.classList.add("fnon-cm-item-disabled"),r.className&&a.classList.add(r.className),r.items&&r.items.length>0&&a.classList.add("fnon-cm-item-parent");const s=document.createElement("span");if(s.className="fnon-cm-item-text",s.innerHTML=we(r.text),a.appendChild(s),r.items&&r.items.length>0){let i=function(){f||(d&&(clearTimeout(d),d=null),f=window.setTimeout(()=>{f=null,!c&&(c=$e(r.items,t+1,n),c.classList.add("fnon-cm-submenu"),c.setAttribute("data-parent-level",String(t+1)),gn(a,c),c.addEventListener("mouseenter",()=>{d&&(clearTimeout(d),d=null)}),c.addEventListener("mouseleave",()=>{u()}))},200))},u=function(){if(!d){if(f){clearTimeout(f),f=null;return}d=window.setTimeout(()=>{d=null,c&&(un(R(c)),c.parentNode&&c.parentNode.removeChild(c),E.delete(c),c=null)},300)}};const l=document.createElement("span");l.className="fnon-cm-arrow",l.innerHTML=ee()?"&#9664;":"&#9654;",a.appendChild(l);let c=null,d=null,f=null;a.addEventListener("mouseenter",()=>{d&&(clearTimeout(d),d=null),i()}),a.addEventListener("mouseleave",m=>{if(c){const g=m.relatedTarget;if(c.contains(g))return;u()}else f&&(clearTimeout(f),f=null)}),a.__cmOpenSubmenu=()=>{c||(c=$e(r.items,t+1,n),c.classList.add("fnon-cm-submenu"),c.setAttribute("data-parent-level",String(t+1)),gn(a,c)),Re(c)},a.__cmCloseSubmenu=()=>{c&&(un(R(c)),c.parentNode&&c.parentNode.removeChild(c),E.delete(c),c=null)}}r.disabled||a.addEventListener("click",i=>{i.stopPropagation(),!(r.items&&r.items.length>0)&&(r.onClick?r.onClick(r,i):n&&n(r,i),F())}),o.appendChild(a)}return o}function bn(e,t,n){if(!t||t.length===0)return x("ContextMenu requires at least one item."),{close:()=>{}};e instanceof MouseEvent&&(e.preventDefault(),e.stopPropagation()),F();const o=rt(e),r=$e(t,0,n);ct(r,o.x,o.y),Re(r);function a(c){const d=c.target;r.contains(d)||F()}function s(c){r.contains(c.target)||F()}function i(c){const d=document.activeElement,f=mn(d);switch(c.key){case"Escape":{if(c.preventDefault(),f&&f.classList.contains("fnon-cm-submenu")){const m=R(f);Pe(m);const g=_e(f);g&&g.focus()}else F();break}case"ArrowDown":{if(c.preventDefault(),d&&d.classList.contains("fnon-cm-item")){const m=pn(d),g=m.indexOf(d);g<m.length-1&&m[g+1].focus()}else f&&Re(f);break}case"ArrowUp":{if(c.preventDefault(),d&&d.classList.contains("fnon-cm-item")){const m=pn(d),g=m.indexOf(d);g>0&&m[g-1].focus()}break}case"ArrowRight":{if(c.preventDefault(),ee()){if(f&&f.classList.contains("fnon-cm-submenu")){const m=R(f);Pe(m);const g=_e(f);g&&g.focus()}}else d&&d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu&&d.__cmOpenSubmenu();break}case"ArrowLeft":{if(c.preventDefault(),ee())d&&d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu&&d.__cmOpenSubmenu();else if(f&&f.classList.contains("fnon-cm-submenu")){const m=R(f);Pe(m);const g=_e(f);g&&g.focus()}break}case"Enter":case" ":{c.preventDefault(),d&&d.classList.contains("fnon-cm-item")&&!d.classList.contains("fnon-cm-item-disabled")&&(d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu?d.__cmOpenSubmenu():d.click());break}}}function u(){F()}function l(){F()}return setTimeout(()=>{document.addEventListener("click",a,!0),document.addEventListener("contextmenu",s),document.addEventListener("keydown",i),window.addEventListener("scroll",u,!0),window.addEventListener("resize",l)},0),Fe=[()=>document.removeEventListener("click",a,!0),()=>document.removeEventListener("contextmenu",s),()=>document.removeEventListener("keydown",i),()=>window.removeEventListener("scroll",u,!0),()=>window.removeEventListener("resize",l)],{close:F}}return{setRenderer:wn,registerCleanup:xn,registerReactRoot:Ln,Alert:pe,Ask:De,Dialogue:J,Breaking:Te,Hint:Ne,Wait:j,Box:ke,DatePicker:dn,DP:nt,ContextMenu:bn,CM:bn,addButton:Hn,Init(e){pe.Init(e),De.Init(e),J.Init(e),Te.Init(e),Ne.Init(e),j.Init(e),ke.Init(e),"isDark"in e&&st(!!e.isDark),"dir"in e&&e.dir&&(document.documentElement.dir=e.dir)},AddLogo(e,t){if(!e||!t){x("Name and HtmlContent are required to add a new logo.");return}if(j[e]){x("A logo with the same name already exists.");return}const o=j;o[e]=function(a,s){const i=document.createElement("div");i.className="fnon-wait-overlay",i.id="fnon-wait-overlay";const u=document.createElement("div");if(u.className="fnon-wait-box",u.innerHTML=t,a){const l=document.createElement("div");l.className="fnon-wait-text",l.textContent=a,u.appendChild(l)}i.appendChild(u),document.body.appendChild(i),requestAnimationFrame(()=>i.classList.add("fnon-wait-active")),s!=null&&s.clickToClose&&i.addEventListener("click",()=>j.Remove())};const r=ke;r[e]=function(a,s,i){var f;const u=typeof a=="string"?document.querySelector(a):a;if(!u){x("Invalid selector");return}const l=u.querySelector(".fnon-box-overlay");l&&((f=l.parentNode)==null||f.removeChild(l));const c=document.createElement("div");c.className="fnon-box-overlay";const d=document.createElement("div");if(d.className="fnon-box-inner",d.innerHTML=t,s){const m=document.createElement("div");m.className="fnon-box-label",m.textContent=s,d.appendChild(m)}c.appendChild(d),u.style.position="relative",u.appendChild(c)}},AddTheme(e,t){if(!e){x("Name is required to generate a new theme.");return}if(pe[e]){x("A theme with the same name already exists.");return}Cn(e,t),jn(e,t),pe[e]=D(e),De[e]=T(e),J[e]=N(e),Ne[e]=A(e),Te[e]=B(e)}}})();
1
+ var Fnon=(function(){"use strict";function C(e){typeof console<"u"&&console.error("[Fnon]",e)}function X(e){return typeof e=="string"?document.querySelector(e):e instanceof HTMLElement?e:null}function le(e){return typeof e=="string"?e:e instanceof HTMLElement?e.outerHTML:String(e)}function J(e){const t=document.createElement("div");t.style.color=e,document.body.appendChild(t);const n=getComputedStyle(t).color;document.body.removeChild(t);const o=n.match(/rgb(a)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return o?{r:+o[2],g:+o[3],b:+o[4]}:null}function Se(e,t){const n=J(e);if(!n)return e;const o=1-t;return`rgb(${n.r*o|0},${n.g*o|0},${n.b*o|0})`}function sn(e,t){const n=J(e);if(!n)return e;const o=1-t;return`rgb(${255-(255-n.r)*o|0},${255-(255-n.g)*o|0},${255-(255-n.b)*o|0})`}function de(e,t=4){if(t===4)return J(e)?[e,sn(e,.3),Se(e,.15),Se(e,.3)]:[e,e,e,e];const n=J(e);if(!n)return Array(t).fill(e);const o=[e];let r=n.r,a=n.g,s=n.b;for(let i=0;i<t-1;i++)r=Math.max(0,r-33),a=Math.max(0,a-33),s=Math.max(0,s-33),o.push(`rgb(${r},${a},${s})`);return o}function De(){return"&times;"}function cn(e){const t=e.replace("#","");let n,o,r;if(t.length===3)n=parseInt(t[0]+t[0],16),o=parseInt(t[1]+t[1],16),r=parseInt(t[2]+t[2],16);else if(t.length===6)n=parseInt(t.substring(0,2),16),o=parseInt(t.substring(2,4),16),r=parseInt(t.substring(4,6),16);else return"#2d3748";return(.299*n+.587*o+.114*r)/255>.55?"#2d3748":"#fff"}const Q={Primary:{titleBackground:"#029eff",titleColor:"#fff",btnOkBackground:"#029eff",btnOkColor:"#fff",btnOkBorderColor:"#029eff",backgroundColor:"#fff"},Success:{titleBackground:"#39DA8A",titleColor:"#fff",btnOkBackground:"#39DA8A",btnOkColor:"#fff",btnOkBorderColor:"#39DA8A",backgroundColor:"#fff"},Warning:{titleBackground:"#fdd347",titleColor:"#2d3748",btnOkBackground:"#fdd347",btnOkColor:"#2d3748",btnOkBorderColor:"#fdd347",backgroundColor:"#fff"},Danger:{titleBackground:"#ff6b6b",titleColor:"#fff",btnOkBackground:"#ff6b6b",btnOkColor:"#fff",btnOkBorderColor:"#ff6b6b",backgroundColor:"#fff"},Info:{titleBackground:"#48dbfb",titleColor:"#2d3748",btnOkBackground:"#48dbfb",btnOkColor:"#2d3748",btnOkBorderColor:"#48dbfb",backgroundColor:"#fff"},Light:{titleBackground:"#f8f9fa",titleColor:"#2d3748",btnOkBackground:"#f8f9fa",btnOkColor:"#2d3748",btnOkBorderColor:"#ced4da",backgroundColor:"#fff"},Dark:{titleBackground:"#222f3e",titleColor:"#fff",btnOkBackground:"#222f3e",btnOkColor:"#fff",btnOkBorderColor:"#222f3e",backgroundColor:"#fff"}};let Z={};function ln(e,t){Z[e]={...Z[e],...t}}function Te(e){return Z[e]?{...Q[e],...Z[e]}:Q[e]?Q[e]:null}function Ne(e){const t=Te(e)||Q.Primary,n=[];for(const[a,s]of Object.entries(t)){const i=a.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(`--fnon-${i}: ${s};`)}const o=t.titleBackground||"#029eff",r=de(o);return n.push(`--fnon-title-shade-light: ${r[1]};`),n.push(`--fnon-title-shade-dark: ${r[2]};`),n.push(`--fnon-title-shade-border: ${r[3]};`),n.join(" ")}let fe=null;const z=[],ue=new Map;function dn(e){fe=e}function Be(e,t,n){if(!fe)return!1;try{return fe(e,t,n)===!0}catch(o){return C(`Renderer failed: ${o}`),!1}}function fn(e,t){z.push({modalId:e,fn:t})}function un(e,t){ue.set(e,t)}function mn(e){const t=ue.get(e);return ue.delete(e),t}function Ae(e){for(let n=z.length-1;n>=0;n--)if(z[n].modalId===e){try{z[n].fn()}catch(o){C(`Cleanup failed: ${o}`)}z.splice(n,1)}const t=mn(e);if(t&&typeof t.unmount=="function")try{t.unmount()}catch{}}function pn(e){if(!e)return"";if(e instanceof HTMLElement)return e.textContent||"";if(typeof e=="string")return e.replace(/<[^>]*>/g,"");const t=e;return typeof t.innerHTML=="string"?t.innerHTML.replace(/<[^>]*>/g,""):String(e)}let gn=0;const R=[],_=new Map,j=new Map,$=new Map,W=new Map,hn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function bn(e,t,n){const o=document.activeElement,r=a=>{if(a.key!=="Tab")return;const s=t.querySelectorAll(hn);if(s.length===0)return;const i=s[0],u=s[s.length-1];a.shiftKey?document.activeElement===i&&(a.preventDefault(),u.focus()):document.activeElement===u&&(a.preventDefault(),i.focus())};n.addEventListener("keydown",r),W.set(e,{previousFocus:o,handler:r})}function vn(e){const t=W.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.removeEventListener("keydown",t.handler),t.previousFocus&&typeof t.previousFocus.focus=="function"&&t.previousFocus.focus(),W.delete(e)}function yn(e){const t=W.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.removeEventListener("keydown",t.handler)}function Ie(e){const t=W.get(e);if(!t)return;const n=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);n&&n.addEventListener("keydown",t.handler)}const G="fnon-task-bar";function kn(){let e=document.getElementById(G);return e||(e=document.createElement("div"),e.id=G,e.className="fnon-task-bar",document.body.appendChild(e)),e}function Cn(e,t,n,o){const r=kn(),a=document.createElement("button");a.className="fnon-task-bar-btn",a.textContent=t||"Minimized",a.dataset.modalId=e,a.addEventListener("click",()=>{if(n.classList.remove("fnon-minimized"),o.classList.remove("fnon-overlay-hidden"),Ie(e),o.parentNode.appendChild(o),a.remove(),$.delete(e),$.size===0){const i=document.getElementById(G);i&&i.remove()}const s=_.get(e);ee(n,o,s==null?void 0:s.showMaxMin)}),r.appendChild(a)}function wn(){const e=document.getElementById(G);e&&$.size===0&&e.remove()}function xn(){const e=document.getElementById(G);return!e||e.children.length===0?0:e.getBoundingClientRect().height}function ee(e,t,n){if(!e.classList.contains("fnon-modal-fl")){e.style.removeProperty("--fnon-fl-max-height");return}if(n){const r=xn();r>0?e.style.setProperty("--fnon-fl-max-height",`calc(100vh - ${r}px)`):e.style.removeProperty("--fnon-fl-max-height")}else e.style.removeProperty("--fnon-fl-max-height")}function Fe(){return`fnon-modal-${++gn}`}const Mn={closeButton:!0,autoFocus:!1,autoFocusTag:"input:not([disabled])",autoFocusDelay:0,focusTrap:!0,appendTarget:"body",layout:"hbf",fontFamily:"'Quicksand', sans-serif",animation:"slide-top",color:"#2b2b2b",background:"rgba(0, 0, 0, 0.4)",zIndex:4e3,showIcon:!1,delButtons:!1};function Ln(e,t){let n=!1,o=0,r=0,a=0,s=0,i=0;function u(){return e.closest('[dir="rtl"]')!==null||document.documentElement.dir==="rtl"}t.addEventListener("mousedown",c=>{if(e.classList.contains("fnon-modal-fl"))return;n=!0,o=c.clientX,r=c.clientY;const l=e.getBoundingClientRect();a=l.left,i=l.right,s=l.top,e.style.position="fixed",e.style.margin="0",e.style.bottom="auto",u()?(e.style.right=window.innerWidth-i+"px",e.style.left="auto"):(e.style.left=a+"px",e.style.right="auto"),e.style.top=s+"px",e.classList.add("fnon-dragging"),c.preventDefault()}),document.addEventListener("mousemove",c=>{if(!n)return;const l=c.clientX-o,d=c.clientY-r;u()?e.style.right=window.innerWidth-i-l+"px":e.style.left=a+l+"px",e.style.top=s+d+"px"}),document.addEventListener("mouseup",()=>{n&&(n=!1,e.classList.remove("fnon-dragging"))})}function O(e,t){const n={...Mn,...t},o=Fe();n.showClose!==void 0&&(n.closeButton=n.showClose),_.set(o,n);const r=n.data||{};r.__modalId=o,j.set(o,r);let a;n.appendTarget?(a=X(n.appendTarget),a||(C(`appendTarget "${n.appendTarget}" not found; falling back to body`),a=document.body)):a=document.body;const s=document.createElement("div");s.className="fnon-overlay",s.dataset.modalId=o,n.zIndex&&(s.style.zIndex=String(n.zIndex)),n.background&&(s.style.background=n.background),n.dir&&(s.dir=n.dir);const i=document.createElement("div");i.className=`fnon-modal fnon-theme-${e.toLowerCase()}`,i.dataset.modalId=o,i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),n.fontFamily&&(i.style.fontFamily=n.fontFamily),n.width&&i.classList.add(`fnon-modal-${n.width.toLowerCase()}`);let u=Ne(e);n.titleColor&&(u+=` --fnon-title-color: ${n.titleColor};`),n.titleBackground&&(u+=` --fnon-title-background: ${n.titleBackground};`),n.color&&(u+=` --fnon-body-color: ${n.color};`),i.setAttribute("style",u);const c=document.createElement("div");c.className="fnon-modal-title",n.titleBackground&&(c.style.background=n.titleBackground),n.titleColor&&(c.style.color=n.titleColor);const l=document.createElement("span");l.className="fnon-modal-title-text",n.title instanceof HTMLElement?l.appendChild(n.title):n.title!==void 0&&n.title!==null&&(l.innerHTML=le(n.title)),c.appendChild(l);const d=document.createElement("div");d.className="fnon-modal-controls";const f=[];if(n.showMin){const p=document.createElement("button");p.className="fnon-btn-min",p.innerHTML="_",p.title="Minimize",p.addEventListener("click",()=>{const h=i.classList.contains("fnon-minimized");if(i.classList.toggle("fnon-minimized"),s.classList.toggle("fnon-overlay-hidden"),!h)yn(o),$.set(o,{modalEl:i,title:n.title||""}),Cn(o,pn(n.title)||"",i,s);else{if(Ie(o),s.parentNode.appendChild(s),$.get(o)){const P=document.querySelector(`.fnon-task-bar-btn[data-modal-id="${o}"]`);P&&P.remove(),$.delete(o),wn()}ee(i,s,n.showMaxMin)}}),f.push(p)}if(n.showMaxMin){const p=document.createElement("button");p.className="fnon-btn-max",p.innerHTML="⛶",p.title="Maximize",p.addEventListener("click",()=>{n.width==="fl"?(i.classList.toggle("fnon-modal-fl"),i.classList.toggle("fnon-modal-xl")):i.classList.toggle("fnon-modal-fl"),ee(i,s,n.showMaxMin),i.classList.remove("fnon-minimized"),s.classList.remove("fnon-overlay-hidden")}),f.push(p)}if(n.closeButton!==!1){const p=document.createElement("button");p.className="fnon-btn-close",p.innerHTML=De(),p.title="Close",p.addEventListener("click",()=>H(o)),f.push(p)}n.dir==="rtl"&&f.reverse(),f.forEach(p=>d.appendChild(p)),c.appendChild(d);const m=document.createElement("div");if(m.className="fnon-modal-body",n.color&&(m.style.color=n.color),n.showIcon&&n.icon){const p=document.createElement("div");p.className="fnon-modal-icon",p.innerHTML=n.icon,n.iconColor&&(p.style.color=n.iconColor),m.appendChild(p)}const g={id:o,theme:e};n.message!==void 0&&n.message!==null&&(Be(n.message,m,g)||(m.innerHTML=le(n.message)));const b=document.createElement("div");if(n.buttons&&n.buttons.length>0&&!n.delButtons){b.className="fnon-modal-footer";for(const p of n.buttons){const h=Pe(p,o,m,r);b.appendChild(h)}}if(typeof n.isDark=="function"?n.isDark():n.isDark){const p=n.darkBgColor||"#1a202c";i.style.setProperty("--fnon-bg",p),m.style.background=p,b.style.background=p,b.style.borderTopColor="#2d3748",t.color||(m.style.color="#e2e8f0")}const v={h:c,b:m,f:b},y=(n.layout||"hbf").toLowerCase().replace(/[^hbf]/g,"");if(y&&y!=="hbf"){const p=new Set;for(const h of y)!p.has(h)&&v[h]&&(i.appendChild(v[h]),p.add(h));for(const h of"hbf")!p.has(h)&&v[h]&&i.appendChild(v[h])}else i.appendChild(c),i.appendChild(m),i.appendChild(b);if(s.appendChild(i),ee(i,s,n.showMaxMin),n.overlay===!1&&(s.classList.add("fnon-overlay-nobg"),i.addEventListener("mousedown",p=>{p.target.closest("button, input, textarea, select, a, [tabindex]")||s.parentNode.appendChild(s)})),Ln(i,c),n.onInit&&n.onInit(i,r),n.defaultBefore&&n.defaultBefore(i,r),n.beforeShow&&n.beforeShow(i,r),a.appendChild(s),n.defaultAfter&&n.defaultAfter(i,r),n.afterShow&&n.afterShow(i,r),requestAnimationFrame(()=>{s.classList.add("fnon-active"),i.classList.add("fnon-active")}),n.autoFocus){const p=n.autoFocusTag||"button",h=n.autoFocusDelay||0;requestAnimationFrame(()=>{const M=i.querySelector(p);M&&(h>0?setTimeout(()=>M.focus(),h):M.focus())})}return n.focusTrap!==!1&&bn(o,i,s),n.onOpen&&n.onOpen(i,r),R.push(s),{close:()=>H(o),modalEl:i,id:o}}function H(e){const t=_.get(e),n=j.get(e)||{},o=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);if(!o){_.delete(e),j.delete(e),C(`Modal ${e} not found in DOM`);return}const r=o.querySelector(".fnon-modal");t!=null&&t.onClosing&&r&&t.onClosing(r,n),vn(e),Ae(e),o.classList.remove("fnon-active"),r&&r.classList.remove("fnon-active"),t!=null&&t.onClose&&t.onClose(n),setTimeout(()=>{o.parentNode&&o.parentNode.removeChild(o),t!=null&&t.onClosed&&t.onClosed(n),_.delete(e),j.delete(e)},300);const a=R.indexOf(o);a!==-1&&R.splice(a,1)}function En(){if(R.length===0)return;const t=R[R.length-1].dataset.modalId;t&&H(t)}function Pe(e,t,n,o){var s;const r=document.createElement("button");r.className=`fnon-btn fnon-btn-${((s=e.style)==null?void 0:s.toLowerCase())||"light"}`,e.css&&(r.className+=" "+e.css),r.textContent=e.text,e.color&&(r.style.color=e.color),e.background&&(r.style.background=e.background);const a=e.boxShadow||e.shadow;return a&&(r.style.boxShadow=a),e.borderColor&&(r.style.borderColor=e.borderColor),e.callback?r.addEventListener("click",()=>{let i=!1;e.callback(()=>{i=!0,H(t)},n,o)!==!1&&(i||H(t))}):r.addEventListener("click",()=>H(t)),r}function Sn(e,t){let n,o;if(typeof e=="string"){n=e;const c=document.querySelector(`.fnon-overlay[data-modal-id="${n}"]`);if(!c)return C(`addModalButton: modal "${n}" not found`),null;if(o=c.querySelector(".fnon-modal"),!o)return C(`addModalButton: modal element for "${n}" not found`),null}else if(o=e,n=o.dataset.modalId||"",!n)return C("addModalButton: HTMLElement has no data-modal-id"),null;const r=_.get(n);if(!r)return C(`addModalButton: options for modal "${n}" not found`),null;let a=o.querySelector(".fnon-modal-footer");if(!a){if(a=document.createElement("div"),a.className="fnon-modal-footer",typeof r.isDark=="function"?r.isDark():r.isDark){const l=r.darkBgColor||"#1a202c";a.style.background=l,a.style.borderTopColor="#2d3748"}o.appendChild(a)}const s=o.querySelector(".fnon-modal-body"),i=j.get(n)||{},u=Pe(t,n,s,i);return a.appendChild(u),u}document.addEventListener("keydown",e=>{e.key==="Escape"&&En()});const me={};function S(e){const t=function(n,o,r,a,s){let i;if(typeof n=="object"?(i={...me,...n},o!==void 0&&(i.title=o)):(i={...me,message:n,title:o||""},r!==void 0&&(i.btnOkText=r),s!==void 0&&(i.onClose=s)),!i.buttons||i.buttons.length===0){const u=a||i.callback,c=i.btnOkText||"OK",l=i.btnOkShadow;i.buttons=[{text:c,style:e,color:i.btnOkColor,background:i.btnOkBackground,boxShadow:l,shadow:l,borderColor:i.btnOkBorderColor,callback:d=>{u&&u(),d()}}]}O(e,i)};return t.Async=function(n,o,r){return new Promise(a=>{const s=()=>a();typeof n=="object"?(n.callback=s,n.onClose=s,t(n,o,r)):t(n,o,r,s,s)})},t}const ne={Primary:S("Primary"),Success:S("Success"),Warning:S("Warning"),Danger:S("Danger"),Info:S("Info"),Light:S("Light"),Dark:S("Dark"),Init(e){Object.assign(me,e)}},pe={};function D(e){const t=function(n,o,r,a,s,i,u){let c,l;if(typeof n=="object"?(c={...pe,...n},o!==void 0&&(c.title=o),l=i||c.cancelCallback):(c={...pe,message:n,title:o||""},r!==void 0&&(c.btnOkText=r),a!==void 0&&(c.btnCancelText=a),l=i,u!==void 0&&(c.onClose=u)),!c.buttons||c.buttons.length===0){const d=s||c.callback;l=l||c.cancelCallback;const f=c.btnOkText||"OK",m=c.btnCancelText||"Cancel",g=c.btnOkShadow,b=c.btnCancelShadow;c.buttons=[{text:m,style:"Light",color:c.btnCancelColor,background:c.btnCancelBackground,boxShadow:b,shadow:b,borderColor:c.btnCancelBorderColor,callback:k=>{l&&l(!1),k()}},{text:f,style:e,color:c.btnOkColor,background:c.btnOkBackground,boxShadow:g,shadow:g,borderColor:c.btnOkBorderColor,callback:k=>{d&&d(!0),k()}}]}O(e,c)};return t.Async=function(n,o,r,a){return new Promise(s=>{const i=()=>s(!0),u=()=>s(!1),c=()=>s(!1);typeof n=="object"?(n.callback=i,n.cancelCallback=u,n.onClose=c,t(n,o,r,a)):t(n,o,r,a,i,u,c)})},t}const ge={Primary:D("Primary"),Success:D("Success"),Warning:D("Warning"),Danger:D("Danger"),Info:D("Info"),Light:D("Light"),Dark:D("Dark"),Init(e){Object.assign(pe,e)}},te={};function K(e){return O("Primary",{...te,...e})}K.Init=function(e){Object.assign(te,e)};function T(e){const t=function(n,o,r,a,s,i,u){let c,l,d;if(typeof n=="object"?(c={...te,...n},o!==void 0&&(c.title=o),l=s||c.callback,d=i||c.cancelCallback):(c={...te,message:n,title:o||""},r!==void 0&&(c.btnOkText=r),a!==void 0&&(c.btnCancelText=a),l=s,d=i,u!==void 0&&(c.onClose=u)),!c.buttons||c.buttons.length===0){let f=null;const m=c.btnOkText||"OK",g=c.btnCancelText||"Cancel",b=c.btnOkShadow,k=c.btnCancelShadow;c.buttons=[{text:g,style:"Light",color:c.btnCancelColor,background:c.btnCancelBackground,boxShadow:k,shadow:k,borderColor:c.btnCancelBorderColor,callback:(y,p,h)=>{d&&d(y,f,h)===!1||y()}},{text:m,style:e,color:c.btnOkColor,background:c.btnOkBackground,boxShadow:b,shadow:b,borderColor:c.btnOkBorderColor,callback:(y,p,h)=>{l&&l(y,f,h)===!1||y()}}],f=O(e,c).modalEl.querySelector(".fnon-modal-body")}else O(e,c)};return t.Async=function(n,o,r,a){return new Promise(s=>{const i=(l,d,f)=>{s(!0)},u=(l,d,f)=>{s(!1)},c=()=>s(!1);typeof n=="object"?(n.callback=i,n.cancelCallback=u,n.onClose=c,t(n,o,r,a)):t(n,o,r,a,i,u,c)})},t}Object.assign(K,{Primary:T("Primary"),Success:T("Success"),Warning:T("Warning"),Danger:T("Danger"),Info:T("Info"),Light:T("Light"),Dark:T("Dark")});const Re={headline:"BREAKING",theme:"Danger",anchor:"top",timeout:5e3,closable:!0,appendTarget:"body",fontFamily:"'Quicksand', sans-serif"};function Y(e){var d;const t={...Re,...e},n=Fe();let o;t.appendTarget?(o=X(t.appendTarget),o||(C(`appendTarget "${t.appendTarget}" not found; falling back to body`),o=document.body)):o=document.body;const r=t.theme||"Danger",a=document.createElement("div");a.className=`fnon-breaking fnon-breaking-${t.anchor}`,a.dataset.modalId=n,a.setAttribute("role","alert");let s=Ne(r);t.fontFamily&&(s+=`; font-family: ${t.fontFamily}`),a.setAttribute("style",s);const i=document.createElement("div");if(i.className="fnon-breaking-inner",t.headline){const f=document.createElement("span");f.className="fnon-breaking-headline",f.textContent=t.headline,i.appendChild(f)}const u=document.createElement("div");u.className="fnon-breaking-body";const c={id:n,type:"breaking"};if(t.message!==void 0&&t.message!==null&&(Be(t.message,u,c)||(u.innerHTML=typeof t.message=="string"?t.message:t.message instanceof HTMLElement?t.message.outerHTML:String(t.message))),i.appendChild(u),t.buttons&&t.buttons.length>0){const f=document.createElement("div");f.className="fnon-breaking-buttons";for(const m of t.buttons){const g=document.createElement("button");g.className=`fnon-btn fnon-btn-${((d=m.style)==null?void 0:d.toLowerCase())||r.toLowerCase()}`,m.css&&(g.className+=" "+m.css),g.textContent=m.text,m.color&&(g.style.color=m.color),m.background&&(g.style.background=m.background);const b=m.boxShadow||m.shadow;b&&(g.style.boxShadow=b),m.borderColor&&(g.style.borderColor=m.borderColor),m.callback&&g.addEventListener("click",()=>m.callback(()=>l(n))),f.appendChild(g)}i.appendChild(f)}if(t.closable!==!1){const f=document.createElement("button");f.className="fnon-breaking-close",f.innerHTML=De(),f.title="Dismiss",f.addEventListener("click",()=>l(n)),i.appendChild(f)}a.appendChild(i),o.appendChild(a),requestAnimationFrame(()=>a.classList.add("fnon-breaking-active")),t.timeout&&t.timeout>0&&setTimeout(()=>l(n),t.timeout);function l(f){Ae(f);const m=document.querySelector(`.fnon-breaking[data-modal-id="${f}"]`);m&&(m.classList.remove("fnon-breaking-active"),t.onClose&&t.onClose(),setTimeout(()=>{m.parentNode&&m.parentNode.removeChild(m)},400))}return{close:()=>l(n),el:a,id:n}}function N(e){const t=function(n,o){return Y(typeof o=="object"&&o!==null?{...o,theme:e,message:n}:{headline:o,message:n,theme:e})};return t.Async=function(n,o){return new Promise(r=>{const a=typeof o=="object"&&o!==null?{...o,theme:e,message:n,onClose:r}:{headline:o,message:n,theme:e,onClose:r};Y(a)})},t}Y.Init=function(e){Object.assign(Re,e)};const he=Object.assign(Y,{Primary:N("Primary"),Success:N("Success"),Warning:N("Warning"),Danger:N("Danger"),Info:N("Info"),Light:N("Light"),Dark:N("Dark"),Init:Y.Init}),_e="fnon-hint-container-",oe='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>',Dn='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 9v4M12 17h.01"/><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/></svg>',Tn='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>',Nn='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/></svg>';function Bn(e,t){return t&&{"right-top":"left-top","right-center":"left-center","right-bottom":"left-bottom","left-top":"right-top","left-center":"right-center","left-bottom":"right-bottom"}[e]||e}const $e={type:"Primary",position:"right-top",animation:"slide-left",timeOut:4e3,closable:!0,spacing:"8px",svgSize:{w:20,h:20},fontSize:"0.88rem",width:"360px",animationDuration:"0.3s",progressColor:void 0,title:void 0,fontFamily:"'Quicksand', sans-serif"};let ie={Primary:{titleColor:"#029eff",backgroundColor:"#ebf8ff",borderColor:"#029eff",svg:oe},Success:{titleColor:"#39DA8A",backgroundColor:"#f0fff4",borderColor:"#39DA8A",svg:oe},Warning:{titleColor:"#fdd347",backgroundColor:"#fffbe5",borderColor:"#fdd347",svg:Dn},Danger:{titleColor:"#ff6b6b",backgroundColor:"#fff5f5",borderColor:"#ff6b6b",svg:Tn},Info:{titleColor:"#48dbfb",backgroundColor:"#e5faff",borderColor:"#48dbfb",svg:Nn},Light:{titleColor:"#2d3748",backgroundColor:"#f8f9fa",borderColor:"#ced4da",svg:oe},Dark:{titleColor:"#fff",backgroundColor:"#222f3e",borderColor:"#222f3e",svg:oe}};function An(e,t){ie[e]={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff",svg:void 0}}function In(e){if(ie[e])return ie[e];const t=Te(e);if(t){const n={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff"};return ie[e]=n,n}return null}function Fn(e){const t=document.querySelector(`#${_e}${e}`);if(t)return t;const n=document.createElement("div");return n.id=`${_e}${e}`,n.className=`fnon-hint-container ${e}`,document.body.appendChild(n),n}function Pn(e){e.children.length===0&&e.parentNode&&e.parentNode.removeChild(e)}function U(e,t){const n={...$e};let o="";typeof t=="string"?o=t:t&&typeof t=="object"&&(Object.assign(n,t),o=n.title||"");const r=n.type||"Primary",a=In(r);if(!a)return C(`Unknown hint type: ${r}`),{close:()=>{}};const s=n.position||"right-top",i=n.dir==="rtl",u=Bn(s,i),c=n.animation||"slide-left",l=Fn(u);i&&(l.dir="rtl");const d=document.createElement("div");if(d.className=`fnon-hint fnon-hint-${u} fnon-hint-anim-${c} fnon-hint-${r.toLowerCase()}`,d.setAttribute("data-hint-id",Date.now().toString()),n.width&&(d.style.maxWidth=n.width),n.fontSize&&(d.style.fontSize=n.fontSize),n.fontFamily&&(d.style.fontFamily=n.fontFamily),n.spacing&&(d.style.marginBottom=n.spacing),n.animationDuration&&(d.style.transitionDuration=n.animationDuration),a.svg){const p=document.createElement("div");p.className="fnon-hint-icon";const h=n.svgSize||{w:20,h:20};p.style.setProperty("--fnon-icon-w",h.w+"px"),p.style.setProperty("--fnon-icon-h",h.h+"px"),p.innerHTML=a.svg,d.appendChild(p)}const f=document.createElement("div");if(f.className="fnon-hint-content",o){const p=document.createElement("div");p.className="fnon-hint-title",p.textContent=o,f.appendChild(p)}const m=document.createElement("div");if(m.className="fnon-hint-message",m.innerHTML=e,f.appendChild(m),d.appendChild(f),n.closable!==!1){const p=document.createElement("button");p.className="fnon-hint-close",p.innerHTML="&times;",p.addEventListener("click",()=>y(d)),d.appendChild(p)}if(n.timeOut&&n.timeOut>0){const p=n.progressColor||a.borderColor,h=document.createElement("div");h.className="fnon-hint-progress",h.style.setProperty("--display-dur",n.timeOut+"ms"),h.style.background=p,d.style.position="relative",d.style.overflow="hidden",d.appendChild(h)}de(a.borderColor);const g=i?"borderRight":"borderLeft";d.style[g]=`4px solid ${a.borderColor}`,d.style.backgroundColor=a.backgroundColor;const b=typeof n.isDark=="function"?n.isDark():n.isDark;if(b){const p=n.darkBgColor||"#1a202c";d.style.backgroundColor=p}const k=b?n.darkBgColor||"#1a202c":a.backgroundColor;d.style.color=cn(k),l.appendChild(d),requestAnimationFrame(()=>{d.classList.add("fnon-hint-active")});let v=null;n.timeOut&&n.timeOut>0&&(v=setTimeout(()=>y(d),n.timeOut));function y(p){v&&clearTimeout(v),p.classList.remove("fnon-hint-active"),n.onClose&&n.onClose(),n.onclosed&&n.onclosed(),setTimeout(()=>{p.parentNode&&p.parentNode.removeChild(p),Pn(l)},300)}return{close:()=>y(d)}}U.Init=function(e){Object.assign($e,e)};function B(e){const t=function(n,o){return U(n,typeof o=="string"?{type:e,title:o}:{...o,type:e})};return t.Async=function(n,o){return new Promise(r=>{const a=typeof o=="string"?{type:e,title:o,onClose:r}:{...o,type:e,onClose:r};U(n,a)})},t}const be={Primary:B("Primary"),Success:B("Success"),Warning:B("Warning"),Danger:B("Danger"),Info:B("Info"),Light:B("Light"),Dark:B("Dark"),show:U,Init:U.Init},ve={...{Orbit:{html:e=>`<div class="fnon-sp-orbit" style="--fnon-sp-color: ${e||"#029eff"}"><div class="fnon-sp-orbit-dot"></div></div>`,css:!0},Spin:{html:e=>`<div class="fnon-sp-spin" style="--fnon-sp-color: ${e||"#029eff"}"><div class="fnon-sp-spin-ring"></div></div>`,css:!0}},...{Infinity:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><path fill="none" stroke="${e[0]}" stroke-width="4" stroke-dasharray="133.42624267578125 123.162685546875" d="M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z" stroke-linecap="round" style="transform:scale(0.8);transform-origin:50px 50px"><animate attributeName="stroke-dashoffset" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="0;256"></animate></path></svg>`},Ripple:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="50" cy="50" r="0" fill="none" stroke="${e[0]}" stroke-width="6"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;40" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline" begin="-0.5s"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline" begin="-0.5s"></animate></circle><circle cx="50" cy="50" r="0" fill="none" stroke="${e[1]}" stroke-width="6"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;40" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline"></animate></circle></svg>`},Typing:{html:e=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="27.5" cy="57.5" r="5" fill="${e[0]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.6s"></animate></circle> <circle cx="42.5" cy="57.5" r="5" fill="${e[1]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.44999999999999996s"></animate></circle> <circle cx="57.5" cy="57.5" r="5" fill="${e[2]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.3s"></animate></circle> <circle cx="72.5" cy="57.5" r="5" fill="${e[3]}"><animate attributeName="cy" calcMode="spline" keySplines="0 0.5 0.5 1;0.5 0 1 0.5;0.5 0.5 0.5 0.5" repeatCount="indefinite" values="57.5;42.5;57.5;57.5" keyTimes="0;0.3;0.6;1" dur=".7s" begin="-0.15s"></animate></circle></svg>`}}};function Oe(e,t){const n=ve[e];if("css"in n&&n.css)return n.html(t);const o=de(t,9);return n.html(o)}const He={text:"",clickToClose:!1,svgColor:"#029eff",containerSize:void 0,fontFamily:"'Quicksand', sans-serif"},Ye={text:"",svgColor:"#029eff",containerSize:void 0,svgSize:void 0,fontFamily:"'Quicksand', sans-serif"};let ye=!1,re=null;function qe(e,t,n){if(ye){C("A wait overlay is already active. Remove it first.");return}const o={...He,...n};t!==void 0&&(o.text=t);const r=o.svgColor||"#029eff",a=Oe(e,r),s=document.createElement("div");s.className="fnon-wait-overlay",s.id="fnon-wait-overlay",o.fontFamily&&(s.style.fontFamily=o.fontFamily);const i=document.createElement("div");if(i.className="fnon-wait-box",o.containerSize&&(i.style.width=o.containerSize),i.innerHTML=a,o.text){const c=document.createElement("div");c.className="fnon-wait-text",c.textContent=o.text,i.appendChild(c)}if(typeof o.isDark=="function"?o.isDark():o.isDark){const c=o.darkBgColor||"#1a202c";s.style.background="rgba(0, 0, 0, 0.85)",i.style.background=c,i.style.padding="1.5rem",i.style.borderRadius="8px"}s.appendChild(i),document.body.appendChild(s),requestAnimationFrame(()=>s.classList.add("fnon-wait-active")),o.clickToClose&&s.addEventListener("click",()=>ze()),ye=!0}function ze(e){const t=document.getElementById("fnon-wait-overlay");if(!t)return;const n=typeof e=="number"?e:0,o=()=>{t.classList.remove("fnon-wait-active"),re&&(re(!0),re=null),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),ye=!1},300)};n>0?setTimeout(o,n):o()}function Rn(e){const t=document.querySelector("#fnon-wait-overlay .fnon-wait-text");t&&(t.textContent=e)}function _n(e){const t=function(n,o){qe(e,n,o)};return t.Async=function(n,o){return new Promise(r=>{re=r,qe(e,n,o)})},t}const q={Remove:ze,Change:Rn,Init:function(e){Object.assign(He,e)}};for(const e of Object.keys(ve))q[e]=_n(e);let ae=null;function je(e,t,n,o){var f;const r=X(t);if(!r){C(`Box target not found: ${t}`);return}const a={...Ye,...o},s=a.svgColor||"#029eff",i=Oe(e,s),u=r.querySelector(".fnon-box-overlay");u&&((f=u.parentNode)==null||f.removeChild(u));const c=document.createElement("div");c.className="fnon-box-overlay",a.fontFamily&&(c.style.fontFamily=a.fontFamily);const l=document.createElement("div");if(l.className="fnon-box-inner",a.containerSize&&(l.style.width=a.containerSize),a.svgSize&&(l.style.setProperty("--fnon-box-svg-w",a.svgSize.w+"px"),l.style.setProperty("--fnon-box-svg-h",a.svgSize.h+"px")),l.innerHTML=i,a.text){const m=document.createElement("div");m.className="fnon-box-label",m.textContent=a.text,l.appendChild(m)}if(typeof a.isDark=="function"?a.isDark():a.isDark){const m=a.darkBgColor||"#1a202c";c.style.background="rgba(0, 0, 0, 0.7)",l.style.background=m,l.style.padding="1.5rem",l.style.borderRadius="8px"}c.appendChild(l),r.style.position="relative",r.appendChild(c)}function $n(e){const t=X(e);if(!t)return;const n=t.querySelector(".fnon-box-overlay");n&&n.parentNode&&n.parentNode.removeChild(n),ae&&(ae(!0),ae=null)}function On(e){const t=function(n,o,r){je(e,n,o,r)};return t.Async=function(n,o,r){return new Promise(a=>{ae=a,je(e,n,o,r)})},t}const se={Remove:$n,Init:function(e){Object.assign(Ye,e)}};for(const e of Object.keys(ve))se[e]=On(e);function We(){return document.documentElement.dir==="rtl"}const Hn={days:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysLong:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",ok:"OK",prevMonth:"Previous month",nextMonth:"Next month",digits:["0","1","2","3","4","5","6","7","8","9"],rangeLabel:"{fromMonth} – {toMonth} {year}"};let Ge={};function Yn(e){const t={},n=[Hn,Ge,e||{}];for(const o of n)for(const r of Object.keys(o))o[r]!==void 0&&(t[r]=o[r]);return t}function A(e,t){return t?String(e).split("").map(n=>t[parseInt(n,10)]||n).join(""):String(e)}function ke(e){Object.assign(Ge,e)}function Ke(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function Ce(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function Ue(e,t){return new Date(e,t+1,0).getDate()}function qn(e,t){return new Date(e,t,1).getDay()}function w(e){return e.getFullYear()*1e4+e.getMonth()*100+e.getDate()}function E(e,t){let n=e.viewMonth+t,o=e.viewYear;for(;n<0;)n+=12,o--;for(;n>11;)n-=12,o++;if(e.minDate!==null){const r=new Date(o,n+1,0);if(w(r)<e.minDate)return!1}if(e.maxDate!==null){const r=new Date(o,n,1);if(w(r)>e.maxDate)return!1}return!0}function Ve(e){if(e.minDate===null)return!0;const t=e.viewMonth-1,n=t<0?e.viewYear-1:e.viewYear,o=t<0?11:t,r=new Date(n,o+1,0);return w(r)>=e.minDate}function Xe(e){if(e.maxDate===null)return!0;const t=e.viewMonth+1,n=t>11?e.viewYear+1:e.viewYear,o=t>11?0:t,r=new Date(n,o,1);return w(r)<=e.maxDate}function ce(e){if(!e.bodyEl)return;const t=e.bodyEl.querySelectorAll(".fnon-dp-day");for(const n of t)n.classList.remove("fnon-dp-range-preview")}function zn(e,t){if(!e.bodyEl)return;const n=e.bodyEl.querySelectorAll(".fnon-dp-day"),o=w(t);for(const r of n){const a=parseInt(r.dataset.ts||"0",10);r.classList.toggle("fnon-dp-selected",a===o),r.classList.remove("fnon-dp-range","fnon-dp-range-start","fnon-dp-range-end")}}function Je(e={}){const t=new Date,n=e.initDate||t,o=!!e.dateRange,r=o?!1:!!e.withTime,a=e.minDate?w(Ke(e.minDate)):null,s=e.maxDate?w(Ke(e.maxDate)):null,i=typeof e.isDark=="function"?e.isDark():e.isDark,u={viewYear:n.getFullYear(),viewMonth:n.getMonth(),start:null,end:null,rangeMode:o,withTime:r,minDate:a,maxDate:s,initDate:n,hour:t.getHours(),minute:t.getMinutes(),resolve:null,reject:null,bodyEl:null,closeModal:null,dark:!!i,darkBg:e.darkBgColor||"#1a202c",layout:e.layout||1,locale:Yn(e.language)};return new Promise((c,l)=>{u.resolve=c,u.reject=l;const d=u.layout===6||u.layout==="auto"?"xl":"sm",f={title:e.title||(o?"Select Date Range":"Select Date"),closeButton:!0,delButtons:!0,layout:"hb",isDark:u.dark,darkBgColor:u.darkBg,width:d,autoFocus:!1,color:u.dark?"#e2e8f0":void 0},m=O("Primary",f);u.closeModal=m.close,u.bodyEl=m.modalEl.querySelector(".fnon-modal-body"),u.bodyEl&&(u.bodyEl.style.padding="0",x(u))})}const jn=Je;function x(e){const t=e.bodyEl;if(!t)return;t.innerHTML="";const n=document.createElement("div");n.className="fnon-dp"+(e.dark?" fnon-dp-dark":"");const o=We();o&&(n.dir="rtl");const r=e.locale;(e.layout==="auto"?window.innerWidth>=768?6:1:e.layout)===1?Wn(e,r,n,o):Gn(e,r,n,o),Un(e,r,n),t.appendChild(n)}function Wn(e,t,n,o){const r=o?"›":"‹",a=o?"‹":"›",s=document.createElement("div");s.className="fnon-dp-header";const i=document.createElement("button");i.className="fnon-dp-nav",i.innerHTML=r,i.title=o?t.nextMonth:t.prevMonth,Ve(e)||i.classList.add("fnon-dp-nav-disabled"),i.addEventListener("click",()=>{Ve(e)&&(e.viewMonth--,e.viewMonth<0&&(e.viewMonth=11,e.viewYear--),x(e))});const u=document.createElement("button");u.className="fnon-dp-label",u.textContent=t.months[e.viewMonth]+" "+A(e.viewYear,t.digits),u.addEventListener("click",d=>{d.stopPropagation(),Jn(e,u)});const c=document.createElement("button");c.className="fnon-dp-nav",c.innerHTML=a,c.title=o?t.prevMonth:t.nextMonth,Xe(e)||c.classList.add("fnon-dp-nav-disabled"),c.addEventListener("click",()=>{Xe(e)&&(e.viewMonth++,e.viewMonth>11&&(e.viewMonth=0,e.viewYear++),x(e))}),s.appendChild(i),s.appendChild(u),s.appendChild(c),n.appendChild(s),e.withTime&&n.appendChild(Ze(e));const l=Qe(t,e.viewYear,e.viewMonth,e,!0);n.appendChild(l)}function Gn(e,t,n,o){const r=o?"›":"‹",a=o?"‹":"›",s=document.createElement("div");s.className="fnon-dp-header";const i=document.createElement("button");i.className="fnon-dp-nav",i.innerHTML=r,i.title=o?t.nextMonth:t.prevMonth,i.addEventListener("click",()=>{E(e,-6)&&(e.viewMonth-=6,e.viewMonth<0&&(e.viewMonth+=12,e.viewYear--),x(e))});const u=document.createElement("button");u.className="fnon-dp-label";const c=e.viewMonth,l=(e.viewMonth+5)%12,d=l<c?e.viewYear+1:e.viewYear;u.textContent=t.rangeLabel.replace("{fromMonth}",t.months[c]).replace("{toMonth}",t.months[l]).replace("{year}",A(d,t.digits));const f=document.createElement("button");f.className="fnon-dp-nav",f.innerHTML=a,f.title=o?t.prevMonth:t.nextMonth,f.addEventListener("click",()=>{E(e,6)&&(e.viewMonth+=6,e.viewMonth>11&&(e.viewMonth-=12,e.viewYear++),x(e))}),s.appendChild(i),s.appendChild(u),s.appendChild(f),n.appendChild(s),e.withTime&&n.appendChild(Ze(e));const m=document.createElement("div");m.className="fnon-dp-months"+(e.layout==="auto"?" fnon-dp-layout-auto":"");for(let g=0;g<6;g++){const b=e.viewMonth+g,k=e.viewYear+Math.floor(b/12),v=Kn(t,k,(b%12+12)%12,e);m.appendChild(v)}n.appendChild(m)}function Kn(e,t,n,o){const r=document.createElement("div");r.className="fnon-dp-month";const a=document.createElement("div");a.className="fnon-dp-month-name",a.textContent=e.months[n]+" "+A(t,e.digits),r.appendChild(a);const s=Qe(e,t,n,o,!1);return r.appendChild(s),r}function Qe(e,t,n,o,r){const a=document.createElement("div");a.className="fnon-dp-grid";for(const m of e.days){const g=document.createElement("div");g.className="fnon-dp-dow",g.textContent=m,a.appendChild(g)}const s=Ue(t,n),i=qn(t,n),u=n===0?11:n-1,c=n===0?t-1:t,l=Ue(c,u),d=Math.ceil((i+s)/7)*7,f=new Date;for(let m=0;m<d;m++){const g=document.createElement("div");g.className="fnon-dp-day";let b,k,v,y;m<i?(b=l-i+m+1,k=n-1<0?11:n-1,v=n-1<0?t-1:t,y=!0):m>=i+s?(b=m-i-s+1,k=n+1>11?0:n+1,v=n+1>11?t+1:t,y=!0):(b=m-i+1,k=n,v=t,y=!1);const p=new Date(v,k,b),h=w(p);if(y&&!r?g.textContent="":g.textContent=A(b,e.digits),g.dataset.year=String(v),g.dataset.month=String(k),g.dataset.day=String(b),g.dataset.ts=String(h),y&&g.classList.add("fnon-dp-other"),Ce(p,f)&&g.classList.add("fnon-dp-today"),o.minDate!==null&&h<o.minDate&&g.classList.add("fnon-dp-disabled"),o.maxDate!==null&&h>o.maxDate&&g.classList.add("fnon-dp-disabled"),o.start&&Ce(p,o.start)&&g.classList.add("fnon-dp-selected"),o.end&&Ce(p,o.end)&&g.classList.add("fnon-dp-selected"),o.rangeMode&&o.start&&o.end){const M=w(o.start),P=w(o.end);h>M&&h<P&&g.classList.add("fnon-dp-range"),h===M&&g.classList.add("fnon-dp-range-start"),h===P&&g.classList.add("fnon-dp-range-end")}!g.classList.contains("fnon-dp-disabled")&&!y&&(g.addEventListener("click",()=>Xn(o,p)),g.addEventListener("mouseenter",()=>Vn(o,p)),g.addEventListener("mouseleave",()=>ce(o))),a.appendChild(g)}return a}function Ze(e,t){const n=document.createElement("div");n.className="fnon-dp-time",n.innerHTML="<label>Time</label>";const o=document.createElement("input");o.type="time",o.className="fnon-dp-time-input";const r=String(e.hour).padStart(2,"0"),a=String(e.minute).padStart(2,"0");return o.value=r+":"+a,o.addEventListener("change",()=>{const s=o.value.split(":");e.hour=parseInt(s[0],10)||0,e.minute=parseInt(s[1],10)||0}),n.appendChild(o),n}function Un(e,t,n){const o=document.createElement("div");o.className="fnon-dp-actions";const r=document.createElement("div");r.className="fnon-dp-btn-group";function a(){s.classList.toggle("fnon-dp-nav-disabled",!E(e,-12)),i.classList.toggle("fnon-dp-nav-disabled",!E(e,-6)),c.classList.toggle("fnon-dp-nav-disabled",!E(e,6)),l.classList.toggle("fnon-dp-nav-disabled",!E(e,12));const d=w(new Date);u.classList.toggle("fnon-dp-nav-disabled",e.minDate!==null&&d<e.minDate||e.maxDate!==null&&d>e.maxDate)}const s=document.createElement("button");s.className="fnon-dp-btn",s.textContent="-1 Year",s.addEventListener("click",()=>{E(e,-12)&&(e.viewYear-=1,x(e))}),r.appendChild(s);const i=document.createElement("button");i.className="fnon-dp-btn",i.textContent="-6 Months",i.addEventListener("click",()=>{E(e,-6)&&(e.viewMonth-=6,e.viewMonth<0&&(e.viewMonth+=12,e.viewYear-=1),x(e))}),r.appendChild(i);const u=document.createElement("button");u.className="fnon-dp-btn",u.textContent=t.today,u.addEventListener("click",()=>{const d=new Date,f=w(d);e.minDate!==null&&f<e.minDate||e.maxDate!==null&&f>e.maxDate||(e.viewYear=d.getFullYear(),e.viewMonth=d.getMonth(),x(e))}),r.appendChild(u);const c=document.createElement("button");c.className="fnon-dp-btn",c.textContent="+6 Months",c.addEventListener("click",()=>{E(e,6)&&(e.viewMonth+=6,e.viewMonth>11&&(e.viewMonth-=12,e.viewYear+=1),x(e))}),r.appendChild(c);const l=document.createElement("button");if(l.className="fnon-dp-btn",l.textContent="+1 Year",l.addEventListener("click",()=>{E(e,12)&&(e.viewYear+=1,x(e))}),r.appendChild(l),o.appendChild(r),a(),!e.rangeMode&&e.withTime){const d=document.createElement("button");d.className="fnon-dp-btn fnon-dp-btn-primary",d.textContent=t.ok,d.addEventListener("click",()=>{if(e.start&&e.resolve){const f=new Date(e.start);e.withTime&&f.setHours(e.hour,e.minute,0,0),e.resolve(f),e.closeModal&&e.closeModal()}}),o.appendChild(d)}n.appendChild(o)}function Vn(e,t){if(!e.rangeMode||!e.start||e.end||!e.bodyEl)return;const n=w(e.start),o=w(t),r=Math.min(n,o),a=Math.max(n,o);ce(e);const s=e.bodyEl.querySelectorAll(".fnon-dp-day");for(const i of s){const u=parseInt(i.dataset.ts||"0",10);u>r&&u<a&&i.classList.add("fnon-dp-range-preview")}}function Xn(e,t,n){if(e.rangeMode){if(!e.start||e.start&&e.end){e.start=t,e.end=null,ce(e),x(e);return}if(e.start&&!e.end){ce(e),w(t)<w(e.start)?(e.end=e.start,e.start=t):e.end=t,x(e),e.resolve&&(e.resolve({start:new Date(e.start),end:new Date(e.end)}),e.closeModal&&e.closeModal());return}}if(e.start=t,e.withTime){zn(e,t);return}e.resolve&&(e.resolve(t),e.closeModal&&e.closeModal())}function Jn(e,t){const n=document.querySelector(".fnon-dp-popup");if(n){n.remove();return}const o=t.closest(".fnon-dp"),r=o?o.getBoundingClientRect():t.getBoundingClientRect(),a=t.getBoundingClientRect(),s=Math.min(Math.max(240,r.width*.85),320),i=document.createElement("div");i.className="fnon-dp-popup"+(e.dark?" fnon-dp-dark":""),i.style.top=a.bottom+4+"px",i.style.left=r.left+(r.width-s)/2+"px",i.style.width=s+"px";const u=We();let c="year",l=e.viewYear;const d=()=>{if(i.innerHTML="",c==="year"){const f=document.createElement("div");f.className="fnon-dp-popup-nav";const m=document.createElement("button");m.className="fnon-dp-popup-nav-btn",m.textContent=u?"›":"‹",m.addEventListener("click",v=>{v.stopPropagation(),l-=12,d()});const g=document.createElement("span");g.className="fnon-dp-popup-nav-label",g.textContent=A(l-5,e.locale.digits)+"–"+A(l+6,e.locale.digits);const b=document.createElement("button");b.className="fnon-dp-popup-nav-btn",b.textContent=u?"‹":"›",b.addEventListener("click",v=>{v.stopPropagation(),l+=12,d()}),f.appendChild(m),f.appendChild(g),f.appendChild(b),i.appendChild(f);const k=l-5;for(let v=0;v<3;v++){const y=document.createElement("div");y.className="fnon-dp-popup-row";for(let p=0;p<4;p++){const h=k+v*4+p,M=document.createElement("div");M.className="fnon-dp-popup-cell"+(h===e.viewYear?" fnon-dp-popup-active":""),M.textContent=A(h,e.locale.digits),M.addEventListener("click",P=>{P.stopPropagation(),l=h,c="month",d()}),y.appendChild(M)}i.appendChild(y)}}else{const f=document.createElement("div");f.className="fnon-dp-popup-nav";const m=document.createElement("button");m.className="fnon-dp-popup-nav-btn",m.textContent=u?"›":"‹",m.addEventListener("click",b=>{b.stopPropagation(),c="year",d()});const g=document.createElement("span");g.className="fnon-dp-popup-nav-label",g.textContent=A(l,e.locale.digits),f.appendChild(m),f.appendChild(g),i.appendChild(f);for(let b=0;b<3;b++){const k=document.createElement("div");k.className="fnon-dp-popup-row";for(let v=0;v<4;v++){const y=b*4+v,p=document.createElement("div");p.className="fnon-dp-popup-cell"+(y===e.viewMonth&&l===e.viewYear?" fnon-dp-popup-active":""),p.textContent=e.locale.monthsShort[y],p.addEventListener("click",h=>{h.stopPropagation(),e.viewYear=l,e.viewMonth=y,i.remove(),x(e)}),k.appendChild(p)}i.appendChild(k)}}};d(),setTimeout(()=>{document.addEventListener("click",f=>{i.parentNode&&!i.contains(f.target)&&i.remove()},{once:!0})},0),i.addEventListener("click",f=>f.stopPropagation()),document.body.appendChild(i)}let en=!1;function V(){return document.documentElement.dir==="rtl"}const L=new Set;let we=[];function Qn(e){return"clientX"in e?{x:e.clientX,y:e.clientY}:{x:e.x,y:e.y}}function Zn(){return en}function et(e){en=e}function I(){L.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),L.clear(),we.forEach(e=>e()),we=[]}function nn(e){L.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)>e&&(t.parentNode&&t.parentNode.removeChild(t),L.delete(t))})}function xe(e){L.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)===e&&(t.parentNode&&t.parentNode.removeChild(t),L.delete(t))})}function Me(e){const t=e.querySelectorAll(".fnon-cm-item:not(.fnon-cm-item-disabled)");t.length>0&&t[0].focus()}function F(e){return parseInt(e.getAttribute("data-parent-level")||"0",10)}function tn(e){for(;e;){if(e.classList.contains("fnon-cm"))return e;e=e.parentElement}return null}function on(e){const t=tn(e);return t?Array.from(t.querySelectorAll(".fnon-cm-item:not(.fnon-cm-item-disabled)")):[]}function nt(e){for(const t of L)if(F(t)===e)return t;return null}function Le(e){const t=F(e)-1,n=nt(t);if(!n)return null;const o=n.querySelectorAll(".fnon-cm-item"),r=e.getBoundingClientRect();for(const a of o){const s=a.getBoundingClientRect();if((Math.abs(s.right-r.left)<20||Math.abs(s.left-r.right)<20)&&Math.abs(s.top-r.top)<50)return a}return null}function tt(e,t,n){document.body.appendChild(e),L.add(e);const o=e.getBoundingClientRect(),r=window.innerWidth,a=window.innerHeight;let s=t,i=n;s+o.width>r-4&&(s=r-o.width-4),i+o.height>a-4&&(i=a-o.height-4),s<4&&(s=4),i<4&&(i=4),e.style.left=s+"px",e.style.top=i+"px"}function rn(e,t){document.body.appendChild(t),L.add(t);const n=e.getBoundingClientRect(),o=t.getBoundingClientRect(),r=window.innerWidth,a=window.innerHeight;let s,i=n.top;V()?(s=n.left-o.width,s<4&&(s=n.right)):(s=n.right,s+o.width>r-4&&(s=n.left-o.width)),i+o.height>a-4&&(i=a-o.height-4),i<4&&(i=4),t.style.left=s+"px",t.style.top=i+"px"}function Ee(e,t,n){const o=document.createElement("div");o.className="fnon-cm"+(Zn()?" fnon-cm-dark":""),o.setAttribute("data-parent-level",String(t)),V()&&(o.dir="rtl");for(const r of e){const a=document.createElement("div");a.className="fnon-cm-item",r.disabled&&a.classList.add("fnon-cm-item-disabled"),r.className&&a.classList.add(r.className),r.items&&r.items.length>0&&a.classList.add("fnon-cm-item-parent");const s=document.createElement("span");if(s.className="fnon-cm-item-text",s.innerHTML=le(r.text),a.appendChild(s),r.items&&r.items.length>0){let i=function(){f||(d&&(clearTimeout(d),d=null),f=window.setTimeout(()=>{f=null,!l&&(l=Ee(r.items,t+1,n),l.classList.add("fnon-cm-submenu"),l.setAttribute("data-parent-level",String(t+1)),rn(a,l),l.addEventListener("mouseenter",()=>{d&&(clearTimeout(d),d=null)}),l.addEventListener("mouseleave",()=>{u()}))},200))},u=function(){if(!d){if(f){clearTimeout(f),f=null;return}d=window.setTimeout(()=>{d=null,l&&(nn(F(l)),l.parentNode&&l.parentNode.removeChild(l),L.delete(l),l=null)},300)}};const c=document.createElement("span");c.className="fnon-cm-arrow",c.innerHTML=V()?"&#9664;":"&#9654;",a.appendChild(c);let l=null,d=null,f=null;a.addEventListener("mouseenter",()=>{d&&(clearTimeout(d),d=null),i()}),a.addEventListener("mouseleave",m=>{if(l){const g=m.relatedTarget;if(l.contains(g))return;u()}else f&&(clearTimeout(f),f=null)}),a.__cmOpenSubmenu=()=>{l||(l=Ee(r.items,t+1,n),l.classList.add("fnon-cm-submenu"),l.setAttribute("data-parent-level",String(t+1)),rn(a,l)),Me(l)},a.__cmCloseSubmenu=()=>{l&&(nn(F(l)),l.parentNode&&l.parentNode.removeChild(l),L.delete(l),l=null)}}r.disabled||a.addEventListener("click",i=>{i.stopPropagation(),!(r.items&&r.items.length>0)&&(r.onClick?r.onClick(r,i):n&&n(r,i),I())}),o.appendChild(a)}return o}function an(e,t,n){if(!t||t.length===0)return C("ContextMenu requires at least one item."),{close:()=>{}};e instanceof MouseEvent&&(e.preventDefault(),e.stopPropagation()),I();const o=Qn(e),r=Ee(t,0,n);tt(r,o.x,o.y),Me(r);function a(l){const d=l.target;r.contains(d)||I()}function s(l){r.contains(l.target)||I()}function i(l){const d=document.activeElement,f=tn(d);switch(l.key){case"Escape":{if(l.preventDefault(),f&&f.classList.contains("fnon-cm-submenu")){const m=F(f);xe(m);const g=Le(f);g&&g.focus()}else I();break}case"ArrowDown":{if(l.preventDefault(),d&&d.classList.contains("fnon-cm-item")){const m=on(d),g=m.indexOf(d);g<m.length-1&&m[g+1].focus()}else f&&Me(f);break}case"ArrowUp":{if(l.preventDefault(),d&&d.classList.contains("fnon-cm-item")){const m=on(d),g=m.indexOf(d);g>0&&m[g-1].focus()}break}case"ArrowRight":{if(l.preventDefault(),V()){if(f&&f.classList.contains("fnon-cm-submenu")){const m=F(f);xe(m);const g=Le(f);g&&g.focus()}}else d&&d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu&&d.__cmOpenSubmenu();break}case"ArrowLeft":{if(l.preventDefault(),V())d&&d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu&&d.__cmOpenSubmenu();else if(f&&f.classList.contains("fnon-cm-submenu")){const m=F(f);xe(m);const g=Le(f);g&&g.focus()}break}case"Enter":case" ":{l.preventDefault(),d&&d.classList.contains("fnon-cm-item")&&!d.classList.contains("fnon-cm-item-disabled")&&(d.classList.contains("fnon-cm-item-parent")&&d.__cmOpenSubmenu?d.__cmOpenSubmenu():d.click());break}}}function u(){I()}function c(){I()}return setTimeout(()=>{document.addEventListener("click",a,!0),document.addEventListener("contextmenu",s),document.addEventListener("keydown",i),window.addEventListener("scroll",u,!0),window.addEventListener("resize",c)},0),we=[()=>document.removeEventListener("click",a,!0),()=>document.removeEventListener("contextmenu",s),()=>document.removeEventListener("keydown",i),()=>window.removeEventListener("scroll",u,!0),()=>window.removeEventListener("resize",c)],{close:I}}const ot=an;return{setRenderer:dn,registerCleanup:fn,registerReactRoot:un,Alert:ne,Ask:ge,Dialogue:K,Breaking:he,Hint:be,Wait:q,Box:se,DatePicker:Object.assign(Je,{setLocale:ke}),DP:Object.assign(jn,{setLocale:ke}),ContextMenu:an,CM:ot,addButton:Sn,Init(e){ne.Init(e),ge.Init(e),K.Init(e),he.Init(e),be.Init(e),q.Init(e),se.Init(e),"datePickerLocale"in e&&ke(e.datePickerLocale),"isDark"in e&&et(!!e.isDark),"dir"in e&&e.dir&&(document.documentElement.dir=e.dir)},AddLogo(e,t){if(!e||!t){C("Name and HtmlContent are required to add a new logo.");return}if(q[e]){C("A logo with the same name already exists.");return}const o=q;o[e]=function(a,s){const i=document.createElement("div");i.className="fnon-wait-overlay",i.id="fnon-wait-overlay";const u=document.createElement("div");if(u.className="fnon-wait-box",u.innerHTML=t,a){const c=document.createElement("div");c.className="fnon-wait-text",c.textContent=a,u.appendChild(c)}i.appendChild(u),document.body.appendChild(i),requestAnimationFrame(()=>i.classList.add("fnon-wait-active")),s!=null&&s.clickToClose&&i.addEventListener("click",()=>q.Remove())};const r=se;r[e]=function(a,s,i){var f;const u=typeof a=="string"?document.querySelector(a):a;if(!u){C("Invalid selector");return}const c=u.querySelector(".fnon-box-overlay");c&&((f=c.parentNode)==null||f.removeChild(c));const l=document.createElement("div");l.className="fnon-box-overlay";const d=document.createElement("div");if(d.className="fnon-box-inner",d.innerHTML=t,s){const m=document.createElement("div");m.className="fnon-box-label",m.textContent=s,d.appendChild(m)}l.appendChild(d),u.style.position="relative",u.appendChild(l)}},AddTheme(e,t){if(!e){C("Name is required to generate a new theme.");return}if(ne[e]){C("A theme with the same name already exists.");return}ln(e,t),An(e,t),ne[e]=S(e),ge[e]=D(e),K[e]=T(e),be[e]=B(e),he[e]=N(e)}}})();
package/index.html CHANGED
@@ -3458,19 +3458,102 @@
3458
3458
  >) })
3459
3459
  </div>
3460
3460
  </div>
3461
+
3462
+ <div class="demo-card">
3463
+ <div class="card-body">
3464
+ <h3>6-Month Layout</h3>
3465
+ <p class="desc">
3466
+ Shows 6 months in a 2×3 grid. Navigation shifts by 6 months.
3467
+ </p>
3468
+ <div class="card-actions">
3469
+ <button class="pri" onclick="Fnon.DatePicker({ layout: 6, title: '6-Month View' }).then((d) => Fnon.Hint.Success(d.toLocaleDateString())).catch(() => Fnon.Hint.Info('Cancelled'))">
3470
+ 6 Months
3471
+ </button>
3472
+ <button onclick="Fnon.DatePicker({ layout: 'auto', title: 'Auto Layout' }).then((d) => Fnon.Hint.Success(d.toLocaleDateString())).catch(() => Fnon.Hint.Info('Cancelled'))">
3473
+ Auto
3474
+ </button>
3475
+ </div>
3476
+ </div>
3477
+ <div class="code">
3478
+ <span class="kw">Fnon</span>.<span class="fn">DatePicker</span>({ <span class="str">layout</span>: <span class="num">6</span> })<br />
3479
+ <span class="kw">Fnon</span>.<span class="fn">DatePicker</span>({ <span class="str">layout</span>: <span class="str">'auto'</span> })
3480
+ </div>
3481
+ </div>
3482
+
3483
+ <div class="demo-card">
3484
+ <div class="card-body">
3485
+ <h3>Localized (Korean)</h3>
3486
+ <p class="desc">
3487
+ Custom day/month names, digits, and UI text via <code>language</code>.
3488
+ </p>
3489
+ <div class="card-actions">
3490
+ <button class="pri" onclick="
3491
+ Fnon.DatePicker({
3492
+ title: '날짜 선택',
3493
+ language: {
3494
+ days: ['일','월','화','수','목','금','토'],
3495
+ months: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
3496
+ today: '오늘',
3497
+ ok: '확인',
3498
+ prevMonth: '이전 달',
3499
+ nextMonth: '다음 달',
3500
+ digits: ['0','1','2','3','4','5','6','7','8','9'],
3501
+ },
3502
+ })
3503
+ .then((d) => Fnon.Hint.Success(d.toLocaleDateString()))
3504
+ .catch(() => Fnon.Hint.Info('취소됨'))
3505
+ ">
3506
+ Korean
3507
+ </button>
3508
+ <button onclick="
3509
+ Fnon.DatePicker.setLocale({
3510
+ days: ['일','월','화','수','목','금','토'],
3511
+ months: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
3512
+ today: '오늘',
3513
+ ok: '확인',
3514
+ });
3515
+ Fnon.DatePicker({ title: 'Globally localized' })
3516
+ .then((d) => Fnon.Hint.Success(d.toLocaleDateString()))
3517
+ .catch(() => Fnon.Hint.Info('취소됨'))
3518
+ ">
3519
+ Global setLocale
3520
+ </button>
3521
+ </div>
3522
+ </div>
3523
+ <div class="code">
3524
+ <span class="kw">Fnon</span>.<span class="fn">DatePicker</span>({ <span class="str">language</span>: { <span class="str">days</span>: [<span class="str">'일'</span>,<span class="str">'월'</span>,...] } })<br />
3525
+ <span class="kw">Fnon</span>.<span class="fn">DatePicker</span>.<span class="fn">setLocale</span>({ <span class="str">days</span>: [...] })
3526
+ </div>
3527
+ </div>
3461
3528
  </div>
3462
3529
 
3463
3530
  <div class="ref-section">
3464
3531
  <h3>DatePickerOptions</h3>
3465
3532
  <pre>
3466
3533
  {
3467
- <span style="color:#63b3ed">initDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Initial month to show (default: today)</span>
3468
- <span style="color:#63b3ed">dateRange</span>: <span style="color:#9ae6b4">boolean</span> <span style="color:#6b7280">// Enable range mode (default: false)</span>
3469
- <span style="color:#63b3ed">withTime</span>: <span style="color:#9ae6b4">boolean</span> <span style="color:#6b7280">// Show time picker after date selection (default: false)</span>
3470
- <span style="color:#63b3ed">minDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Earliest selectable date</span>
3471
- <span style="color:#63b3ed">maxDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Latest selectable date</span>
3472
- <span style="color:#63b3ed">title</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// Modal title</span>
3473
- <span style="color:#63b3ed">isDark</span>: <span style="color:#9ae6b4">boolean|()=&gt;boolean</span> <span style="color:#6b7280">// Enable dark mode for this instance</span>
3534
+ <span style="color:#63b3ed">initDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Initial month to show (default: today)</span>
3535
+ <span style="color:#63b3ed">dateRange</span>: <span style="color:#9ae6b4">boolean</span> <span style="color:#6b7280">// Enable range mode (default: false)</span>
3536
+ <span style="color:#63b3ed">withTime</span>: <span style="color:#9ae6b4">boolean</span> <span style="color:#6b7280">// Show time picker (default: false)</span>
3537
+ <span style="color:#63b3ed">minDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Earliest selectable date</span>
3538
+ <span style="color:#63b3ed">maxDate</span>: <span style="color:#9ae6b4">Date</span> <span style="color:#6b7280">// Latest selectable date</span>
3539
+ <span style="color:#63b3ed">title</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// Modal title</span>
3540
+ <span style="color:#63b3ed">isDark</span>: <span style="color:#9ae6b4">boolean|()=&gt;boolean</span> <span style="color:#6b7280">// Enable dark mode</span>
3541
+ <span style="color:#63b3ed">dir</span>: <span style="color:#9ae6b4">'ltr'|'rtl'</span> <span style="color:#6b7280">// Text direction</span>
3542
+ <span style="color:#63b3ed">layout</span>: <span style="color:#9ae6b4">1|6|'auto'</span> <span style="color:#6b7280">// Calendar layout (default: 1)</span>
3543
+ <span style="color:#63b3ed">language</span>: <span style="color:#9ae6b4">DatePickerLocale</span> <span style="color:#6b7280">// Localization object (see below)</span>
3544
+ }
3545
+ <span style="color:#6b7280">// DatePickerLocale full shape:</span>
3546
+ {
3547
+ <span style="color:#63b3ed">days</span>: <span style="color:#9ae6b4">[string,string,...]</span> <span style="color:#6b7280">// 7 short day names (default: ['Sun','Mon',...])</span>
3548
+ <span style="color:#63b3ed">daysLong</span>: <span style="color:#9ae6b4">[string,string,...]</span> <span style="color:#6b7280">// 7 long day names (default: ['Sunday','Monday',...])</span>
3549
+ <span style="color:#63b3ed">months</span>: <span style="color:#9ae6b4">[string,string,...]</span> <span style="color:#6b7280">// 12 month names (default: ['January','February',...])</span>
3550
+ <span style="color:#63b3ed">monthsShort</span>: <span style="color:#9ae6b4">[string,string,...]</span> <span style="color:#6b7280">// 12 short month names (default: ['Jan','Feb',...])</span>
3551
+ <span style="color:#63b3ed">today</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// Today button text (default: 'Today')</span>
3552
+ <span style="color:#63b3ed">ok</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// OK button text (default: 'OK')</span>
3553
+ <span style="color:#63b3ed">prevMonth</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// Prev month tooltip (default: 'Previous month')</span>
3554
+ <span style="color:#63b3ed">nextMonth</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// Next month tooltip (default: 'Next month')</span>
3555
+ <span style="color:#63b3ed">digits</span>: <span style="color:#9ae6b4">[string,string,...]</span> <span style="color:#6b7280">// 10 numeral digits (default: ['0','1',...,'9'])</span>
3556
+ <span style="color:#63b3ed">rangeLabel</span>: <span style="color:#9ae6b4">string</span> <span style="color:#6b7280">// 6-month range label template (default: '{fromMonth} – {toMonth} {year}')</span>
3474
3557
  }
3475
3558
  </pre>
3476
3559
  </div>
@@ -3504,6 +3587,22 @@
3504
3587
  >
3505
3588
  </div>
3506
3589
  </div>
3590
+ <div class="sandbox-row">
3591
+ <label for="dp-layout">Layout</label>
3592
+ <select id="dp-layout">
3593
+ <option value="1">1 (single month)</option>
3594
+ <option value="6">6 (2×3 grid)</option>
3595
+ <option value="auto">auto (responsive)</option>
3596
+ </select>
3597
+ </div>
3598
+ <div class="sandbox-row">
3599
+ <label for="dp-lang">Language preset</label>
3600
+ <select id="dp-lang">
3601
+ <option value="">Default (English)</option>
3602
+ <option value="ko">한국어 (Korean)</option>
3603
+ <option value="ar">العربية (Arabic, RTL)</option>
3604
+ </select>
3605
+ </div>
3507
3606
  <div class="sandbox-row">
3508
3607
  <label for="dp-min">Min date (YYYY-MM-DD, optional)</label>
3509
3608
  <input type="date" id="dp-min" />
@@ -3935,6 +4034,33 @@
3935
4034
  var opts = { title: title };
3936
4035
  if (chk("dp-range")) opts.dateRange = true;
3937
4036
  if (chk("dp-time")) opts.withTime = true;
4037
+ var layout = val("dp-layout");
4038
+ if (layout) opts.layout = layout === "auto" ? "auto" : Number(layout);
4039
+ var lang = val("dp-lang");
4040
+ if (lang === "ko") {
4041
+ opts.language = {
4042
+ days: ['일','월','화','수','목','금','토'],
4043
+ months: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
4044
+ today: '오늘',
4045
+ ok: '확인',
4046
+ prevMonth: '이전 달',
4047
+ nextMonth: '다음 달',
4048
+ digits: ['0','1','2','3','4','5','6','7','8','9'],
4049
+ rangeLabel: '{fromMonth} – {toMonth} {year}',
4050
+ };
4051
+ } else if (lang === "ar") {
4052
+ opts.language = {
4053
+ days: ['أحد','إثنين','ثلاثاء','أربعاء','خميس','جمعة','سبت'],
4054
+ months: ['يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر'],
4055
+ today: 'اليوم',
4056
+ ok: 'موافق',
4057
+ prevMonth: 'الشهر السابق',
4058
+ nextMonth: 'الشهر التالي',
4059
+ digits: ['٠','١','٢','٣','٤','٥','٦','٧','٨','٩'],
4060
+ rangeLabel: '{fromMonth} – {toMonth} {year}',
4061
+ };
4062
+ opts.dir = 'rtl';
4063
+ }
3938
4064
  var min = val("dp-min");
3939
4065
  if (min) opts.minDate = new Date(min + "T00:00:00");
3940
4066
  var max = val("dp-max");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adelalawdi/fnon2",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "Lightweight modal, toast, spinner, date picker, and context menu library. No dependencies. 42 KB minified (12 KB gzip). Works in all modern browsers.",
5
5
  "main": "fnon.min.js",
6
6
  "scripts": {