@adelalawdi/fnon2 2.0.3 → 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 +85 -5
- package/fnon.min.css +1 -1
- package/fnon.min.js +1 -1
- package/index.html +184 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Fnon.js v2.0 🚀
|
|
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-
|
|
1061
|
-
| `.fnon-dp-btn` |
|
|
1062
|
-
| `.fnon-dp-btn-
|
|
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: 4000;--fnon-z-modal: 4001;--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-task-bar{position:fixed;bottom:0;left:0;right:0;z-index:calc(var(--fnon-z-modal) + 20);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) + 10);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 E(e){typeof console<"u"&&console.error("[Fnon]",e)}function le(e){return typeof e=="string"?document.querySelector(e):e instanceof HTMLElement?e:null}function xe(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 Oe(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 Le(e,t=4){if(t===4)return de(e)?[e,yn(e,.3),Oe(e,.15),Oe(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 Ye(){return"×"}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 ze(e){return ue[e]?{...fe[e],...ue[e]}:fe[e]?fe[e]:null}function qe(e){const t=ze(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=Le(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 Ee=null;const U=[],Me=new Map;function wn(e){Ee=e}function je(e,t,n){if(!Ee)return!1;try{return Ee(e,t,n)===!0}catch(o){return E(`Renderer failed: ${o}`),!1}}function xn(e,t){U.push({modalId:e,fn:t})}function Ln(e,t){Me.set(e,t)}function En(e){const t=Me.get(e);return Me.delete(e),t}function We(e){for(let n=U.length-1;n>=0;n--)if(U[n].modalId===e){try{U[n].fn()}catch(o){E(`Cleanup failed: ${o}`)}U.splice(n,1)}const t=En(e);if(t&&typeof t.unmount=="function")try{t.unmount()}catch{}}function Mn(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 Dn=0;const O=[],V=new Map,me=new Map,Y=new Map,X=new Map,Sn='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(Sn);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 Ke(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"),Ke(e),o.parentNode.appendChild(o),a.remove(),Y.delete(e),Y.size===0){const i=document.getElementById(Q);i&&i.remove()}const s=V.get(e);pe(n,o,s==null?void 0:s.showMaxMin)}),r.appendChild(a)}function Fn(){const e=document.getElementById(Q);e&&Y.size===0&&e.remove()}function Pn(){const e=document.getElementById(Q);return!e||e.children.length===0?0:e.getBoundingClientRect().height}function pe(e,t,n){if(!e.classList.contains("fnon-modal-fl")){t.style.zIndex="",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"),t.style.zIndex=""}else t.style.zIndex="4022",e.style.removeProperty("--fnon-fl-max-height")}function Ge(){return`fnon-modal-${++Dn}`}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",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 z(e,t){var h;const n={...Rn,...t},o=Ge();n.showClose!==void 0&&(n.closeButton=n.showClose),V.set(o,n);const r=n.data||{};me.set(o,r);let a;n.appendTarget?(a=le(n.appendTarget),a||(E(`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 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=xe(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 v=i.classList.contains("fnon-minimized");if(i.classList.toggle("fnon-minimized"),s.classList.toggle("fnon-overlay-hidden"),!v)Bn(o),Y.set(o,{modalEl:i,title:n.title||""}),In(o,Mn(n.title)||"",i,s);else{if(Ke(o),s.parentNode.appendChild(s),Y.get(o)){const $=document.querySelector(`.fnon-task-bar-btn[data-modal-id="${o}"]`);$&&$.remove(),Y.delete(o),Fn()}pe(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"),pe(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=Ye(),p.title="Close",p.addEventListener("click",()=>q(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&&(je(n.message,m,g)||(m.innerHTML=xe(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 v=document.createElement("button");v.className=`fnon-btn fnon-btn-${((h=p.style)==null?void 0:h.toLowerCase())||"primary"}`,p.css&&(v.className+=" "+p.css),v.textContent=p.text,p.color&&(v.style.color=p.color),p.background&&(v.style.background=p.background);const S=p.boxShadow||p.shadow;S&&(v.style.boxShadow=S),p.borderColor&&(v.style.borderColor=p.borderColor),p.callback?v.addEventListener("click",()=>{let $=!1;p.callback(()=>{$=!0,q(o)},m,r)!==!1&&($||q(o))}):v.addEventListener("click",()=>q(o)),b.appendChild(v)}}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 x={h:c,b:m,f:b},C=(n.layout||"hbf").toLowerCase().replace(/[^hbf]/g,"");if(C&&C!=="hbf"){const p=new Set;for(const v of C)!p.has(v)&&x[v]&&(i.appendChild(x[v]),p.add(v));for(const v of"hbf")!p.has(v)&&x[v]&&i.appendChild(x[v])}else i.appendChild(c),i.appendChild(m),i.appendChild(b);if(s.appendChild(i),pe(i,s,n.showMaxMin),_n(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",v=n.autoFocusDelay||0;requestAnimationFrame(()=>{const S=i.querySelector(p);S&&(v>0?setTimeout(()=>S.focus(),v):S.focus())})}return n.focusTrap!==!1&&Tn(o,i,s),n.onOpen&&n.onOpen(i,r),O.push(s),{close:()=>q(o),modalEl:i,id:o}}function q(e){const t=V.get(e),n=me.get(e)||{},o=document.querySelector(`.fnon-overlay[data-modal-id="${e}"]`);if(!o){V.delete(e),me.delete(e),E(`Modal ${e} not found in DOM`);return}const r=o.querySelector(".fnon-modal");t!=null&&t.onClosing&&r&&t.onClosing(r,n),Nn(e),We(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),V.delete(e),me.delete(e)},300);const a=O.indexOf(o);a!==-1&&O.splice(a,1)}function $n(){if(O.length===0)return;const t=O[O.length-1].dataset.modalId;t&&q(t)}document.addEventListener("keydown",e=>{e.key==="Escape"&&$n()});const De={};function N(e){const t=function(n,o,r,a,s){let i;if(typeof n=="object"?(i={...De,...n},o!==void 0&&(i.title=o)):(i={...De,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()}}]}z(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 ge={Primary:N("Primary"),Success:N("Success"),Warning:N("Warning"),Danger:N("Danger"),Info:N("Info"),Light:N("Light"),Dark:N("Dark"),Init(e){Object.assign(De,e)}},Se={};function B(e){const t=function(n,o,r,a,s,i,u){let c,l;if(typeof n=="object"?(c={...Se,...n},o!==void 0&&(c.title=o),l=i||c.cancelCallback):(c={...Se,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()}}]}z(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 Te={Primary:B("Primary"),Success:B("Success"),Warning:B("Warning"),Danger:B("Danger"),Info:B("Info"),Light:B("Light"),Dark:B("Dark"),Init(e){Object.assign(Se,e)}},be={};function J(e){return z("Primary",{...be,...e})}J.Init=function(e){Object.assign(be,e)};function A(e){const t=function(n,o,r,a,s,i,u){let c,l,d;if(typeof n=="object"?(c={...be,...n},o!==void 0&&(c.title=o),l=s||c.callback,d=i||c.cancelCallback):(c={...be,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:(C,h,p)=>{d&&d(C,f,p)===!1||C()}},{text:m,style:e,color:c.btnOkColor,background:c.btnOkBackground,boxShadow:b,shadow:b,borderColor:c.btnOkBorderColor,callback:(C,h,p)=>{l&&l(C,f,p)===!1||C()}}],f=z(e,c).modalEl.querySelector(".fnon-modal-body")}else z(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(J,{Primary:A("Primary"),Success:A("Success"),Warning:A("Warning"),Danger:A("Danger"),Info:A("Info"),Light:A("Light"),Dark:A("Dark")});const Ue={headline:"BREAKING",theme:"Danger",anchor:"top",timeout:5e3,closable:!0,appendTarget:"body",fontFamily:"'Quicksand', sans-serif"};function j(e){var d;const t={...Ue,...e},n=Ge();let o;t.appendTarget?(o=le(t.appendTarget),o||(E(`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 c={id:n,type:"breaking"};if(t.message!==void 0&&t.message!==null&&(je(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=Ye(),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){We(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 I(e){const t=function(n,o){return j(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};j(a)})},t}j.Init=function(e){Object.assign(Ue,e)};const Ne=Object.assign(j,{Primary:I("Primary"),Success:I("Success"),Warning:I("Warning"),Danger:I("Danger"),Info:I("Info"),Light:I("Light"),Dark:I("Dark"),Init:j.Init}),Ve="fnon-hint-container-",he='<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>',Hn='<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>',On='<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>',Yn='<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 ve={Primary:{titleColor:"#029eff",backgroundColor:"#ebf8ff",borderColor:"#029eff",svg:he},Success:{titleColor:"#39DA8A",backgroundColor:"#f0fff4",borderColor:"#39DA8A",svg:he},Warning:{titleColor:"#fdd347",backgroundColor:"#fffbe5",borderColor:"#fdd347",svg:Hn},Danger:{titleColor:"#ff6b6b",backgroundColor:"#fff5f5",borderColor:"#ff6b6b",svg:On},Info:{titleColor:"#48dbfb",backgroundColor:"#e5faff",borderColor:"#48dbfb",svg:Yn},Light:{titleColor:"#2d3748",backgroundColor:"#f8f9fa",borderColor:"#ced4da",svg:he},Dark:{titleColor:"#fff",backgroundColor:"#222f3e",borderColor:"#222f3e",svg:he}};function qn(e,t){ve[e]={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff",svg:void 0}}function jn(e){if(ve[e])return ve[e];const t=ze(e);if(t){const n={titleColor:t.titleColor||"#fff",backgroundColor:t.backgroundColor||"#fff",borderColor:t.titleBackground||"#029eff"};return ve[e]=n,n}return null}function Wn(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 Kn(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=jn(r);if(!a)return E(`Unknown hint type: ${r}`),{close:()=>{}};const s=n.position||"right-top",i=n.dir==="rtl",u=zn(s,i),c=n.animation||"slide-left",l=Wn(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 h=document.createElement("div");h.className="fnon-hint-icon";const p=n.svgSize||{w:20,h:20};h.style.setProperty("--fnon-icon-w",p.w+"px"),h.style.setProperty("--fnon-icon-h",p.h+"px"),h.innerHTML=a.svg,d.appendChild(h)}const f=document.createElement("div");if(f.className="fnon-hint-content",o){const h=document.createElement("div");h.className="fnon-hint-title",h.textContent=o,f.appendChild(h)}const m=document.createElement("div");if(m.className="fnon-hint-message",m.innerHTML=e,f.appendChild(m),d.appendChild(f),n.closable!==!1){const h=document.createElement("button");h.className="fnon-hint-close",h.innerHTML="×",h.addEventListener("click",()=>C(d)),d.appendChild(h)}if(n.timeOut&&n.timeOut>0){const h=n.progressColor||a.borderColor,p=document.createElement("div");p.className="fnon-hint-progress",p.style.setProperty("--display-dur",n.timeOut+"ms"),p.style.background=h,d.style.position="relative",d.style.overflow="hidden",d.appendChild(p)}Le(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 h=n.darkBgColor||"#1a202c";d.style.backgroundColor=h}const k=b?n.darkBgColor||"#1a202c":a.backgroundColor;d.style.color=kn(k),l.appendChild(d),requestAnimationFrame(()=>{d.classList.add("fnon-hint-active")});let x=null;n.timeOut&&n.timeOut>0&&(x=setTimeout(()=>C(d),n.timeOut));function C(h){x&&clearTimeout(x),h.classList.remove("fnon-hint-active"),n.onClose&&n.onClose(),n.onclosed&&n.onclosed(),setTimeout(()=>{h.parentNode&&h.parentNode.removeChild(h),Kn(l)},300)}return{close:()=>C(d)}}Z.Init=function(e){Object.assign(Xe,e)};function F(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 Be={Primary:F("Primary"),Success:F("Success"),Warning:F("Warning"),Danger:F("Danger"),Info:F("Info"),Light:F("Light"),Dark:F("Dark"),show:Z,Init:Z.Init},Ae={...{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=Ae[e];if("css"in n&&n.css)return n.html(t);const o=Le(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 Ie=!1,ye=null;function en(e,t,n){if(Ie){E("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 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",()=>nn()),Ie=!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"),ye&&(ye(!0),ye=null),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),Ie=!1},300)};n>0?setTimeout(o,n):o()}function Gn(e){const t=document.querySelector("#fnon-wait-overlay .fnon-wait-text");t&&(t.textContent=e)}function Un(e){const t=function(n,o){en(e,n,o)};return t.Async=function(n,o){return new Promise(r=>{ye=r,en(e,n,o)})},t}const W={Remove:nn,Change:Gn,Init:function(e){Object.assign(Je,e)}};for(const e of Object.keys(Ae))W[e]=Un(e);let ke=null;function tn(e,t,n,o){var f;const r=le(t);if(!r){E(`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 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 Vn(e){const t=le(e);if(!t)return;const n=t.querySelector(".fnon-box-overlay");n&&n.parentNode&&n.parentNode.removeChild(n),ke&&(ke(!0),ke=null)}function Xn(e){const t=function(n,o,r){tn(e,n,o,r)};return t.Async=function(n,o,r){return new Promise(a=>{ke=a,tn(e,n,o,r)})},t}const Ce={Remove:Vn,Init:function(e){Object.assign(Ze,e)}};for(const e of Object.keys(Ae))Ce[e]=Xn(e);function on(){return document.documentElement.dir==="rtl"}const Qn=["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 Fe(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 Jn(e,t){return new Date(e,t,1).getDay()}function L(e){return e.getFullYear()*1e4+e.getMonth()*100+e.getDate()}function P(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 cn(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 ln(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 we(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=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((c,l)=>{u.resolve=c,u.reject=l;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=z("Primary",d);u.closeModal=f.close,u.bodyEl=f.modalEl.querySelector(".fnon-modal-body"),u.bodyEl&&(u.bodyEl.style.padding="0",M(u))})}const et=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",cn(e)||i.classList.add("fnon-dp-nav-disabled"),i.addEventListener("click",()=>{cn(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",w=>{w.stopPropagation(),ot(e,u)});const c=document.createElement("button");c.className="fnon-dp-nav",c.innerHTML=s,c.title=o?"Previous month":"Next month",ln(e)||c.classList.add("fnon-dp-nav-disabled"),c.addEventListener("click",()=>{ln(e)&&(e.viewMonth++,e.viewMonth>11&&(e.viewMonth=0,e.viewYear++),M(e))}),r.appendChild(i),r.appendChild(u),r.appendChild(c),n.appendChild(r);const l=document.createElement("div");l.className="fnon-dp-time",e.withTime||(l.style.display="none"),l.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 w=d.value.split(":");e.hour=parseInt(w[0],10)||0,e.minute=parseInt(w[1],10)||0}),l.appendChild(d),n.appendChild(l);const g=document.createElement("div");g.className="fnon-dp-grid";for(const w of Qn){const y=document.createElement("div");y.className="fnon-dp-dow",y.textContent=w,g.appendChild(y)}const b=e.viewYear,k=e.viewMonth,x=sn(b,k),C=Jn(b,k),h=k===0?11:k-1,p=k===0?b-1:b,v=sn(p,h),S=42,$=new Date;for(let w=0;w<S;w++){const y=document.createElement("div");y.className="fnon-dp-day";let K,ae,se,ce;w<C?(K=v-C+w+1,ae=k-1<0?11:k-1,se=k-1<0?b-1:b,ce=!0):w>=C+x?(K=w-C-x+1,ae=k+1>11?0:k+1,se=k+1>11?b+1:b,ce=!0):(K=w-C+1,ae=k,se=b,ce=!1);const G=new Date(se,ae,K),H=L(G);if(y.textContent=String(K),y.dataset.year=String(se),y.dataset.month=String(ae),y.dataset.day=String(K),y.dataset.ts=String(H),ce&&y.classList.add("fnon-dp-other"),Fe(G,$)&&y.classList.add("fnon-dp-today"),e.minDate!==null&&H<e.minDate&&y.classList.add("fnon-dp-disabled"),e.maxDate!==null&&H>e.maxDate&&y.classList.add("fnon-dp-disabled"),e.start&&Fe(G,e.start)&&y.classList.add("fnon-dp-selected"),e.end&&Fe(G,e.end)&&y.classList.add("fnon-dp-selected"),e.rangeMode&&e.start&&e.end){const hn=L(e.start),vn=L(e.end);H>hn&&H<vn&&y.classList.add("fnon-dp-range"),H===hn&&y.classList.add("fnon-dp-range-start"),H===vn&&y.classList.add("fnon-dp-range-end")}!y.classList.contains("fnon-dp-disabled")&&!ce&&(y.addEventListener("click",()=>tt(e,G)),y.addEventListener("mouseenter",()=>nt(e,G)),y.addEventListener("mouseleave",()=>we(e))),g.appendChild(y)}n.appendChild(g);const T=document.createElement("div");T.className="fnon-dp-actions";function lt(){ne.classList.toggle("fnon-dp-nav-disabled",!P(e,-12)),te.classList.toggle("fnon-dp-nav-disabled",!P(e,-6)),ie.classList.toggle("fnon-dp-nav-disabled",!P(e,6)),re.classList.toggle("fnon-dp-nav-disabled",!P(e,12));const w=L(new Date);oe.classList.toggle("fnon-dp-nav-disabled",e.minDate!==null&&w<e.minDate||e.maxDate!==null&&w>e.maxDate)}const ne=document.createElement("button");ne.className="fnon-dp-btn",ne.textContent="-1 Year",ne.addEventListener("click",()=>{P(e,-12)&&(e.viewYear-=1,M(e))}),T.appendChild(ne);const te=document.createElement("button");te.className="fnon-dp-btn",te.textContent="-6 Months",te.addEventListener("click",()=>{P(e,-6)&&(e.viewMonth-=6,e.viewMonth<0&&(e.viewMonth+=12,e.viewYear-=1),M(e))}),T.appendChild(te);const oe=document.createElement("button");oe.className="fnon-dp-btn",oe.textContent="Today",oe.addEventListener("click",()=>{const w=new Date,y=L(w);e.minDate!==null&&y<e.minDate||e.maxDate!==null&&y>e.maxDate||(e.viewYear=w.getFullYear(),e.viewMonth=w.getMonth(),M(e))}),T.appendChild(oe);const ie=document.createElement("button");ie.className="fnon-dp-btn",ie.textContent="+6 Months",ie.addEventListener("click",()=>{P(e,6)&&(e.viewMonth+=6,e.viewMonth>11&&(e.viewMonth-=12,e.viewYear+=1),M(e))}),T.appendChild(ie);const re=document.createElement("button");if(re.className="fnon-dp-btn",re.textContent="+1 Year",re.addEventListener("click",()=>{P(e,12)&&(e.viewYear+=1,M(e))}),T.appendChild(re),lt(),!e.rangeMode&&e.withTime){const w=document.createElement("button");w.className="fnon-dp-btn fnon-dp-btn-primary",w.textContent="OK",w.addEventListener("click",()=>{if(e.start&&e.resolve){const y=new Date(e.start);e.withTime&&y.setHours(e.hour,e.minute,0,0),e.resolve(y),e.closeModal&&e.closeModal()}}),T.appendChild(w)}n.appendChild(T),t.appendChild(n)}function nt(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);we(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 tt(e,t,n){if(e.rangeMode){if(!e.start||e.start&&e.end){e.start=t,e.end=null,we(e),M(e);return}if(e.start&&!e.end){we(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){Zn(e,t);return}e.resolve&&(e.resolve(t),e.closeModal&&e.closeModal())}function ot(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 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",x=>{x.stopPropagation(),l-=12,d()});const g=document.createElement("span");g.className="fnon-dp-popup-nav-label",g.textContent=l-5+"–"+(l+6);const b=document.createElement("button");b.className="fnon-dp-popup-nav-btn",b.textContent=u?"‹":"›",b.addEventListener("click",x=>{x.stopPropagation(),l+=12,d()}),f.appendChild(m),f.appendChild(g),f.appendChild(b),i.appendChild(f);const k=l-5;for(let x=0;x<3;x++){const C=document.createElement("div");C.className="fnon-dp-popup-row";for(let h=0;h<4;h++){const p=k+x*4+h,v=document.createElement("div");v.className="fnon-dp-popup-cell"+(p===e.viewYear?" fnon-dp-popup-active":""),v.textContent=String(p),v.addEventListener("click",S=>{S.stopPropagation(),l=p,c="month",d()}),C.appendChild(v)}i.appendChild(C)}}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=String(l),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 x=0;x<4;x++){const C=b*4+x,h=document.createElement("div");h.className="fnon-dp-popup-cell"+(C===e.viewMonth&&l===e.viewYear?" fnon-dp-popup-active":""),h.textContent=rn[C].substring(0,3),h.addEventListener("click",p=>{p.stopPropagation(),e.viewYear=l,e.viewMonth=C,i.remove(),M(e)}),k.appendChild(h)}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 fn=!1;function ee(){return document.documentElement.dir==="rtl"}const D=new Set;let Pe=[];function it(e){return"clientX"in e?{x:e.clientX,y:e.clientY}:{x:e.x,y:e.y}}function rt(){return fn}function at(e){fn=e}function R(){D.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),D.clear(),Pe.forEach(e=>e()),Pe=[]}function un(e){D.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)>e&&(t.parentNode&&t.parentNode.removeChild(t),D.delete(t))})}function Re(e){D.forEach(t=>{parseInt(t.getAttribute("data-parent-level")||"0",10)===e&&(t.parentNode&&t.parentNode.removeChild(t),D.delete(t))})}function _e(e){const t=e.querySelectorAll(".fnon-cm-item:not(.fnon-cm-item-disabled)");t.length>0&&t[0].focus()}function _(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 st(e){for(const t of D)if(_(t)===e)return t;return null}function $e(e){const t=_(e)-1,n=st(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),D.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),D.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 He(e,t,n){const o=document.createElement("div");o.className="fnon-cm"+(rt()?" 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=xe(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=He(r.items,t+1,n),l.classList.add("fnon-cm-submenu"),l.setAttribute("data-parent-level",String(t+1)),gn(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&&(un(_(l)),l.parentNode&&l.parentNode.removeChild(l),D.delete(l),l=null)},300)}};const c=document.createElement("span");c.className="fnon-cm-arrow",c.innerHTML=ee()?"◀":"▶",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=He(r.items,t+1,n),l.classList.add("fnon-cm-submenu"),l.setAttribute("data-parent-level",String(t+1)),gn(a,l)),_e(l)},a.__cmCloseSubmenu=()=>{l&&(un(_(l)),l.parentNode&&l.parentNode.removeChild(l),D.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),R())}),o.appendChild(a)}return o}function bn(e,t,n){if(!t||t.length===0)return E("ContextMenu requires at least one item."),{close:()=>{}};e instanceof MouseEvent&&(e.preventDefault(),e.stopPropagation()),R();const o=it(e),r=He(t,0,n);ct(r,o.x,o.y),_e(r);function a(l){const d=l.target;r.contains(d)||R()}function s(l){r.contains(l.target)||R()}function i(l){const d=document.activeElement,f=mn(d);switch(l.key){case"Escape":{if(l.preventDefault(),f&&f.classList.contains("fnon-cm-submenu")){const m=_(f);Re(m);const g=$e(f);g&&g.focus()}else R();break}case"ArrowDown":{if(l.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&&_e(f);break}case"ArrowUp":{if(l.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(l.preventDefault(),ee()){if(f&&f.classList.contains("fnon-cm-submenu")){const m=_(f);Re(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(l.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=_(f);Re(m);const g=$e(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(){R()}function c(){R()}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),Pe=[()=>document.removeEventListener("click",a,!0),()=>document.removeEventListener("contextmenu",s),()=>document.removeEventListener("keydown",i),()=>window.removeEventListener("scroll",u,!0),()=>window.removeEventListener("resize",c)],{close:R}}return{setRenderer:wn,registerCleanup:xn,registerReactRoot:Ln,Alert:ge,Ask:Te,Dialogue:J,Breaking:Ne,Hint:Be,Wait:W,Box:Ce,DatePicker:dn,DP:et,ContextMenu:bn,CM:bn,Init(e){ge.Init(e),Te.Init(e),J.Init(e),Ne.Init(e),Be.Init(e),W.Init(e),Ce.Init(e),"isDark"in e&&at(!!e.isDark),"dir"in e&&e.dir&&(document.documentElement.dir=e.dir)},AddLogo(e,t){if(!e||!t){E("Name and HtmlContent are required to add a new logo.");return}if(W[e]){E("A logo with the same name already exists.");return}const o=W;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",()=>W.Remove())};const r=Ce;r[e]=function(a,s,i){var f;const u=typeof a=="string"?document.querySelector(a):a;if(!u){E("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){E("Name is required to generate a new theme.");return}if(ge[e]){E("A theme with the same name already exists.");return}Cn(e,t),qn(e,t),ge[e]=N(e),Te[e]=B(e),J[e]=A(e),Be[e]=F(e),Ne[e]=I(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"×"}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="×",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()?"◀":"▶",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
|
@@ -629,7 +629,7 @@
|
|
|
629
629
|
<div class="container">
|
|
630
630
|
<div class="header">
|
|
631
631
|
<h1>
|
|
632
|
-
Fnon.js v2.0.
|
|
632
|
+
Fnon.js v2.0.4
|
|
633
633
|
<small
|
|
634
634
|
>Interactive Playground — all APIs, live sandbox, Init
|
|
635
635
|
reference</small
|
|
@@ -652,7 +652,7 @@
|
|
|
652
652
|
</button>
|
|
653
653
|
</h1>
|
|
654
654
|
<p class="sub">
|
|
655
|
-
|
|
655
|
+
Twelve feature sections. Each has code examples (try instantly), an
|
|
656
656
|
Init() config reference table, an Async explanation, and a live
|
|
657
657
|
sandbox form. Open browser console for lifecycle logs.
|
|
658
658
|
</p>
|
|
@@ -668,6 +668,7 @@
|
|
|
668
668
|
<a href="#contextmenu">9 ContextMenu</a>
|
|
669
669
|
<a href="#addtheme">10 AddTheme</a>
|
|
670
670
|
<a href="#addlogo">11 AddLogo</a>
|
|
671
|
+
<a href="#overlay-false">12 No‑Backdrop Dialog</a>
|
|
671
672
|
</div>
|
|
672
673
|
</div>
|
|
673
674
|
|
|
@@ -2638,7 +2639,7 @@
|
|
|
2638
2639
|
onclick="
|
|
2639
2640
|
Fnon.Dialogue({
|
|
2640
2641
|
message: 'Click _ to minimize, ⛶ to maximize',
|
|
2641
|
-
title: 'Min/Max',
|
|
2642
|
+
title: 'Min/Max '+new Date().getTime(),
|
|
2642
2643
|
showMin: true,
|
|
2643
2644
|
showMaxMin: true,
|
|
2644
2645
|
buttons: [
|
|
@@ -3457,19 +3458,102 @@
|
|
|
3457
3458
|
>) })
|
|
3458
3459
|
</div>
|
|
3459
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>
|
|
3460
3528
|
</div>
|
|
3461
3529
|
|
|
3462
3530
|
<div class="ref-section">
|
|
3463
3531
|
<h3>DatePickerOptions</h3>
|
|
3464
3532
|
<pre>
|
|
3465
3533
|
{
|
|
3466
|
-
<span style="color:#63b3ed">initDate</span>: <span style="color:#9ae6b4">Date</span>
|
|
3467
|
-
<span style="color:#63b3ed">dateRange</span>: <span style="color:#9ae6b4">boolean</span>
|
|
3468
|
-
<span style="color:#63b3ed">withTime</span>: <span style="color:#9ae6b4">boolean</span>
|
|
3469
|
-
<span style="color:#63b3ed">minDate</span>: <span style="color:#9ae6b4">Date</span>
|
|
3470
|
-
<span style="color:#63b3ed">maxDate</span>: <span style="color:#9ae6b4">Date</span>
|
|
3471
|
-
<span style="color:#63b3ed">title</span>: <span style="color:#9ae6b4">string</span>
|
|
3472
|
-
<span style="color:#63b3ed">isDark</span>: <span style="color:#9ae6b4">boolean|()=>boolean</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|()=>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>
|
|
3473
3557
|
}
|
|
3474
3558
|
</pre>
|
|
3475
3559
|
</div>
|
|
@@ -3503,6 +3587,22 @@
|
|
|
3503
3587
|
>
|
|
3504
3588
|
</div>
|
|
3505
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>
|
|
3506
3606
|
<div class="sandbox-row">
|
|
3507
3607
|
<label for="dp-min">Min date (YYYY-MM-DD, optional)</label>
|
|
3508
3608
|
<input type="date" id="dp-min" />
|
|
@@ -3719,6 +3819,53 @@
|
|
|
3719
3819
|
</div>
|
|
3720
3820
|
</section>
|
|
3721
3821
|
|
|
3822
|
+
<!-- ══════════════════════════ Overlay: false ══════════════════════════ -->
|
|
3823
|
+
<section id="overlay-false">
|
|
3824
|
+
<div class="section-body">
|
|
3825
|
+
<h2>
|
|
3826
|
+
<a href="#overlay-false">#</a>
|
|
3827
|
+
12. No‑Backdrop Dialog
|
|
3828
|
+
<span class="badge">overlay: false</span>
|
|
3829
|
+
</h2>
|
|
3830
|
+
<p>
|
|
3831
|
+
Set <code>overlay: false</code> on a Dialogue to hide the dark backdrop
|
|
3832
|
+
and let users interact with the page behind the modal.
|
|
3833
|
+
Clicking the modal body brings it to the front.
|
|
3834
|
+
</p>
|
|
3835
|
+
<div class="sandbox">
|
|
3836
|
+
<div class="sandbox-row">
|
|
3837
|
+
<button class="fnon-btn fnon-btn-primary"
|
|
3838
|
+
onclick="Fnon.Dialogue({
|
|
3839
|
+
title: 'Floating Dialog',
|
|
3840
|
+
message: 'I have no backdrop — click outside me to interact with the page.',
|
|
3841
|
+
overlay: false,
|
|
3842
|
+
showMaxMin: true
|
|
3843
|
+
})">
|
|
3844
|
+
Dialogue with overlay: false
|
|
3845
|
+
</button>
|
|
3846
|
+
<button class="fnon-btn fnon-btn-success"
|
|
3847
|
+
onclick="Fnon.Dialogue.Success({
|
|
3848
|
+
title: 'Stack Test',
|
|
3849
|
+
message: 'Open multiple to see stacking. Click a dialog to bring it to top.',
|
|
3850
|
+
overlay: false,
|
|
3851
|
+
showMaxMin: true,
|
|
3852
|
+
width: 'sm'
|
|
3853
|
+
})">
|
|
3854
|
+
Stackable (open 2-3x)
|
|
3855
|
+
</button>
|
|
3856
|
+
</div>
|
|
3857
|
+
<div class="code">
|
|
3858
|
+
<span class="kw">Fnon</span>.<span class="fn">Dialogue</span>({<br />
|
|
3859
|
+
title: <span class="str">"Floating Dialog"</span>,<br />
|
|
3860
|
+
message: <span class="str">"No backdrop."</span>,<br />
|
|
3861
|
+
<span class="kw">overlay</span>: <span class="bool">false</span>,<br />
|
|
3862
|
+
showMaxMin: <span class="bool">true</span><br />
|
|
3863
|
+
});
|
|
3864
|
+
</div>
|
|
3865
|
+
</div>
|
|
3866
|
+
</div>
|
|
3867
|
+
</section>
|
|
3868
|
+
|
|
3722
3869
|
<hr />
|
|
3723
3870
|
<footer>
|
|
3724
3871
|
Fnon.js v2.0.0 — Interactive Playground · MIT License
|
|
@@ -3887,6 +4034,33 @@
|
|
|
3887
4034
|
var opts = { title: title };
|
|
3888
4035
|
if (chk("dp-range")) opts.dateRange = true;
|
|
3889
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
|
+
}
|
|
3890
4064
|
var min = val("dp-min");
|
|
3891
4065
|
if (min) opts.minDate = new Date(min + "T00:00:00");
|
|
3892
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.
|
|
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": {
|