Plugin Directory

Changeset 3462588


Ignore:
Timestamp:
02/16/2026 02:08:32 PM (5 days ago)
Author:
shoaibzain
Message:

v0.7.0 — Hamburger Menu widget, Advanced Form widget with submission storage, Submissions admin page

Location:
nebula-forge-addons-for-elementor
Files:
8 added
11 edited
15 copied

Legend:

Unmodified
Added
Removed
  • nebula-forge-addons-for-elementor/tags/0.7.0/assets/css/frontend.css

    r3462573 r3462588  
    19391939    outline-offset: 2px;
    19401940}
     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  
    542542    };
    543543
     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
    544809    $(window).on('elementor/frontend/init', () => {
    545810        if (!window.elementorFrontend || !elementorFrontend.hooks) {
     
    553818        elementorFrontend.hooks.addAction('frontend/element_ready/nfa-image-comparison.default', initImageComparison);
    554819        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);
    555822
    556823        // 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  
    2424    public const MENU_SLUG_FONTS = 'nebula-forge-addon-fonts';
    2525    public const MENU_SLUG_CHANGELOG = 'nebula-forge-addon-changelog';
     26    public const MENU_SLUG_SUBMISSIONS = 'nebula-forge-addon-submissions';
    2627
    2728    public const OPTION_ACTIVATION_REDIRECT = 'nebula_forge_addon_activation_redirect';
     
    3536    private ?Changelog_Page $changelog_page = null;
    3637    private ?Custom_Fonts_Page $fonts_page = null;
     38    private ?Submissions_Page $submissions_page = null;
    3739
    3840    /**
     
    5759        $this->changelog_page = new Changelog_Page();
    5860        $this->fonts_page = new Custom_Fonts_Page();
     61        $this->submissions_page = new Submissions_Page();
    5962    }
    6063
     
    128131        add_submenu_page(
    129132            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,
    130142            esc_html__('Changelog', 'nebula-forge-addons-for-elementor'),
    131143            esc_html__('Changelog', 'nebula-forge-addons-for-elementor'),
  • nebula-forge-addons-for-elementor/tags/0.7.0/includes/Admin/Ui_Helper.php

    r3462573 r3462588  
    4040                'icon' => 'dashicons-editor-textcolor',
    4141            ],
     42            Admin_Manager::MENU_SLUG_SUBMISSIONS => [
     43                'label' => esc_html__('Submissions', 'nebula-forge-addons-for-elementor'),
     44                'icon' => 'dashicons-email-alt',
     45            ],
    4246            Admin_Manager::MENU_SLUG_CHANGELOG => [
    4347                '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  
    200200                'icon'        => 'eicon-countdown',
    201201            ],
     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            ],
    202222        ];
    203223    }
  • nebula-forge-addons-for-elementor/tags/0.7.0/includes/Plugin.php

    r3462573 r3462588  
    2323use NebulaForgeAddon\Extensions\Tooltip_Extension;
    2424use NebulaForgeAddon\Extensions\Wrapper_Link;
     25use NebulaForgeAddon\Extensions\Form_Handler;
    2526
    2627/**
     
    174175            Wrapper_Link::init();
    175176        }
     177
     178        // Form handler is always active (not a toggle-able extension).
     179        Form_Handler::init();
    176180    }
    177181
  • nebula-forge-addons-for-elementor/tags/0.7.0/nebula-forge-addons-for-elementor.php

    r3462573 r3462588  
    44 * Plugin URI:        https://wordpress.org/plugins/nebula-forge-addons-for-elementor/
    55 * Description:       Professional Elementor widgets for any WordPress page — blogs, portfolios, landing pages, WooCommerce, and beyond.
    6  * Version:           0.6.0
     6 * Version:           0.7.0
    77 * Author:            Zainaster
    88 * Author URI:        https://profiles.wordpress.org/shoaibzain/
     
    2222}
    2323
    24 define('NEBULA_FORGE_ADDON_VERSION', '0.6.0');
     24define('NEBULA_FORGE_ADDON_VERSION', '0.7.0');
    2525define('NEBULA_FORGE_ADDON_FILE', __FILE__);
    2626define('NEBULA_FORGE_ADDON_BASENAME', plugin_basename(__FILE__));
  • nebula-forge-addons-for-elementor/tags/0.7.0/readme.txt

    r3462573 r3462588  
    55Tested up to: 6.9.1
    66Requires PHP: 7.4
    7 Stable tag: 0.6.0
     7Stable tag: 0.7.0
    88Requires Plugins: elementor
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    12 17 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.
     1219 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.
    1313
    1414== Description ==
    1515
    16 **Nebula Forge Addons for Elementor** is a free collection of 17 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.
    1717
    1818The 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.
     
    2222= Highlights =
    2323* Built for the free Elementor plugin. No Elementor Pro required.
    24 * 17 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.
    2525* 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links.
    2626* Detailed style controls for typography, spacing, colors, borders, and hover states.
     
    2929* Built with capability checks, nonces, and sanitized settings.
    3030* 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.
    3232
    3333= Widgets =
     
    5151* Image Comparison — interactive before/after image comparison slider with draggable handle, labels, and hover options.
    5252* 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.
    5355
    5456= Pro Extensions =
     
    9698= How do I use Display Conditions? =
    9799Edit 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? =
     102Go to **Nebula Forge > Submissions** in wp-admin. You can filter by form name, view submission details, and bulk-delete entries.
    98103
    99104= Will this slow down my site? =
     
    123128
    124129== 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
    125140= 0.4.0 =
    126141* Switched frontend styles from dark theme (CSS custom properties) to light-mode defaults for broader compatibility.
     
    212227
    213228== Upgrade Notice ==
     229= 0.7.0 =
     2302 new widgets: Hamburger Menu and Advanced Form with submission storage. Update recommended.
     231
    214232= 0.6.0 =
    2152334 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  
    19391939    outline-offset: 2px;
    19401940}
     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  
    542542    };
    543543
     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
    544809    $(window).on('elementor/frontend/init', () => {
    545810        if (!window.elementorFrontend || !elementorFrontend.hooks) {
     
    553818        elementorFrontend.hooks.addAction('frontend/element_ready/nfa-image-comparison.default', initImageComparison);
    554819        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);
    555822
    556823        // 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  
    2424    public const MENU_SLUG_FONTS = 'nebula-forge-addon-fonts';
    2525    public const MENU_SLUG_CHANGELOG = 'nebula-forge-addon-changelog';
     26    public const MENU_SLUG_SUBMISSIONS = 'nebula-forge-addon-submissions';
    2627
    2728    public const OPTION_ACTIVATION_REDIRECT = 'nebula_forge_addon_activation_redirect';
     
    3536    private ?Changelog_Page $changelog_page = null;
    3637    private ?Custom_Fonts_Page $fonts_page = null;
     38    private ?Submissions_Page $submissions_page = null;
    3739
    3840    /**
     
    5759        $this->changelog_page = new Changelog_Page();
    5860        $this->fonts_page = new Custom_Fonts_Page();
     61        $this->submissions_page = new Submissions_Page();
    5962    }
    6063
     
    128131        add_submenu_page(
    129132            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,
    130142            esc_html__('Changelog', 'nebula-forge-addons-for-elementor'),
    131143            esc_html__('Changelog', 'nebula-forge-addons-for-elementor'),
  • nebula-forge-addons-for-elementor/trunk/includes/Admin/Ui_Helper.php

    r3462573 r3462588  
    4040                'icon' => 'dashicons-editor-textcolor',
    4141            ],
     42            Admin_Manager::MENU_SLUG_SUBMISSIONS => [
     43                'label' => esc_html__('Submissions', 'nebula-forge-addons-for-elementor'),
     44                'icon' => 'dashicons-email-alt',
     45            ],
    4246            Admin_Manager::MENU_SLUG_CHANGELOG => [
    4347                'label' => esc_html__('Changelog', 'nebula-forge-addons-for-elementor'),
  • nebula-forge-addons-for-elementor/trunk/includes/Admin/Widget_Registry.php

    r3462552 r3462588  
    200200                'icon'        => 'eicon-countdown',
    201201            ],
     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            ],
    202222        ];
    203223    }
  • nebula-forge-addons-for-elementor/trunk/includes/Plugin.php

    r3462573 r3462588  
    2323use NebulaForgeAddon\Extensions\Tooltip_Extension;
    2424use NebulaForgeAddon\Extensions\Wrapper_Link;
     25use NebulaForgeAddon\Extensions\Form_Handler;
    2526
    2627/**
     
    174175            Wrapper_Link::init();
    175176        }
     177
     178        // Form handler is always active (not a toggle-able extension).
     179        Form_Handler::init();
    176180    }
    177181
  • nebula-forge-addons-for-elementor/trunk/nebula-forge-addons-for-elementor.php

    r3462573 r3462588  
    44 * Plugin URI:        https://wordpress.org/plugins/nebula-forge-addons-for-elementor/
    55 * Description:       Professional Elementor widgets for any WordPress page — blogs, portfolios, landing pages, WooCommerce, and beyond.
    6  * Version:           0.6.0
     6 * Version:           0.7.0
    77 * Author:            Zainaster
    88 * Author URI:        https://profiles.wordpress.org/shoaibzain/
     
    2222}
    2323
    24 define('NEBULA_FORGE_ADDON_VERSION', '0.6.0');
     24define('NEBULA_FORGE_ADDON_VERSION', '0.7.0');
    2525define('NEBULA_FORGE_ADDON_FILE', __FILE__);
    2626define('NEBULA_FORGE_ADDON_BASENAME', plugin_basename(__FILE__));
  • nebula-forge-addons-for-elementor/trunk/readme.txt

    r3462573 r3462588  
    55Tested up to: 6.9.1
    66Requires PHP: 7.4
    7 Stable tag: 0.6.0
     7Stable tag: 0.7.0
    88Requires Plugins: elementor
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    12 17 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.
     1219 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.
    1313
    1414== Description ==
    1515
    16 **Nebula Forge Addons for Elementor** is a free collection of 17 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.
    1717
    1818The 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.
     
    2222= Highlights =
    2323* Built for the free Elementor plugin. No Elementor Pro required.
    24 * 17 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.
    2525* 4 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links.
    2626* Detailed style controls for typography, spacing, colors, borders, and hover states.
     
    2929* Built with capability checks, nonces, and sanitized settings.
    3030* 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.
    3232
    3333= Widgets =
     
    5151* Image Comparison — interactive before/after image comparison slider with draggable handle, labels, and hover options.
    5252* 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.
    5355
    5456= Pro Extensions =
     
    9698= How do I use Display Conditions? =
    9799Edit 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? =
     102Go to **Nebula Forge > Submissions** in wp-admin. You can filter by form name, view submission details, and bulk-delete entries.
    98103
    99104= Will this slow down my site? =
     
    123128
    124129== 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
    125140= 0.4.0 =
    126141* Switched frontend styles from dark theme (CSS custom properties) to light-mode defaults for broader compatibility.
     
    212227
    213228== Upgrade Notice ==
     229= 0.7.0 =
     2302 new widgets: Hamburger Menu and Advanced Form with submission storage. Update recommended.
     231
    214232= 0.6.0 =
    2152334 pro extensions: Display Conditions, Custom Fonts, Widget Tooltips, and Wrapper Links. Update recommended.
Note: See TracChangeset for help on using the changeset viewer.