Changeset 3462588
- Timestamp:
- 02/16/2026 02:08:32 PM (5 days ago)
- Location:
- nebula-forge-addons-for-elementor
- Files:
-
- 8 added
- 11 edited
- 15 copied
-
tags/0.7.0 (copied) (copied from nebula-forge-addons-for-elementor/trunk)
-
tags/0.7.0/assets/css/admin.css (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/css/admin.css)
-
tags/0.7.0/assets/css/admin.min.css (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/css/admin.min.css)
-
tags/0.7.0/assets/css/frontend.css (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/css/frontend.css) (1 diff)
-
tags/0.7.0/assets/css/frontend.min.css (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/css/frontend.min.css) (1 diff)
-
tags/0.7.0/assets/js/frontend.js (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/js/frontend.js) (2 diffs)
-
tags/0.7.0/assets/js/frontend.min.js (copied) (copied from nebula-forge-addons-for-elementor/trunk/assets/js/frontend.min.js) (1 diff)
-
tags/0.7.0/includes/Admin/Admin_Manager.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Admin/Admin_Manager.php) (4 diffs)
-
tags/0.7.0/includes/Admin/Custom_Fonts_Page.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Admin/Custom_Fonts_Page.php)
-
tags/0.7.0/includes/Admin/Settings_Page.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Admin/Settings_Page.php)
-
tags/0.7.0/includes/Admin/Submissions_Page.php (added)
-
tags/0.7.0/includes/Admin/Ui_Helper.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Admin/Ui_Helper.php) (1 diff)
-
tags/0.7.0/includes/Admin/Widget_Registry.php (modified) (1 diff)
-
tags/0.7.0/includes/Extensions (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Extensions)
-
tags/0.7.0/includes/Extensions/Form_Handler.php (added)
-
tags/0.7.0/includes/Plugin.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/includes/Plugin.php) (2 diffs)
-
tags/0.7.0/includes/Widgets/Advanced_Form_Widget.php (added)
-
tags/0.7.0/includes/Widgets/Hamburger_Menu_Widget.php (added)
-
tags/0.7.0/nebula-forge-addons-for-elementor.php (copied) (copied from nebula-forge-addons-for-elementor/trunk/nebula-forge-addons-for-elementor.php) (2 diffs)
-
tags/0.7.0/readme.txt (copied) (copied from nebula-forge-addons-for-elementor/trunk/readme.txt) (7 diffs)
-
trunk/assets/css/frontend.css (modified) (1 diff)
-
trunk/assets/css/frontend.min.css (modified) (1 diff)
-
trunk/assets/js/frontend.js (modified) (2 diffs)
-
trunk/assets/js/frontend.min.js (modified) (1 diff)
-
trunk/includes/Admin/Admin_Manager.php (modified) (4 diffs)
-
trunk/includes/Admin/Submissions_Page.php (added)
-
trunk/includes/Admin/Ui_Helper.php (modified) (1 diff)
-
trunk/includes/Admin/Widget_Registry.php (modified) (1 diff)
-
trunk/includes/Extensions/Form_Handler.php (added)
-
trunk/includes/Plugin.php (modified) (2 diffs)
-
trunk/includes/Widgets/Advanced_Form_Widget.php (added)
-
trunk/includes/Widgets/Hamburger_Menu_Widget.php (added)
-
trunk/nebula-forge-addons-for-elementor.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
nebula-forge-addons-for-elementor/tags/0.7.0/assets/css/frontend.css
r3462573 r3462588 1939 1939 outline-offset: 2px; 1940 1940 } 1941 1942 /* ========================================================================== 1943 Hamburger Menu Widget 1944 ========================================================================== */ 1945 1946 .nfa-hamburger__toggle-wrap { 1947 display: flex; 1948 } 1949 1950 .nfa-hamburger__toggle { 1951 display: inline-flex; 1952 align-items: center; 1953 justify-content: center; 1954 border: none; 1955 cursor: pointer; 1956 line-height: 1; 1957 transition: background 0.2s ease, color 0.2s ease; 1958 } 1959 1960 /* Icon: Bars */ 1961 .nfa-hamburger__icon--bars { 1962 display: flex; 1963 flex-direction: column; 1964 gap: 4px; 1965 width: 1em; 1966 } 1967 1968 .nfa-hamburger__icon--bars span { 1969 display: block; 1970 height: 2px; 1971 background: currentColor; 1972 border-radius: 2px; 1973 transition: transform 0.3s ease, opacity 0.3s ease; 1974 } 1975 1976 /* Icon: Dots */ 1977 .nfa-hamburger__icon--dots { 1978 display: flex; 1979 flex-direction: column; 1980 gap: 4px; 1981 align-items: center; 1982 width: 1em; 1983 } 1984 1985 .nfa-hamburger__icon--dots span { 1986 display: block; 1987 width: 5px; 1988 height: 5px; 1989 background: currentColor; 1990 border-radius: 50%; 1991 } 1992 1993 /* Icon: Grid */ 1994 .nfa-hamburger__icon--grid { 1995 display: grid; 1996 grid-template-columns: repeat(2, 1fr); 1997 gap: 3px; 1998 width: 1em; 1999 } 2000 2001 .nfa-hamburger__icon--grid span { 2002 display: block; 2003 width: 7px; 2004 height: 7px; 2005 background: currentColor; 2006 border-radius: 2px; 2007 } 2008 2009 /* Overlay */ 2010 .nfa-hamburger__overlay { 2011 position: fixed; 2012 inset: 0; 2013 z-index: 99998; 2014 opacity: 0; 2015 visibility: hidden; 2016 transition: opacity 0.35s ease, visibility 0.35s ease; 2017 } 2018 2019 .nfa-hamburger--open .nfa-hamburger__overlay { 2020 opacity: 1; 2021 visibility: visible; 2022 } 2023 2024 /* Panel */ 2025 .nfa-hamburger__panel { 2026 position: fixed; 2027 z-index: 99999; 2028 background: #fff; 2029 overflow-y: auto; 2030 -webkit-overflow-scrolling: touch; 2031 transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.35s ease; 2032 visibility: hidden; 2033 } 2034 2035 .nfa-hamburger__panel--left { 2036 top: 0; 2037 left: 0; 2038 bottom: 0; 2039 transform: translateX(-100%); 2040 } 2041 2042 .nfa-hamburger__panel--right { 2043 top: 0; 2044 right: 0; 2045 bottom: 0; 2046 transform: translateX(100%); 2047 } 2048 2049 .nfa-hamburger__panel--top { 2050 top: 0; 2051 left: 0; 2052 right: 0; 2053 max-height: 80vh; 2054 transform: translateY(-100%); 2055 } 2056 2057 .nfa-hamburger--open .nfa-hamburger__panel { 2058 transform: translate(0); 2059 visibility: visible; 2060 } 2061 2062 /* Panel header */ 2063 .nfa-hamburger__panel-header { 2064 display: flex; 2065 align-items: center; 2066 justify-content: space-between; 2067 margin-bottom: 16px; 2068 } 2069 2070 .nfa-hamburger__logo { 2071 max-height: 40px; 2072 width: auto; 2073 } 2074 2075 .nfa-hamburger__close { 2076 background: none; 2077 border: none; 2078 font-size: 28px; 2079 cursor: pointer; 2080 line-height: 1; 2081 padding: 4px 8px; 2082 transition: color 0.2s ease; 2083 margin-left: auto; 2084 } 2085 2086 /* Menu list */ 2087 .nfa-hamburger__list { 2088 list-style: none; 2089 margin: 0; 2090 padding: 0; 2091 } 2092 2093 .nfa-hamburger__item--separated { 2094 border-bottom: 1px solid #e2e8f0; 2095 } 2096 2097 .nfa-hamburger__link { 2098 display: flex; 2099 align-items: center; 2100 gap: 10px; 2101 text-decoration: none; 2102 font-size: 15px; 2103 font-weight: 500; 2104 transition: color 0.2s ease; 2105 } 2106 2107 .nfa-hamburger__link-icon { 2108 flex-shrink: 0; 2109 font-size: 1.1em; 2110 } 2111 2112 .nfa-hamburger__arrow { 2113 margin-left: auto; 2114 font-size: 12px; 2115 transition: transform 0.25s ease; 2116 } 2117 2118 .nfa-hamburger__item--sub-open > .nfa-hamburger__link .nfa-hamburger__arrow { 2119 transform: rotate(180deg); 2120 } 2121 2122 /* Sub-menu */ 2123 .nfa-hamburger__sub-list { 2124 list-style: none; 2125 margin: 0; 2126 padding: 4px 0 4px 24px; 2127 display: none; 2128 } 2129 2130 .nfa-hamburger__item--sub-open > .nfa-hamburger__sub-list { 2131 display: block; 2132 } 2133 2134 .nfa-hamburger__sub-link { 2135 display: block; 2136 padding: 6px 0; 2137 text-decoration: none; 2138 font-size: 14px; 2139 transition: color 0.2s ease; 2140 } 2141 2142 /* ========================================================================== 2143 Advanced Form Widget 2144 ========================================================================== */ 2145 2146 .nfa-form__fields { 2147 display: flex; 2148 flex-wrap: wrap; 2149 gap: 16px; 2150 } 2151 2152 .nfa-form__col--100 { width: 100%; } 2153 .nfa-form__col--75 { width: calc(75% - 8px); } 2154 .nfa-form__col--66 { width: calc(66.666% - 8px); } 2155 .nfa-form__col--50 { width: calc(50% - 8px); } 2156 .nfa-form__col--33 { width: calc(33.333% - 8px); } 2157 .nfa-form__col--25 { width: calc(25% - 12px); } 2158 .nfa-form__col--hidden { display: none; } 2159 2160 .nfa-form__label { 2161 display: block; 2162 font-weight: 600; 2163 font-size: 13px; 2164 margin-bottom: 6px; 2165 } 2166 2167 .nfa-form__required { 2168 color: #ef4444; 2169 margin-left: 2px; 2170 } 2171 2172 .nfa-form__input, 2173 .nfa-form__select, 2174 .nfa-form__textarea { 2175 display: block; 2176 width: 100%; 2177 border: 1px solid #cbd5e1; 2178 font-size: 14px; 2179 line-height: 1.5; 2180 transition: border-color 0.2s ease, box-shadow 0.2s ease; 2181 outline: none; 2182 box-sizing: border-box; 2183 } 2184 2185 .nfa-form__input:focus, 2186 .nfa-form__select:focus, 2187 .nfa-form__textarea:focus { 2188 border-color: #6366f1; 2189 box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); 2190 } 2191 2192 .nfa-form__input--file { 2193 padding: 8px; 2194 border-style: dashed; 2195 } 2196 2197 .nfa-form__textarea { 2198 resize: vertical; 2199 min-height: 100px; 2200 } 2201 2202 .nfa-form__choice-group { 2203 display: flex; 2204 flex-wrap: wrap; 2205 gap: 12px; 2206 } 2207 2208 .nfa-form__choice { 2209 display: flex; 2210 align-items: center; 2211 gap: 6px; 2212 font-size: 14px; 2213 cursor: pointer; 2214 } 2215 2216 .nfa-form__choice input { 2217 accent-color: #6366f1; 2218 width: 16px; 2219 height: 16px; 2220 } 2221 2222 .nfa-form__field-error { 2223 display: block; 2224 font-size: 12px; 2225 color: #ef4444; 2226 min-height: 18px; 2227 margin-top: 4px; 2228 } 2229 2230 .nfa-form__actions { 2231 display: flex; 2232 margin-top: 20px; 2233 } 2234 2235 .nfa-form__submit { 2236 display: inline-flex; 2237 align-items: center; 2238 gap: 8px; 2239 border: none; 2240 font-weight: 600; 2241 cursor: pointer; 2242 transition: background 0.2s ease, transform 0.15s ease; 2243 } 2244 2245 .nfa-form__submit:hover { 2246 transform: translateY(-1px); 2247 } 2248 2249 .nfa-form__submit:active { 2250 transform: translateY(0); 2251 } 2252 2253 .nfa-form__submit:disabled { 2254 opacity: 0.6; 2255 cursor: not-allowed; 2256 transform: none; 2257 } 2258 2259 .nfa-form__spinner { 2260 display: inline-block; 2261 width: 16px; 2262 height: 16px; 2263 border: 2px solid rgba(255, 255, 255, 0.3); 2264 border-top-color: #fff; 2265 border-radius: 50%; 2266 animation: nfa-spin 0.6s linear infinite; 2267 } 2268 2269 @keyframes nfa-spin { 2270 to { transform: rotate(360deg); } 2271 } 2272 2273 .nfa-form__msg { 2274 padding: 14px 18px; 2275 border-radius: 8px; 2276 font-size: 14px; 2277 font-weight: 500; 2278 margin-top: 16px; 2279 } 2280 2281 .nfa-form__msg--success { 2282 background: #f0fdf4; 2283 color: #166534; 2284 border: 1px solid #bbf7d0; 2285 } 2286 2287 .nfa-form__msg--error { 2288 background: #fef2f2; 2289 color: #991b1b; 2290 border: 1px solid #fecaca; 2291 } 2292 2293 .nfa-form__input--invalid, 2294 .nfa-form__select--invalid, 2295 .nfa-form__textarea--invalid { 2296 border-color: #ef4444 !important; 2297 box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1) !important; 2298 } 2299 2300 @media (max-width: 767px) { 2301 .nfa-form__col--75, 2302 .nfa-form__col--66, 2303 .nfa-form__col--50, 2304 .nfa-form__col--33, 2305 .nfa-form__col--25 { 2306 width: 100%; 2307 } 2308 } 2309 2310 /* Submissions admin badges */ 2311 .nfa-badge { 2312 display: inline-block; 2313 padding: 2px 10px; 2314 border-radius: 999px; 2315 font-size: 11px; 2316 font-weight: 600; 2317 text-transform: uppercase; 2318 letter-spacing: 0.04em; 2319 } 2320 2321 .nfa-badge--blue { 2322 background: #eef2ff; 2323 color: #4f46e5; 2324 } 2325 2326 .nfa-badge--gray { 2327 background: #f1f5f9; 2328 color: #64748b; 2329 } 2330 2331 .nfa-sub-row--unread td { 2332 background: #fafbff; 2333 font-weight: 500; 2334 } -
nebula-forge-addons-for-elementor/tags/0.7.0/assets/css/frontend.min.css
r3462573 r3462588 1 .nfa-hero-cta{color:#131313;display:flex;flex-direction:column;gap:24px;text-decoration:none}.nfa-hero-cta__kicker{letter-spacing:.2em;text-transform:uppercase;font-size:.85rem;opacity:.7;margin:0;position:relative}.nfa-hero-cta__headline{font-size:clamp(2.5rem, 4vw, 3.5rem);line-height:1.1;margin:0;position:relative;letter-spacing:-.02em}.nfa-hero-cta__body{font-size:1.1rem;max-width:640px;margin:0;opacity:.85;line-height:1.7;position:relative}.nfa-hero-cta__button{align-self:flex-start;padding:14px 32px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);position:relative;display:inline-flex;align-items:center;gap:8px}.nfa-hero-cta__button:focus-visible,.nfa-hero-cta__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-hero-cta__button:active{transform:translateY(-1px) scale(.99)}.nfa-feature-list{display:flex;flex-direction:column;gap:24px}.nfa-feature-list__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-feature-list__item{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:flex-start;padding:20px;border-radius:16px;background:#fff;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-feature-list__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-feature-list__icon-wrap{display:inline-flex;justify-content:center;align-items:center;padding:10px;border-radius:12px;background:rgba(14,165,233,.08);transition:background .2s ease}.nfa-feature-list__item:hover .nfa-feature-list__icon-wrap{background:rgba(14,165,233,.08)}.nfa-feature-list__icon{color:#0ea5e9;font-size:24px;line-height:1}.nfa-feature-list__title{margin:0 0 4px 0;color:#131313;font-size:1.05rem;font-weight:600}.nfa-feature-list__text{margin:0;color:rgba(19,19,19,.55);font-size:.95rem;line-height:1.6}.nfa-spotlight-card{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:32px;align-items:center}.nfa-spotlight-card__content{display:flex;flex-direction:column;gap:14px}.nfa-spotlight-card__eyebrow{margin:0;letter-spacing:.15em;text-transform:uppercase;color:#0ea5e9;font-size:.78rem;font-weight:600}.nfa-spotlight-card__title{margin:0;color:#131313;font-size:clamp(1.9rem, 3vw, 2.4rem);letter-spacing:-.01em}.nfa-spotlight-card__description{margin:0;color:rgba(19,19,19,.55);font-size:1.02rem;line-height:1.7}.nfa-spotlight-card__meta{margin:0;color:rgba(19,19,19,.4);font-size:.95rem}.nfa-spotlight-card__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-spotlight-card__button:focus-visible,.nfa-spotlight-card__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-spotlight-card__media img{width:100%;height:auto;border-radius:20px;display:block;transition:transform .3s ease}.nfa-spotlight-card:hover .nfa-spotlight-card__media img{transform:scale(1.02)}.nfa-stats-grid{display:flex;flex-direction:column;gap:28px}.nfa-stats-grid__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-stats-grid__item{padding:24px;border-radius:18px;background:#fff;border:1px solid rgba(19,19,19,.1);display:grid;row-gap:8px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-stats-grid__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-stats-grid__value{color:#131313;font-weight:700;font-size:2rem;line-height:1.2;letter-spacing:-.02em}.nfa-stats-grid__label{color:rgba(19,19,19,.55);font-weight:600;font-size:1rem}.nfa-stats-grid__helper{color:rgba(19,19,19,.4);font-size:.9rem;line-height:1.5}.nfa-pricing-table{display:flex;flex-direction:column;gap:20px;color:#131313;position:relative;transition:transform .3s ease,box-shadow .3s ease}.nfa-pricing-table:hover{transform:translateY(-4px)}.nfa-pricing-table__badge{position:absolute;top:18px;right:18px;background:#ff6b35;color:#0f172a;padding:6px 14px;border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 4px 12px rgba(255,107,53,.15)}.nfa-pricing-table__label{margin:0 0 6px 0;font-size:1.4rem}.nfa-pricing-table__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6}.nfa-pricing-table__price{display:flex;align-items:baseline;gap:8px}.nfa-pricing-table__amount{font-size:2.6rem;font-weight:700;line-height:1;letter-spacing:-.02em}.nfa-pricing-table__suffix{font-size:1rem;color:rgba(19,19,19,.4)}.nfa-pricing-table__features{list-style:none;padding:0;margin:0;display:grid;gap:12px}.nfa-pricing-table__features li{display:flex;align-items:flex-start;gap:12px;color:rgba(19,19,19,.55);line-height:1.5}.nfa-pricing-table__features li::before{content:'\2713';color:#0ea5e9;font-weight:700;font-size:.9rem;margin-top:1px;flex-shrink:0}.nfa-pricing-table__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-pricing-table__button:focus-visible,.nfa-pricing-table__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-testimonials{display:flex;flex-direction:column;gap:24px}.nfa-testimonials__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.nfa-testimonials__card{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:16px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-testimonials__card:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-testimonials__avatar img{width:48px;height:48px;border-radius:50%;object-fit:cover;display:block;border:2px solid rgba(19,19,19,.1)}.nfa-testimonials__quote{margin:0;color:rgba(19,19,19,.55);font-size:1rem;line-height:1.7;font-style:normal}blockquote.nfa-testimonials__quote{border:0;padding:0}.nfa-testimonials__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto}.nfa-testimonials__name{font-weight:600;color:#131313}.nfa-testimonials__role{color:rgba(19,19,19,.4);font-size:.9rem}.nfa-testimonials__rating{font-size:.9rem;letter-spacing:1px;color:#fbbf24}.nfa-logo-grid{display:flex;flex-direction:column;gap:24px}.nfa-logo-grid__items{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;align-items:center}.nfa-logo-grid__logo{display:flex;align-items:center;justify-content:center;padding:20px;border-radius:14px;background:#fff;border:1px solid rgba(19,19,19,.1);min-height:86px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-logo-grid__logo:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-3px)}.nfa-logo-grid__logo img{max-width:140px;width:100%;height:auto;opacity:.7;transition:opacity .2s ease,filter .2s ease;filter:grayscale(20%)}.nfa-logo-grid__logo:hover img{opacity:1;filter:grayscale(0%)}.nfa-logo-grid__text{color:#131313;font-weight:600}.nfa-faq{display:flex;flex-direction:column;gap:24px}.nfa-faq__items{display:grid;gap:12px}.nfa-faq__item{background:#fff;border-radius:16px;padding:20px 22px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease}.nfa-faq__item:hover{border-color:#0ea5e9}.nfa-faq__item[open]{background:#f8f9fa;border-color:#0ea5e9}.nfa-faq__question{cursor:pointer;font-weight:600;color:#131313;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:14px;user-select:none}.nfa-faq__question::after{content:'+';font-size:1.2rem;color:#0ea5e9;transition:transform .2s ease;flex-shrink:0;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(14,165,233,.08)}.nfa-faq__item[open] .nfa-faq__question::after{content:'\2212';transform:rotate(180deg)}.nfa-faq__question::-webkit-details-marker{display:none}.nfa-faq__answer{margin-top:14px;color:rgba(19,19,19,.55);line-height:1.7}.nfa-steps{display:flex;flex-direction:column;gap:24px}.nfa-steps__list{display:grid;gap:20px}.nfa-steps--vertical .nfa-steps__list{grid-template-columns:1fr}.nfa-steps--horizontal .nfa-steps__list{grid-template-columns:repeat(3,minmax(0,1fr))}.nfa-steps__item{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:10px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease;position:relative}.nfa-steps__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-steps__label{text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;color:#0ea5e9;font-weight:700}.nfa-steps__title{margin:0;font-size:1.1rem;color:#131313;font-weight:600}.nfa-steps__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6;font-size:.95rem}.nfa-slider{position:relative}.nfa-slider__track{display:flex;gap:20px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-bottom:6px;scrollbar-width:none;-ms-overflow-style:none}.nfa-slider__track::-webkit-scrollbar{display:none}.nfa-slider__item{flex:0 0 100%;scroll-snap-align:start}.nfa-slider__btn{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:999px;border:1px solid rgba(19,19,19,.1);background:#131313;color:#131313;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 8px 20px rgb(15 23 42 / .3);transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease;z-index:2}.nfa-slider__btn--prev{left:-16px}.nfa-slider__btn--next{right:-16px}.nfa-slider__btn:hover{transform:translateY(-50%) scale(1.08);background:rgba(255,255,255,.08);border-color:#0ea5e9}.nfa-slider__btn:focus-visible{outline:0;box-shadow:0 0 0 3px rgba(125,211,252,.3)}.nfa-showcase{position:relative}.nfa-showcase__nav{display:flex;gap:12px;margin-bottom:24px;justify-content:flex-end}.nfa-showcase__arrow{width:48px;height:48px;border-radius:50%;border:1.5px solid rgba(19,19,19,.15);background:0 0;color:#fff;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.nfa-showcase__arrow:hover{background:#131313;color:#f4f4f4;border-color:#131313}.nfa-showcase__viewport{overflow:hidden}.nfa-showcase__track{display:flex;transition:transform .5s cubic-bezier(.25, .46, .45, .94);will-change:transform}.nfa-showcase__card{flex-shrink:0;position:relative;height:420px;border-radius:20px;overflow:hidden;transition:transform .35s ease;text-decoration:none;display:block}.nfa-showcase__card:hover{transform:translateY(-4px)}.nfa-showcase__img{position:absolute;inset:0;z-index:0}.nfa-showcase__img img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.nfa-showcase__card:hover .nfa-showcase__img img{transform:scale(1.08)}.nfa-showcase__card--overlay-dark .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(19,19,19,.92) 0,rgba(19,19,19,.5) 50%,rgba(19,19,19,.15) 100%);z-index:1}.nfa-showcase__card--overlay-light .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(255,255,255,.92) 0,rgba(255,255,255,.4) 50%,transparent 100%);z-index:1}.nfa-showcase__badge{position:absolute;top:20px;left:20px;background:rgba(244,244,244,.15);backdrop-filter:blur(10px);color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:2;border:1px solid rgba(244,244,244,.1)}.nfa-showcase__body{position:absolute;bottom:0;left:0;right:0;padding:32px 28px;z-index:2}.nfa-showcase__title{font-size:22px;font-weight:700;color:#f4f4f4;margin-bottom:12px}.nfa-showcase__desc{font-size:14px;color:rgba(244,244,244,.65);line-height:1.8;margin:0}.nfa-showcase__tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nfa-showcase__tag{font-size:11px;padding:4px 12px;border-radius:50px;border:1px solid rgba(244,244,244,.12);color:rgba(244,244,244,.6);letter-spacing:.3px}.nfa-showcase__dots{display:flex;justify-content:center;gap:8px;margin-top:24px}.nfa-showcase__dot{width:10px;height:10px;border-radius:50%;background:rgba(19,19,19,.2);border:none;cursor:pointer;padding:0;transition:background .3s ease,transform .3s ease}.nfa-showcase__dot--active{background:#131313;transform:scale(1.2)}.nfa-showcase__dot:hover:not(.nfa-showcase__dot--active){background:rgba(19,19,19,.4)}.nfa-areas__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:1/3}.nfa-areas__card{background:#fff;border-radius:18px;overflow:hidden;position:relative;transition:all .4s ease;display:block;text-decoration:none;color:inherit}a.nfa-areas__card:hover{text-decoration:none;color:inherit}.nfa-areas__card--shadow-sm{box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}.nfa-areas__card--shadow-md{box-shadow:0 4px 12px rgba(0,0,0,.08)}.nfa-areas__card--shadow-lg{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__card:hover{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__img{height:200px;overflow:hidden;position:relative}.nfa-areas__img img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}.nfa-areas__badge{position:absolute;top:16px;left:16px;background:#131313;color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:3}.nfa-areas__body{padding:24px}.nfa-areas__title{font-size:19px;font-weight:600;margin:0 0 8px;color:#131313}.nfa-areas__desc{font-size:14px;color:rgba(19,19,19,.55);line-height:1.7;margin:0}.nfa-areas__card--featured{position:relative}.nfa-areas__card--featured .nfa-areas__img{position:absolute;inset:0;height:100%;z-index:0}.nfa-areas__overlay{position:absolute;inset:0;z-index:1;pointer-events:none}.nfa-areas__card--featured .nfa-areas__body{position:absolute;bottom:0;left:0;right:0;z-index:2;padding:32px 28px}.nfa-areas__card--featured .nfa-areas__title{color:#f4f4f4;font-size:24px;margin-bottom:12px}.nfa-areas__card--featured .nfa-areas__desc{color:rgba(244,244,244,.65);font-size:14px;line-height:1.8}.nfa-areas__card--featured .nfa-areas__badge{background:rgba(244,244,244,.15);backdrop-filter:blur(10px);border:1px solid rgba(244,244,244,.1);z-index:2}.nfa-journey__steps{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:24px;position:relative}.nfa-journey__steps--line::before{content:'';position:absolute;top:36px;left:48px;right:48px;height:2px;background:linear-gradient(90deg,#131313,rgba(19,19,19,.08));z-index:0}.nfa-journey__step{text-align:center;position:relative;z-index:1}.nfa-journey__number{width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:2px solid #131313;background:#fff;color:#131313;font-size:22px;font-weight:700;margin:0 auto 20px;transition:all .3s ease}.nfa-journey__step:hover .nfa-journey__number{background:#131313;color:#f4f4f4;box-shadow:0 8px 24px rgba(19,19,19,.2);transform:scale(1.05)}.nfa-journey__step-title{margin:0 0 10px;font-size:16px;font-weight:600;color:#131313}.nfa-journey__step-description{margin:0;font-size:13px;line-height:1.7;color:rgba(19,19,19,.45)}@media (max-width:900px){.nfa-feature-list__items,.nfa-logo-grid__items,.nfa-stats-grid__items,.nfa-steps--horizontal .nfa-steps__list,.nfa-testimonials__grid{grid-template-columns:1fr}.nfa-journey__steps{grid-template-columns:repeat(2,minmax(0,1fr))}.nfa-journey__steps--line::before{display:none}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:auto}.nfa-areas__card--featured .nfa-areas__img{position:relative;inset:auto;height:200px}.nfa-areas__card--featured .nfa-areas__overlay{display:none}.nfa-areas__card--featured .nfa-areas__body{position:relative;bottom:auto;left:auto;right:auto;padding:24px}.nfa-areas .nfa-areas__card--featured .nfa-areas__title{color:#131313!important;font-size:19px!important;margin-bottom:8px}.nfa-areas .nfa-areas__card--featured .nfa-areas__desc{color:rgba(19,19,19,.55)!important;font-size:14px;line-height:1.7}.nfa-areas .nfa-areas__card--featured .nfa-areas__badge{background:#131313!important;color:#f4f4f4!important;backdrop-filter:none;border:none!important}}@media (max-width:640px){.nfa-journey__steps{grid-template-columns:1fr}.nfa-slider__btn--prev{left:-8px}.nfa-slider__btn--next{right:-8px}}.nfa-team__grid{display:grid;gap:24px;grid-template-columns:repeat(var(--nfa-team-cols,3),1fr)}.nfa-team__card{background:#fff;border-radius:16px;overflow:hidden;text-align:center;transition:box-shadow .3s ease,transform .25s ease;box-shadow:0 1px 4px rgba(0,0,0,.06)}.nfa-team__card:hover{box-shadow:0 8px 24px rgba(0,0,0,.1);transform:translateY(-4px)}.nfa-team__card--layout-left{display:flex;text-align:left}.nfa-team__card--layout-left .nfa-team__photo{flex:0 0 140px;height:auto}.nfa-team__photo{width:100%;height:220px;object-fit:cover;display:block}.nfa-team__card--layout-circle .nfa-team__photo{width:120px;height:120px;border-radius:50%;margin:24px auto 0}.nfa-team__body{padding:20px}.nfa-team__name{margin:0 0 4px;font-size:1.15em;font-weight:600;color:#131313}.nfa-team__role{font-size:.875em;color:rgba(19,19,19,.55);margin-bottom:10px}.nfa-team__bio{font-size:.9em;color:rgba(19,19,19,.7);line-height:1.6;margin-bottom:14px}.nfa-team__social{display:flex;gap:10px;justify-content:center}.nfa-team__card--layout-left .nfa-team__social{justify-content:flex-start}.nfa-team__social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:rgba(19,19,19,.06);color:#131313;font-size:15px;transition:background .25s,color .25s;text-decoration:none}.nfa-team__social a:hover{background:#0ea5e9;color:#fff}@media (max-width:767px){.nfa-team__grid{grid-template-columns:1fr}.nfa-team__card--layout-left{flex-direction:column;text-align:center}.nfa-team__card--layout-left .nfa-team__photo{flex:none;width:100%;height:200px}.nfa-team__card--layout-left .nfa-team__social{justify-content:center}}.nfa-cta-banner{border-radius:16px;padding:48px 40px;text-align:center;position:relative;overflow:hidden}.nfa-cta-banner--left{text-align:left}.nfa-cta-banner--side{display:flex;align-items:center;justify-content:space-between;text-align:left;gap:32px}.nfa-cta-banner__icon{font-size:40px;margin-bottom:16px;display:inline-block}.nfa-cta-banner__kicker{display:inline-block;font-size:.8em;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px;opacity:.75}.nfa-cta-banner__title{margin:0 0 14px;font-size:1.75em;font-weight:700;line-height:1.25}.nfa-cta-banner__desc{font-size:1.05em;line-height:1.6;opacity:.85;max-width:640px;margin:0 auto 24px}.nfa-cta-banner--left .nfa-cta-banner__desc,.nfa-cta-banner--side .nfa-cta-banner__desc{margin-left:0}.nfa-cta-banner__actions{display:flex;gap:12px;flex-wrap:wrap}.nfa-cta-banner--center .nfa-cta-banner__actions{justify-content:center}.nfa-cta-banner__btn{display:inline-flex;align-items:center;padding:12px 28px;border-radius:8px;font-weight:600;font-size:.95em;text-decoration:none;transition:opacity .25s,transform .15s;border:none;cursor:pointer}.nfa-cta-banner__btn:hover{opacity:.88;transform:translateY(-1px)}@media (max-width:767px){.nfa-cta-banner{padding:32px 24px}.nfa-cta-banner--side{flex-direction:column;text-align:center}.nfa-cta-banner--side .nfa-cta-banner__actions{justify-content:center}}.nfa-tabs{display:flex;flex-direction:column;gap:0}.nfa-tabs--vertical{flex-direction:row;gap:24px}.nfa-tabs__nav{display:flex;gap:4px;border-bottom:2px solid rgba(19,19,19,.08);padding-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:column;border-bottom:none;border-right:2px solid rgba(19,19,19,.08);padding-right:0;padding-bottom:0;min-width:180px;overflow-x:visible}.nfa-tabs__btn{position:relative;display:inline-flex;align-items:center;gap:8px;padding:12px 24px;font-weight:500;font-size:.95em;background:0 0;border:none;color:rgba(19,19,19,.55);cursor:pointer;white-space:nowrap;transition:color .2s,background .2s;border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 0 0 8px;justify-content:flex-start;text-align:left;width:100%}.nfa-tabs__btn:hover{color:#131313;background:rgba(19,19,19,.03)}.nfa-tabs__btn--active{color:#0ea5e9;background:rgba(14,165,233,.08)}.nfa-tabs__btn--active::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#0ea5e9;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:auto;top:0;left:auto;right:-2px;width:3px;height:100%;border-radius:0 3px 3px 0}.nfa-tabs__btn--icon-top{flex-direction:column}.nfa-tabs__btn-icon{font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center}.nfa-tabs__panels{flex:1}.nfa-tabs__panel{display:none;padding:24px;color:rgba(19,19,19,.7);line-height:1.7;border-radius:0 0 12px 12px}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 12px 12px 0}.nfa-tabs__panel--active{display:block}@media (max-width:767px){.nfa-tabs--vertical{flex-direction:column}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:row;border-right:none;border-bottom:2px solid rgba(19,19,19,.08);min-width:0;overflow-x:auto}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:-2px;top:auto;right:0;left:0;width:auto;height:3px;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 0 12px 12px}}.nfa-compare{position:relative;overflow:hidden;border-radius:12px;user-select:none;touch-action:none;cursor:col-resize;line-height:0}.nfa-compare--vertical{cursor:row-resize}.nfa-compare__after,.nfa-compare__before{position:relative;width:100%}.nfa-compare__before{position:absolute;top:0;left:0;z-index:2;height:100%;overflow:hidden}.nfa-compare__after img,.nfa-compare__before img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.nfa-compare__label{position:absolute;bottom:16px;padding:4px 14px;font-size:.8em;font-weight:600;color:#fff;background:rgba(0,0,0,.55);border-radius:6px;z-index:5;pointer-events:none;transition:opacity .3s}.nfa-compare__label--before{left:16px}.nfa-compare__label--after{right:16px}.nfa-compare--vertical .nfa-compare__label--before{top:16px;bottom:auto;left:16px}.nfa-compare--vertical .nfa-compare__label--after{bottom:16px;right:auto;left:16px}.nfa-compare--hover-labels .nfa-compare__label{opacity:0}.nfa-compare--hover-labels:hover .nfa-compare__label{opacity:1}.nfa-compare__slider{position:absolute;top:0;bottom:0;z-index:10;display:flex;align-items:center;justify-content:center}.nfa-compare--horizontal .nfa-compare__slider{flex-direction:column;width:0}.nfa-compare--vertical .nfa-compare__slider{top:auto;left:0;right:0;flex-direction:row;height:0}.nfa-compare__line{position:absolute}.nfa-compare--horizontal .nfa-compare__line{width:3px;top:0;bottom:0;background:#fff}.nfa-compare--vertical .nfa-compare__line{height:3px;left:0;right:0;background:#fff}.nfa-compare__handle{position:relative;z-index:11;width:40px;height:40px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.25);color:#131313;cursor:inherit;flex-shrink:0}.nfa-compare__handle svg{width:14px;height:14px}.nfa-countdown{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:16px}.nfa-countdown__block{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-width:80px;border-radius:12px;background:rgba(19,19,19,.04);transition:transform .25s,box-shadow .25s;position:relative}.nfa-countdown__block:hover{transform:translateY(-3px);box-shadow:0 4px 16px rgba(0,0,0,.08)}.nfa-countdown__digit{font-size:2.5em;font-weight:700;line-height:1.1;color:#131313;font-variant-numeric:tabular-nums}.nfa-countdown__label{font-size:.8em;font-weight:500;color:rgba(19,19,19,.55);text-transform:uppercase;letter-spacing:.06em;margin-top:8px}.nfa-countdown__sep{font-size:2em;font-weight:700;color:rgba(19,19,19,.3);line-height:1;align-self:flex-start;padding-top:20px}.nfa-countdown--inline .nfa-countdown__block{background:0 0;padding:10px 6px;min-width:auto;border-radius:0}.nfa-countdown--inline .nfa-countdown__block:hover{transform:none;box-shadow:none}.nfa-countdown__block--circle{position:relative;background:0 0;padding:0;width:120px;height:120px;border-radius:50%}.nfa-countdown__block--circle:hover{transform:none;box-shadow:none}.nfa-countdown__ring{position:absolute;top:0;left:0;width:100%;height:100%}.nfa-countdown__progress{transition:stroke-dashoffset .6s ease}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.6em}.nfa-countdown__block--circle .nfa-countdown__label{font-size:.65em;margin-top:2px}.nfa-countdown__expiry{width:100%;text-align:center;font-size:1.2em;font-weight:600;color:#131313;padding:24px}@media (max-width:480px){.nfa-countdown__digit{font-size:1.8em}.nfa-countdown__block{min-width:60px;padding:14px}.nfa-countdown__block--circle{width:80px;height:80px}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.2em}}.nfa-tooltip{position:absolute;z-index:99999;max-width:260px;padding:8px 14px;border-radius:6px;background:#1e293b;color:#fff;font-size:13px;line-height:1.5;text-align:center;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease,transform .25s ease;white-space:normal;word-wrap:break-word;box-shadow:0 4px 12px rgba(0,0,0,.15)}.nfa-tooltip--visible{opacity:1;visibility:visible}.nfa-tooltip::after{content:'';position:absolute;width:0;height:0;border:6px solid transparent}.nfa-tooltip--no-arrow::after{display:none}.nfa-tooltip--top{transform:translateY(6px)}.nfa-tooltip--top.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--top::after{top:100%;left:50%;transform:translateX(-50%);border-top-color:inherit}.nfa-tooltip--bottom{transform:translateY(-6px)}.nfa-tooltip--bottom.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--bottom::after{bottom:100%;left:50%;transform:translateX(-50%);border-bottom-color:inherit}.nfa-tooltip--left{transform:translateX(6px)}.nfa-tooltip--left.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--left::after{left:100%;top:50%;transform:translateY(-50%);border-left-color:inherit}.nfa-tooltip--right{transform:translateX(-6px)}.nfa-tooltip--right.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--right::after{right:100%;top:50%;transform:translateY(-50%);border-right-color:inherit}[data-nfa-wrapper-link]{cursor:pointer;position:relative}[data-nfa-wrapper-link]:focus-visible{outline:2px solid currentColor;outline-offset:2px} 1 .nfa-hero-cta{color:#131313;display:flex;flex-direction:column;gap:24px;text-decoration:none}.nfa-hero-cta__kicker{letter-spacing:.2em;text-transform:uppercase;font-size:.85rem;opacity:.7;margin:0;position:relative}.nfa-hero-cta__headline{font-size:clamp(2.5rem, 4vw, 3.5rem);line-height:1.1;margin:0;position:relative;letter-spacing:-.02em}.nfa-hero-cta__body{font-size:1.1rem;max-width:640px;margin:0;opacity:.85;line-height:1.7;position:relative}.nfa-hero-cta__button{align-self:flex-start;padding:14px 32px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);position:relative;display:inline-flex;align-items:center;gap:8px}.nfa-hero-cta__button:focus-visible,.nfa-hero-cta__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-hero-cta__button:active{transform:translateY(-1px) scale(.99)}.nfa-feature-list{display:flex;flex-direction:column;gap:24px}.nfa-feature-list__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-feature-list__item{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:flex-start;padding:20px;border-radius:16px;background:#fff;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-feature-list__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-feature-list__icon-wrap{display:inline-flex;justify-content:center;align-items:center;padding:10px;border-radius:12px;background:rgba(14,165,233,.08);transition:background .2s ease}.nfa-feature-list__item:hover .nfa-feature-list__icon-wrap{background:rgba(14,165,233,.08)}.nfa-feature-list__icon{color:#0ea5e9;font-size:24px;line-height:1}.nfa-feature-list__title{margin:0 0 4px 0;color:#131313;font-size:1.05rem;font-weight:600}.nfa-feature-list__text{margin:0;color:rgba(19,19,19,.55);font-size:.95rem;line-height:1.6}.nfa-spotlight-card{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:32px;align-items:center}.nfa-spotlight-card__content{display:flex;flex-direction:column;gap:14px}.nfa-spotlight-card__eyebrow{margin:0;letter-spacing:.15em;text-transform:uppercase;color:#0ea5e9;font-size:.78rem;font-weight:600}.nfa-spotlight-card__title{margin:0;color:#131313;font-size:clamp(1.9rem, 3vw, 2.4rem);letter-spacing:-.01em}.nfa-spotlight-card__description{margin:0;color:rgba(19,19,19,.55);font-size:1.02rem;line-height:1.7}.nfa-spotlight-card__meta{margin:0;color:rgba(19,19,19,.4);font-size:.95rem}.nfa-spotlight-card__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-spotlight-card__button:focus-visible,.nfa-spotlight-card__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-spotlight-card__media img{width:100%;height:auto;border-radius:20px;display:block;transition:transform .3s ease}.nfa-spotlight-card:hover .nfa-spotlight-card__media img{transform:scale(1.02)}.nfa-stats-grid{display:flex;flex-direction:column;gap:28px}.nfa-stats-grid__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-stats-grid__item{padding:24px;border-radius:18px;background:#fff;border:1px solid rgba(19,19,19,.1);display:grid;row-gap:8px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-stats-grid__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-stats-grid__value{color:#131313;font-weight:700;font-size:2rem;line-height:1.2;letter-spacing:-.02em}.nfa-stats-grid__label{color:rgba(19,19,19,.55);font-weight:600;font-size:1rem}.nfa-stats-grid__helper{color:rgba(19,19,19,.4);font-size:.9rem;line-height:1.5}.nfa-pricing-table{display:flex;flex-direction:column;gap:20px;color:#131313;position:relative;transition:transform .3s ease,box-shadow .3s ease}.nfa-pricing-table:hover{transform:translateY(-4px)}.nfa-pricing-table__badge{position:absolute;top:18px;right:18px;background:#ff6b35;color:#0f172a;padding:6px 14px;border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 4px 12px rgba(255,107,53,.15)}.nfa-pricing-table__label{margin:0 0 6px 0;font-size:1.4rem}.nfa-pricing-table__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6}.nfa-pricing-table__price{display:flex;align-items:baseline;gap:8px}.nfa-pricing-table__amount{font-size:2.6rem;font-weight:700;line-height:1;letter-spacing:-.02em}.nfa-pricing-table__suffix{font-size:1rem;color:rgba(19,19,19,.4)}.nfa-pricing-table__features{list-style:none;padding:0;margin:0;display:grid;gap:12px}.nfa-pricing-table__features li{display:flex;align-items:flex-start;gap:12px;color:rgba(19,19,19,.55);line-height:1.5}.nfa-pricing-table__features li::before{content:'\2713';color:#0ea5e9;font-weight:700;font-size:.9rem;margin-top:1px;flex-shrink:0}.nfa-pricing-table__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-pricing-table__button:focus-visible,.nfa-pricing-table__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-testimonials{display:flex;flex-direction:column;gap:24px}.nfa-testimonials__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.nfa-testimonials__card{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:16px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-testimonials__card:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-testimonials__avatar img{width:48px;height:48px;border-radius:50%;object-fit:cover;display:block;border:2px solid rgba(19,19,19,.1)}.nfa-testimonials__quote{margin:0;color:rgba(19,19,19,.55);font-size:1rem;line-height:1.7;font-style:normal}blockquote.nfa-testimonials__quote{border:0;padding:0}.nfa-testimonials__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto}.nfa-testimonials__name{font-weight:600;color:#131313}.nfa-testimonials__role{color:rgba(19,19,19,.4);font-size:.9rem}.nfa-testimonials__rating{font-size:.9rem;letter-spacing:1px;color:#fbbf24}.nfa-logo-grid{display:flex;flex-direction:column;gap:24px}.nfa-logo-grid__items{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;align-items:center}.nfa-logo-grid__logo{display:flex;align-items:center;justify-content:center;padding:20px;border-radius:14px;background:#fff;border:1px solid rgba(19,19,19,.1);min-height:86px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-logo-grid__logo:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-3px)}.nfa-logo-grid__logo img{max-width:140px;width:100%;height:auto;opacity:.7;transition:opacity .2s ease,filter .2s ease;filter:grayscale(20%)}.nfa-logo-grid__logo:hover img{opacity:1;filter:grayscale(0%)}.nfa-logo-grid__text{color:#131313;font-weight:600}.nfa-faq{display:flex;flex-direction:column;gap:24px}.nfa-faq__items{display:grid;gap:12px}.nfa-faq__item{background:#fff;border-radius:16px;padding:20px 22px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease}.nfa-faq__item:hover{border-color:#0ea5e9}.nfa-faq__item[open]{background:#f8f9fa;border-color:#0ea5e9}.nfa-faq__question{cursor:pointer;font-weight:600;color:#131313;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:14px;user-select:none}.nfa-faq__question::after{content:'+';font-size:1.2rem;color:#0ea5e9;transition:transform .2s ease;flex-shrink:0;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(14,165,233,.08)}.nfa-faq__item[open] .nfa-faq__question::after{content:'\2212';transform:rotate(180deg)}.nfa-faq__question::-webkit-details-marker{display:none}.nfa-faq__answer{margin-top:14px;color:rgba(19,19,19,.55);line-height:1.7}.nfa-steps{display:flex;flex-direction:column;gap:24px}.nfa-steps__list{display:grid;gap:20px}.nfa-steps--vertical .nfa-steps__list{grid-template-columns:1fr}.nfa-steps--horizontal .nfa-steps__list{grid-template-columns:repeat(3,minmax(0,1fr))}.nfa-steps__item{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:10px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease;position:relative}.nfa-steps__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-steps__label{text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;color:#0ea5e9;font-weight:700}.nfa-steps__title{margin:0;font-size:1.1rem;color:#131313;font-weight:600}.nfa-steps__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6;font-size:.95rem}.nfa-slider{position:relative}.nfa-slider__track{display:flex;gap:20px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-bottom:6px;scrollbar-width:none;-ms-overflow-style:none}.nfa-slider__track::-webkit-scrollbar{display:none}.nfa-slider__item{flex:0 0 100%;scroll-snap-align:start}.nfa-slider__btn{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:999px;border:1px solid rgba(19,19,19,.1);background:#131313;color:#131313;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 8px 20px rgb(15 23 42 / .3);transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease;z-index:2}.nfa-slider__btn--prev{left:-16px}.nfa-slider__btn--next{right:-16px}.nfa-slider__btn:hover{transform:translateY(-50%) scale(1.08);background:rgba(255,255,255,.08);border-color:#0ea5e9}.nfa-slider__btn:focus-visible{outline:0;box-shadow:0 0 0 3px rgba(125,211,252,.3)}.nfa-showcase{position:relative}.nfa-showcase__nav{display:flex;gap:12px;margin-bottom:24px;justify-content:flex-end}.nfa-showcase__arrow{width:48px;height:48px;border-radius:50%;border:1.5px solid rgba(19,19,19,.15);background:0 0;color:#fff;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.nfa-showcase__arrow:hover{background:#131313;color:#f4f4f4;border-color:#131313}.nfa-showcase__viewport{overflow:hidden}.nfa-showcase__track{display:flex;transition:transform .5s cubic-bezier(.25, .46, .45, .94);will-change:transform}.nfa-showcase__card{flex-shrink:0;position:relative;height:420px;border-radius:20px;overflow:hidden;transition:transform .35s ease;text-decoration:none;display:block}.nfa-showcase__card:hover{transform:translateY(-4px)}.nfa-showcase__img{position:absolute;inset:0;z-index:0}.nfa-showcase__img img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.nfa-showcase__card:hover .nfa-showcase__img img{transform:scale(1.08)}.nfa-showcase__card--overlay-dark .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(19,19,19,.92) 0,rgba(19,19,19,.5) 50%,rgba(19,19,19,.15) 100%);z-index:1}.nfa-showcase__card--overlay-light .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(255,255,255,.92) 0,rgba(255,255,255,.4) 50%,transparent 100%);z-index:1}.nfa-showcase__badge{position:absolute;top:20px;left:20px;background:rgba(244,244,244,.15);backdrop-filter:blur(10px);color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:2;border:1px solid rgba(244,244,244,.1)}.nfa-showcase__body{position:absolute;bottom:0;left:0;right:0;padding:32px 28px;z-index:2}.nfa-showcase__title{font-size:22px;font-weight:700;color:#f4f4f4;margin-bottom:12px}.nfa-showcase__desc{font-size:14px;color:rgba(244,244,244,.65);line-height:1.8;margin:0}.nfa-showcase__tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nfa-showcase__tag{font-size:11px;padding:4px 12px;border-radius:50px;border:1px solid rgba(244,244,244,.12);color:rgba(244,244,244,.6);letter-spacing:.3px}.nfa-showcase__dots{display:flex;justify-content:center;gap:8px;margin-top:24px}.nfa-showcase__dot{width:10px;height:10px;border-radius:50%;background:rgba(19,19,19,.2);border:none;cursor:pointer;padding:0;transition:background .3s ease,transform .3s ease}.nfa-showcase__dot--active{background:#131313;transform:scale(1.2)}.nfa-showcase__dot:hover:not(.nfa-showcase__dot--active){background:rgba(19,19,19,.4)}.nfa-areas__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:1/3}.nfa-areas__card{background:#fff;border-radius:18px;overflow:hidden;position:relative;transition:all .4s ease;display:block;text-decoration:none;color:inherit}a.nfa-areas__card:hover{text-decoration:none;color:inherit}.nfa-areas__card--shadow-sm{box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}.nfa-areas__card--shadow-md{box-shadow:0 4px 12px rgba(0,0,0,.08)}.nfa-areas__card--shadow-lg{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__card:hover{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__img{height:200px;overflow:hidden;position:relative}.nfa-areas__img img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}.nfa-areas__badge{position:absolute;top:16px;left:16px;background:#131313;color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:3}.nfa-areas__body{padding:24px}.nfa-areas__title{font-size:19px;font-weight:600;margin:0 0 8px;color:#131313}.nfa-areas__desc{font-size:14px;color:rgba(19,19,19,.55);line-height:1.7;margin:0}.nfa-areas__card--featured{position:relative}.nfa-areas__card--featured .nfa-areas__img{position:absolute;inset:0;height:100%;z-index:0}.nfa-areas__overlay{position:absolute;inset:0;z-index:1;pointer-events:none}.nfa-areas__card--featured .nfa-areas__body{position:absolute;bottom:0;left:0;right:0;z-index:2;padding:32px 28px}.nfa-areas__card--featured .nfa-areas__title{color:#f4f4f4;font-size:24px;margin-bottom:12px}.nfa-areas__card--featured .nfa-areas__desc{color:rgba(244,244,244,.65);font-size:14px;line-height:1.8}.nfa-areas__card--featured .nfa-areas__badge{background:rgba(244,244,244,.15);backdrop-filter:blur(10px);border:1px solid rgba(244,244,244,.1);z-index:2}.nfa-journey__steps{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:24px;position:relative}.nfa-journey__steps--line::before{content:'';position:absolute;top:36px;left:48px;right:48px;height:2px;background:linear-gradient(90deg,#131313,rgba(19,19,19,.08));z-index:0}.nfa-journey__step{text-align:center;position:relative;z-index:1}.nfa-journey__number{width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:2px solid #131313;background:#fff;color:#131313;font-size:22px;font-weight:700;margin:0 auto 20px;transition:all .3s ease}.nfa-journey__step:hover .nfa-journey__number{background:#131313;color:#f4f4f4;box-shadow:0 8px 24px rgba(19,19,19,.2);transform:scale(1.05)}.nfa-journey__step-title{margin:0 0 10px;font-size:16px;font-weight:600;color:#131313}.nfa-journey__step-description{margin:0;font-size:13px;line-height:1.7;color:rgba(19,19,19,.45)}@media (max-width:900px){.nfa-feature-list__items,.nfa-logo-grid__items,.nfa-stats-grid__items,.nfa-steps--horizontal .nfa-steps__list,.nfa-testimonials__grid{grid-template-columns:1fr}.nfa-journey__steps{grid-template-columns:repeat(2,minmax(0,1fr))}.nfa-journey__steps--line::before{display:none}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:auto}.nfa-areas__card--featured .nfa-areas__img{position:relative;inset:auto;height:200px}.nfa-areas__card--featured .nfa-areas__overlay{display:none}.nfa-areas__card--featured .nfa-areas__body{position:relative;bottom:auto;left:auto;right:auto;padding:24px}.nfa-areas .nfa-areas__card--featured .nfa-areas__title{color:#131313!important;font-size:19px!important;margin-bottom:8px}.nfa-areas .nfa-areas__card--featured .nfa-areas__desc{color:rgba(19,19,19,.55)!important;font-size:14px;line-height:1.7}.nfa-areas .nfa-areas__card--featured .nfa-areas__badge{background:#131313!important;color:#f4f4f4!important;backdrop-filter:none;border:none!important}}@media (max-width:640px){.nfa-journey__steps{grid-template-columns:1fr}.nfa-slider__btn--prev{left:-8px}.nfa-slider__btn--next{right:-8px}}.nfa-team__grid{display:grid;gap:24px;grid-template-columns:repeat(var(--nfa-team-cols,3),1fr)}.nfa-team__card{background:#fff;border-radius:16px;overflow:hidden;text-align:center;transition:box-shadow .3s ease,transform .25s ease;box-shadow:0 1px 4px rgba(0,0,0,.06)}.nfa-team__card:hover{box-shadow:0 8px 24px rgba(0,0,0,.1);transform:translateY(-4px)}.nfa-team__card--layout-left{display:flex;text-align:left}.nfa-team__card--layout-left .nfa-team__photo{flex:0 0 140px;height:auto}.nfa-team__photo{width:100%;height:220px;object-fit:cover;display:block}.nfa-team__card--layout-circle .nfa-team__photo{width:120px;height:120px;border-radius:50%;margin:24px auto 0}.nfa-team__body{padding:20px}.nfa-team__name{margin:0 0 4px;font-size:1.15em;font-weight:600;color:#131313}.nfa-team__role{font-size:.875em;color:rgba(19,19,19,.55);margin-bottom:10px}.nfa-team__bio{font-size:.9em;color:rgba(19,19,19,.7);line-height:1.6;margin-bottom:14px}.nfa-team__social{display:flex;gap:10px;justify-content:center}.nfa-team__card--layout-left .nfa-team__social{justify-content:flex-start}.nfa-team__social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:rgba(19,19,19,.06);color:#131313;font-size:15px;transition:background .25s,color .25s;text-decoration:none}.nfa-team__social a:hover{background:#0ea5e9;color:#fff}@media (max-width:767px){.nfa-team__grid{grid-template-columns:1fr}.nfa-team__card--layout-left{flex-direction:column;text-align:center}.nfa-team__card--layout-left .nfa-team__photo{flex:none;width:100%;height:200px}.nfa-team__card--layout-left .nfa-team__social{justify-content:center}}.nfa-cta-banner{border-radius:16px;padding:48px 40px;text-align:center;position:relative;overflow:hidden}.nfa-cta-banner--left{text-align:left}.nfa-cta-banner--side{display:flex;align-items:center;justify-content:space-between;text-align:left;gap:32px}.nfa-cta-banner__icon{font-size:40px;margin-bottom:16px;display:inline-block}.nfa-cta-banner__kicker{display:inline-block;font-size:.8em;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px;opacity:.75}.nfa-cta-banner__title{margin:0 0 14px;font-size:1.75em;font-weight:700;line-height:1.25}.nfa-cta-banner__desc{font-size:1.05em;line-height:1.6;opacity:.85;max-width:640px;margin:0 auto 24px}.nfa-cta-banner--left .nfa-cta-banner__desc,.nfa-cta-banner--side .nfa-cta-banner__desc{margin-left:0}.nfa-cta-banner__actions{display:flex;gap:12px;flex-wrap:wrap}.nfa-cta-banner--center .nfa-cta-banner__actions{justify-content:center}.nfa-cta-banner__btn{display:inline-flex;align-items:center;padding:12px 28px;border-radius:8px;font-weight:600;font-size:.95em;text-decoration:none;transition:opacity .25s,transform .15s;border:none;cursor:pointer}.nfa-cta-banner__btn:hover{opacity:.88;transform:translateY(-1px)}@media (max-width:767px){.nfa-cta-banner{padding:32px 24px}.nfa-cta-banner--side{flex-direction:column;text-align:center}.nfa-cta-banner--side .nfa-cta-banner__actions{justify-content:center}}.nfa-tabs{display:flex;flex-direction:column;gap:0}.nfa-tabs--vertical{flex-direction:row;gap:24px}.nfa-tabs__nav{display:flex;gap:4px;border-bottom:2px solid rgba(19,19,19,.08);padding-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:column;border-bottom:none;border-right:2px solid rgba(19,19,19,.08);padding-right:0;padding-bottom:0;min-width:180px;overflow-x:visible}.nfa-tabs__btn{position:relative;display:inline-flex;align-items:center;gap:8px;padding:12px 24px;font-weight:500;font-size:.95em;background:0 0;border:none;color:rgba(19,19,19,.55);cursor:pointer;white-space:nowrap;transition:color .2s,background .2s;border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 0 0 8px;justify-content:flex-start;text-align:left;width:100%}.nfa-tabs__btn:hover{color:#131313;background:rgba(19,19,19,.03)}.nfa-tabs__btn--active{color:#0ea5e9;background:rgba(14,165,233,.08)}.nfa-tabs__btn--active::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#0ea5e9;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:auto;top:0;left:auto;right:-2px;width:3px;height:100%;border-radius:0 3px 3px 0}.nfa-tabs__btn--icon-top{flex-direction:column}.nfa-tabs__btn-icon{font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center}.nfa-tabs__panels{flex:1}.nfa-tabs__panel{display:none;padding:24px;color:rgba(19,19,19,.7);line-height:1.7;border-radius:0 0 12px 12px}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 12px 12px 0}.nfa-tabs__panel--active{display:block}@media (max-width:767px){.nfa-tabs--vertical{flex-direction:column}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:row;border-right:none;border-bottom:2px solid rgba(19,19,19,.08);min-width:0;overflow-x:auto}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:-2px;top:auto;right:0;left:0;width:auto;height:3px;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 0 12px 12px}}.nfa-compare{position:relative;overflow:hidden;border-radius:12px;user-select:none;touch-action:none;cursor:col-resize;line-height:0}.nfa-compare--vertical{cursor:row-resize}.nfa-compare__after,.nfa-compare__before{position:relative;width:100%}.nfa-compare__before{position:absolute;top:0;left:0;z-index:2;height:100%;overflow:hidden}.nfa-compare__after img,.nfa-compare__before img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.nfa-compare__label{position:absolute;bottom:16px;padding:4px 14px;font-size:.8em;font-weight:600;color:#fff;background:rgba(0,0,0,.55);border-radius:6px;z-index:5;pointer-events:none;transition:opacity .3s}.nfa-compare__label--before{left:16px}.nfa-compare__label--after{right:16px}.nfa-compare--vertical .nfa-compare__label--before{top:16px;bottom:auto;left:16px}.nfa-compare--vertical .nfa-compare__label--after{bottom:16px;right:auto;left:16px}.nfa-compare--hover-labels .nfa-compare__label{opacity:0}.nfa-compare--hover-labels:hover .nfa-compare__label{opacity:1}.nfa-compare__slider{position:absolute;top:0;bottom:0;z-index:10;display:flex;align-items:center;justify-content:center}.nfa-compare--horizontal .nfa-compare__slider{flex-direction:column;width:0}.nfa-compare--vertical .nfa-compare__slider{top:auto;left:0;right:0;flex-direction:row;height:0}.nfa-compare__line{position:absolute}.nfa-compare--horizontal .nfa-compare__line{width:3px;top:0;bottom:0;background:#fff}.nfa-compare--vertical .nfa-compare__line{height:3px;left:0;right:0;background:#fff}.nfa-compare__handle{position:relative;z-index:11;width:40px;height:40px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.25);color:#131313;cursor:inherit;flex-shrink:0}.nfa-compare__handle svg{width:14px;height:14px}.nfa-countdown{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:16px}.nfa-countdown__block{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-width:80px;border-radius:12px;background:rgba(19,19,19,.04);transition:transform .25s,box-shadow .25s;position:relative}.nfa-countdown__block:hover{transform:translateY(-3px);box-shadow:0 4px 16px rgba(0,0,0,.08)}.nfa-countdown__digit{font-size:2.5em;font-weight:700;line-height:1.1;color:#131313;font-variant-numeric:tabular-nums}.nfa-countdown__label{font-size:.8em;font-weight:500;color:rgba(19,19,19,.55);text-transform:uppercase;letter-spacing:.06em;margin-top:8px}.nfa-countdown__sep{font-size:2em;font-weight:700;color:rgba(19,19,19,.3);line-height:1;align-self:flex-start;padding-top:20px}.nfa-countdown--inline .nfa-countdown__block{background:0 0;padding:10px 6px;min-width:auto;border-radius:0}.nfa-countdown--inline .nfa-countdown__block:hover{transform:none;box-shadow:none}.nfa-countdown__block--circle{position:relative;background:0 0;padding:0;width:120px;height:120px;border-radius:50%}.nfa-countdown__block--circle:hover{transform:none;box-shadow:none}.nfa-countdown__ring{position:absolute;top:0;left:0;width:100%;height:100%}.nfa-countdown__progress{transition:stroke-dashoffset .6s ease}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.6em}.nfa-countdown__block--circle .nfa-countdown__label{font-size:.65em;margin-top:2px}.nfa-countdown__expiry{width:100%;text-align:center;font-size:1.2em;font-weight:600;color:#131313;padding:24px}@media (max-width:480px){.nfa-countdown__digit{font-size:1.8em}.nfa-countdown__block{min-width:60px;padding:14px}.nfa-countdown__block--circle{width:80px;height:80px}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.2em}}.nfa-tooltip{position:absolute;z-index:99999;max-width:260px;padding:8px 14px;border-radius:6px;background:#1e293b;color:#fff;font-size:13px;line-height:1.5;text-align:center;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease,transform .25s ease;white-space:normal;word-wrap:break-word;box-shadow:0 4px 12px rgba(0,0,0,.15)}.nfa-tooltip--visible{opacity:1;visibility:visible}.nfa-tooltip::after{content:'';position:absolute;width:0;height:0;border:6px solid transparent}.nfa-tooltip--no-arrow::after{display:none}.nfa-tooltip--top{transform:translateY(6px)}.nfa-tooltip--top.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--top::after{top:100%;left:50%;transform:translateX(-50%);border-top-color:inherit}.nfa-tooltip--bottom{transform:translateY(-6px)}.nfa-tooltip--bottom.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--bottom::after{bottom:100%;left:50%;transform:translateX(-50%);border-bottom-color:inherit}.nfa-tooltip--left{transform:translateX(6px)}.nfa-tooltip--left.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--left::after{left:100%;top:50%;transform:translateY(-50%);border-left-color:inherit}.nfa-tooltip--right{transform:translateX(-6px)}.nfa-tooltip--right.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--right::after{right:100%;top:50%;transform:translateY(-50%);border-right-color:inherit}[data-nfa-wrapper-link]{cursor:pointer;position:relative}[data-nfa-wrapper-link]:focus-visible{outline:2px solid currentColor;outline-offset:2px}.nfa-hamburger__toggle-wrap{display:flex}.nfa-hamburger__toggle{display:inline-flex;align-items:center;justify-content:center;border:none;cursor:pointer;line-height:1;transition:background .2s ease,color .2s ease}.nfa-hamburger__icon--bars{display:flex;flex-direction:column;gap:4px;width:1em}.nfa-hamburger__icon--bars span{display:block;height:2px;background:currentColor;border-radius:2px;transition:transform .3s ease,opacity .3s ease}.nfa-hamburger__icon--dots{display:flex;flex-direction:column;gap:4px;align-items:center;width:1em}.nfa-hamburger__icon--dots span{display:block;width:5px;height:5px;background:currentColor;border-radius:50%}.nfa-hamburger__icon--grid{display:grid;grid-template-columns:repeat(2,1fr);gap:3px;width:1em}.nfa-hamburger__icon--grid span{display:block;width:7px;height:7px;background:currentColor;border-radius:2px}.nfa-hamburger__overlay{position:fixed;inset:0;z-index:99998;opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.nfa-hamburger--open .nfa-hamburger__overlay{opacity:1;visibility:visible}.nfa-hamburger__panel{position:fixed;z-index:99999;background:#fff;overflow-y:auto;-webkit-overflow-scrolling:touch;transition:transform .35s cubic-bezier(.4, 0, .2, 1),visibility .35s ease;visibility:hidden}.nfa-hamburger__panel--left{top:0;left:0;bottom:0;transform:translateX(-100%)}.nfa-hamburger__panel--right{top:0;right:0;bottom:0;transform:translateX(100%)}.nfa-hamburger__panel--top{top:0;left:0;right:0;max-height:80vh;transform:translateY(-100%)}.nfa-hamburger--open .nfa-hamburger__panel{transform:translate(0);visibility:visible}.nfa-hamburger__panel-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.nfa-hamburger__logo{max-height:40px;width:auto}.nfa-hamburger__close{background:0 0;border:none;font-size:28px;cursor:pointer;line-height:1;padding:4px 8px;transition:color .2s ease;margin-left:auto}.nfa-hamburger__list{list-style:none;margin:0;padding:0}.nfa-hamburger__item--separated{border-bottom:1px solid #e2e8f0}.nfa-hamburger__link{display:flex;align-items:center;gap:10px;text-decoration:none;font-size:15px;font-weight:500;transition:color .2s ease}.nfa-hamburger__link-icon{flex-shrink:0;font-size:1.1em}.nfa-hamburger__arrow{margin-left:auto;font-size:12px;transition:transform .25s ease}.nfa-hamburger__item--sub-open>.nfa-hamburger__link .nfa-hamburger__arrow{transform:rotate(180deg)}.nfa-hamburger__sub-list{list-style:none;margin:0;padding:4px 0 4px 24px;display:none}.nfa-hamburger__item--sub-open>.nfa-hamburger__sub-list{display:block}.nfa-hamburger__sub-link{display:block;padding:6px 0;text-decoration:none;font-size:14px;transition:color .2s ease}.nfa-form__fields{display:flex;flex-wrap:wrap;gap:16px}.nfa-form__col--100{width:100%}.nfa-form__col--75{width:calc(75% - 8px)}.nfa-form__col--66{width:calc(66.666% - 8px)}.nfa-form__col--50{width:calc(50% - 8px)}.nfa-form__col--33{width:calc(33.333% - 8px)}.nfa-form__col--25{width:calc(25% - 12px)}.nfa-form__col--hidden{display:none}.nfa-form__label{display:block;font-weight:600;font-size:13px;margin-bottom:6px}.nfa-form__required{color:#ef4444;margin-left:2px}.nfa-form__input,.nfa-form__select,.nfa-form__textarea{display:block;width:100%;border:1px solid #cbd5e1;font-size:14px;line-height:1.5;transition:border-color .2s ease,box-shadow .2s ease;outline:0;box-sizing:border-box}.nfa-form__input:focus,.nfa-form__select:focus,.nfa-form__textarea:focus{border-color:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.1)}.nfa-form__input--file{padding:8px;border-style:dashed}.nfa-form__textarea{resize:vertical;min-height:100px}.nfa-form__choice-group{display:flex;flex-wrap:wrap;gap:12px}.nfa-form__choice{display:flex;align-items:center;gap:6px;font-size:14px;cursor:pointer}.nfa-form__choice input{accent-color:#6366f1;width:16px;height:16px}.nfa-form__field-error{display:block;font-size:12px;color:#ef4444;min-height:18px;margin-top:4px}.nfa-form__actions{display:flex;margin-top:20px}.nfa-form__submit{display:inline-flex;align-items:center;gap:8px;border:none;font-weight:600;cursor:pointer;transition:background .2s ease,transform .15s ease}.nfa-form__submit:hover{transform:translateY(-1px)}.nfa-form__submit:active{transform:translateY(0)}.nfa-form__submit:disabled{opacity:.6;cursor:not-allowed;transform:none}.nfa-form__spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:nfa-spin .6s linear infinite}@keyframes nfa-spin{to{transform:rotate(360deg)}}.nfa-form__msg{padding:14px 18px;border-radius:8px;font-size:14px;font-weight:500;margin-top:16px}.nfa-form__msg--success{background:#f0fdf4;color:#166534;border:1px solid #bbf7d0}.nfa-form__msg--error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.nfa-form__input--invalid,.nfa-form__select--invalid,.nfa-form__textarea--invalid{border-color:#ef4444!important;box-shadow:0 0 0 3px rgba(239,68,68,.1)!important}@media (max-width:767px){.nfa-form__col--25,.nfa-form__col--33,.nfa-form__col--50,.nfa-form__col--66,.nfa-form__col--75{width:100%}}.nfa-badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.nfa-badge--blue{background:#eef2ff;color:#4f46e5}.nfa-badge--gray{background:#f1f5f9;color:#64748b}.nfa-sub-row--unread td{background:#fafbff;font-weight:500} -
nebula-forge-addons-for-elementor/tags/0.7.0/assets/js/frontend.js
r3462573 r3462588 542 542 }; 543 543 544 /** 545 * Initialize hamburger menu widgets. 546 */ 547 const initHamburgerMenu = (scope) => { 548 const $menus = scope.find('.nfa-hamburger'); 549 550 $menus.each(function () { 551 const $root = $(this); 552 if ($root.data('nfa-hm-bound')) return; 553 $root.data('nfa-hm-bound', true); 554 555 const $toggle = $root.find('.nfa-hamburger__toggle'); 556 const $panel = $root.find('.nfa-hamburger__panel'); 557 const $overlay = $root.find('.nfa-hamburger__overlay'); 558 const $close = $root.find('.nfa-hamburger__close'); 559 const closeOnLink = $root.data('close-on-link') === 1 || $root.data('close-on-link') === '1'; 560 const closeOnEsc = $root.data('close-on-esc') === 1 || $root.data('close-on-esc') === '1'; 561 562 function open() { 563 $root.addClass('nfa-hamburger--open'); 564 $toggle.attr('aria-expanded', 'true'); 565 $panel.attr('aria-hidden', 'false'); 566 // Trap focus inside panel. 567 $panel.find('a, button').first().focus(); 568 } 569 570 function close() { 571 $root.removeClass('nfa-hamburger--open'); 572 $toggle.attr('aria-expanded', 'false'); 573 $panel.attr('aria-hidden', 'true'); 574 $toggle.focus(); 575 } 576 577 $toggle.on('click', function (e) { 578 e.preventDefault(); 579 if ($root.hasClass('nfa-hamburger--open')) { 580 close(); 581 } else { 582 open(); 583 } 584 }); 585 586 $close.on('click', close); 587 $overlay.on('click', close); 588 589 if (closeOnEsc) { 590 $(document).on('keydown', function (e) { 591 if (e.key === 'Escape' && $root.hasClass('nfa-hamburger--open')) { 592 close(); 593 } 594 }); 595 } 596 597 if (closeOnLink) { 598 $panel.on('click', '.nfa-hamburger__link, .nfa-hamburger__sub-link', function () { 599 const href = $(this).attr('href'); 600 if (href && href !== '#') { 601 close(); 602 } 603 }); 604 } 605 606 // Submenu toggle. 607 $root.find('.nfa-hamburger__item--has-sub > .nfa-hamburger__link').on('click', function (e) { 608 if ($(this).attr('href') === '#') { 609 e.preventDefault(); 610 } 611 $(this).parent().toggleClass('nfa-hamburger__item--sub-open'); 612 }); 613 }); 614 }; 615 616 /** 617 * Initialize advanced form widgets. 618 */ 619 const initAdvancedForm = (scope) => { 620 const $forms = scope.find('.nfa-form'); 621 622 $forms.each(function () { 623 const $root = $(this); 624 if ($root.data('nfa-form-bound')) return; 625 $root.data('nfa-form-bound', true); 626 627 const config = $root.data('nfa-form'); 628 if (!config) return; 629 630 const $form = $root.find('.nfa-form__el'); 631 const $submit = $root.find('.nfa-form__submit'); 632 const $text = $root.find('.nfa-form__submit-text'); 633 const $spin = $root.find('.nfa-form__spinner'); 634 const $msg = $root.find('.nfa-form__msg'); 635 636 /** 637 * Validate a single field. 638 */ 639 function validateField(el) { 640 const $el = $(el); 641 const $err = $el.closest('.nfa-form__col').find('.nfa-form__field-error'); 642 let valid = true; 643 let errMsg = ''; 644 645 // Required check. 646 if (el.required) { 647 if (el.type === 'checkbox') { 648 const name = el.name; 649 const checked = $form.find('input[name="' + name + '"]:checked').length; 650 if (!checked) { 651 valid = false; 652 errMsg = config.requiredMsg || 'This field is required.'; 653 } 654 } else if (!el.value.trim()) { 655 valid = false; 656 errMsg = config.requiredMsg || 'This field is required.'; 657 } 658 } 659 660 // Type-specific validation. 661 if (valid && el.value.trim()) { 662 if (el.type === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(el.value)) { 663 valid = false; 664 errMsg = 'Please enter a valid email address.'; 665 } 666 if (el.type === 'url' && !/^https?:\/\/.+/.test(el.value)) { 667 valid = false; 668 errMsg = 'Please enter a valid URL.'; 669 } 670 if (el.type === 'tel' && !/^[\d\s+\-().]+$/.test(el.value)) { 671 valid = false; 672 errMsg = 'Please enter a valid phone number.'; 673 } 674 if (el.type === 'file') { 675 const maxMB = parseFloat($el.data('max-size') || 5); 676 if (el.files[0] && el.files[0].size > maxMB * 1024 * 1024) { 677 valid = false; 678 errMsg = 'File exceeds ' + maxMB + 'MB limit.'; 679 } 680 } 681 } 682 683 if (!valid) { 684 $el.addClass('nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid'); 685 $err.text(errMsg); 686 } else { 687 $el.removeClass('nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid'); 688 $err.text(''); 689 } 690 691 return valid; 692 } 693 694 // Live validation on blur. 695 $form.find('input, textarea, select').on('blur change', function () { 696 validateField(this); 697 }); 698 699 $form.on('submit', function (e) { 700 e.preventDefault(); 701 702 // Validate all fields. 703 let allValid = true; 704 $form.find('input[required], textarea[required], select[required]').each(function () { 705 if (!validateField(this)) { 706 allValid = false; 707 } 708 }); 709 710 if (!allValid) { 711 $form.find('.nfa-form__input--invalid, .nfa-form__select--invalid, .nfa-form__textarea--invalid').first().focus(); 712 return; 713 } 714 715 // Gather field data. 716 const fields = []; 717 const seen = {}; 718 719 $form.find('[data-label]').each(function () { 720 const $el = $(this); 721 const label = $el.data('label'); 722 const type = $el.attr('type') || this.tagName.toLowerCase(); 723 724 if (type === 'checkbox') { 725 if (!seen[label]) { 726 seen[label] = true; 727 const vals = []; 728 $form.find('input[data-label="' + label + '"]:checked').each(function () { 729 vals.push($(this).val()); 730 }); 731 fields.push({ label: label, value: vals }); 732 } 733 return; 734 } 735 736 if (type === 'radio') { 737 if (!seen[label]) { 738 seen[label] = true; 739 const val = $form.find('input[data-label="' + label + '"]:checked').val() || ''; 740 fields.push({ label: label, value: val }); 741 } 742 return; 743 } 744 745 if (type === 'file') { 746 // File uploads not sent via AJAX JSON — skip for now. 747 fields.push({ label: label, value: this.files[0] ? this.files[0].name : '' }); 748 return; 749 } 750 751 fields.push({ label: label, value: $el.val() || '' }); 752 }); 753 754 // Show loading state. 755 $submit.prop('disabled', true); 756 $text.css('opacity', '0.5'); 757 $spin.show(); 758 $msg.hide(); 759 760 $.ajax({ 761 url: config.ajaxUrl, 762 type: 'POST', 763 data: { 764 action: 'nfa_form_submit', 765 nonce: config.nonce, 766 form_name: config.formName, 767 action_save: config.actionSave ? '1' : '', 768 action_email: config.actionEmail ? '1' : '', 769 email_to: config.emailTo, 770 email_subject: config.emailSubject, 771 email_from_name: config.emailFromName, 772 email_reply_to: config.emailReplyTo, 773 page_url: window.location.href, 774 fields: JSON.stringify(fields), 775 }, 776 success: function (resp) { 777 $submit.prop('disabled', false); 778 $text.css('opacity', '1'); 779 $spin.hide(); 780 781 if (resp.success) { 782 $msg.removeClass('nfa-form__msg--error').addClass('nfa-form__msg--success') 783 .text(config.successMessage || resp.data.message).show(); 784 $form[0].reset(); 785 $form.find('.nfa-form__field-error').text(''); 786 787 if (config.actionRedirect && config.redirectUrl) { 788 setTimeout(function () { 789 window.location.href = config.redirectUrl; 790 }, 1000); 791 } 792 } else { 793 $msg.removeClass('nfa-form__msg--success').addClass('nfa-form__msg--error') 794 .text(config.errorMessage || resp.data.message || 'Error').show(); 795 } 796 }, 797 error: function () { 798 $submit.prop('disabled', false); 799 $text.css('opacity', '1'); 800 $spin.hide(); 801 $msg.removeClass('nfa-form__msg--success').addClass('nfa-form__msg--error') 802 .text(config.errorMessage || 'Network error. Please try again.').show(); 803 }, 804 }); 805 }); 806 }); 807 }; 808 544 809 $(window).on('elementor/frontend/init', () => { 545 810 if (!window.elementorFrontend || !elementorFrontend.hooks) { … … 553 818 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-image-comparison.default', initImageComparison); 554 819 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-countdown-timer.default', initCountdownTimer); 820 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-hamburger-menu.default', initHamburgerMenu); 821 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-advanced-form.default', initAdvancedForm); 555 822 556 823 // Initialize extensions on every element ready (global). -
nebula-forge-addons-for-elementor/tags/0.7.0/assets/js/frontend.min.js
r3462573 r3462588 1 !function( t){"use strict";const e=e=>{e.find(".nfa-slider").each(function(){const e=t(this),n=e.find(".nfa-slider__track").get(0);if(!n)return;const o=Math.max(1,Math.min(6,parseInt(e.data("slider-per-view"),10)||3)),a=Math.max(0,parseInt(e.data("slider-gap"),10)||20),i=Array.from(n.children),r=()=>{n.style.gap=a+"px";const t="calc((100% - "+a*(o-1)+"px) / "+o+")";i.forEach(e=>{e.style.flex="0 0 "+t})};if(r(),e.data("slider-bound"))return;let d;e.data("slider-bound",!0),t(window).on("resize.nfaSlider",()=>{clearTimeout(d),d=setTimeout(r,150)}),e.find(".nfa-slider__btn--prev").on("click",()=>{n.scrollBy({left:-n.clientWidth,behavior:"smooth"})}),e.find(".nfa-slider__btn--next").on("click",()=>{n.scrollBy({left:n.clientWidth,behavior:"smooth"})})})},n=e=>{const n=e.find(".nfa-showcase");n.length&&n.each(function(){const e=t(this),n=e.find(".nfa-showcase__track").get(0),o=e.find(".nfa-showcase__dots"),a=Array.from(n.children),i=a.length;if(!n||0===i)return;if(e.data("showcase-bound"))return;e.data("showcase-bound",!0);const r=Math.max(1,parseInt(e.data("per-view"),10)||3),d=Math.max(1,parseInt(e.data("per-view-tablet"),10)||2),s=Math.max(1,parseInt(e.data("per-view-mobile"),10)||1),c=Math.max(0,parseInt(e.data("gap"),10)||20),l="yes"===e.data("autoplay"),f=Math.max(1e3,parseInt(e.data("autoplay-speed"),10)||4e3),u="yes"===e.data("pause-on-hover");let h,p=0,m=null;function w(){const t=window.innerWidth;return t<=767?s:t<=1024?d:r}function _(){return Math.max(0,i-w())}function b(){const e=w(),i="calc((100% - "+c*(e-1)+"px) / "+e+")";if(a.forEach(function(t){t.style.flex="0 0 "+i}),a[0]){const t=a[0].getBoundingClientRect().width+c;n.style.transform="translateX(-"+p*t+"px)"}!function(){if(!o.length)return;const e=_()+1;if(o.children().length!==e){o.empty();for(var n=0;n<e;n++)o.append('<button class="nfa-showcase__dot" data-index="'+n+'" aria-label="Slide '+(n+1)+'"></button>');o.find(".nfa-showcase__dot").on("click",function(){p=parseInt(t(this).data("index"),10),p=Math.min(p,_()),b(),k()})}o.find(".nfa-showcase__dot").removeClass("nfa-showcase__dot--active"),o.find(".nfa-showcase__dot").eq(p).addClass("nfa-showcase__dot--active")}()}function g(){p=p>=_()?0:p+1,b()}function v(){l&&(y(),m=setInterval(g,f))}function y(){m&&(clearInterval(m),m=null)}function k(){l&&(y(),v())}e.find(".nfa-showcase__arrow--prev").on("click",function(){p=p<=0?_():p-1,b(),k()}),e.find(".nfa-showcase__arrow--next").on("click",function(){g(),k()}),u&&l&&(e.on("mouseenter",y),e.on("mouseleave",v)),t(window).on("resize.nfaShowcaseCarousel",function(){clearTimeout(h),h=setTimeout(function(){p=Math.min(p,_()),b()},150)}),b(),v()})},o=e=>{const n=e.find("[data-tabs]");n.length&&n.each(function(){const e=t(this);if(e.data("tabs-bound"))return;e.data("tabs-bound",!0);const n=e.find(".nfa-tabs__btn"),o=e.find(".nfa-tabs__panel");n.on("click",function(){const a=t(this),i=a.attr("aria-controls");n.removeClass("nfa-tabs__btn--active").attr("aria-selected","false"),a.addClass("nfa-tabs__btn--active").attr("aria-selected","true"),o.removeClass("nfa-tabs__panel--active").attr("hidden",!0),e.find("#"+i).addClass("nfa-tabs__panel--active").removeAttr("hidden")})})},a=e=>{const n=e.find("[data-compare]");n.length&&n.each(function(){const e=this,n=t(e);if(n.data("compare-bound"))return;n.data("compare-bound",!0);const o="horizontal"===(n.data("orientation")||"horizontal"),a=n.find(".nfa-compare__before"),i=n.find(".nfa-compare__slider");let r=!1;function d(t){t=Math.max(0,Math.min(100,t)),o?(a.css("clip-path","inset(0 "+(100-t)+"% 0 0)"),i.css("left",t+"%")):(a.css("clip-path","inset(0 0 "+(100-t)+"% 0)"),i.css("top",t+"%"))}function s(t){const n=e.getBoundingClientRect(),a=t.touches?t.touches[0].clientX:t.clientX,i=t.touches?t.touches[0].clientY:t.clientY;return o?(a-n.left)/n.width*100:(i-n.top)/n.height*100}function c(t){r&&(t.preventDefault(),d(s(t)))}function l(){r=!1,t(document).off("mousemove.nfaCompare touchmove.nfaCompare"),t(document).off("mouseup.nfaCompare touchend.nfaCompare")}n.on("mousedown touchstart",function(e){r=!0,d(s(e)),t(document).on("mousemove.nfaCompare touchmove.nfaCompare",c),t(document).on("mouseup.nfaCompare touchend.nfaCompare",l)})})},i=e=>{const n=e.find("[data-countdown]");n.length&&n.each(function(){const e=t(this);if(e.data("countdown-bound"))return;e.data("countdown-bound",!0);const n=new Date(e.data("target")).getTime(),o=e.data("expiry")||{},a=(e.data("units")||"days,hours,minutes,seconds").split(","),i=2*Math.PI*44;function r(){const t=Date.now(),r=Math.max(0,n-t);if(r<=0)return void function(){clearInterval(d);const t=o.action||"none";"message"===t?(e.find(".nfa-countdown__block, .nfa-countdown__sep").hide(),e.find(".nfa-countdown__expiry").show()):"hide"===t?e.hide():"redirect"===t&&o.redirect&&(window.location.href=o.redirect)}();const s=Math.floor(r/1e3),c={days:Math.floor(s/86400),hours:Math.floor(s%86400/3600),minutes:Math.floor(s%3600/60),seconds:s%60};a.forEach(function(t){e.find('[data-digit="'+t+'"]').text(String(c[t]).padStart(2,"0"));const n=e.find('[data-unit="'+t+'"] .nfa-countdown__progress');if(n.length){const e=parseInt(n.data("max"),10)||60,o=i*(1-c[t]/e);n.attr("stroke-dashoffset",o)}})}r();const d=setInterval(r,1e3)})},r=()=>{document.querySelectorAll("[data-nfa-tooltip]").forEach(t=>{if(t._nfaTooltipBound)return;t._nfaTooltipBound=!0;const e=t.getAttribute("data-nfa-tooltip"),n=t.getAttribute("data-nfa-tooltip-pos")||"top",o=t.getAttribute("data-nfa-tooltip-trigger")||"hover",a="0"!==t.getAttribute("data-nfa-tooltip-arrow"),i=parseInt(t.getAttribute("data-nfa-tooltip-duration"),10)||250,r=document.createElement("div");function d(){!function(){const e=t.getBoundingClientRect(),o=r.getBoundingClientRect(),a=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft;let d,s;switch(n){case"bottom":d=e.bottom+a+8,s=e.left+i+e.width/2-o.width/2;break;case"left":d=e.top+a+e.height/2-o.height/2,s=e.left+i-o.width-8;break;case"right":d=e.top+a+e.height/2-o.height/2,s=e.right+i+8;break;default:d=e.top+a-o.height-8,s=e.left+i+e.width/2-o.width/2}r.style.top=d+"px",r.style.left=s+"px"}(),r.classList.add("nfa-tooltip--visible")}function s(){r.classList.remove("nfa-tooltip--visible")}r.className="nfa-tooltip nfa-tooltip--"+n,a||r.classList.add("nfa-tooltip--no-arrow"),r.textContent=e,r.style.transitionDuration=i+"ms",r.setAttribute("role","tooltip"),r.id="nfa-tooltip-"+Math.random().toString(36).substr(2,9),t.setAttribute("aria-describedby",r.id),t.style.position=t.style.position||"relative",document.body.appendChild(r),"click"===o?(t.addEventListener("click",t=>{t.preventDefault(),r.classList.contains("nfa-tooltip--visible")?s():d()}),document.addEventListener("click",e=>{t.contains(e.target)||r.contains(e.target)||s()})):(t.addEventListener("mouseenter",d),t.addEventListener("mouseleave",s),t.addEventListener("focusin",d),t.addEventListener("focusout",s))})};t(window).on("elementor/frontend/init",()=>{window.elementorFrontend&&elementorFrontend.hooks&&(elementorFrontend.hooks.addAction("frontend/element_ready/nfa-testimonial-grid.default",e),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-logo-grid.default",e),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-showcase-carousel.default",n),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-content-tabs.default",o),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-image-comparison.default",a),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-countdown-timer.default",i),elementorFrontend.hooks.addAction("frontend/element_ready/global",()=>{r(),document.querySelectorAll("[data-nfa-wrapper-link]").forEach(t=>{if(t._nfaWrapperLinkBound)return;t._nfaWrapperLinkBound=!0;const e=t.getAttribute("data-nfa-wrapper-link"),n="1"===t.getAttribute("data-nfa-link-external"),o="1"===t.getAttribute("data-nfa-link-nofollow");e&&(t.addEventListener("click",t=>{const a=t.target.tagName.toLowerCase();if("a"!==a&&"button"!==a&&"input"!==a&&"textarea"!==a&&"select"!==a)if(n){const t=window.open(e,"_blank");t&&o&&(t.opener=null)}else window.location.href=e}),t.addEventListener("keydown",e=>{"Enter"===e.key&&t.click()}))})}))})}(jQuery);1 !function(e){"use strict";const t=t=>{t.find(".nfa-slider").each(function(){const t=e(this),n=t.find(".nfa-slider__track").get(0);if(!n)return;const a=Math.max(1,Math.min(6,parseInt(t.data("slider-per-view"),10)||3)),o=Math.max(0,parseInt(t.data("slider-gap"),10)||20),i=Array.from(n.children),r=()=>{n.style.gap=o+"px";const e="calc((100% - "+o*(a-1)+"px) / "+a+")";i.forEach(t=>{t.style.flex="0 0 "+e})};if(r(),t.data("slider-bound"))return;let s;t.data("slider-bound",!0),e(window).on("resize.nfaSlider",()=>{clearTimeout(s),s=setTimeout(r,150)}),t.find(".nfa-slider__btn--prev").on("click",()=>{n.scrollBy({left:-n.clientWidth,behavior:"smooth"})}),t.find(".nfa-slider__btn--next").on("click",()=>{n.scrollBy({left:n.clientWidth,behavior:"smooth"})})})},n=t=>{const n=t.find(".nfa-showcase");n.length&&n.each(function(){const t=e(this),n=t.find(".nfa-showcase__track").get(0),a=t.find(".nfa-showcase__dots"),o=Array.from(n.children),i=o.length;if(!n||0===i)return;if(t.data("showcase-bound"))return;t.data("showcase-bound",!0);const r=Math.max(1,parseInt(t.data("per-view"),10)||3),s=Math.max(1,parseInt(t.data("per-view-tablet"),10)||2),d=Math.max(1,parseInt(t.data("per-view-mobile"),10)||1),f=Math.max(0,parseInt(t.data("gap"),10)||20),l="yes"===t.data("autoplay"),c=Math.max(1e3,parseInt(t.data("autoplay-speed"),10)||4e3),u="yes"===t.data("pause-on-hover");let m,h=0,p=null;function _(){const e=window.innerWidth;return e<=767?d:e<=1024?s:r}function b(){return Math.max(0,i-_())}function g(){const t=_(),i="calc((100% - "+f*(t-1)+"px) / "+t+")";if(o.forEach(function(e){e.style.flex="0 0 "+i}),o[0]){const e=o[0].getBoundingClientRect().width+f;n.style.transform="translateX(-"+h*e+"px)"}!function(){if(!a.length)return;const t=b()+1;if(a.children().length!==t){a.empty();for(var n=0;n<t;n++)a.append('<button class="nfa-showcase__dot" data-index="'+n+'" aria-label="Slide '+(n+1)+'"></button>');a.find(".nfa-showcase__dot").on("click",function(){h=parseInt(e(this).data("index"),10),h=Math.min(h,b()),g(),y()})}a.find(".nfa-showcase__dot").removeClass("nfa-showcase__dot--active"),a.find(".nfa-showcase__dot").eq(h).addClass("nfa-showcase__dot--active")}()}function v(){h=h>=b()?0:h+1,g()}function w(){l&&(k(),p=setInterval(v,c))}function k(){p&&(clearInterval(p),p=null)}function y(){l&&(k(),w())}t.find(".nfa-showcase__arrow--prev").on("click",function(){h=h<=0?b():h-1,g(),y()}),t.find(".nfa-showcase__arrow--next").on("click",function(){v(),y()}),u&&l&&(t.on("mouseenter",k),t.on("mouseleave",w)),e(window).on("resize.nfaShowcaseCarousel",function(){clearTimeout(m),m=setTimeout(function(){h=Math.min(h,b()),g()},150)}),g(),w()})},a=t=>{const n=t.find("[data-tabs]");n.length&&n.each(function(){const t=e(this);if(t.data("tabs-bound"))return;t.data("tabs-bound",!0);const n=t.find(".nfa-tabs__btn"),a=t.find(".nfa-tabs__panel");n.on("click",function(){const o=e(this),i=o.attr("aria-controls");n.removeClass("nfa-tabs__btn--active").attr("aria-selected","false"),o.addClass("nfa-tabs__btn--active").attr("aria-selected","true"),a.removeClass("nfa-tabs__panel--active").attr("hidden",!0),t.find("#"+i).addClass("nfa-tabs__panel--active").removeAttr("hidden")})})},o=t=>{const n=t.find("[data-compare]");n.length&&n.each(function(){const t=this,n=e(t);if(n.data("compare-bound"))return;n.data("compare-bound",!0);const a="horizontal"===(n.data("orientation")||"horizontal"),o=n.find(".nfa-compare__before"),i=n.find(".nfa-compare__slider");let r=!1;function s(e){e=Math.max(0,Math.min(100,e)),a?(o.css("clip-path","inset(0 "+(100-e)+"% 0 0)"),i.css("left",e+"%")):(o.css("clip-path","inset(0 0 "+(100-e)+"% 0)"),i.css("top",e+"%"))}function d(e){const n=t.getBoundingClientRect(),o=e.touches?e.touches[0].clientX:e.clientX,i=e.touches?e.touches[0].clientY:e.clientY;return a?(o-n.left)/n.width*100:(i-n.top)/n.height*100}function f(e){r&&(e.preventDefault(),s(d(e)))}function l(){r=!1,e(document).off("mousemove.nfaCompare touchmove.nfaCompare"),e(document).off("mouseup.nfaCompare touchend.nfaCompare")}n.on("mousedown touchstart",function(t){r=!0,s(d(t)),e(document).on("mousemove.nfaCompare touchmove.nfaCompare",f),e(document).on("mouseup.nfaCompare touchend.nfaCompare",l)})})},i=t=>{const n=t.find("[data-countdown]");n.length&&n.each(function(){const t=e(this);if(t.data("countdown-bound"))return;t.data("countdown-bound",!0);const n=new Date(t.data("target")).getTime(),a=t.data("expiry")||{},o=(t.data("units")||"days,hours,minutes,seconds").split(","),i=2*Math.PI*44;function r(){const e=Date.now(),r=Math.max(0,n-e);if(r<=0)return void function(){clearInterval(s);const e=a.action||"none";"message"===e?(t.find(".nfa-countdown__block, .nfa-countdown__sep").hide(),t.find(".nfa-countdown__expiry").show()):"hide"===e?t.hide():"redirect"===e&&a.redirect&&(window.location.href=a.redirect)}();const d=Math.floor(r/1e3),f={days:Math.floor(d/86400),hours:Math.floor(d%86400/3600),minutes:Math.floor(d%3600/60),seconds:d%60};o.forEach(function(e){t.find('[data-digit="'+e+'"]').text(String(f[e]).padStart(2,"0"));const n=t.find('[data-unit="'+e+'"] .nfa-countdown__progress');if(n.length){const t=parseInt(n.data("max"),10)||60,a=i*(1-f[e]/t);n.attr("stroke-dashoffset",a)}})}r();const s=setInterval(r,1e3)})},r=()=>{document.querySelectorAll("[data-nfa-tooltip]").forEach(e=>{if(e._nfaTooltipBound)return;e._nfaTooltipBound=!0;const t=e.getAttribute("data-nfa-tooltip"),n=e.getAttribute("data-nfa-tooltip-pos")||"top",a=e.getAttribute("data-nfa-tooltip-trigger")||"hover",o="0"!==e.getAttribute("data-nfa-tooltip-arrow"),i=parseInt(e.getAttribute("data-nfa-tooltip-duration"),10)||250,r=document.createElement("div");function s(){!function(){const t=e.getBoundingClientRect(),a=r.getBoundingClientRect(),o=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft;let s,d;switch(n){case"bottom":s=t.bottom+o+8,d=t.left+i+t.width/2-a.width/2;break;case"left":s=t.top+o+t.height/2-a.height/2,d=t.left+i-a.width-8;break;case"right":s=t.top+o+t.height/2-a.height/2,d=t.right+i+8;break;default:s=t.top+o-a.height-8,d=t.left+i+t.width/2-a.width/2}r.style.top=s+"px",r.style.left=d+"px"}(),r.classList.add("nfa-tooltip--visible")}function d(){r.classList.remove("nfa-tooltip--visible")}r.className="nfa-tooltip nfa-tooltip--"+n,o||r.classList.add("nfa-tooltip--no-arrow"),r.textContent=t,r.style.transitionDuration=i+"ms",r.setAttribute("role","tooltip"),r.id="nfa-tooltip-"+Math.random().toString(36).substr(2,9),e.setAttribute("aria-describedby",r.id),e.style.position=e.style.position||"relative",document.body.appendChild(r),"click"===a?(e.addEventListener("click",e=>{e.preventDefault(),r.classList.contains("nfa-tooltip--visible")?d():s()}),document.addEventListener("click",t=>{e.contains(t.target)||r.contains(t.target)||d()})):(e.addEventListener("mouseenter",s),e.addEventListener("mouseleave",d),e.addEventListener("focusin",s),e.addEventListener("focusout",d))})},s=t=>{t.find(".nfa-hamburger").each(function(){const t=e(this);if(t.data("nfa-hm-bound"))return;t.data("nfa-hm-bound",!0);const n=t.find(".nfa-hamburger__toggle"),a=t.find(".nfa-hamburger__panel"),o=t.find(".nfa-hamburger__overlay"),i=t.find(".nfa-hamburger__close"),r=1===t.data("close-on-link")||"1"===t.data("close-on-link"),s=1===t.data("close-on-esc")||"1"===t.data("close-on-esc");function d(){t.removeClass("nfa-hamburger--open"),n.attr("aria-expanded","false"),a.attr("aria-hidden","true"),n.focus()}n.on("click",function(e){e.preventDefault(),t.hasClass("nfa-hamburger--open")?d():(t.addClass("nfa-hamburger--open"),n.attr("aria-expanded","true"),a.attr("aria-hidden","false"),a.find("a, button").first().focus())}),i.on("click",d),o.on("click",d),s&&e(document).on("keydown",function(e){"Escape"===e.key&&t.hasClass("nfa-hamburger--open")&&d()}),r&&a.on("click",".nfa-hamburger__link, .nfa-hamburger__sub-link",function(){const t=e(this).attr("href");t&&"#"!==t&&d()}),t.find(".nfa-hamburger__item--has-sub > .nfa-hamburger__link").on("click",function(t){"#"===e(this).attr("href")&&t.preventDefault(),e(this).parent().toggleClass("nfa-hamburger__item--sub-open")})})},d=t=>{t.find(".nfa-form").each(function(){const t=e(this);if(t.data("nfa-form-bound"))return;t.data("nfa-form-bound",!0);const n=t.data("nfa-form");if(!n)return;const a=t.find(".nfa-form__el"),o=t.find(".nfa-form__submit"),i=t.find(".nfa-form__submit-text"),r=t.find(".nfa-form__spinner"),s=t.find(".nfa-form__msg");function d(t){const o=e(t),i=o.closest(".nfa-form__col").find(".nfa-form__field-error");let r=!0,s="";if(t.required)if("checkbox"===t.type){const e=t.name;a.find('input[name="'+e+'"]:checked').length||(r=!1,s=n.requiredMsg||"This field is required.")}else t.value.trim()||(r=!1,s=n.requiredMsg||"This field is required.");if(r&&t.value.trim()&&("email"!==t.type||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.value)||(r=!1,s="Please enter a valid email address."),"url"!==t.type||/^https?:\/\/.+/.test(t.value)||(r=!1,s="Please enter a valid URL."),"tel"!==t.type||/^[\d\s+\-().]+$/.test(t.value)||(r=!1,s="Please enter a valid phone number."),"file"===t.type)){const e=parseFloat(o.data("max-size")||5);t.files[0]&&t.files[0].size>1024*e*1024&&(r=!1,s="File exceeds "+e+"MB limit.")}return r?(o.removeClass("nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid"),i.text("")):(o.addClass("nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid"),i.text(s)),r}a.find("input, textarea, select").on("blur change",function(){d(this)}),a.on("submit",function(t){t.preventDefault();let f=!0;if(a.find("input[required], textarea[required], select[required]").each(function(){d(this)||(f=!1)}),!f)return void a.find(".nfa-form__input--invalid, .nfa-form__select--invalid, .nfa-form__textarea--invalid").first().focus();const l=[],c={};a.find("[data-label]").each(function(){const t=e(this),n=t.data("label"),o=t.attr("type")||this.tagName.toLowerCase();if("checkbox"!==o){if("radio"!==o)"file"!==o?l.push({label:n,value:t.val()||""}):l.push({label:n,value:this.files[0]?this.files[0].name:""});else if(!c[n]){c[n]=!0;const e=a.find('input[data-label="'+n+'"]:checked').val()||"";l.push({label:n,value:e})}}else if(!c[n]){c[n]=!0;const t=[];a.find('input[data-label="'+n+'"]:checked').each(function(){t.push(e(this).val())}),l.push({label:n,value:t})}}),o.prop("disabled",!0),i.css("opacity","0.5"),r.show(),s.hide(),e.ajax({url:n.ajaxUrl,type:"POST",data:{action:"nfa_form_submit",nonce:n.nonce,form_name:n.formName,action_save:n.actionSave?"1":"",action_email:n.actionEmail?"1":"",email_to:n.emailTo,email_subject:n.emailSubject,email_from_name:n.emailFromName,email_reply_to:n.emailReplyTo,page_url:window.location.href,fields:JSON.stringify(l)},success:function(e){o.prop("disabled",!1),i.css("opacity","1"),r.hide(),e.success?(s.removeClass("nfa-form__msg--error").addClass("nfa-form__msg--success").text(n.successMessage||e.data.message).show(),a[0].reset(),a.find(".nfa-form__field-error").text(""),n.actionRedirect&&n.redirectUrl&&setTimeout(function(){window.location.href=n.redirectUrl},1e3)):s.removeClass("nfa-form__msg--success").addClass("nfa-form__msg--error").text(n.errorMessage||e.data.message||"Error").show()},error:function(){o.prop("disabled",!1),i.css("opacity","1"),r.hide(),s.removeClass("nfa-form__msg--success").addClass("nfa-form__msg--error").text(n.errorMessage||"Network error. Please try again.").show()}})})})};e(window).on("elementor/frontend/init",()=>{window.elementorFrontend&&elementorFrontend.hooks&&(elementorFrontend.hooks.addAction("frontend/element_ready/nfa-testimonial-grid.default",t),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-logo-grid.default",t),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-showcase-carousel.default",n),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-content-tabs.default",a),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-image-comparison.default",o),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-countdown-timer.default",i),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-hamburger-menu.default",s),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-advanced-form.default",d),elementorFrontend.hooks.addAction("frontend/element_ready/global",()=>{r(),document.querySelectorAll("[data-nfa-wrapper-link]").forEach(e=>{if(e._nfaWrapperLinkBound)return;e._nfaWrapperLinkBound=!0;const t=e.getAttribute("data-nfa-wrapper-link"),n="1"===e.getAttribute("data-nfa-link-external"),a="1"===e.getAttribute("data-nfa-link-nofollow");t&&(e.addEventListener("click",e=>{const o=e.target.tagName.toLowerCase();if("a"!==o&&"button"!==o&&"input"!==o&&"textarea"!==o&&"select"!==o)if(n){const e=window.open(t,"_blank");e&&a&&(e.opener=null)}else window.location.href=t}),e.addEventListener("keydown",t=>{"Enter"===t.key&&e.click()}))})}))})}(jQuery); -
nebula-forge-addons-for-elementor/tags/0.7.0/includes/Admin/Admin_Manager.php
r3462573 r3462588 24 24 public const MENU_SLUG_FONTS = 'nebula-forge-addon-fonts'; 25 25 public const MENU_SLUG_CHANGELOG = 'nebula-forge-addon-changelog'; 26 public const MENU_SLUG_SUBMISSIONS = 'nebula-forge-addon-submissions'; 26 27 27 28 public const OPTION_ACTIVATION_REDIRECT = 'nebula_forge_addon_activation_redirect'; … … 35 36 private ?Changelog_Page $changelog_page = null; 36 37 private ?Custom_Fonts_Page $fonts_page = null; 38 private ?Submissions_Page $submissions_page = null; 37 39 38 40 /** … … 57 59 $this->changelog_page = new Changelog_Page(); 58 60 $this->fonts_page = new Custom_Fonts_Page(); 61 $this->submissions_page = new Submissions_Page(); 59 62 } 60 63 … … 128 131 add_submenu_page( 129 132 self::MENU_SLUG_WELCOME, 133 esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 134 esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 135 'manage_options', 136 self::MENU_SLUG_SUBMISSIONS, 137 [$this->submissions_page, 'render'] 138 ); 139 140 add_submenu_page( 141 self::MENU_SLUG_WELCOME, 130 142 esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), 131 143 esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), -
nebula-forge-addons-for-elementor/tags/0.7.0/includes/Admin/Ui_Helper.php
r3462573 r3462588 40 40 'icon' => 'dashicons-editor-textcolor', 41 41 ], 42 Admin_Manager::MENU_SLUG_SUBMISSIONS => [ 43 'label' => esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 44 'icon' => 'dashicons-email-alt', 45 ], 42 46 Admin_Manager::MENU_SLUG_CHANGELOG => [ 43 47 'label' => esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), -
nebula-forge-addons-for-elementor/tags/0.7.0/includes/Admin/Widget_Registry.php
r3462552 r3462588 200 200 'icon' => 'eicon-countdown', 201 201 ], 202 'hamburger_menu' => [ 203 'label' => __('Hamburger Menu', 'nebula-forge-addons-for-elementor'), 204 'description' => __('Off-canvas mobile navigation with slide panel, WP menus or custom items, and submenu support.', 'nebula-forge-addons-for-elementor'), 205 'tooltip' => __('Add a responsive hamburger menu with off-canvas navigation, ideal for mobile-first designs.', 'nebula-forge-addons-for-elementor'), 206 'badge' => __('MENU', 'nebula-forge-addons-for-elementor'), 207 'badge_color' => '#8b5cf6', 208 'category' => 'layout', 209 'class' => Widgets\Hamburger_Menu_Widget::class, 210 'icon' => 'eicon-menu-bar', 211 ], 212 'advanced_form' => [ 213 'label' => __('Advanced Form', 'nebula-forge-addons-for-elementor'), 214 'description' => __('Drag-and-drop form builder with email notifications, database submissions, and field validation.', 'nebula-forge-addons-for-elementor'), 215 'tooltip' => __('Build contact, lead, or registration forms with AJAX submission, validation, and saved entries.', 'nebula-forge-addons-for-elementor'), 216 'badge' => __('FORM', 'nebula-forge-addons-for-elementor'), 217 'badge_color' => '#10b981', 218 'category' => 'conversion', 219 'class' => Widgets\Advanced_Form_Widget::class, 220 'icon' => 'eicon-form-horizontal', 221 ], 202 222 ]; 203 223 } -
nebula-forge-addons-for-elementor/tags/0.7.0/includes/Plugin.php
r3462573 r3462588 23 23 use NebulaForgeAddon\Extensions\Tooltip_Extension; 24 24 use NebulaForgeAddon\Extensions\Wrapper_Link; 25 use NebulaForgeAddon\Extensions\Form_Handler; 25 26 26 27 /** … … 174 175 Wrapper_Link::init(); 175 176 } 177 178 // Form handler is always active (not a toggle-able extension). 179 Form_Handler::init(); 176 180 } 177 181 -
nebula-forge-addons-for-elementor/tags/0.7.0/nebula-forge-addons-for-elementor.php
r3462573 r3462588 4 4 * Plugin URI: https://wordpress.org/plugins/nebula-forge-addons-for-elementor/ 5 5 * Description: Professional Elementor widgets for any WordPress page — blogs, portfolios, landing pages, WooCommerce, and beyond. 6 * Version: 0. 6.06 * Version: 0.7.0 7 7 * Author: Zainaster 8 8 * Author URI: https://profiles.wordpress.org/shoaibzain/ … … 22 22 } 23 23 24 define('NEBULA_FORGE_ADDON_VERSION', '0. 6.0');24 define('NEBULA_FORGE_ADDON_VERSION', '0.7.0'); 25 25 define('NEBULA_FORGE_ADDON_FILE', __FILE__); 26 26 define('NEBULA_FORGE_ADDON_BASENAME', plugin_basename(__FILE__)); -
nebula-forge-addons-for-elementor/tags/0.7.0/readme.txt
r3462573 r3462588 5 5 Tested up to: 6.9.1 6 6 Requires PHP: 7.4 7 Stable tag: 0. 6.07 Stable tag: 0.7.0 8 8 Requires Plugins: elementor 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html 11 11 12 1 7 free Elementor widgets + 4 pro extensions — hero sections, pricing tables, testimonials, FAQs, countdown timers, image comparisons, content tabs, team profiles, CTA banners, display conditions, custom fonts, widget tooltips, wrapper links & more. No Elementor Pro required.12 19 free Elementor widgets + 4 pro extensions — hero sections, pricing tables, testimonials, FAQs, countdown timers, image comparisons, content tabs, team profiles, CTA banners, hamburger menus, advanced forms with submissions, display conditions, custom fonts, widget tooltips, wrapper links & more. No Elementor Pro required. 13 13 14 14 == Description == 15 15 16 **Nebula Forge Addons for Elementor** is a free collection of 1 7 professionally designed Elementor widgets and 4 pro-level extensions. Create stunning hero sections, feature grids, pricing tables, testimonial sliders, FAQ accordions, stats counters, logo carousals, team member profiles, CTA banners, content tabs, image comparison sliders, countdown timers, and more— all without Elementor Pro.16 **Nebula Forge Addons for Elementor** is a free collection of 19 professionally designed Elementor widgets and 4 pro-level extensions. Create stunning hero sections, feature grids, pricing tables, testimonial sliders, FAQ accordions, stats counters, logo carousals, team member profiles, CTA banners, content tabs, image comparison sliders, countdown timers, hamburger menus, and advanced forms with saved submissions — all without Elementor Pro. 17 17 18 18 The plugin also includes powerful extensions that work across ALL Elementor elements: Display Conditions to show/hide content by user role, date, page type, browser, or device; Custom Fonts upload for use in Elementor typography controls; Widget Tooltips with hover/click triggers; and Wrapper Links to make any element fully clickable. … … 22 22 = Highlights = 23 23 * Built for the free Elementor plugin. No Elementor Pro required. 24 * 1 7 professional widgets for hero sections, feature lists, spotlight cards, stats grids, pricing tables, testimonials, FAQs, logo grids, steps, teams, CTAs, tabs, comparisons, and countdowns.24 * 19 professional widgets for hero sections, feature lists, spotlight cards, stats grids, pricing tables, testimonials, FAQs, logo grids, steps, teams, CTAs, tabs, comparisons, countdowns, hamburger menus, and advanced forms. 25 25 * 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links. 26 26 * Detailed style controls for typography, spacing, colors, borders, and hover states. … … 29 29 * Built with capability checks, nonces, and sanitized settings. 30 30 * Layout controls to switch between grid and slider displays. 31 * Custom font uploader with WOFF2, WOFF, and TTF support.31 * Form submission storage with admin list, filters, and single-entry detail view. 32 32 33 33 = Widgets = … … 51 51 * Image Comparison — interactive before/after image comparison slider with draggable handle, labels, and hover options. 52 52 * Countdown Timer — countdown to a target date with blocks, inline, or circle styles, labels, and expiry actions. 53 * Hamburger Menu — off-canvas mobile navigation with slide panel from left, right, or top, WP menus or custom items, submenu support, and three icon styles. 54 * Advanced Form — drag-and-drop form builder with 12 field types, AJAX submission, email notifications, database storage, and redirect actions. 53 55 54 56 = Pro Extensions = … … 96 98 = How do I use Display Conditions? = 97 99 Edit any Elementor element, go to the **Advanced** tab, and expand the **Display Conditions** section. Enable conditions and configure the rules. 100 101 = How do I view form submissions? = 102 Go to **Nebula Forge > Submissions** in wp-admin. You can filter by form name, view submission details, and bulk-delete entries. 98 103 99 104 = Will this slow down my site? = … … 123 128 124 129 == Changelog == 130 = 0.7.0 = 131 * Added Hamburger Menu widget — off-canvas mobile navigation with slide panel (left/right/top), WP nav menu or custom items, submenu accordion, three icon styles, overlay, close on link/ESC, and full style controls. 132 * Added Advanced Form widget — drag-and-drop form builder with 12 field types (text, email, tel, URL, number, textarea, select, radio, checkbox, date, file, hidden), per-field width, validation, AJAX submission, email notifications, database storage, and redirect actions. 133 * Added Form submission handler with rate limiting, nonce verification, and custom post type storage. 134 * Added Submissions admin page with list view, form name filter, pagination, bulk delete, single entry detail, and auto-read status marking. 135 * Added Submissions tab to admin navigation. 136 * Updated frontend CSS with hamburger menu panel animations, form field grid, validation states, and responsive breakpoints. 137 * Updated frontend JS with hamburger toggle/submenu accordion and form AJAX validation/submission handlers. 138 * Bumped total widget count from 17 to 19. 139 125 140 = 0.4.0 = 126 141 * Switched frontend styles from dark theme (CSS custom properties) to light-mode defaults for broader compatibility. … … 212 227 213 228 == Upgrade Notice == 229 = 0.7.0 = 230 2 new widgets: Hamburger Menu and Advanced Form with submission storage. Update recommended. 231 214 232 = 0.6.0 = 215 233 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links. Update recommended. -
nebula-forge-addons-for-elementor/trunk/assets/css/frontend.css
r3462573 r3462588 1939 1939 outline-offset: 2px; 1940 1940 } 1941 1942 /* ========================================================================== 1943 Hamburger Menu Widget 1944 ========================================================================== */ 1945 1946 .nfa-hamburger__toggle-wrap { 1947 display: flex; 1948 } 1949 1950 .nfa-hamburger__toggle { 1951 display: inline-flex; 1952 align-items: center; 1953 justify-content: center; 1954 border: none; 1955 cursor: pointer; 1956 line-height: 1; 1957 transition: background 0.2s ease, color 0.2s ease; 1958 } 1959 1960 /* Icon: Bars */ 1961 .nfa-hamburger__icon--bars { 1962 display: flex; 1963 flex-direction: column; 1964 gap: 4px; 1965 width: 1em; 1966 } 1967 1968 .nfa-hamburger__icon--bars span { 1969 display: block; 1970 height: 2px; 1971 background: currentColor; 1972 border-radius: 2px; 1973 transition: transform 0.3s ease, opacity 0.3s ease; 1974 } 1975 1976 /* Icon: Dots */ 1977 .nfa-hamburger__icon--dots { 1978 display: flex; 1979 flex-direction: column; 1980 gap: 4px; 1981 align-items: center; 1982 width: 1em; 1983 } 1984 1985 .nfa-hamburger__icon--dots span { 1986 display: block; 1987 width: 5px; 1988 height: 5px; 1989 background: currentColor; 1990 border-radius: 50%; 1991 } 1992 1993 /* Icon: Grid */ 1994 .nfa-hamburger__icon--grid { 1995 display: grid; 1996 grid-template-columns: repeat(2, 1fr); 1997 gap: 3px; 1998 width: 1em; 1999 } 2000 2001 .nfa-hamburger__icon--grid span { 2002 display: block; 2003 width: 7px; 2004 height: 7px; 2005 background: currentColor; 2006 border-radius: 2px; 2007 } 2008 2009 /* Overlay */ 2010 .nfa-hamburger__overlay { 2011 position: fixed; 2012 inset: 0; 2013 z-index: 99998; 2014 opacity: 0; 2015 visibility: hidden; 2016 transition: opacity 0.35s ease, visibility 0.35s ease; 2017 } 2018 2019 .nfa-hamburger--open .nfa-hamburger__overlay { 2020 opacity: 1; 2021 visibility: visible; 2022 } 2023 2024 /* Panel */ 2025 .nfa-hamburger__panel { 2026 position: fixed; 2027 z-index: 99999; 2028 background: #fff; 2029 overflow-y: auto; 2030 -webkit-overflow-scrolling: touch; 2031 transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.35s ease; 2032 visibility: hidden; 2033 } 2034 2035 .nfa-hamburger__panel--left { 2036 top: 0; 2037 left: 0; 2038 bottom: 0; 2039 transform: translateX(-100%); 2040 } 2041 2042 .nfa-hamburger__panel--right { 2043 top: 0; 2044 right: 0; 2045 bottom: 0; 2046 transform: translateX(100%); 2047 } 2048 2049 .nfa-hamburger__panel--top { 2050 top: 0; 2051 left: 0; 2052 right: 0; 2053 max-height: 80vh; 2054 transform: translateY(-100%); 2055 } 2056 2057 .nfa-hamburger--open .nfa-hamburger__panel { 2058 transform: translate(0); 2059 visibility: visible; 2060 } 2061 2062 /* Panel header */ 2063 .nfa-hamburger__panel-header { 2064 display: flex; 2065 align-items: center; 2066 justify-content: space-between; 2067 margin-bottom: 16px; 2068 } 2069 2070 .nfa-hamburger__logo { 2071 max-height: 40px; 2072 width: auto; 2073 } 2074 2075 .nfa-hamburger__close { 2076 background: none; 2077 border: none; 2078 font-size: 28px; 2079 cursor: pointer; 2080 line-height: 1; 2081 padding: 4px 8px; 2082 transition: color 0.2s ease; 2083 margin-left: auto; 2084 } 2085 2086 /* Menu list */ 2087 .nfa-hamburger__list { 2088 list-style: none; 2089 margin: 0; 2090 padding: 0; 2091 } 2092 2093 .nfa-hamburger__item--separated { 2094 border-bottom: 1px solid #e2e8f0; 2095 } 2096 2097 .nfa-hamburger__link { 2098 display: flex; 2099 align-items: center; 2100 gap: 10px; 2101 text-decoration: none; 2102 font-size: 15px; 2103 font-weight: 500; 2104 transition: color 0.2s ease; 2105 } 2106 2107 .nfa-hamburger__link-icon { 2108 flex-shrink: 0; 2109 font-size: 1.1em; 2110 } 2111 2112 .nfa-hamburger__arrow { 2113 margin-left: auto; 2114 font-size: 12px; 2115 transition: transform 0.25s ease; 2116 } 2117 2118 .nfa-hamburger__item--sub-open > .nfa-hamburger__link .nfa-hamburger__arrow { 2119 transform: rotate(180deg); 2120 } 2121 2122 /* Sub-menu */ 2123 .nfa-hamburger__sub-list { 2124 list-style: none; 2125 margin: 0; 2126 padding: 4px 0 4px 24px; 2127 display: none; 2128 } 2129 2130 .nfa-hamburger__item--sub-open > .nfa-hamburger__sub-list { 2131 display: block; 2132 } 2133 2134 .nfa-hamburger__sub-link { 2135 display: block; 2136 padding: 6px 0; 2137 text-decoration: none; 2138 font-size: 14px; 2139 transition: color 0.2s ease; 2140 } 2141 2142 /* ========================================================================== 2143 Advanced Form Widget 2144 ========================================================================== */ 2145 2146 .nfa-form__fields { 2147 display: flex; 2148 flex-wrap: wrap; 2149 gap: 16px; 2150 } 2151 2152 .nfa-form__col--100 { width: 100%; } 2153 .nfa-form__col--75 { width: calc(75% - 8px); } 2154 .nfa-form__col--66 { width: calc(66.666% - 8px); } 2155 .nfa-form__col--50 { width: calc(50% - 8px); } 2156 .nfa-form__col--33 { width: calc(33.333% - 8px); } 2157 .nfa-form__col--25 { width: calc(25% - 12px); } 2158 .nfa-form__col--hidden { display: none; } 2159 2160 .nfa-form__label { 2161 display: block; 2162 font-weight: 600; 2163 font-size: 13px; 2164 margin-bottom: 6px; 2165 } 2166 2167 .nfa-form__required { 2168 color: #ef4444; 2169 margin-left: 2px; 2170 } 2171 2172 .nfa-form__input, 2173 .nfa-form__select, 2174 .nfa-form__textarea { 2175 display: block; 2176 width: 100%; 2177 border: 1px solid #cbd5e1; 2178 font-size: 14px; 2179 line-height: 1.5; 2180 transition: border-color 0.2s ease, box-shadow 0.2s ease; 2181 outline: none; 2182 box-sizing: border-box; 2183 } 2184 2185 .nfa-form__input:focus, 2186 .nfa-form__select:focus, 2187 .nfa-form__textarea:focus { 2188 border-color: #6366f1; 2189 box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); 2190 } 2191 2192 .nfa-form__input--file { 2193 padding: 8px; 2194 border-style: dashed; 2195 } 2196 2197 .nfa-form__textarea { 2198 resize: vertical; 2199 min-height: 100px; 2200 } 2201 2202 .nfa-form__choice-group { 2203 display: flex; 2204 flex-wrap: wrap; 2205 gap: 12px; 2206 } 2207 2208 .nfa-form__choice { 2209 display: flex; 2210 align-items: center; 2211 gap: 6px; 2212 font-size: 14px; 2213 cursor: pointer; 2214 } 2215 2216 .nfa-form__choice input { 2217 accent-color: #6366f1; 2218 width: 16px; 2219 height: 16px; 2220 } 2221 2222 .nfa-form__field-error { 2223 display: block; 2224 font-size: 12px; 2225 color: #ef4444; 2226 min-height: 18px; 2227 margin-top: 4px; 2228 } 2229 2230 .nfa-form__actions { 2231 display: flex; 2232 margin-top: 20px; 2233 } 2234 2235 .nfa-form__submit { 2236 display: inline-flex; 2237 align-items: center; 2238 gap: 8px; 2239 border: none; 2240 font-weight: 600; 2241 cursor: pointer; 2242 transition: background 0.2s ease, transform 0.15s ease; 2243 } 2244 2245 .nfa-form__submit:hover { 2246 transform: translateY(-1px); 2247 } 2248 2249 .nfa-form__submit:active { 2250 transform: translateY(0); 2251 } 2252 2253 .nfa-form__submit:disabled { 2254 opacity: 0.6; 2255 cursor: not-allowed; 2256 transform: none; 2257 } 2258 2259 .nfa-form__spinner { 2260 display: inline-block; 2261 width: 16px; 2262 height: 16px; 2263 border: 2px solid rgba(255, 255, 255, 0.3); 2264 border-top-color: #fff; 2265 border-radius: 50%; 2266 animation: nfa-spin 0.6s linear infinite; 2267 } 2268 2269 @keyframes nfa-spin { 2270 to { transform: rotate(360deg); } 2271 } 2272 2273 .nfa-form__msg { 2274 padding: 14px 18px; 2275 border-radius: 8px; 2276 font-size: 14px; 2277 font-weight: 500; 2278 margin-top: 16px; 2279 } 2280 2281 .nfa-form__msg--success { 2282 background: #f0fdf4; 2283 color: #166534; 2284 border: 1px solid #bbf7d0; 2285 } 2286 2287 .nfa-form__msg--error { 2288 background: #fef2f2; 2289 color: #991b1b; 2290 border: 1px solid #fecaca; 2291 } 2292 2293 .nfa-form__input--invalid, 2294 .nfa-form__select--invalid, 2295 .nfa-form__textarea--invalid { 2296 border-color: #ef4444 !important; 2297 box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1) !important; 2298 } 2299 2300 @media (max-width: 767px) { 2301 .nfa-form__col--75, 2302 .nfa-form__col--66, 2303 .nfa-form__col--50, 2304 .nfa-form__col--33, 2305 .nfa-form__col--25 { 2306 width: 100%; 2307 } 2308 } 2309 2310 /* Submissions admin badges */ 2311 .nfa-badge { 2312 display: inline-block; 2313 padding: 2px 10px; 2314 border-radius: 999px; 2315 font-size: 11px; 2316 font-weight: 600; 2317 text-transform: uppercase; 2318 letter-spacing: 0.04em; 2319 } 2320 2321 .nfa-badge--blue { 2322 background: #eef2ff; 2323 color: #4f46e5; 2324 } 2325 2326 .nfa-badge--gray { 2327 background: #f1f5f9; 2328 color: #64748b; 2329 } 2330 2331 .nfa-sub-row--unread td { 2332 background: #fafbff; 2333 font-weight: 500; 2334 } -
nebula-forge-addons-for-elementor/trunk/assets/css/frontend.min.css
r3462573 r3462588 1 .nfa-hero-cta{color:#131313;display:flex;flex-direction:column;gap:24px;text-decoration:none}.nfa-hero-cta__kicker{letter-spacing:.2em;text-transform:uppercase;font-size:.85rem;opacity:.7;margin:0;position:relative}.nfa-hero-cta__headline{font-size:clamp(2.5rem, 4vw, 3.5rem);line-height:1.1;margin:0;position:relative;letter-spacing:-.02em}.nfa-hero-cta__body{font-size:1.1rem;max-width:640px;margin:0;opacity:.85;line-height:1.7;position:relative}.nfa-hero-cta__button{align-self:flex-start;padding:14px 32px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);position:relative;display:inline-flex;align-items:center;gap:8px}.nfa-hero-cta__button:focus-visible,.nfa-hero-cta__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-hero-cta__button:active{transform:translateY(-1px) scale(.99)}.nfa-feature-list{display:flex;flex-direction:column;gap:24px}.nfa-feature-list__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-feature-list__item{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:flex-start;padding:20px;border-radius:16px;background:#fff;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-feature-list__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-feature-list__icon-wrap{display:inline-flex;justify-content:center;align-items:center;padding:10px;border-radius:12px;background:rgba(14,165,233,.08);transition:background .2s ease}.nfa-feature-list__item:hover .nfa-feature-list__icon-wrap{background:rgba(14,165,233,.08)}.nfa-feature-list__icon{color:#0ea5e9;font-size:24px;line-height:1}.nfa-feature-list__title{margin:0 0 4px 0;color:#131313;font-size:1.05rem;font-weight:600}.nfa-feature-list__text{margin:0;color:rgba(19,19,19,.55);font-size:.95rem;line-height:1.6}.nfa-spotlight-card{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:32px;align-items:center}.nfa-spotlight-card__content{display:flex;flex-direction:column;gap:14px}.nfa-spotlight-card__eyebrow{margin:0;letter-spacing:.15em;text-transform:uppercase;color:#0ea5e9;font-size:.78rem;font-weight:600}.nfa-spotlight-card__title{margin:0;color:#131313;font-size:clamp(1.9rem, 3vw, 2.4rem);letter-spacing:-.01em}.nfa-spotlight-card__description{margin:0;color:rgba(19,19,19,.55);font-size:1.02rem;line-height:1.7}.nfa-spotlight-card__meta{margin:0;color:rgba(19,19,19,.4);font-size:.95rem}.nfa-spotlight-card__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-spotlight-card__button:focus-visible,.nfa-spotlight-card__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-spotlight-card__media img{width:100%;height:auto;border-radius:20px;display:block;transition:transform .3s ease}.nfa-spotlight-card:hover .nfa-spotlight-card__media img{transform:scale(1.02)}.nfa-stats-grid{display:flex;flex-direction:column;gap:28px}.nfa-stats-grid__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-stats-grid__item{padding:24px;border-radius:18px;background:#fff;border:1px solid rgba(19,19,19,.1);display:grid;row-gap:8px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-stats-grid__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-stats-grid__value{color:#131313;font-weight:700;font-size:2rem;line-height:1.2;letter-spacing:-.02em}.nfa-stats-grid__label{color:rgba(19,19,19,.55);font-weight:600;font-size:1rem}.nfa-stats-grid__helper{color:rgba(19,19,19,.4);font-size:.9rem;line-height:1.5}.nfa-pricing-table{display:flex;flex-direction:column;gap:20px;color:#131313;position:relative;transition:transform .3s ease,box-shadow .3s ease}.nfa-pricing-table:hover{transform:translateY(-4px)}.nfa-pricing-table__badge{position:absolute;top:18px;right:18px;background:#ff6b35;color:#0f172a;padding:6px 14px;border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 4px 12px rgba(255,107,53,.15)}.nfa-pricing-table__label{margin:0 0 6px 0;font-size:1.4rem}.nfa-pricing-table__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6}.nfa-pricing-table__price{display:flex;align-items:baseline;gap:8px}.nfa-pricing-table__amount{font-size:2.6rem;font-weight:700;line-height:1;letter-spacing:-.02em}.nfa-pricing-table__suffix{font-size:1rem;color:rgba(19,19,19,.4)}.nfa-pricing-table__features{list-style:none;padding:0;margin:0;display:grid;gap:12px}.nfa-pricing-table__features li{display:flex;align-items:flex-start;gap:12px;color:rgba(19,19,19,.55);line-height:1.5}.nfa-pricing-table__features li::before{content:'\2713';color:#0ea5e9;font-weight:700;font-size:.9rem;margin-top:1px;flex-shrink:0}.nfa-pricing-table__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-pricing-table__button:focus-visible,.nfa-pricing-table__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-testimonials{display:flex;flex-direction:column;gap:24px}.nfa-testimonials__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.nfa-testimonials__card{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:16px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-testimonials__card:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-testimonials__avatar img{width:48px;height:48px;border-radius:50%;object-fit:cover;display:block;border:2px solid rgba(19,19,19,.1)}.nfa-testimonials__quote{margin:0;color:rgba(19,19,19,.55);font-size:1rem;line-height:1.7;font-style:normal}blockquote.nfa-testimonials__quote{border:0;padding:0}.nfa-testimonials__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto}.nfa-testimonials__name{font-weight:600;color:#131313}.nfa-testimonials__role{color:rgba(19,19,19,.4);font-size:.9rem}.nfa-testimonials__rating{font-size:.9rem;letter-spacing:1px;color:#fbbf24}.nfa-logo-grid{display:flex;flex-direction:column;gap:24px}.nfa-logo-grid__items{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;align-items:center}.nfa-logo-grid__logo{display:flex;align-items:center;justify-content:center;padding:20px;border-radius:14px;background:#fff;border:1px solid rgba(19,19,19,.1);min-height:86px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-logo-grid__logo:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-3px)}.nfa-logo-grid__logo img{max-width:140px;width:100%;height:auto;opacity:.7;transition:opacity .2s ease,filter .2s ease;filter:grayscale(20%)}.nfa-logo-grid__logo:hover img{opacity:1;filter:grayscale(0%)}.nfa-logo-grid__text{color:#131313;font-weight:600}.nfa-faq{display:flex;flex-direction:column;gap:24px}.nfa-faq__items{display:grid;gap:12px}.nfa-faq__item{background:#fff;border-radius:16px;padding:20px 22px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease}.nfa-faq__item:hover{border-color:#0ea5e9}.nfa-faq__item[open]{background:#f8f9fa;border-color:#0ea5e9}.nfa-faq__question{cursor:pointer;font-weight:600;color:#131313;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:14px;user-select:none}.nfa-faq__question::after{content:'+';font-size:1.2rem;color:#0ea5e9;transition:transform .2s ease;flex-shrink:0;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(14,165,233,.08)}.nfa-faq__item[open] .nfa-faq__question::after{content:'\2212';transform:rotate(180deg)}.nfa-faq__question::-webkit-details-marker{display:none}.nfa-faq__answer{margin-top:14px;color:rgba(19,19,19,.55);line-height:1.7}.nfa-steps{display:flex;flex-direction:column;gap:24px}.nfa-steps__list{display:grid;gap:20px}.nfa-steps--vertical .nfa-steps__list{grid-template-columns:1fr}.nfa-steps--horizontal .nfa-steps__list{grid-template-columns:repeat(3,minmax(0,1fr))}.nfa-steps__item{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:10px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease;position:relative}.nfa-steps__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-steps__label{text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;color:#0ea5e9;font-weight:700}.nfa-steps__title{margin:0;font-size:1.1rem;color:#131313;font-weight:600}.nfa-steps__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6;font-size:.95rem}.nfa-slider{position:relative}.nfa-slider__track{display:flex;gap:20px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-bottom:6px;scrollbar-width:none;-ms-overflow-style:none}.nfa-slider__track::-webkit-scrollbar{display:none}.nfa-slider__item{flex:0 0 100%;scroll-snap-align:start}.nfa-slider__btn{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:999px;border:1px solid rgba(19,19,19,.1);background:#131313;color:#131313;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 8px 20px rgb(15 23 42 / .3);transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease;z-index:2}.nfa-slider__btn--prev{left:-16px}.nfa-slider__btn--next{right:-16px}.nfa-slider__btn:hover{transform:translateY(-50%) scale(1.08);background:rgba(255,255,255,.08);border-color:#0ea5e9}.nfa-slider__btn:focus-visible{outline:0;box-shadow:0 0 0 3px rgba(125,211,252,.3)}.nfa-showcase{position:relative}.nfa-showcase__nav{display:flex;gap:12px;margin-bottom:24px;justify-content:flex-end}.nfa-showcase__arrow{width:48px;height:48px;border-radius:50%;border:1.5px solid rgba(19,19,19,.15);background:0 0;color:#fff;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.nfa-showcase__arrow:hover{background:#131313;color:#f4f4f4;border-color:#131313}.nfa-showcase__viewport{overflow:hidden}.nfa-showcase__track{display:flex;transition:transform .5s cubic-bezier(.25, .46, .45, .94);will-change:transform}.nfa-showcase__card{flex-shrink:0;position:relative;height:420px;border-radius:20px;overflow:hidden;transition:transform .35s ease;text-decoration:none;display:block}.nfa-showcase__card:hover{transform:translateY(-4px)}.nfa-showcase__img{position:absolute;inset:0;z-index:0}.nfa-showcase__img img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.nfa-showcase__card:hover .nfa-showcase__img img{transform:scale(1.08)}.nfa-showcase__card--overlay-dark .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(19,19,19,.92) 0,rgba(19,19,19,.5) 50%,rgba(19,19,19,.15) 100%);z-index:1}.nfa-showcase__card--overlay-light .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(255,255,255,.92) 0,rgba(255,255,255,.4) 50%,transparent 100%);z-index:1}.nfa-showcase__badge{position:absolute;top:20px;left:20px;background:rgba(244,244,244,.15);backdrop-filter:blur(10px);color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:2;border:1px solid rgba(244,244,244,.1)}.nfa-showcase__body{position:absolute;bottom:0;left:0;right:0;padding:32px 28px;z-index:2}.nfa-showcase__title{font-size:22px;font-weight:700;color:#f4f4f4;margin-bottom:12px}.nfa-showcase__desc{font-size:14px;color:rgba(244,244,244,.65);line-height:1.8;margin:0}.nfa-showcase__tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nfa-showcase__tag{font-size:11px;padding:4px 12px;border-radius:50px;border:1px solid rgba(244,244,244,.12);color:rgba(244,244,244,.6);letter-spacing:.3px}.nfa-showcase__dots{display:flex;justify-content:center;gap:8px;margin-top:24px}.nfa-showcase__dot{width:10px;height:10px;border-radius:50%;background:rgba(19,19,19,.2);border:none;cursor:pointer;padding:0;transition:background .3s ease,transform .3s ease}.nfa-showcase__dot--active{background:#131313;transform:scale(1.2)}.nfa-showcase__dot:hover:not(.nfa-showcase__dot--active){background:rgba(19,19,19,.4)}.nfa-areas__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:1/3}.nfa-areas__card{background:#fff;border-radius:18px;overflow:hidden;position:relative;transition:all .4s ease;display:block;text-decoration:none;color:inherit}a.nfa-areas__card:hover{text-decoration:none;color:inherit}.nfa-areas__card--shadow-sm{box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}.nfa-areas__card--shadow-md{box-shadow:0 4px 12px rgba(0,0,0,.08)}.nfa-areas__card--shadow-lg{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__card:hover{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__img{height:200px;overflow:hidden;position:relative}.nfa-areas__img img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}.nfa-areas__badge{position:absolute;top:16px;left:16px;background:#131313;color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:3}.nfa-areas__body{padding:24px}.nfa-areas__title{font-size:19px;font-weight:600;margin:0 0 8px;color:#131313}.nfa-areas__desc{font-size:14px;color:rgba(19,19,19,.55);line-height:1.7;margin:0}.nfa-areas__card--featured{position:relative}.nfa-areas__card--featured .nfa-areas__img{position:absolute;inset:0;height:100%;z-index:0}.nfa-areas__overlay{position:absolute;inset:0;z-index:1;pointer-events:none}.nfa-areas__card--featured .nfa-areas__body{position:absolute;bottom:0;left:0;right:0;z-index:2;padding:32px 28px}.nfa-areas__card--featured .nfa-areas__title{color:#f4f4f4;font-size:24px;margin-bottom:12px}.nfa-areas__card--featured .nfa-areas__desc{color:rgba(244,244,244,.65);font-size:14px;line-height:1.8}.nfa-areas__card--featured .nfa-areas__badge{background:rgba(244,244,244,.15);backdrop-filter:blur(10px);border:1px solid rgba(244,244,244,.1);z-index:2}.nfa-journey__steps{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:24px;position:relative}.nfa-journey__steps--line::before{content:'';position:absolute;top:36px;left:48px;right:48px;height:2px;background:linear-gradient(90deg,#131313,rgba(19,19,19,.08));z-index:0}.nfa-journey__step{text-align:center;position:relative;z-index:1}.nfa-journey__number{width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:2px solid #131313;background:#fff;color:#131313;font-size:22px;font-weight:700;margin:0 auto 20px;transition:all .3s ease}.nfa-journey__step:hover .nfa-journey__number{background:#131313;color:#f4f4f4;box-shadow:0 8px 24px rgba(19,19,19,.2);transform:scale(1.05)}.nfa-journey__step-title{margin:0 0 10px;font-size:16px;font-weight:600;color:#131313}.nfa-journey__step-description{margin:0;font-size:13px;line-height:1.7;color:rgba(19,19,19,.45)}@media (max-width:900px){.nfa-feature-list__items,.nfa-logo-grid__items,.nfa-stats-grid__items,.nfa-steps--horizontal .nfa-steps__list,.nfa-testimonials__grid{grid-template-columns:1fr}.nfa-journey__steps{grid-template-columns:repeat(2,minmax(0,1fr))}.nfa-journey__steps--line::before{display:none}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:auto}.nfa-areas__card--featured .nfa-areas__img{position:relative;inset:auto;height:200px}.nfa-areas__card--featured .nfa-areas__overlay{display:none}.nfa-areas__card--featured .nfa-areas__body{position:relative;bottom:auto;left:auto;right:auto;padding:24px}.nfa-areas .nfa-areas__card--featured .nfa-areas__title{color:#131313!important;font-size:19px!important;margin-bottom:8px}.nfa-areas .nfa-areas__card--featured .nfa-areas__desc{color:rgba(19,19,19,.55)!important;font-size:14px;line-height:1.7}.nfa-areas .nfa-areas__card--featured .nfa-areas__badge{background:#131313!important;color:#f4f4f4!important;backdrop-filter:none;border:none!important}}@media (max-width:640px){.nfa-journey__steps{grid-template-columns:1fr}.nfa-slider__btn--prev{left:-8px}.nfa-slider__btn--next{right:-8px}}.nfa-team__grid{display:grid;gap:24px;grid-template-columns:repeat(var(--nfa-team-cols,3),1fr)}.nfa-team__card{background:#fff;border-radius:16px;overflow:hidden;text-align:center;transition:box-shadow .3s ease,transform .25s ease;box-shadow:0 1px 4px rgba(0,0,0,.06)}.nfa-team__card:hover{box-shadow:0 8px 24px rgba(0,0,0,.1);transform:translateY(-4px)}.nfa-team__card--layout-left{display:flex;text-align:left}.nfa-team__card--layout-left .nfa-team__photo{flex:0 0 140px;height:auto}.nfa-team__photo{width:100%;height:220px;object-fit:cover;display:block}.nfa-team__card--layout-circle .nfa-team__photo{width:120px;height:120px;border-radius:50%;margin:24px auto 0}.nfa-team__body{padding:20px}.nfa-team__name{margin:0 0 4px;font-size:1.15em;font-weight:600;color:#131313}.nfa-team__role{font-size:.875em;color:rgba(19,19,19,.55);margin-bottom:10px}.nfa-team__bio{font-size:.9em;color:rgba(19,19,19,.7);line-height:1.6;margin-bottom:14px}.nfa-team__social{display:flex;gap:10px;justify-content:center}.nfa-team__card--layout-left .nfa-team__social{justify-content:flex-start}.nfa-team__social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:rgba(19,19,19,.06);color:#131313;font-size:15px;transition:background .25s,color .25s;text-decoration:none}.nfa-team__social a:hover{background:#0ea5e9;color:#fff}@media (max-width:767px){.nfa-team__grid{grid-template-columns:1fr}.nfa-team__card--layout-left{flex-direction:column;text-align:center}.nfa-team__card--layout-left .nfa-team__photo{flex:none;width:100%;height:200px}.nfa-team__card--layout-left .nfa-team__social{justify-content:center}}.nfa-cta-banner{border-radius:16px;padding:48px 40px;text-align:center;position:relative;overflow:hidden}.nfa-cta-banner--left{text-align:left}.nfa-cta-banner--side{display:flex;align-items:center;justify-content:space-between;text-align:left;gap:32px}.nfa-cta-banner__icon{font-size:40px;margin-bottom:16px;display:inline-block}.nfa-cta-banner__kicker{display:inline-block;font-size:.8em;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px;opacity:.75}.nfa-cta-banner__title{margin:0 0 14px;font-size:1.75em;font-weight:700;line-height:1.25}.nfa-cta-banner__desc{font-size:1.05em;line-height:1.6;opacity:.85;max-width:640px;margin:0 auto 24px}.nfa-cta-banner--left .nfa-cta-banner__desc,.nfa-cta-banner--side .nfa-cta-banner__desc{margin-left:0}.nfa-cta-banner__actions{display:flex;gap:12px;flex-wrap:wrap}.nfa-cta-banner--center .nfa-cta-banner__actions{justify-content:center}.nfa-cta-banner__btn{display:inline-flex;align-items:center;padding:12px 28px;border-radius:8px;font-weight:600;font-size:.95em;text-decoration:none;transition:opacity .25s,transform .15s;border:none;cursor:pointer}.nfa-cta-banner__btn:hover{opacity:.88;transform:translateY(-1px)}@media (max-width:767px){.nfa-cta-banner{padding:32px 24px}.nfa-cta-banner--side{flex-direction:column;text-align:center}.nfa-cta-banner--side .nfa-cta-banner__actions{justify-content:center}}.nfa-tabs{display:flex;flex-direction:column;gap:0}.nfa-tabs--vertical{flex-direction:row;gap:24px}.nfa-tabs__nav{display:flex;gap:4px;border-bottom:2px solid rgba(19,19,19,.08);padding-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:column;border-bottom:none;border-right:2px solid rgba(19,19,19,.08);padding-right:0;padding-bottom:0;min-width:180px;overflow-x:visible}.nfa-tabs__btn{position:relative;display:inline-flex;align-items:center;gap:8px;padding:12px 24px;font-weight:500;font-size:.95em;background:0 0;border:none;color:rgba(19,19,19,.55);cursor:pointer;white-space:nowrap;transition:color .2s,background .2s;border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 0 0 8px;justify-content:flex-start;text-align:left;width:100%}.nfa-tabs__btn:hover{color:#131313;background:rgba(19,19,19,.03)}.nfa-tabs__btn--active{color:#0ea5e9;background:rgba(14,165,233,.08)}.nfa-tabs__btn--active::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#0ea5e9;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:auto;top:0;left:auto;right:-2px;width:3px;height:100%;border-radius:0 3px 3px 0}.nfa-tabs__btn--icon-top{flex-direction:column}.nfa-tabs__btn-icon{font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center}.nfa-tabs__panels{flex:1}.nfa-tabs__panel{display:none;padding:24px;color:rgba(19,19,19,.7);line-height:1.7;border-radius:0 0 12px 12px}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 12px 12px 0}.nfa-tabs__panel--active{display:block}@media (max-width:767px){.nfa-tabs--vertical{flex-direction:column}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:row;border-right:none;border-bottom:2px solid rgba(19,19,19,.08);min-width:0;overflow-x:auto}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:-2px;top:auto;right:0;left:0;width:auto;height:3px;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 0 12px 12px}}.nfa-compare{position:relative;overflow:hidden;border-radius:12px;user-select:none;touch-action:none;cursor:col-resize;line-height:0}.nfa-compare--vertical{cursor:row-resize}.nfa-compare__after,.nfa-compare__before{position:relative;width:100%}.nfa-compare__before{position:absolute;top:0;left:0;z-index:2;height:100%;overflow:hidden}.nfa-compare__after img,.nfa-compare__before img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.nfa-compare__label{position:absolute;bottom:16px;padding:4px 14px;font-size:.8em;font-weight:600;color:#fff;background:rgba(0,0,0,.55);border-radius:6px;z-index:5;pointer-events:none;transition:opacity .3s}.nfa-compare__label--before{left:16px}.nfa-compare__label--after{right:16px}.nfa-compare--vertical .nfa-compare__label--before{top:16px;bottom:auto;left:16px}.nfa-compare--vertical .nfa-compare__label--after{bottom:16px;right:auto;left:16px}.nfa-compare--hover-labels .nfa-compare__label{opacity:0}.nfa-compare--hover-labels:hover .nfa-compare__label{opacity:1}.nfa-compare__slider{position:absolute;top:0;bottom:0;z-index:10;display:flex;align-items:center;justify-content:center}.nfa-compare--horizontal .nfa-compare__slider{flex-direction:column;width:0}.nfa-compare--vertical .nfa-compare__slider{top:auto;left:0;right:0;flex-direction:row;height:0}.nfa-compare__line{position:absolute}.nfa-compare--horizontal .nfa-compare__line{width:3px;top:0;bottom:0;background:#fff}.nfa-compare--vertical .nfa-compare__line{height:3px;left:0;right:0;background:#fff}.nfa-compare__handle{position:relative;z-index:11;width:40px;height:40px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.25);color:#131313;cursor:inherit;flex-shrink:0}.nfa-compare__handle svg{width:14px;height:14px}.nfa-countdown{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:16px}.nfa-countdown__block{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-width:80px;border-radius:12px;background:rgba(19,19,19,.04);transition:transform .25s,box-shadow .25s;position:relative}.nfa-countdown__block:hover{transform:translateY(-3px);box-shadow:0 4px 16px rgba(0,0,0,.08)}.nfa-countdown__digit{font-size:2.5em;font-weight:700;line-height:1.1;color:#131313;font-variant-numeric:tabular-nums}.nfa-countdown__label{font-size:.8em;font-weight:500;color:rgba(19,19,19,.55);text-transform:uppercase;letter-spacing:.06em;margin-top:8px}.nfa-countdown__sep{font-size:2em;font-weight:700;color:rgba(19,19,19,.3);line-height:1;align-self:flex-start;padding-top:20px}.nfa-countdown--inline .nfa-countdown__block{background:0 0;padding:10px 6px;min-width:auto;border-radius:0}.nfa-countdown--inline .nfa-countdown__block:hover{transform:none;box-shadow:none}.nfa-countdown__block--circle{position:relative;background:0 0;padding:0;width:120px;height:120px;border-radius:50%}.nfa-countdown__block--circle:hover{transform:none;box-shadow:none}.nfa-countdown__ring{position:absolute;top:0;left:0;width:100%;height:100%}.nfa-countdown__progress{transition:stroke-dashoffset .6s ease}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.6em}.nfa-countdown__block--circle .nfa-countdown__label{font-size:.65em;margin-top:2px}.nfa-countdown__expiry{width:100%;text-align:center;font-size:1.2em;font-weight:600;color:#131313;padding:24px}@media (max-width:480px){.nfa-countdown__digit{font-size:1.8em}.nfa-countdown__block{min-width:60px;padding:14px}.nfa-countdown__block--circle{width:80px;height:80px}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.2em}}.nfa-tooltip{position:absolute;z-index:99999;max-width:260px;padding:8px 14px;border-radius:6px;background:#1e293b;color:#fff;font-size:13px;line-height:1.5;text-align:center;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease,transform .25s ease;white-space:normal;word-wrap:break-word;box-shadow:0 4px 12px rgba(0,0,0,.15)}.nfa-tooltip--visible{opacity:1;visibility:visible}.nfa-tooltip::after{content:'';position:absolute;width:0;height:0;border:6px solid transparent}.nfa-tooltip--no-arrow::after{display:none}.nfa-tooltip--top{transform:translateY(6px)}.nfa-tooltip--top.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--top::after{top:100%;left:50%;transform:translateX(-50%);border-top-color:inherit}.nfa-tooltip--bottom{transform:translateY(-6px)}.nfa-tooltip--bottom.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--bottom::after{bottom:100%;left:50%;transform:translateX(-50%);border-bottom-color:inherit}.nfa-tooltip--left{transform:translateX(6px)}.nfa-tooltip--left.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--left::after{left:100%;top:50%;transform:translateY(-50%);border-left-color:inherit}.nfa-tooltip--right{transform:translateX(-6px)}.nfa-tooltip--right.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--right::after{right:100%;top:50%;transform:translateY(-50%);border-right-color:inherit}[data-nfa-wrapper-link]{cursor:pointer;position:relative}[data-nfa-wrapper-link]:focus-visible{outline:2px solid currentColor;outline-offset:2px} 1 .nfa-hero-cta{color:#131313;display:flex;flex-direction:column;gap:24px;text-decoration:none}.nfa-hero-cta__kicker{letter-spacing:.2em;text-transform:uppercase;font-size:.85rem;opacity:.7;margin:0;position:relative}.nfa-hero-cta__headline{font-size:clamp(2.5rem, 4vw, 3.5rem);line-height:1.1;margin:0;position:relative;letter-spacing:-.02em}.nfa-hero-cta__body{font-size:1.1rem;max-width:640px;margin:0;opacity:.85;line-height:1.7;position:relative}.nfa-hero-cta__button{align-self:flex-start;padding:14px 32px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);position:relative;display:inline-flex;align-items:center;gap:8px}.nfa-hero-cta__button:focus-visible,.nfa-hero-cta__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-hero-cta__button:active{transform:translateY(-1px) scale(.99)}.nfa-feature-list{display:flex;flex-direction:column;gap:24px}.nfa-feature-list__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-feature-list__item{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:flex-start;padding:20px;border-radius:16px;background:#fff;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-feature-list__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-feature-list__icon-wrap{display:inline-flex;justify-content:center;align-items:center;padding:10px;border-radius:12px;background:rgba(14,165,233,.08);transition:background .2s ease}.nfa-feature-list__item:hover .nfa-feature-list__icon-wrap{background:rgba(14,165,233,.08)}.nfa-feature-list__icon{color:#0ea5e9;font-size:24px;line-height:1}.nfa-feature-list__title{margin:0 0 4px 0;color:#131313;font-size:1.05rem;font-weight:600}.nfa-feature-list__text{margin:0;color:rgba(19,19,19,.55);font-size:.95rem;line-height:1.6}.nfa-spotlight-card{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:32px;align-items:center}.nfa-spotlight-card__content{display:flex;flex-direction:column;gap:14px}.nfa-spotlight-card__eyebrow{margin:0;letter-spacing:.15em;text-transform:uppercase;color:#0ea5e9;font-size:.78rem;font-weight:600}.nfa-spotlight-card__title{margin:0;color:#131313;font-size:clamp(1.9rem, 3vw, 2.4rem);letter-spacing:-.01em}.nfa-spotlight-card__description{margin:0;color:rgba(19,19,19,.55);font-size:1.02rem;line-height:1.7}.nfa-spotlight-card__meta{margin:0;color:rgba(19,19,19,.4);font-size:.95rem}.nfa-spotlight-card__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-spotlight-card__button:focus-visible,.nfa-spotlight-card__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-spotlight-card__media img{width:100%;height:auto;border-radius:20px;display:block;transition:transform .3s ease}.nfa-spotlight-card:hover .nfa-spotlight-card__media img{transform:scale(1.02)}.nfa-stats-grid{display:flex;flex-direction:column;gap:28px}.nfa-stats-grid__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.nfa-stats-grid__item{padding:24px;border-radius:18px;background:#fff;border:1px solid rgba(19,19,19,.1);display:grid;row-gap:8px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-stats-grid__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-stats-grid__value{color:#131313;font-weight:700;font-size:2rem;line-height:1.2;letter-spacing:-.02em}.nfa-stats-grid__label{color:rgba(19,19,19,.55);font-weight:600;font-size:1rem}.nfa-stats-grid__helper{color:rgba(19,19,19,.4);font-size:.9rem;line-height:1.5}.nfa-pricing-table{display:flex;flex-direction:column;gap:20px;color:#131313;position:relative;transition:transform .3s ease,box-shadow .3s ease}.nfa-pricing-table:hover{transform:translateY(-4px)}.nfa-pricing-table__badge{position:absolute;top:18px;right:18px;background:#ff6b35;color:#0f172a;padding:6px 14px;border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 4px 12px rgba(255,107,53,.15)}.nfa-pricing-table__label{margin:0 0 6px 0;font-size:1.4rem}.nfa-pricing-table__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6}.nfa-pricing-table__price{display:flex;align-items:baseline;gap:8px}.nfa-pricing-table__amount{font-size:2.6rem;font-weight:700;line-height:1;letter-spacing:-.02em}.nfa-pricing-table__suffix{font-size:1rem;color:rgba(19,19,19,.4)}.nfa-pricing-table__features{list-style:none;padding:0;margin:0;display:grid;gap:12px}.nfa-pricing-table__features li{display:flex;align-items:flex-start;gap:12px;color:rgba(19,19,19,.55);line-height:1.5}.nfa-pricing-table__features li::before{content:'\2713';color:#0ea5e9;font-weight:700;font-size:.9rem;margin-top:1px;flex-shrink:0}.nfa-pricing-table__button{align-self:flex-start;padding:14px 28px;border-radius:999px;font-weight:600;color:#0f172a;background:#ff6b35;text-decoration:none;transition:transform .3s ease,box-shadow .3s ease,background .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);display:inline-flex;align-items:center;gap:8px}.nfa-pricing-table__button:focus-visible,.nfa-pricing-table__button:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 8px 30px rgba(255,107,53,.15);background:#ff7d4f}.nfa-testimonials{display:flex;flex-direction:column;gap:24px}.nfa-testimonials__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.nfa-testimonials__card{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:16px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-testimonials__card:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-testimonials__avatar img{width:48px;height:48px;border-radius:50%;object-fit:cover;display:block;border:2px solid rgba(19,19,19,.1)}.nfa-testimonials__quote{margin:0;color:rgba(19,19,19,.55);font-size:1rem;line-height:1.7;font-style:normal}blockquote.nfa-testimonials__quote{border:0;padding:0}.nfa-testimonials__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto}.nfa-testimonials__name{font-weight:600;color:#131313}.nfa-testimonials__role{color:rgba(19,19,19,.4);font-size:.9rem}.nfa-testimonials__rating{font-size:.9rem;letter-spacing:1px;color:#fbbf24}.nfa-logo-grid{display:flex;flex-direction:column;gap:24px}.nfa-logo-grid__items{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;align-items:center}.nfa-logo-grid__logo{display:flex;align-items:center;justify-content:center;padding:20px;border-radius:14px;background:#fff;border:1px solid rgba(19,19,19,.1);min-height:86px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.nfa-logo-grid__logo:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-3px)}.nfa-logo-grid__logo img{max-width:140px;width:100%;height:auto;opacity:.7;transition:opacity .2s ease,filter .2s ease;filter:grayscale(20%)}.nfa-logo-grid__logo:hover img{opacity:1;filter:grayscale(0%)}.nfa-logo-grid__text{color:#131313;font-weight:600}.nfa-faq{display:flex;flex-direction:column;gap:24px}.nfa-faq__items{display:grid;gap:12px}.nfa-faq__item{background:#fff;border-radius:16px;padding:20px 22px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease}.nfa-faq__item:hover{border-color:#0ea5e9}.nfa-faq__item[open]{background:#f8f9fa;border-color:#0ea5e9}.nfa-faq__question{cursor:pointer;font-weight:600;color:#131313;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:14px;user-select:none}.nfa-faq__question::after{content:'+';font-size:1.2rem;color:#0ea5e9;transition:transform .2s ease;flex-shrink:0;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(14,165,233,.08)}.nfa-faq__item[open] .nfa-faq__question::after{content:'\2212';transform:rotate(180deg)}.nfa-faq__question::-webkit-details-marker{display:none}.nfa-faq__answer{margin-top:14px;color:rgba(19,19,19,.55);line-height:1.7}.nfa-steps{display:flex;flex-direction:column;gap:24px}.nfa-steps__list{display:grid;gap:20px}.nfa-steps--vertical .nfa-steps__list{grid-template-columns:1fr}.nfa-steps--horizontal .nfa-steps__list{grid-template-columns:repeat(3,minmax(0,1fr))}.nfa-steps__item{background:#fff;border-radius:18px;padding:24px;display:flex;flex-direction:column;gap:10px;border:1px solid rgba(19,19,19,.1);transition:background .2s ease,border-color .2s ease,transform .2s ease;position:relative}.nfa-steps__item:hover{background:#f8f9fa;border-color:#0ea5e9;transform:translateY(-2px)}.nfa-steps__label{text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;color:#0ea5e9;font-weight:700}.nfa-steps__title{margin:0;font-size:1.1rem;color:#131313;font-weight:600}.nfa-steps__description{margin:0;color:rgba(19,19,19,.55);line-height:1.6;font-size:.95rem}.nfa-slider{position:relative}.nfa-slider__track{display:flex;gap:20px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-bottom:6px;scrollbar-width:none;-ms-overflow-style:none}.nfa-slider__track::-webkit-scrollbar{display:none}.nfa-slider__item{flex:0 0 100%;scroll-snap-align:start}.nfa-slider__btn{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:999px;border:1px solid rgba(19,19,19,.1);background:#131313;color:#131313;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 8px 20px rgb(15 23 42 / .3);transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease;z-index:2}.nfa-slider__btn--prev{left:-16px}.nfa-slider__btn--next{right:-16px}.nfa-slider__btn:hover{transform:translateY(-50%) scale(1.08);background:rgba(255,255,255,.08);border-color:#0ea5e9}.nfa-slider__btn:focus-visible{outline:0;box-shadow:0 0 0 3px rgba(125,211,252,.3)}.nfa-showcase{position:relative}.nfa-showcase__nav{display:flex;gap:12px;margin-bottom:24px;justify-content:flex-end}.nfa-showcase__arrow{width:48px;height:48px;border-radius:50%;border:1.5px solid rgba(19,19,19,.15);background:0 0;color:#fff;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.nfa-showcase__arrow:hover{background:#131313;color:#f4f4f4;border-color:#131313}.nfa-showcase__viewport{overflow:hidden}.nfa-showcase__track{display:flex;transition:transform .5s cubic-bezier(.25, .46, .45, .94);will-change:transform}.nfa-showcase__card{flex-shrink:0;position:relative;height:420px;border-radius:20px;overflow:hidden;transition:transform .35s ease;text-decoration:none;display:block}.nfa-showcase__card:hover{transform:translateY(-4px)}.nfa-showcase__img{position:absolute;inset:0;z-index:0}.nfa-showcase__img img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.nfa-showcase__card:hover .nfa-showcase__img img{transform:scale(1.08)}.nfa-showcase__card--overlay-dark .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(19,19,19,.92) 0,rgba(19,19,19,.5) 50%,rgba(19,19,19,.15) 100%);z-index:1}.nfa-showcase__card--overlay-light .nfa-showcase__img::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(255,255,255,.92) 0,rgba(255,255,255,.4) 50%,transparent 100%);z-index:1}.nfa-showcase__badge{position:absolute;top:20px;left:20px;background:rgba(244,244,244,.15);backdrop-filter:blur(10px);color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:2;border:1px solid rgba(244,244,244,.1)}.nfa-showcase__body{position:absolute;bottom:0;left:0;right:0;padding:32px 28px;z-index:2}.nfa-showcase__title{font-size:22px;font-weight:700;color:#f4f4f4;margin-bottom:12px}.nfa-showcase__desc{font-size:14px;color:rgba(244,244,244,.65);line-height:1.8;margin:0}.nfa-showcase__tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nfa-showcase__tag{font-size:11px;padding:4px 12px;border-radius:50px;border:1px solid rgba(244,244,244,.12);color:rgba(244,244,244,.6);letter-spacing:.3px}.nfa-showcase__dots{display:flex;justify-content:center;gap:8px;margin-top:24px}.nfa-showcase__dot{width:10px;height:10px;border-radius:50%;background:rgba(19,19,19,.2);border:none;cursor:pointer;padding:0;transition:background .3s ease,transform .3s ease}.nfa-showcase__dot--active{background:#131313;transform:scale(1.2)}.nfa-showcase__dot:hover:not(.nfa-showcase__dot--active){background:rgba(19,19,19,.4)}.nfa-areas__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:1/3}.nfa-areas__card{background:#fff;border-radius:18px;overflow:hidden;position:relative;transition:all .4s ease;display:block;text-decoration:none;color:inherit}a.nfa-areas__card:hover{text-decoration:none;color:inherit}.nfa-areas__card--shadow-sm{box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}.nfa-areas__card--shadow-md{box-shadow:0 4px 12px rgba(0,0,0,.08)}.nfa-areas__card--shadow-lg{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__card:hover{box-shadow:0 10px 30px rgba(0,0,0,.12)}.nfa-areas__img{height:200px;overflow:hidden;position:relative}.nfa-areas__img img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}.nfa-areas__badge{position:absolute;top:16px;left:16px;background:#131313;color:#f4f4f4;padding:5px 16px;border-radius:50px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;z-index:3}.nfa-areas__body{padding:24px}.nfa-areas__title{font-size:19px;font-weight:600;margin:0 0 8px;color:#131313}.nfa-areas__desc{font-size:14px;color:rgba(19,19,19,.55);line-height:1.7;margin:0}.nfa-areas__card--featured{position:relative}.nfa-areas__card--featured .nfa-areas__img{position:absolute;inset:0;height:100%;z-index:0}.nfa-areas__overlay{position:absolute;inset:0;z-index:1;pointer-events:none}.nfa-areas__card--featured .nfa-areas__body{position:absolute;bottom:0;left:0;right:0;z-index:2;padding:32px 28px}.nfa-areas__card--featured .nfa-areas__title{color:#f4f4f4;font-size:24px;margin-bottom:12px}.nfa-areas__card--featured .nfa-areas__desc{color:rgba(244,244,244,.65);font-size:14px;line-height:1.8}.nfa-areas__card--featured .nfa-areas__badge{background:rgba(244,244,244,.15);backdrop-filter:blur(10px);border:1px solid rgba(244,244,244,.1);z-index:2}.nfa-journey__steps{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:24px;position:relative}.nfa-journey__steps--line::before{content:'';position:absolute;top:36px;left:48px;right:48px;height:2px;background:linear-gradient(90deg,#131313,rgba(19,19,19,.08));z-index:0}.nfa-journey__step{text-align:center;position:relative;z-index:1}.nfa-journey__number{width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:2px solid #131313;background:#fff;color:#131313;font-size:22px;font-weight:700;margin:0 auto 20px;transition:all .3s ease}.nfa-journey__step:hover .nfa-journey__number{background:#131313;color:#f4f4f4;box-shadow:0 8px 24px rgba(19,19,19,.2);transform:scale(1.05)}.nfa-journey__step-title{margin:0 0 10px;font-size:16px;font-weight:600;color:#131313}.nfa-journey__step-description{margin:0;font-size:13px;line-height:1.7;color:rgba(19,19,19,.45)}@media (max-width:900px){.nfa-feature-list__items,.nfa-logo-grid__items,.nfa-stats-grid__items,.nfa-steps--horizontal .nfa-steps__list,.nfa-testimonials__grid{grid-template-columns:1fr}.nfa-journey__steps{grid-template-columns:repeat(2,minmax(0,1fr))}.nfa-journey__steps--line::before{display:none}.nfa-areas__grid--featured .nfa-areas__card:first-child{grid-row:auto}.nfa-areas__card--featured .nfa-areas__img{position:relative;inset:auto;height:200px}.nfa-areas__card--featured .nfa-areas__overlay{display:none}.nfa-areas__card--featured .nfa-areas__body{position:relative;bottom:auto;left:auto;right:auto;padding:24px}.nfa-areas .nfa-areas__card--featured .nfa-areas__title{color:#131313!important;font-size:19px!important;margin-bottom:8px}.nfa-areas .nfa-areas__card--featured .nfa-areas__desc{color:rgba(19,19,19,.55)!important;font-size:14px;line-height:1.7}.nfa-areas .nfa-areas__card--featured .nfa-areas__badge{background:#131313!important;color:#f4f4f4!important;backdrop-filter:none;border:none!important}}@media (max-width:640px){.nfa-journey__steps{grid-template-columns:1fr}.nfa-slider__btn--prev{left:-8px}.nfa-slider__btn--next{right:-8px}}.nfa-team__grid{display:grid;gap:24px;grid-template-columns:repeat(var(--nfa-team-cols,3),1fr)}.nfa-team__card{background:#fff;border-radius:16px;overflow:hidden;text-align:center;transition:box-shadow .3s ease,transform .25s ease;box-shadow:0 1px 4px rgba(0,0,0,.06)}.nfa-team__card:hover{box-shadow:0 8px 24px rgba(0,0,0,.1);transform:translateY(-4px)}.nfa-team__card--layout-left{display:flex;text-align:left}.nfa-team__card--layout-left .nfa-team__photo{flex:0 0 140px;height:auto}.nfa-team__photo{width:100%;height:220px;object-fit:cover;display:block}.nfa-team__card--layout-circle .nfa-team__photo{width:120px;height:120px;border-radius:50%;margin:24px auto 0}.nfa-team__body{padding:20px}.nfa-team__name{margin:0 0 4px;font-size:1.15em;font-weight:600;color:#131313}.nfa-team__role{font-size:.875em;color:rgba(19,19,19,.55);margin-bottom:10px}.nfa-team__bio{font-size:.9em;color:rgba(19,19,19,.7);line-height:1.6;margin-bottom:14px}.nfa-team__social{display:flex;gap:10px;justify-content:center}.nfa-team__card--layout-left .nfa-team__social{justify-content:flex-start}.nfa-team__social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:rgba(19,19,19,.06);color:#131313;font-size:15px;transition:background .25s,color .25s;text-decoration:none}.nfa-team__social a:hover{background:#0ea5e9;color:#fff}@media (max-width:767px){.nfa-team__grid{grid-template-columns:1fr}.nfa-team__card--layout-left{flex-direction:column;text-align:center}.nfa-team__card--layout-left .nfa-team__photo{flex:none;width:100%;height:200px}.nfa-team__card--layout-left .nfa-team__social{justify-content:center}}.nfa-cta-banner{border-radius:16px;padding:48px 40px;text-align:center;position:relative;overflow:hidden}.nfa-cta-banner--left{text-align:left}.nfa-cta-banner--side{display:flex;align-items:center;justify-content:space-between;text-align:left;gap:32px}.nfa-cta-banner__icon{font-size:40px;margin-bottom:16px;display:inline-block}.nfa-cta-banner__kicker{display:inline-block;font-size:.8em;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px;opacity:.75}.nfa-cta-banner__title{margin:0 0 14px;font-size:1.75em;font-weight:700;line-height:1.25}.nfa-cta-banner__desc{font-size:1.05em;line-height:1.6;opacity:.85;max-width:640px;margin:0 auto 24px}.nfa-cta-banner--left .nfa-cta-banner__desc,.nfa-cta-banner--side .nfa-cta-banner__desc{margin-left:0}.nfa-cta-banner__actions{display:flex;gap:12px;flex-wrap:wrap}.nfa-cta-banner--center .nfa-cta-banner__actions{justify-content:center}.nfa-cta-banner__btn{display:inline-flex;align-items:center;padding:12px 28px;border-radius:8px;font-weight:600;font-size:.95em;text-decoration:none;transition:opacity .25s,transform .15s;border:none;cursor:pointer}.nfa-cta-banner__btn:hover{opacity:.88;transform:translateY(-1px)}@media (max-width:767px){.nfa-cta-banner{padding:32px 24px}.nfa-cta-banner--side{flex-direction:column;text-align:center}.nfa-cta-banner--side .nfa-cta-banner__actions{justify-content:center}}.nfa-tabs{display:flex;flex-direction:column;gap:0}.nfa-tabs--vertical{flex-direction:row;gap:24px}.nfa-tabs__nav{display:flex;gap:4px;border-bottom:2px solid rgba(19,19,19,.08);padding-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:column;border-bottom:none;border-right:2px solid rgba(19,19,19,.08);padding-right:0;padding-bottom:0;min-width:180px;overflow-x:visible}.nfa-tabs__btn{position:relative;display:inline-flex;align-items:center;gap:8px;padding:12px 24px;font-weight:500;font-size:.95em;background:0 0;border:none;color:rgba(19,19,19,.55);cursor:pointer;white-space:nowrap;transition:color .2s,background .2s;border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 0 0 8px;justify-content:flex-start;text-align:left;width:100%}.nfa-tabs__btn:hover{color:#131313;background:rgba(19,19,19,.03)}.nfa-tabs__btn--active{color:#0ea5e9;background:rgba(14,165,233,.08)}.nfa-tabs__btn--active::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#0ea5e9;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:auto;top:0;left:auto;right:-2px;width:3px;height:100%;border-radius:0 3px 3px 0}.nfa-tabs__btn--icon-top{flex-direction:column}.nfa-tabs__btn-icon{font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center}.nfa-tabs__panels{flex:1}.nfa-tabs__panel{display:none;padding:24px;color:rgba(19,19,19,.7);line-height:1.7;border-radius:0 0 12px 12px}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 12px 12px 0}.nfa-tabs__panel--active{display:block}@media (max-width:767px){.nfa-tabs--vertical{flex-direction:column}.nfa-tabs--vertical .nfa-tabs__nav{flex-direction:row;border-right:none;border-bottom:2px solid rgba(19,19,19,.08);min-width:0;overflow-x:auto}.nfa-tabs--vertical .nfa-tabs__btn{border-radius:8px 8px 0 0}.nfa-tabs--vertical .nfa-tabs__btn--active::after{bottom:-2px;top:auto;right:0;left:0;width:auto;height:3px;border-radius:3px 3px 0 0}.nfa-tabs--vertical .nfa-tabs__panel{border-radius:0 0 12px 12px}}.nfa-compare{position:relative;overflow:hidden;border-radius:12px;user-select:none;touch-action:none;cursor:col-resize;line-height:0}.nfa-compare--vertical{cursor:row-resize}.nfa-compare__after,.nfa-compare__before{position:relative;width:100%}.nfa-compare__before{position:absolute;top:0;left:0;z-index:2;height:100%;overflow:hidden}.nfa-compare__after img,.nfa-compare__before img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.nfa-compare__label{position:absolute;bottom:16px;padding:4px 14px;font-size:.8em;font-weight:600;color:#fff;background:rgba(0,0,0,.55);border-radius:6px;z-index:5;pointer-events:none;transition:opacity .3s}.nfa-compare__label--before{left:16px}.nfa-compare__label--after{right:16px}.nfa-compare--vertical .nfa-compare__label--before{top:16px;bottom:auto;left:16px}.nfa-compare--vertical .nfa-compare__label--after{bottom:16px;right:auto;left:16px}.nfa-compare--hover-labels .nfa-compare__label{opacity:0}.nfa-compare--hover-labels:hover .nfa-compare__label{opacity:1}.nfa-compare__slider{position:absolute;top:0;bottom:0;z-index:10;display:flex;align-items:center;justify-content:center}.nfa-compare--horizontal .nfa-compare__slider{flex-direction:column;width:0}.nfa-compare--vertical .nfa-compare__slider{top:auto;left:0;right:0;flex-direction:row;height:0}.nfa-compare__line{position:absolute}.nfa-compare--horizontal .nfa-compare__line{width:3px;top:0;bottom:0;background:#fff}.nfa-compare--vertical .nfa-compare__line{height:3px;left:0;right:0;background:#fff}.nfa-compare__handle{position:relative;z-index:11;width:40px;height:40px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.25);color:#131313;cursor:inherit;flex-shrink:0}.nfa-compare__handle svg{width:14px;height:14px}.nfa-countdown{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:16px}.nfa-countdown__block{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-width:80px;border-radius:12px;background:rgba(19,19,19,.04);transition:transform .25s,box-shadow .25s;position:relative}.nfa-countdown__block:hover{transform:translateY(-3px);box-shadow:0 4px 16px rgba(0,0,0,.08)}.nfa-countdown__digit{font-size:2.5em;font-weight:700;line-height:1.1;color:#131313;font-variant-numeric:tabular-nums}.nfa-countdown__label{font-size:.8em;font-weight:500;color:rgba(19,19,19,.55);text-transform:uppercase;letter-spacing:.06em;margin-top:8px}.nfa-countdown__sep{font-size:2em;font-weight:700;color:rgba(19,19,19,.3);line-height:1;align-self:flex-start;padding-top:20px}.nfa-countdown--inline .nfa-countdown__block{background:0 0;padding:10px 6px;min-width:auto;border-radius:0}.nfa-countdown--inline .nfa-countdown__block:hover{transform:none;box-shadow:none}.nfa-countdown__block--circle{position:relative;background:0 0;padding:0;width:120px;height:120px;border-radius:50%}.nfa-countdown__block--circle:hover{transform:none;box-shadow:none}.nfa-countdown__ring{position:absolute;top:0;left:0;width:100%;height:100%}.nfa-countdown__progress{transition:stroke-dashoffset .6s ease}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.6em}.nfa-countdown__block--circle .nfa-countdown__label{font-size:.65em;margin-top:2px}.nfa-countdown__expiry{width:100%;text-align:center;font-size:1.2em;font-weight:600;color:#131313;padding:24px}@media (max-width:480px){.nfa-countdown__digit{font-size:1.8em}.nfa-countdown__block{min-width:60px;padding:14px}.nfa-countdown__block--circle{width:80px;height:80px}.nfa-countdown__block--circle .nfa-countdown__digit{font-size:1.2em}}.nfa-tooltip{position:absolute;z-index:99999;max-width:260px;padding:8px 14px;border-radius:6px;background:#1e293b;color:#fff;font-size:13px;line-height:1.5;text-align:center;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease,transform .25s ease;white-space:normal;word-wrap:break-word;box-shadow:0 4px 12px rgba(0,0,0,.15)}.nfa-tooltip--visible{opacity:1;visibility:visible}.nfa-tooltip::after{content:'';position:absolute;width:0;height:0;border:6px solid transparent}.nfa-tooltip--no-arrow::after{display:none}.nfa-tooltip--top{transform:translateY(6px)}.nfa-tooltip--top.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--top::after{top:100%;left:50%;transform:translateX(-50%);border-top-color:inherit}.nfa-tooltip--bottom{transform:translateY(-6px)}.nfa-tooltip--bottom.nfa-tooltip--visible{transform:translateY(0)}.nfa-tooltip--bottom::after{bottom:100%;left:50%;transform:translateX(-50%);border-bottom-color:inherit}.nfa-tooltip--left{transform:translateX(6px)}.nfa-tooltip--left.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--left::after{left:100%;top:50%;transform:translateY(-50%);border-left-color:inherit}.nfa-tooltip--right{transform:translateX(-6px)}.nfa-tooltip--right.nfa-tooltip--visible{transform:translateX(0)}.nfa-tooltip--right::after{right:100%;top:50%;transform:translateY(-50%);border-right-color:inherit}[data-nfa-wrapper-link]{cursor:pointer;position:relative}[data-nfa-wrapper-link]:focus-visible{outline:2px solid currentColor;outline-offset:2px}.nfa-hamburger__toggle-wrap{display:flex}.nfa-hamburger__toggle{display:inline-flex;align-items:center;justify-content:center;border:none;cursor:pointer;line-height:1;transition:background .2s ease,color .2s ease}.nfa-hamburger__icon--bars{display:flex;flex-direction:column;gap:4px;width:1em}.nfa-hamburger__icon--bars span{display:block;height:2px;background:currentColor;border-radius:2px;transition:transform .3s ease,opacity .3s ease}.nfa-hamburger__icon--dots{display:flex;flex-direction:column;gap:4px;align-items:center;width:1em}.nfa-hamburger__icon--dots span{display:block;width:5px;height:5px;background:currentColor;border-radius:50%}.nfa-hamburger__icon--grid{display:grid;grid-template-columns:repeat(2,1fr);gap:3px;width:1em}.nfa-hamburger__icon--grid span{display:block;width:7px;height:7px;background:currentColor;border-radius:2px}.nfa-hamburger__overlay{position:fixed;inset:0;z-index:99998;opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.nfa-hamburger--open .nfa-hamburger__overlay{opacity:1;visibility:visible}.nfa-hamburger__panel{position:fixed;z-index:99999;background:#fff;overflow-y:auto;-webkit-overflow-scrolling:touch;transition:transform .35s cubic-bezier(.4, 0, .2, 1),visibility .35s ease;visibility:hidden}.nfa-hamburger__panel--left{top:0;left:0;bottom:0;transform:translateX(-100%)}.nfa-hamburger__panel--right{top:0;right:0;bottom:0;transform:translateX(100%)}.nfa-hamburger__panel--top{top:0;left:0;right:0;max-height:80vh;transform:translateY(-100%)}.nfa-hamburger--open .nfa-hamburger__panel{transform:translate(0);visibility:visible}.nfa-hamburger__panel-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.nfa-hamburger__logo{max-height:40px;width:auto}.nfa-hamburger__close{background:0 0;border:none;font-size:28px;cursor:pointer;line-height:1;padding:4px 8px;transition:color .2s ease;margin-left:auto}.nfa-hamburger__list{list-style:none;margin:0;padding:0}.nfa-hamburger__item--separated{border-bottom:1px solid #e2e8f0}.nfa-hamburger__link{display:flex;align-items:center;gap:10px;text-decoration:none;font-size:15px;font-weight:500;transition:color .2s ease}.nfa-hamburger__link-icon{flex-shrink:0;font-size:1.1em}.nfa-hamburger__arrow{margin-left:auto;font-size:12px;transition:transform .25s ease}.nfa-hamburger__item--sub-open>.nfa-hamburger__link .nfa-hamburger__arrow{transform:rotate(180deg)}.nfa-hamburger__sub-list{list-style:none;margin:0;padding:4px 0 4px 24px;display:none}.nfa-hamburger__item--sub-open>.nfa-hamburger__sub-list{display:block}.nfa-hamburger__sub-link{display:block;padding:6px 0;text-decoration:none;font-size:14px;transition:color .2s ease}.nfa-form__fields{display:flex;flex-wrap:wrap;gap:16px}.nfa-form__col--100{width:100%}.nfa-form__col--75{width:calc(75% - 8px)}.nfa-form__col--66{width:calc(66.666% - 8px)}.nfa-form__col--50{width:calc(50% - 8px)}.nfa-form__col--33{width:calc(33.333% - 8px)}.nfa-form__col--25{width:calc(25% - 12px)}.nfa-form__col--hidden{display:none}.nfa-form__label{display:block;font-weight:600;font-size:13px;margin-bottom:6px}.nfa-form__required{color:#ef4444;margin-left:2px}.nfa-form__input,.nfa-form__select,.nfa-form__textarea{display:block;width:100%;border:1px solid #cbd5e1;font-size:14px;line-height:1.5;transition:border-color .2s ease,box-shadow .2s ease;outline:0;box-sizing:border-box}.nfa-form__input:focus,.nfa-form__select:focus,.nfa-form__textarea:focus{border-color:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.1)}.nfa-form__input--file{padding:8px;border-style:dashed}.nfa-form__textarea{resize:vertical;min-height:100px}.nfa-form__choice-group{display:flex;flex-wrap:wrap;gap:12px}.nfa-form__choice{display:flex;align-items:center;gap:6px;font-size:14px;cursor:pointer}.nfa-form__choice input{accent-color:#6366f1;width:16px;height:16px}.nfa-form__field-error{display:block;font-size:12px;color:#ef4444;min-height:18px;margin-top:4px}.nfa-form__actions{display:flex;margin-top:20px}.nfa-form__submit{display:inline-flex;align-items:center;gap:8px;border:none;font-weight:600;cursor:pointer;transition:background .2s ease,transform .15s ease}.nfa-form__submit:hover{transform:translateY(-1px)}.nfa-form__submit:active{transform:translateY(0)}.nfa-form__submit:disabled{opacity:.6;cursor:not-allowed;transform:none}.nfa-form__spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:nfa-spin .6s linear infinite}@keyframes nfa-spin{to{transform:rotate(360deg)}}.nfa-form__msg{padding:14px 18px;border-radius:8px;font-size:14px;font-weight:500;margin-top:16px}.nfa-form__msg--success{background:#f0fdf4;color:#166534;border:1px solid #bbf7d0}.nfa-form__msg--error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.nfa-form__input--invalid,.nfa-form__select--invalid,.nfa-form__textarea--invalid{border-color:#ef4444!important;box-shadow:0 0 0 3px rgba(239,68,68,.1)!important}@media (max-width:767px){.nfa-form__col--25,.nfa-form__col--33,.nfa-form__col--50,.nfa-form__col--66,.nfa-form__col--75{width:100%}}.nfa-badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.nfa-badge--blue{background:#eef2ff;color:#4f46e5}.nfa-badge--gray{background:#f1f5f9;color:#64748b}.nfa-sub-row--unread td{background:#fafbff;font-weight:500} -
nebula-forge-addons-for-elementor/trunk/assets/js/frontend.js
r3462573 r3462588 542 542 }; 543 543 544 /** 545 * Initialize hamburger menu widgets. 546 */ 547 const initHamburgerMenu = (scope) => { 548 const $menus = scope.find('.nfa-hamburger'); 549 550 $menus.each(function () { 551 const $root = $(this); 552 if ($root.data('nfa-hm-bound')) return; 553 $root.data('nfa-hm-bound', true); 554 555 const $toggle = $root.find('.nfa-hamburger__toggle'); 556 const $panel = $root.find('.nfa-hamburger__panel'); 557 const $overlay = $root.find('.nfa-hamburger__overlay'); 558 const $close = $root.find('.nfa-hamburger__close'); 559 const closeOnLink = $root.data('close-on-link') === 1 || $root.data('close-on-link') === '1'; 560 const closeOnEsc = $root.data('close-on-esc') === 1 || $root.data('close-on-esc') === '1'; 561 562 function open() { 563 $root.addClass('nfa-hamburger--open'); 564 $toggle.attr('aria-expanded', 'true'); 565 $panel.attr('aria-hidden', 'false'); 566 // Trap focus inside panel. 567 $panel.find('a, button').first().focus(); 568 } 569 570 function close() { 571 $root.removeClass('nfa-hamburger--open'); 572 $toggle.attr('aria-expanded', 'false'); 573 $panel.attr('aria-hidden', 'true'); 574 $toggle.focus(); 575 } 576 577 $toggle.on('click', function (e) { 578 e.preventDefault(); 579 if ($root.hasClass('nfa-hamburger--open')) { 580 close(); 581 } else { 582 open(); 583 } 584 }); 585 586 $close.on('click', close); 587 $overlay.on('click', close); 588 589 if (closeOnEsc) { 590 $(document).on('keydown', function (e) { 591 if (e.key === 'Escape' && $root.hasClass('nfa-hamburger--open')) { 592 close(); 593 } 594 }); 595 } 596 597 if (closeOnLink) { 598 $panel.on('click', '.nfa-hamburger__link, .nfa-hamburger__sub-link', function () { 599 const href = $(this).attr('href'); 600 if (href && href !== '#') { 601 close(); 602 } 603 }); 604 } 605 606 // Submenu toggle. 607 $root.find('.nfa-hamburger__item--has-sub > .nfa-hamburger__link').on('click', function (e) { 608 if ($(this).attr('href') === '#') { 609 e.preventDefault(); 610 } 611 $(this).parent().toggleClass('nfa-hamburger__item--sub-open'); 612 }); 613 }); 614 }; 615 616 /** 617 * Initialize advanced form widgets. 618 */ 619 const initAdvancedForm = (scope) => { 620 const $forms = scope.find('.nfa-form'); 621 622 $forms.each(function () { 623 const $root = $(this); 624 if ($root.data('nfa-form-bound')) return; 625 $root.data('nfa-form-bound', true); 626 627 const config = $root.data('nfa-form'); 628 if (!config) return; 629 630 const $form = $root.find('.nfa-form__el'); 631 const $submit = $root.find('.nfa-form__submit'); 632 const $text = $root.find('.nfa-form__submit-text'); 633 const $spin = $root.find('.nfa-form__spinner'); 634 const $msg = $root.find('.nfa-form__msg'); 635 636 /** 637 * Validate a single field. 638 */ 639 function validateField(el) { 640 const $el = $(el); 641 const $err = $el.closest('.nfa-form__col').find('.nfa-form__field-error'); 642 let valid = true; 643 let errMsg = ''; 644 645 // Required check. 646 if (el.required) { 647 if (el.type === 'checkbox') { 648 const name = el.name; 649 const checked = $form.find('input[name="' + name + '"]:checked').length; 650 if (!checked) { 651 valid = false; 652 errMsg = config.requiredMsg || 'This field is required.'; 653 } 654 } else if (!el.value.trim()) { 655 valid = false; 656 errMsg = config.requiredMsg || 'This field is required.'; 657 } 658 } 659 660 // Type-specific validation. 661 if (valid && el.value.trim()) { 662 if (el.type === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(el.value)) { 663 valid = false; 664 errMsg = 'Please enter a valid email address.'; 665 } 666 if (el.type === 'url' && !/^https?:\/\/.+/.test(el.value)) { 667 valid = false; 668 errMsg = 'Please enter a valid URL.'; 669 } 670 if (el.type === 'tel' && !/^[\d\s+\-().]+$/.test(el.value)) { 671 valid = false; 672 errMsg = 'Please enter a valid phone number.'; 673 } 674 if (el.type === 'file') { 675 const maxMB = parseFloat($el.data('max-size') || 5); 676 if (el.files[0] && el.files[0].size > maxMB * 1024 * 1024) { 677 valid = false; 678 errMsg = 'File exceeds ' + maxMB + 'MB limit.'; 679 } 680 } 681 } 682 683 if (!valid) { 684 $el.addClass('nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid'); 685 $err.text(errMsg); 686 } else { 687 $el.removeClass('nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid'); 688 $err.text(''); 689 } 690 691 return valid; 692 } 693 694 // Live validation on blur. 695 $form.find('input, textarea, select').on('blur change', function () { 696 validateField(this); 697 }); 698 699 $form.on('submit', function (e) { 700 e.preventDefault(); 701 702 // Validate all fields. 703 let allValid = true; 704 $form.find('input[required], textarea[required], select[required]').each(function () { 705 if (!validateField(this)) { 706 allValid = false; 707 } 708 }); 709 710 if (!allValid) { 711 $form.find('.nfa-form__input--invalid, .nfa-form__select--invalid, .nfa-form__textarea--invalid').first().focus(); 712 return; 713 } 714 715 // Gather field data. 716 const fields = []; 717 const seen = {}; 718 719 $form.find('[data-label]').each(function () { 720 const $el = $(this); 721 const label = $el.data('label'); 722 const type = $el.attr('type') || this.tagName.toLowerCase(); 723 724 if (type === 'checkbox') { 725 if (!seen[label]) { 726 seen[label] = true; 727 const vals = []; 728 $form.find('input[data-label="' + label + '"]:checked').each(function () { 729 vals.push($(this).val()); 730 }); 731 fields.push({ label: label, value: vals }); 732 } 733 return; 734 } 735 736 if (type === 'radio') { 737 if (!seen[label]) { 738 seen[label] = true; 739 const val = $form.find('input[data-label="' + label + '"]:checked').val() || ''; 740 fields.push({ label: label, value: val }); 741 } 742 return; 743 } 744 745 if (type === 'file') { 746 // File uploads not sent via AJAX JSON — skip for now. 747 fields.push({ label: label, value: this.files[0] ? this.files[0].name : '' }); 748 return; 749 } 750 751 fields.push({ label: label, value: $el.val() || '' }); 752 }); 753 754 // Show loading state. 755 $submit.prop('disabled', true); 756 $text.css('opacity', '0.5'); 757 $spin.show(); 758 $msg.hide(); 759 760 $.ajax({ 761 url: config.ajaxUrl, 762 type: 'POST', 763 data: { 764 action: 'nfa_form_submit', 765 nonce: config.nonce, 766 form_name: config.formName, 767 action_save: config.actionSave ? '1' : '', 768 action_email: config.actionEmail ? '1' : '', 769 email_to: config.emailTo, 770 email_subject: config.emailSubject, 771 email_from_name: config.emailFromName, 772 email_reply_to: config.emailReplyTo, 773 page_url: window.location.href, 774 fields: JSON.stringify(fields), 775 }, 776 success: function (resp) { 777 $submit.prop('disabled', false); 778 $text.css('opacity', '1'); 779 $spin.hide(); 780 781 if (resp.success) { 782 $msg.removeClass('nfa-form__msg--error').addClass('nfa-form__msg--success') 783 .text(config.successMessage || resp.data.message).show(); 784 $form[0].reset(); 785 $form.find('.nfa-form__field-error').text(''); 786 787 if (config.actionRedirect && config.redirectUrl) { 788 setTimeout(function () { 789 window.location.href = config.redirectUrl; 790 }, 1000); 791 } 792 } else { 793 $msg.removeClass('nfa-form__msg--success').addClass('nfa-form__msg--error') 794 .text(config.errorMessage || resp.data.message || 'Error').show(); 795 } 796 }, 797 error: function () { 798 $submit.prop('disabled', false); 799 $text.css('opacity', '1'); 800 $spin.hide(); 801 $msg.removeClass('nfa-form__msg--success').addClass('nfa-form__msg--error') 802 .text(config.errorMessage || 'Network error. Please try again.').show(); 803 }, 804 }); 805 }); 806 }); 807 }; 808 544 809 $(window).on('elementor/frontend/init', () => { 545 810 if (!window.elementorFrontend || !elementorFrontend.hooks) { … … 553 818 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-image-comparison.default', initImageComparison); 554 819 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-countdown-timer.default', initCountdownTimer); 820 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-hamburger-menu.default', initHamburgerMenu); 821 elementorFrontend.hooks.addAction('frontend/element_ready/nfa-advanced-form.default', initAdvancedForm); 555 822 556 823 // Initialize extensions on every element ready (global). -
nebula-forge-addons-for-elementor/trunk/assets/js/frontend.min.js
r3462573 r3462588 1 !function( t){"use strict";const e=e=>{e.find(".nfa-slider").each(function(){const e=t(this),n=e.find(".nfa-slider__track").get(0);if(!n)return;const o=Math.max(1,Math.min(6,parseInt(e.data("slider-per-view"),10)||3)),a=Math.max(0,parseInt(e.data("slider-gap"),10)||20),i=Array.from(n.children),r=()=>{n.style.gap=a+"px";const t="calc((100% - "+a*(o-1)+"px) / "+o+")";i.forEach(e=>{e.style.flex="0 0 "+t})};if(r(),e.data("slider-bound"))return;let d;e.data("slider-bound",!0),t(window).on("resize.nfaSlider",()=>{clearTimeout(d),d=setTimeout(r,150)}),e.find(".nfa-slider__btn--prev").on("click",()=>{n.scrollBy({left:-n.clientWidth,behavior:"smooth"})}),e.find(".nfa-slider__btn--next").on("click",()=>{n.scrollBy({left:n.clientWidth,behavior:"smooth"})})})},n=e=>{const n=e.find(".nfa-showcase");n.length&&n.each(function(){const e=t(this),n=e.find(".nfa-showcase__track").get(0),o=e.find(".nfa-showcase__dots"),a=Array.from(n.children),i=a.length;if(!n||0===i)return;if(e.data("showcase-bound"))return;e.data("showcase-bound",!0);const r=Math.max(1,parseInt(e.data("per-view"),10)||3),d=Math.max(1,parseInt(e.data("per-view-tablet"),10)||2),s=Math.max(1,parseInt(e.data("per-view-mobile"),10)||1),c=Math.max(0,parseInt(e.data("gap"),10)||20),l="yes"===e.data("autoplay"),f=Math.max(1e3,parseInt(e.data("autoplay-speed"),10)||4e3),u="yes"===e.data("pause-on-hover");let h,p=0,m=null;function w(){const t=window.innerWidth;return t<=767?s:t<=1024?d:r}function _(){return Math.max(0,i-w())}function b(){const e=w(),i="calc((100% - "+c*(e-1)+"px) / "+e+")";if(a.forEach(function(t){t.style.flex="0 0 "+i}),a[0]){const t=a[0].getBoundingClientRect().width+c;n.style.transform="translateX(-"+p*t+"px)"}!function(){if(!o.length)return;const e=_()+1;if(o.children().length!==e){o.empty();for(var n=0;n<e;n++)o.append('<button class="nfa-showcase__dot" data-index="'+n+'" aria-label="Slide '+(n+1)+'"></button>');o.find(".nfa-showcase__dot").on("click",function(){p=parseInt(t(this).data("index"),10),p=Math.min(p,_()),b(),k()})}o.find(".nfa-showcase__dot").removeClass("nfa-showcase__dot--active"),o.find(".nfa-showcase__dot").eq(p).addClass("nfa-showcase__dot--active")}()}function g(){p=p>=_()?0:p+1,b()}function v(){l&&(y(),m=setInterval(g,f))}function y(){m&&(clearInterval(m),m=null)}function k(){l&&(y(),v())}e.find(".nfa-showcase__arrow--prev").on("click",function(){p=p<=0?_():p-1,b(),k()}),e.find(".nfa-showcase__arrow--next").on("click",function(){g(),k()}),u&&l&&(e.on("mouseenter",y),e.on("mouseleave",v)),t(window).on("resize.nfaShowcaseCarousel",function(){clearTimeout(h),h=setTimeout(function(){p=Math.min(p,_()),b()},150)}),b(),v()})},o=e=>{const n=e.find("[data-tabs]");n.length&&n.each(function(){const e=t(this);if(e.data("tabs-bound"))return;e.data("tabs-bound",!0);const n=e.find(".nfa-tabs__btn"),o=e.find(".nfa-tabs__panel");n.on("click",function(){const a=t(this),i=a.attr("aria-controls");n.removeClass("nfa-tabs__btn--active").attr("aria-selected","false"),a.addClass("nfa-tabs__btn--active").attr("aria-selected","true"),o.removeClass("nfa-tabs__panel--active").attr("hidden",!0),e.find("#"+i).addClass("nfa-tabs__panel--active").removeAttr("hidden")})})},a=e=>{const n=e.find("[data-compare]");n.length&&n.each(function(){const e=this,n=t(e);if(n.data("compare-bound"))return;n.data("compare-bound",!0);const o="horizontal"===(n.data("orientation")||"horizontal"),a=n.find(".nfa-compare__before"),i=n.find(".nfa-compare__slider");let r=!1;function d(t){t=Math.max(0,Math.min(100,t)),o?(a.css("clip-path","inset(0 "+(100-t)+"% 0 0)"),i.css("left",t+"%")):(a.css("clip-path","inset(0 0 "+(100-t)+"% 0)"),i.css("top",t+"%"))}function s(t){const n=e.getBoundingClientRect(),a=t.touches?t.touches[0].clientX:t.clientX,i=t.touches?t.touches[0].clientY:t.clientY;return o?(a-n.left)/n.width*100:(i-n.top)/n.height*100}function c(t){r&&(t.preventDefault(),d(s(t)))}function l(){r=!1,t(document).off("mousemove.nfaCompare touchmove.nfaCompare"),t(document).off("mouseup.nfaCompare touchend.nfaCompare")}n.on("mousedown touchstart",function(e){r=!0,d(s(e)),t(document).on("mousemove.nfaCompare touchmove.nfaCompare",c),t(document).on("mouseup.nfaCompare touchend.nfaCompare",l)})})},i=e=>{const n=e.find("[data-countdown]");n.length&&n.each(function(){const e=t(this);if(e.data("countdown-bound"))return;e.data("countdown-bound",!0);const n=new Date(e.data("target")).getTime(),o=e.data("expiry")||{},a=(e.data("units")||"days,hours,minutes,seconds").split(","),i=2*Math.PI*44;function r(){const t=Date.now(),r=Math.max(0,n-t);if(r<=0)return void function(){clearInterval(d);const t=o.action||"none";"message"===t?(e.find(".nfa-countdown__block, .nfa-countdown__sep").hide(),e.find(".nfa-countdown__expiry").show()):"hide"===t?e.hide():"redirect"===t&&o.redirect&&(window.location.href=o.redirect)}();const s=Math.floor(r/1e3),c={days:Math.floor(s/86400),hours:Math.floor(s%86400/3600),minutes:Math.floor(s%3600/60),seconds:s%60};a.forEach(function(t){e.find('[data-digit="'+t+'"]').text(String(c[t]).padStart(2,"0"));const n=e.find('[data-unit="'+t+'"] .nfa-countdown__progress');if(n.length){const e=parseInt(n.data("max"),10)||60,o=i*(1-c[t]/e);n.attr("stroke-dashoffset",o)}})}r();const d=setInterval(r,1e3)})},r=()=>{document.querySelectorAll("[data-nfa-tooltip]").forEach(t=>{if(t._nfaTooltipBound)return;t._nfaTooltipBound=!0;const e=t.getAttribute("data-nfa-tooltip"),n=t.getAttribute("data-nfa-tooltip-pos")||"top",o=t.getAttribute("data-nfa-tooltip-trigger")||"hover",a="0"!==t.getAttribute("data-nfa-tooltip-arrow"),i=parseInt(t.getAttribute("data-nfa-tooltip-duration"),10)||250,r=document.createElement("div");function d(){!function(){const e=t.getBoundingClientRect(),o=r.getBoundingClientRect(),a=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft;let d,s;switch(n){case"bottom":d=e.bottom+a+8,s=e.left+i+e.width/2-o.width/2;break;case"left":d=e.top+a+e.height/2-o.height/2,s=e.left+i-o.width-8;break;case"right":d=e.top+a+e.height/2-o.height/2,s=e.right+i+8;break;default:d=e.top+a-o.height-8,s=e.left+i+e.width/2-o.width/2}r.style.top=d+"px",r.style.left=s+"px"}(),r.classList.add("nfa-tooltip--visible")}function s(){r.classList.remove("nfa-tooltip--visible")}r.className="nfa-tooltip nfa-tooltip--"+n,a||r.classList.add("nfa-tooltip--no-arrow"),r.textContent=e,r.style.transitionDuration=i+"ms",r.setAttribute("role","tooltip"),r.id="nfa-tooltip-"+Math.random().toString(36).substr(2,9),t.setAttribute("aria-describedby",r.id),t.style.position=t.style.position||"relative",document.body.appendChild(r),"click"===o?(t.addEventListener("click",t=>{t.preventDefault(),r.classList.contains("nfa-tooltip--visible")?s():d()}),document.addEventListener("click",e=>{t.contains(e.target)||r.contains(e.target)||s()})):(t.addEventListener("mouseenter",d),t.addEventListener("mouseleave",s),t.addEventListener("focusin",d),t.addEventListener("focusout",s))})};t(window).on("elementor/frontend/init",()=>{window.elementorFrontend&&elementorFrontend.hooks&&(elementorFrontend.hooks.addAction("frontend/element_ready/nfa-testimonial-grid.default",e),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-logo-grid.default",e),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-showcase-carousel.default",n),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-content-tabs.default",o),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-image-comparison.default",a),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-countdown-timer.default",i),elementorFrontend.hooks.addAction("frontend/element_ready/global",()=>{r(),document.querySelectorAll("[data-nfa-wrapper-link]").forEach(t=>{if(t._nfaWrapperLinkBound)return;t._nfaWrapperLinkBound=!0;const e=t.getAttribute("data-nfa-wrapper-link"),n="1"===t.getAttribute("data-nfa-link-external"),o="1"===t.getAttribute("data-nfa-link-nofollow");e&&(t.addEventListener("click",t=>{const a=t.target.tagName.toLowerCase();if("a"!==a&&"button"!==a&&"input"!==a&&"textarea"!==a&&"select"!==a)if(n){const t=window.open(e,"_blank");t&&o&&(t.opener=null)}else window.location.href=e}),t.addEventListener("keydown",e=>{"Enter"===e.key&&t.click()}))})}))})}(jQuery);1 !function(e){"use strict";const t=t=>{t.find(".nfa-slider").each(function(){const t=e(this),n=t.find(".nfa-slider__track").get(0);if(!n)return;const a=Math.max(1,Math.min(6,parseInt(t.data("slider-per-view"),10)||3)),o=Math.max(0,parseInt(t.data("slider-gap"),10)||20),i=Array.from(n.children),r=()=>{n.style.gap=o+"px";const e="calc((100% - "+o*(a-1)+"px) / "+a+")";i.forEach(t=>{t.style.flex="0 0 "+e})};if(r(),t.data("slider-bound"))return;let s;t.data("slider-bound",!0),e(window).on("resize.nfaSlider",()=>{clearTimeout(s),s=setTimeout(r,150)}),t.find(".nfa-slider__btn--prev").on("click",()=>{n.scrollBy({left:-n.clientWidth,behavior:"smooth"})}),t.find(".nfa-slider__btn--next").on("click",()=>{n.scrollBy({left:n.clientWidth,behavior:"smooth"})})})},n=t=>{const n=t.find(".nfa-showcase");n.length&&n.each(function(){const t=e(this),n=t.find(".nfa-showcase__track").get(0),a=t.find(".nfa-showcase__dots"),o=Array.from(n.children),i=o.length;if(!n||0===i)return;if(t.data("showcase-bound"))return;t.data("showcase-bound",!0);const r=Math.max(1,parseInt(t.data("per-view"),10)||3),s=Math.max(1,parseInt(t.data("per-view-tablet"),10)||2),d=Math.max(1,parseInt(t.data("per-view-mobile"),10)||1),f=Math.max(0,parseInt(t.data("gap"),10)||20),l="yes"===t.data("autoplay"),c=Math.max(1e3,parseInt(t.data("autoplay-speed"),10)||4e3),u="yes"===t.data("pause-on-hover");let m,h=0,p=null;function _(){const e=window.innerWidth;return e<=767?d:e<=1024?s:r}function b(){return Math.max(0,i-_())}function g(){const t=_(),i="calc((100% - "+f*(t-1)+"px) / "+t+")";if(o.forEach(function(e){e.style.flex="0 0 "+i}),o[0]){const e=o[0].getBoundingClientRect().width+f;n.style.transform="translateX(-"+h*e+"px)"}!function(){if(!a.length)return;const t=b()+1;if(a.children().length!==t){a.empty();for(var n=0;n<t;n++)a.append('<button class="nfa-showcase__dot" data-index="'+n+'" aria-label="Slide '+(n+1)+'"></button>');a.find(".nfa-showcase__dot").on("click",function(){h=parseInt(e(this).data("index"),10),h=Math.min(h,b()),g(),y()})}a.find(".nfa-showcase__dot").removeClass("nfa-showcase__dot--active"),a.find(".nfa-showcase__dot").eq(h).addClass("nfa-showcase__dot--active")}()}function v(){h=h>=b()?0:h+1,g()}function w(){l&&(k(),p=setInterval(v,c))}function k(){p&&(clearInterval(p),p=null)}function y(){l&&(k(),w())}t.find(".nfa-showcase__arrow--prev").on("click",function(){h=h<=0?b():h-1,g(),y()}),t.find(".nfa-showcase__arrow--next").on("click",function(){v(),y()}),u&&l&&(t.on("mouseenter",k),t.on("mouseleave",w)),e(window).on("resize.nfaShowcaseCarousel",function(){clearTimeout(m),m=setTimeout(function(){h=Math.min(h,b()),g()},150)}),g(),w()})},a=t=>{const n=t.find("[data-tabs]");n.length&&n.each(function(){const t=e(this);if(t.data("tabs-bound"))return;t.data("tabs-bound",!0);const n=t.find(".nfa-tabs__btn"),a=t.find(".nfa-tabs__panel");n.on("click",function(){const o=e(this),i=o.attr("aria-controls");n.removeClass("nfa-tabs__btn--active").attr("aria-selected","false"),o.addClass("nfa-tabs__btn--active").attr("aria-selected","true"),a.removeClass("nfa-tabs__panel--active").attr("hidden",!0),t.find("#"+i).addClass("nfa-tabs__panel--active").removeAttr("hidden")})})},o=t=>{const n=t.find("[data-compare]");n.length&&n.each(function(){const t=this,n=e(t);if(n.data("compare-bound"))return;n.data("compare-bound",!0);const a="horizontal"===(n.data("orientation")||"horizontal"),o=n.find(".nfa-compare__before"),i=n.find(".nfa-compare__slider");let r=!1;function s(e){e=Math.max(0,Math.min(100,e)),a?(o.css("clip-path","inset(0 "+(100-e)+"% 0 0)"),i.css("left",e+"%")):(o.css("clip-path","inset(0 0 "+(100-e)+"% 0)"),i.css("top",e+"%"))}function d(e){const n=t.getBoundingClientRect(),o=e.touches?e.touches[0].clientX:e.clientX,i=e.touches?e.touches[0].clientY:e.clientY;return a?(o-n.left)/n.width*100:(i-n.top)/n.height*100}function f(e){r&&(e.preventDefault(),s(d(e)))}function l(){r=!1,e(document).off("mousemove.nfaCompare touchmove.nfaCompare"),e(document).off("mouseup.nfaCompare touchend.nfaCompare")}n.on("mousedown touchstart",function(t){r=!0,s(d(t)),e(document).on("mousemove.nfaCompare touchmove.nfaCompare",f),e(document).on("mouseup.nfaCompare touchend.nfaCompare",l)})})},i=t=>{const n=t.find("[data-countdown]");n.length&&n.each(function(){const t=e(this);if(t.data("countdown-bound"))return;t.data("countdown-bound",!0);const n=new Date(t.data("target")).getTime(),a=t.data("expiry")||{},o=(t.data("units")||"days,hours,minutes,seconds").split(","),i=2*Math.PI*44;function r(){const e=Date.now(),r=Math.max(0,n-e);if(r<=0)return void function(){clearInterval(s);const e=a.action||"none";"message"===e?(t.find(".nfa-countdown__block, .nfa-countdown__sep").hide(),t.find(".nfa-countdown__expiry").show()):"hide"===e?t.hide():"redirect"===e&&a.redirect&&(window.location.href=a.redirect)}();const d=Math.floor(r/1e3),f={days:Math.floor(d/86400),hours:Math.floor(d%86400/3600),minutes:Math.floor(d%3600/60),seconds:d%60};o.forEach(function(e){t.find('[data-digit="'+e+'"]').text(String(f[e]).padStart(2,"0"));const n=t.find('[data-unit="'+e+'"] .nfa-countdown__progress');if(n.length){const t=parseInt(n.data("max"),10)||60,a=i*(1-f[e]/t);n.attr("stroke-dashoffset",a)}})}r();const s=setInterval(r,1e3)})},r=()=>{document.querySelectorAll("[data-nfa-tooltip]").forEach(e=>{if(e._nfaTooltipBound)return;e._nfaTooltipBound=!0;const t=e.getAttribute("data-nfa-tooltip"),n=e.getAttribute("data-nfa-tooltip-pos")||"top",a=e.getAttribute("data-nfa-tooltip-trigger")||"hover",o="0"!==e.getAttribute("data-nfa-tooltip-arrow"),i=parseInt(e.getAttribute("data-nfa-tooltip-duration"),10)||250,r=document.createElement("div");function s(){!function(){const t=e.getBoundingClientRect(),a=r.getBoundingClientRect(),o=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft;let s,d;switch(n){case"bottom":s=t.bottom+o+8,d=t.left+i+t.width/2-a.width/2;break;case"left":s=t.top+o+t.height/2-a.height/2,d=t.left+i-a.width-8;break;case"right":s=t.top+o+t.height/2-a.height/2,d=t.right+i+8;break;default:s=t.top+o-a.height-8,d=t.left+i+t.width/2-a.width/2}r.style.top=s+"px",r.style.left=d+"px"}(),r.classList.add("nfa-tooltip--visible")}function d(){r.classList.remove("nfa-tooltip--visible")}r.className="nfa-tooltip nfa-tooltip--"+n,o||r.classList.add("nfa-tooltip--no-arrow"),r.textContent=t,r.style.transitionDuration=i+"ms",r.setAttribute("role","tooltip"),r.id="nfa-tooltip-"+Math.random().toString(36).substr(2,9),e.setAttribute("aria-describedby",r.id),e.style.position=e.style.position||"relative",document.body.appendChild(r),"click"===a?(e.addEventListener("click",e=>{e.preventDefault(),r.classList.contains("nfa-tooltip--visible")?d():s()}),document.addEventListener("click",t=>{e.contains(t.target)||r.contains(t.target)||d()})):(e.addEventListener("mouseenter",s),e.addEventListener("mouseleave",d),e.addEventListener("focusin",s),e.addEventListener("focusout",d))})},s=t=>{t.find(".nfa-hamburger").each(function(){const t=e(this);if(t.data("nfa-hm-bound"))return;t.data("nfa-hm-bound",!0);const n=t.find(".nfa-hamburger__toggle"),a=t.find(".nfa-hamburger__panel"),o=t.find(".nfa-hamburger__overlay"),i=t.find(".nfa-hamburger__close"),r=1===t.data("close-on-link")||"1"===t.data("close-on-link"),s=1===t.data("close-on-esc")||"1"===t.data("close-on-esc");function d(){t.removeClass("nfa-hamburger--open"),n.attr("aria-expanded","false"),a.attr("aria-hidden","true"),n.focus()}n.on("click",function(e){e.preventDefault(),t.hasClass("nfa-hamburger--open")?d():(t.addClass("nfa-hamburger--open"),n.attr("aria-expanded","true"),a.attr("aria-hidden","false"),a.find("a, button").first().focus())}),i.on("click",d),o.on("click",d),s&&e(document).on("keydown",function(e){"Escape"===e.key&&t.hasClass("nfa-hamburger--open")&&d()}),r&&a.on("click",".nfa-hamburger__link, .nfa-hamburger__sub-link",function(){const t=e(this).attr("href");t&&"#"!==t&&d()}),t.find(".nfa-hamburger__item--has-sub > .nfa-hamburger__link").on("click",function(t){"#"===e(this).attr("href")&&t.preventDefault(),e(this).parent().toggleClass("nfa-hamburger__item--sub-open")})})},d=t=>{t.find(".nfa-form").each(function(){const t=e(this);if(t.data("nfa-form-bound"))return;t.data("nfa-form-bound",!0);const n=t.data("nfa-form");if(!n)return;const a=t.find(".nfa-form__el"),o=t.find(".nfa-form__submit"),i=t.find(".nfa-form__submit-text"),r=t.find(".nfa-form__spinner"),s=t.find(".nfa-form__msg");function d(t){const o=e(t),i=o.closest(".nfa-form__col").find(".nfa-form__field-error");let r=!0,s="";if(t.required)if("checkbox"===t.type){const e=t.name;a.find('input[name="'+e+'"]:checked').length||(r=!1,s=n.requiredMsg||"This field is required.")}else t.value.trim()||(r=!1,s=n.requiredMsg||"This field is required.");if(r&&t.value.trim()&&("email"!==t.type||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.value)||(r=!1,s="Please enter a valid email address."),"url"!==t.type||/^https?:\/\/.+/.test(t.value)||(r=!1,s="Please enter a valid URL."),"tel"!==t.type||/^[\d\s+\-().]+$/.test(t.value)||(r=!1,s="Please enter a valid phone number."),"file"===t.type)){const e=parseFloat(o.data("max-size")||5);t.files[0]&&t.files[0].size>1024*e*1024&&(r=!1,s="File exceeds "+e+"MB limit.")}return r?(o.removeClass("nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid"),i.text("")):(o.addClass("nfa-form__input--invalid nfa-form__select--invalid nfa-form__textarea--invalid"),i.text(s)),r}a.find("input, textarea, select").on("blur change",function(){d(this)}),a.on("submit",function(t){t.preventDefault();let f=!0;if(a.find("input[required], textarea[required], select[required]").each(function(){d(this)||(f=!1)}),!f)return void a.find(".nfa-form__input--invalid, .nfa-form__select--invalid, .nfa-form__textarea--invalid").first().focus();const l=[],c={};a.find("[data-label]").each(function(){const t=e(this),n=t.data("label"),o=t.attr("type")||this.tagName.toLowerCase();if("checkbox"!==o){if("radio"!==o)"file"!==o?l.push({label:n,value:t.val()||""}):l.push({label:n,value:this.files[0]?this.files[0].name:""});else if(!c[n]){c[n]=!0;const e=a.find('input[data-label="'+n+'"]:checked').val()||"";l.push({label:n,value:e})}}else if(!c[n]){c[n]=!0;const t=[];a.find('input[data-label="'+n+'"]:checked').each(function(){t.push(e(this).val())}),l.push({label:n,value:t})}}),o.prop("disabled",!0),i.css("opacity","0.5"),r.show(),s.hide(),e.ajax({url:n.ajaxUrl,type:"POST",data:{action:"nfa_form_submit",nonce:n.nonce,form_name:n.formName,action_save:n.actionSave?"1":"",action_email:n.actionEmail?"1":"",email_to:n.emailTo,email_subject:n.emailSubject,email_from_name:n.emailFromName,email_reply_to:n.emailReplyTo,page_url:window.location.href,fields:JSON.stringify(l)},success:function(e){o.prop("disabled",!1),i.css("opacity","1"),r.hide(),e.success?(s.removeClass("nfa-form__msg--error").addClass("nfa-form__msg--success").text(n.successMessage||e.data.message).show(),a[0].reset(),a.find(".nfa-form__field-error").text(""),n.actionRedirect&&n.redirectUrl&&setTimeout(function(){window.location.href=n.redirectUrl},1e3)):s.removeClass("nfa-form__msg--success").addClass("nfa-form__msg--error").text(n.errorMessage||e.data.message||"Error").show()},error:function(){o.prop("disabled",!1),i.css("opacity","1"),r.hide(),s.removeClass("nfa-form__msg--success").addClass("nfa-form__msg--error").text(n.errorMessage||"Network error. Please try again.").show()}})})})};e(window).on("elementor/frontend/init",()=>{window.elementorFrontend&&elementorFrontend.hooks&&(elementorFrontend.hooks.addAction("frontend/element_ready/nfa-testimonial-grid.default",t),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-logo-grid.default",t),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-showcase-carousel.default",n),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-content-tabs.default",a),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-image-comparison.default",o),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-countdown-timer.default",i),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-hamburger-menu.default",s),elementorFrontend.hooks.addAction("frontend/element_ready/nfa-advanced-form.default",d),elementorFrontend.hooks.addAction("frontend/element_ready/global",()=>{r(),document.querySelectorAll("[data-nfa-wrapper-link]").forEach(e=>{if(e._nfaWrapperLinkBound)return;e._nfaWrapperLinkBound=!0;const t=e.getAttribute("data-nfa-wrapper-link"),n="1"===e.getAttribute("data-nfa-link-external"),a="1"===e.getAttribute("data-nfa-link-nofollow");t&&(e.addEventListener("click",e=>{const o=e.target.tagName.toLowerCase();if("a"!==o&&"button"!==o&&"input"!==o&&"textarea"!==o&&"select"!==o)if(n){const e=window.open(t,"_blank");e&&a&&(e.opener=null)}else window.location.href=t}),e.addEventListener("keydown",t=>{"Enter"===t.key&&e.click()}))})}))})}(jQuery); -
nebula-forge-addons-for-elementor/trunk/includes/Admin/Admin_Manager.php
r3462573 r3462588 24 24 public const MENU_SLUG_FONTS = 'nebula-forge-addon-fonts'; 25 25 public const MENU_SLUG_CHANGELOG = 'nebula-forge-addon-changelog'; 26 public const MENU_SLUG_SUBMISSIONS = 'nebula-forge-addon-submissions'; 26 27 27 28 public const OPTION_ACTIVATION_REDIRECT = 'nebula_forge_addon_activation_redirect'; … … 35 36 private ?Changelog_Page $changelog_page = null; 36 37 private ?Custom_Fonts_Page $fonts_page = null; 38 private ?Submissions_Page $submissions_page = null; 37 39 38 40 /** … … 57 59 $this->changelog_page = new Changelog_Page(); 58 60 $this->fonts_page = new Custom_Fonts_Page(); 61 $this->submissions_page = new Submissions_Page(); 59 62 } 60 63 … … 128 131 add_submenu_page( 129 132 self::MENU_SLUG_WELCOME, 133 esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 134 esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 135 'manage_options', 136 self::MENU_SLUG_SUBMISSIONS, 137 [$this->submissions_page, 'render'] 138 ); 139 140 add_submenu_page( 141 self::MENU_SLUG_WELCOME, 130 142 esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), 131 143 esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), -
nebula-forge-addons-for-elementor/trunk/includes/Admin/Ui_Helper.php
r3462573 r3462588 40 40 'icon' => 'dashicons-editor-textcolor', 41 41 ], 42 Admin_Manager::MENU_SLUG_SUBMISSIONS => [ 43 'label' => esc_html__('Submissions', 'nebula-forge-addons-for-elementor'), 44 'icon' => 'dashicons-email-alt', 45 ], 42 46 Admin_Manager::MENU_SLUG_CHANGELOG => [ 43 47 'label' => esc_html__('Changelog', 'nebula-forge-addons-for-elementor'), -
nebula-forge-addons-for-elementor/trunk/includes/Admin/Widget_Registry.php
r3462552 r3462588 200 200 'icon' => 'eicon-countdown', 201 201 ], 202 'hamburger_menu' => [ 203 'label' => __('Hamburger Menu', 'nebula-forge-addons-for-elementor'), 204 'description' => __('Off-canvas mobile navigation with slide panel, WP menus or custom items, and submenu support.', 'nebula-forge-addons-for-elementor'), 205 'tooltip' => __('Add a responsive hamburger menu with off-canvas navigation, ideal for mobile-first designs.', 'nebula-forge-addons-for-elementor'), 206 'badge' => __('MENU', 'nebula-forge-addons-for-elementor'), 207 'badge_color' => '#8b5cf6', 208 'category' => 'layout', 209 'class' => Widgets\Hamburger_Menu_Widget::class, 210 'icon' => 'eicon-menu-bar', 211 ], 212 'advanced_form' => [ 213 'label' => __('Advanced Form', 'nebula-forge-addons-for-elementor'), 214 'description' => __('Drag-and-drop form builder with email notifications, database submissions, and field validation.', 'nebula-forge-addons-for-elementor'), 215 'tooltip' => __('Build contact, lead, or registration forms with AJAX submission, validation, and saved entries.', 'nebula-forge-addons-for-elementor'), 216 'badge' => __('FORM', 'nebula-forge-addons-for-elementor'), 217 'badge_color' => '#10b981', 218 'category' => 'conversion', 219 'class' => Widgets\Advanced_Form_Widget::class, 220 'icon' => 'eicon-form-horizontal', 221 ], 202 222 ]; 203 223 } -
nebula-forge-addons-for-elementor/trunk/includes/Plugin.php
r3462573 r3462588 23 23 use NebulaForgeAddon\Extensions\Tooltip_Extension; 24 24 use NebulaForgeAddon\Extensions\Wrapper_Link; 25 use NebulaForgeAddon\Extensions\Form_Handler; 25 26 26 27 /** … … 174 175 Wrapper_Link::init(); 175 176 } 177 178 // Form handler is always active (not a toggle-able extension). 179 Form_Handler::init(); 176 180 } 177 181 -
nebula-forge-addons-for-elementor/trunk/nebula-forge-addons-for-elementor.php
r3462573 r3462588 4 4 * Plugin URI: https://wordpress.org/plugins/nebula-forge-addons-for-elementor/ 5 5 * Description: Professional Elementor widgets for any WordPress page — blogs, portfolios, landing pages, WooCommerce, and beyond. 6 * Version: 0. 6.06 * Version: 0.7.0 7 7 * Author: Zainaster 8 8 * Author URI: https://profiles.wordpress.org/shoaibzain/ … … 22 22 } 23 23 24 define('NEBULA_FORGE_ADDON_VERSION', '0. 6.0');24 define('NEBULA_FORGE_ADDON_VERSION', '0.7.0'); 25 25 define('NEBULA_FORGE_ADDON_FILE', __FILE__); 26 26 define('NEBULA_FORGE_ADDON_BASENAME', plugin_basename(__FILE__)); -
nebula-forge-addons-for-elementor/trunk/readme.txt
r3462573 r3462588 5 5 Tested up to: 6.9.1 6 6 Requires PHP: 7.4 7 Stable tag: 0. 6.07 Stable tag: 0.7.0 8 8 Requires Plugins: elementor 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html 11 11 12 1 7 free Elementor widgets + 4 pro extensions — hero sections, pricing tables, testimonials, FAQs, countdown timers, image comparisons, content tabs, team profiles, CTA banners, display conditions, custom fonts, widget tooltips, wrapper links & more. No Elementor Pro required.12 19 free Elementor widgets + 4 pro extensions — hero sections, pricing tables, testimonials, FAQs, countdown timers, image comparisons, content tabs, team profiles, CTA banners, hamburger menus, advanced forms with submissions, display conditions, custom fonts, widget tooltips, wrapper links & more. No Elementor Pro required. 13 13 14 14 == Description == 15 15 16 **Nebula Forge Addons for Elementor** is a free collection of 1 7 professionally designed Elementor widgets and 4 pro-level extensions. Create stunning hero sections, feature grids, pricing tables, testimonial sliders, FAQ accordions, stats counters, logo carousals, team member profiles, CTA banners, content tabs, image comparison sliders, countdown timers, and more— all without Elementor Pro.16 **Nebula Forge Addons for Elementor** is a free collection of 19 professionally designed Elementor widgets and 4 pro-level extensions. Create stunning hero sections, feature grids, pricing tables, testimonial sliders, FAQ accordions, stats counters, logo carousals, team member profiles, CTA banners, content tabs, image comparison sliders, countdown timers, hamburger menus, and advanced forms with saved submissions — all without Elementor Pro. 17 17 18 18 The plugin also includes powerful extensions that work across ALL Elementor elements: Display Conditions to show/hide content by user role, date, page type, browser, or device; Custom Fonts upload for use in Elementor typography controls; Widget Tooltips with hover/click triggers; and Wrapper Links to make any element fully clickable. … … 22 22 = Highlights = 23 23 * Built for the free Elementor plugin. No Elementor Pro required. 24 * 1 7 professional widgets for hero sections, feature lists, spotlight cards, stats grids, pricing tables, testimonials, FAQs, logo grids, steps, teams, CTAs, tabs, comparisons, and countdowns.24 * 19 professional widgets for hero sections, feature lists, spotlight cards, stats grids, pricing tables, testimonials, FAQs, logo grids, steps, teams, CTAs, tabs, comparisons, countdowns, hamburger menus, and advanced forms. 25 25 * 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links. 26 26 * Detailed style controls for typography, spacing, colors, borders, and hover states. … … 29 29 * Built with capability checks, nonces, and sanitized settings. 30 30 * Layout controls to switch between grid and slider displays. 31 * Custom font uploader with WOFF2, WOFF, and TTF support.31 * Form submission storage with admin list, filters, and single-entry detail view. 32 32 33 33 = Widgets = … … 51 51 * Image Comparison — interactive before/after image comparison slider with draggable handle, labels, and hover options. 52 52 * Countdown Timer — countdown to a target date with blocks, inline, or circle styles, labels, and expiry actions. 53 * Hamburger Menu — off-canvas mobile navigation with slide panel from left, right, or top, WP menus or custom items, submenu support, and three icon styles. 54 * Advanced Form — drag-and-drop form builder with 12 field types, AJAX submission, email notifications, database storage, and redirect actions. 53 55 54 56 = Pro Extensions = … … 96 98 = How do I use Display Conditions? = 97 99 Edit any Elementor element, go to the **Advanced** tab, and expand the **Display Conditions** section. Enable conditions and configure the rules. 100 101 = How do I view form submissions? = 102 Go to **Nebula Forge > Submissions** in wp-admin. You can filter by form name, view submission details, and bulk-delete entries. 98 103 99 104 = Will this slow down my site? = … … 123 128 124 129 == Changelog == 130 = 0.7.0 = 131 * Added Hamburger Menu widget — off-canvas mobile navigation with slide panel (left/right/top), WP nav menu or custom items, submenu accordion, three icon styles, overlay, close on link/ESC, and full style controls. 132 * Added Advanced Form widget — drag-and-drop form builder with 12 field types (text, email, tel, URL, number, textarea, select, radio, checkbox, date, file, hidden), per-field width, validation, AJAX submission, email notifications, database storage, and redirect actions. 133 * Added Form submission handler with rate limiting, nonce verification, and custom post type storage. 134 * Added Submissions admin page with list view, form name filter, pagination, bulk delete, single entry detail, and auto-read status marking. 135 * Added Submissions tab to admin navigation. 136 * Updated frontend CSS with hamburger menu panel animations, form field grid, validation states, and responsive breakpoints. 137 * Updated frontend JS with hamburger toggle/submenu accordion and form AJAX validation/submission handlers. 138 * Bumped total widget count from 17 to 19. 139 125 140 = 0.4.0 = 126 141 * Switched frontend styles from dark theme (CSS custom properties) to light-mode defaults for broader compatibility. … … 212 227 213 228 == Upgrade Notice == 229 = 0.7.0 = 230 2 new widgets: Hamburger Menu and Advanced Form with submission storage. Update recommended. 231 214 232 = 0.6.0 = 215 233 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links. Update recommended.
Note: See TracChangeset
for help on using the changeset viewer.