System.register(["@angular/core","@angular/material/core","@angular/cdk/coercion","@angular/common","rxjs","rxjs/operators","@angular/common/http","@angular/platform-browser"],(function(t){"use strict";var e,n,o,i,s,r,a,c,l,h,u,g,f,m,d,_,p,v,I,S,C,E,F,w,R;return{setters:[function(t){e=t.SecurityContext,n=t,t.Injectable,o=t.Optional,t.Inject,i=t.SkipSelf,s=t.ErrorHandler,r=t.InjectionToken,a=t.inject,t.Component,t.ViewEncapsulation,t.ChangeDetectionStrategy,t.Attribute,t.Input,t.NgModule},function(t){c=t.mixinColor,l=t.MatCommonModule},function(t){h=t.coerceBooleanProperty},function(t){u=t.DOCUMENT},function(t){g=t.of,f=t.throwError,m=t.forkJoin,d=t.Subscription},function(t){_=t.tap,p=t.map,v=t.catchError,I=t.finalize,S=t.share,C=t.take},function(t){E=t,F=t.HttpClient},function(t){w=t,R=t.DomSanitizer}],execute:function(){t({ICON_REGISTRY_PROVIDER_FACTORY:L,MAT_ICON_LOCATION_FACTORY:D,getMatIconFailedToSanitizeLiteralError:b,getMatIconFailedToSanitizeUrlError:x,getMatIconNameNotFoundError:y,getMatIconNoHttpProviderError:A});const N=["*"];function y(t){return Error(`Unable to find icon with the name "${t}"`)}function A(){return Error("Could not find HttpClient provider for use with Angular Material icons. Please include the HttpClientModule from @angular/common/http in your app imports.")}function x(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function b(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}class T{constructor(t,e,n){this.url=t,this.svgText=e,this.options=n}}class M{constructor(t,e,n,o){this._httpClient=t,this._sanitizer=e,this._errorHandler=o,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._resolvers=[],this._defaultFontSetClass=["material-icons","mat-ligature-font"],this._document=n}addSvgIcon(t,e,n){return this.addSvgIconInNamespace("",t,e,n)}addSvgIconLiteral(t,e,n){return this.addSvgIconLiteralInNamespace("",t,e,n)}addSvgIconInNamespace(t,e,n,o){return this._addSvgIconConfig(t,e,new T(n,null,o))}addSvgIconResolver(t){return this._resolvers.push(t),this}addSvgIconLiteralInNamespace(t,n,o,i){const s=this._sanitizer.sanitize(e.HTML,o);if(!s)throw b(o);const r=s;return this._addSvgIconConfig(t,n,new T("",r,i))}addSvgIconSet(t,e){return this.addSvgIconSetInNamespace("",t,e)}addSvgIconSetLiteral(t,e){return this.addSvgIconSetLiteralInNamespace("",t,e)}addSvgIconSetInNamespace(t,e,n){return this._addSvgIconSetConfig(t,new T(e,null,n))}addSvgIconSetLiteralInNamespace(t,n,o){const i=this._sanitizer.sanitize(e.HTML,n);if(!i)throw b(n);const s=i;return this._addSvgIconSetConfig(t,new T("",s,o))}registerFontClassAlias(t,e=t){return this._fontCssClassesByAlias.set(t,e),this}classNameForFontAlias(t){return this._fontCssClassesByAlias.get(t)||t}setDefaultFontSetClass(...t){return this._defaultFontSetClass=t,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(t){const n=this._sanitizer.sanitize(e.RESOURCE_URL,t);if(!n)throw x(t);const o=this._cachedIconsByUrl.get(n);return o?g(O(o)):this._loadSvgIconFromConfig(new T(t,null)).pipe(_((t=>this._cachedIconsByUrl.set(n,t))),p((t=>O(t))))}getNamedSvgIcon(t,e=""){const n=U(e,t);let o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(e,t),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);const i=this._iconSetConfigs.get(e);return i?this._getSvgFromIconSetConfigs(t,i):f(y(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(t){return t.svgText?g(O(this._svgElementFromConfig(t))):this._loadSvgIconFromConfig(t).pipe(p((t=>O(t))))}_getSvgFromIconSetConfigs(t,n){const o=this._extractIconWithNameFromAnySet(t,n);if(o)return g(o);const i=n.filter((t=>!t.svgText)).map((t=>this._loadSvgIconSetFromConfig(t).pipe(v((n=>{const o=`Loading icon set URL: ${this._sanitizer.sanitize(e.RESOURCE_URL,t.url)} failed: ${n.message}`;return this._errorHandler.handleError(new Error(o)),g(null)})))));return m(i).pipe(p((()=>{const e=this._extractIconWithNameFromAnySet(t,n);if(!e)throw y(t);return e})))}_extractIconWithNameFromAnySet(t,e){for(let n=e.length-1;n>=0;n--){const o=e[n];if(o.svgText&&o.svgText.toString().indexOf(t)>-1){const e=this._svgElementFromConfig(o),n=this._extractSvgIconFromSet(e,t,o.options);if(n)return n}}return null}_loadSvgIconFromConfig(t){return this._fetchIcon(t).pipe(_((e=>t.svgText=e)),p((()=>this._svgElementFromConfig(t))))}_loadSvgIconSetFromConfig(t){return t.svgText?g(null):this._fetchIcon(t).pipe(_((e=>t.svgText=e)))}_extractSvgIconFromSet(t,e,n){const o=t.querySelector(`[id="${e}"]`);if(!o)return null;const i=o.cloneNode(!0);if(i.removeAttribute("id"),"svg"===i.nodeName.toLowerCase())return this._setSvgAttributes(i,n);if("symbol"===i.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(i),n);const s=this._svgElementFromString("");return s.appendChild(i),this._setSvgAttributes(s,n)}_svgElementFromString(t){const e=this._document.createElement("DIV");e.innerHTML=t;const n=e.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(t){const e=this._svgElementFromString(""),n=t.attributes;for(let t=0;tt)),I((()=>this._inProgressUrlFetches.delete(s))),S());return this._inProgressUrlFetches.set(s,a),a}_addSvgIconConfig(t,e,n){return this._svgIconConfigs.set(U(t,e),n),this}_addSvgIconSetConfig(t,e){const n=this._iconSetConfigs.get(t);return n?n.push(e):this._iconSetConfigs.set(t,[e]),this}_svgElementFromConfig(t){if(!t.svgElement){const e=this._svgElementFromString(t.svgText);this._setSvgAttributes(e,t.options),t.svgElement=e}return t.svgElement}_getIconConfigFromResolvers(t,e){for(let o=0;oe?e.pathname+e.search:""}}const k=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],H=k.map((t=>`[${t}]`)).join(", "),$=/^url\(['"]?#(.*?)['"]?\)$/;class W extends j{get inline(){return this._inline}set inline(t){this._inline=h(t)}get svgIcon(){return this._svgIcon}set svgIcon(t){t!==this._svgIcon&&(t?this._updateSvgIcon(t):this._svgIcon&&this._clearSvgElement(),this._svgIcon=t)}get fontSet(){return this._fontSet}set fontSet(t){const e=this._cleanupFontValue(t);e!==this._fontSet&&(this._fontSet=e,this._updateFontIconClasses())}get fontIcon(){return this._fontIcon}set fontIcon(t){const e=this._cleanupFontValue(t);e!==this._fontIcon&&(this._fontIcon=e,this._updateFontIconClasses())}constructor(t,e,n,o,i,s){super(t),this._iconRegistry=e,this._location=o,this._errorHandler=i,this._inline=!1,this._previousFontSetClass=[],this._currentIconFetch=d.EMPTY,s&&(s.color&&(this.color=this.defaultColor=s.color),s.fontSet&&(this.fontSet=s.fontSet)),n||t.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(t){if(!t)return["",""];const e=t.split(":");switch(e.length){case 1:return["",e[0]];case 2:return e;default:throw Error(`Invalid icon name: "${t}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){const t=this._elementsWithExternalReferences;if(t&&t.size){const t=this._location.getPathname();t!==this._previousPath&&(this._previousPath=t,this._prependPathToReferences(t))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(t){this._clearSvgElement();const e=this._location.getPathname();this._previousPath=e,this._cacheChildrenWithExternalReferences(t),this._prependPathToReferences(e),this._elementRef.nativeElement.appendChild(t)}_clearSvgElement(){const t=this._elementRef.nativeElement;let e=t.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();e--;){const n=t.childNodes[e];1===n.nodeType&&"svg"!==n.nodeName.toLowerCase()||n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;const t=this._elementRef.nativeElement,e=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter((t=>t.length>0));this._previousFontSetClass.forEach((e=>t.classList.remove(e))),e.forEach((e=>t.classList.add(e))),this._previousFontSetClass=e,this.fontIcon===this._previousFontIconClass||e.includes("mat-ligature-font")||(this._previousFontIconClass&&t.classList.remove(this._previousFontIconClass),this.fontIcon&&t.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(t){return"string"==typeof t?t.trim().split(" ")[0]:t}_prependPathToReferences(t){const e=this._elementsWithExternalReferences;e&&e.forEach(((e,n)=>{e.forEach((e=>{n.setAttribute(e.name,`url('${t}#${e.value}')`)}))}))}_cacheChildrenWithExternalReferences(t){const e=t.querySelectorAll(H),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let t=0;t{const i=e[t],s=i.getAttribute(o),r=s?s.match($):null;if(r){let t=n.get(i);t||(t=[],n.set(i,t)),t.push({name:o,value:r[1]})}}))}_updateSvgIcon(t){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),t){const[e,n]=this._splitIconName(t);e&&(this._svgNamespace=e),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,e).pipe(C(1)).subscribe((t=>this._setSvgElement(t)),(t=>{const o=`Error retrieving icon ${e}:${n}! ${t.message}`;this._errorHandler.handleError(new Error(o))}))}}static{this.\u0275fac=function(t){return new(t||W)(n.\u0275\u0275directiveInject(n.ElementRef),n.\u0275\u0275directiveInject(M),n.\u0275\u0275injectAttribute("aria-hidden"),n.\u0275\u0275directiveInject(z),n.\u0275\u0275directiveInject(n.ErrorHandler),n.\u0275\u0275directiveInject(P,8))}}static{this.\u0275cmp=n.\u0275\u0275defineComponent({type:W,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:8,hostBindings:function(t,e){2&t&&(n.\u0275\u0275attribute("data-mat-icon-type",e._usingFontIcon()?"font":"svg")("data-mat-icon-name",e._svgName||e.fontIcon)("data-mat-icon-namespace",e._svgNamespace||e.fontSet)("fontIcon",e._usingFontIcon()?e.fontIcon:null),n.\u0275\u0275classProp("mat-icon-inline",e.inline)("mat-icon-no-color","primary"!==e.color&&"accent"!==e.color&&"warn"!==e.color))},inputs:{color:"color",inline:"inline",svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],features:[n.\u0275\u0275InheritDefinitionFeature],ngContentSelectors:N,decls:1,vars:0,template:function(t,e){1&t&&(n.\u0275\u0275projectionDef(),n.\u0275\u0275projection(0))},styles:["mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}"],encapsulation:2,changeDetection:0})}}t("MatIcon",W);class B{static{this.\u0275fac=function(t){return new(t||B)}}static{this.\u0275mod=n.\u0275\u0275defineNgModule({type:B})}static{this.\u0275inj=n.\u0275\u0275defineInjector({imports:[l,l]})}}t("MatIconModule",B)}}})); Как декорировать скромный балкон для релаксации – Gavin Mostert Attorneys

Как декорировать скромный балкон для релаксации

Как декорировать скромный балкон для релаксации

Небольшой балкон может стать настоящей участком для отдыха, если правильно приступить к обустройству пространства. Немало хозяева квартир расценивают маленькие лоджии минусом, хотя даже пространство в несколько квадратных метров дает создать уютное пространство для утреннего кофе или вечернего чтения.

Преобразование балкона предполагает продуманного способа к подбору мебели, декора и дополнений. Раскладные элементы, многофункциональные объекты и вертикальное озеленение позволяют избежать перегрузки площади. Удачное объединение удобства и зрительной красоты трансформирует лоджию в изолированный уголок.

Формирование приятной обстановки на игровые автоматы на деньги невозможно без понимания индивидуальных вкусов и характера быта владельцев. Кому-то ценна способность перекусить на чистом воздухе, иные хотят о мини-саде с цветами. Универсального способа не наличествует, поэтому стоит определить первостепенные ещё до старта обустройства.

С чего стартовать оформление компактного балкона

Стартовым шагом оказывается анализ физического состояния балкона и выявление способов для его использования. Требуется оценить устойчивость парапета, уровень остекления и наличность гидроизоляции. Закрытый балкон дает больше решений для отделки, чем незастекленная конструкция, склонная влиянию осадков.

Дальнейший период охватывает обмеры пространства и создание чертежа установки объектов. Четкие размеры помогают избежать покупания слишком крупной обстановки. Нужно заранее определить, какие функции будет исполнять лоджия: уголок для чаепития, рабочий офис или пространство для разведения цветов.

Обработка оснований нуждается тщательности к деталям и добротных сырья. Покрытие возможно покрыть водостойким ламинатом, керамической кафелем или террасной доской. Перегородки рекомендуется оформить яркими оттенками, визуально расширяющими территорию. Обогрев лоджии с посредством 100Слотов дает эксплуатировать площадь целый год, обращая её в еще зону.

Как подобрать небольшую мебель для скромного площади

Выбор мебели для миниатюрного лоджии базируется на подходе трансформации и многофункциональности. Складные столы и кресла обеспечивают высвобождать пространство, когда лоджия не задействуется. Откидные системы, монтирующиеся к перегородке, экономят площадь и обеспечивают площадку для размещения чашки или книги.

Компоненты обстановки должны соответствовать обстоятельствам применения на лоджии. Пластиковые элементы характеризуются невесомостью и резистентностью к сырости, стальные изделия с порошковым покрытием служат длительно. Деревянная обстановка предполагает покрытия защитными смесями, зато порождает атмосферу теплоты и природности.

Вмонтированные варианты предельно рационально используют имеющуюся площадь. Узкие лавочки с поднимающимися местами соединяют функции посадочного пространства и механизма размещения. Угловые полки применяют области, которые зачастую являются незаполненными. Правильно подобранная обстановка для онлайн казино трансформирует балкон в рабочую зону без впечатления зажатости.

Какие элементы помогут превратить лоджию комфортнее

Уютное применение лоджии определяется от взвешенного набора дополнений и вспомогательных компонентов. Небольшие элементы образуют обстановку уюта и увеличивают практичность зоны.

Для обустройства лоджии понадобятся следующие элементы:

  • Нежные подушечки и накидки, привносящие комфорта местам
  • Миниатюрный стол на колёсиках, который свободно переставляется
  • Напольный коврик из влагостойких компонентов
  • Термос или маленький электрический чайник для жидкостей
  • Антимоскитная занавеска или гардины, предохраняющие от комаров и солнца
  • Стойки для изданий и журналов

Декоративные предметы обогащают утилитарные вещи и дают балкону индивидуальность. Свечи в фонарях, миниатюрные фигурки или картины на поверхностях выражают пристрастия обладателей. Подбор аксессуаров для казино онлайн определяется от стиля обустройства и собственных предпочтений, важное — не заполнять небольшое площадь излишними вещами.

Как использовать ткани для создания более приятной ауры

Текстильные предметы смягчают сдержанность балконного интерьера и вносят семейного тепла. Подушки различных величин делают твердые места в комфортные пространства для расслабления. Накидки со съёмными наволочками дают оперативно изменять колористическую схему в соотношении от сезона.

Шторы и портьеры исполняют одновременно декоративную и утилитарную функции. Воздушные прозрачные полотна размывают насыщенный солнечный луч, порождая уютную затенение. Плотные материалы оберегают от чужих взглядов и сквозняков. Римские гардины или роллетные конструкции берегут территорию лучше обычных занавесей.

Пледы и накидки привносят тепла и выступают функциональным аксессуаром для прохладных времен. Естественные материи мягки к телу и замечательно терпят стирку, синтетические вещества скорее высыхают. Половички из джута или бамбука создают чувство единения к окружению. Верно найденный текстиль на 100Слотов соединяет несвязанные детали убранства в гармоничную композицию.

Иллюминация лоджии: гирлянды, светильники и портативные светильники

Правильное освещение превращает лоджию в комфортное зону для вечернего релаксации. Естественного освещения предостаточно утром, но с приходом вечера понадобятся дополнительные устройства. Многоярусная конструкция предполагает главный освещение, точечную подсветку и декоративные компоненты.

Настенные бра экономят пространство и предоставляют адресный свет для чтения. Конструкции с подвижным углом отклонения позволяют корректировать вектор освещения. Верхние приборы пригодны для закрытых балконов, вмонтированные точечные элементы образуют сбалансированное освещение.

Украшающее подсветка дарит романтики и оптически раздвигает площадь. Светодиодные гирлянды затрачивают минимум энергии и действуют ряд циклов. Светильники на солнечных батареях не предполагают соединения к проводке. Передвижные источники комфортны тем, что их возможно передвигать в необходимую область. Подсветка на онлайн казино обязано быть достаточно ярким для удобства, но не бьющим.

Как добавить зелень и не захламить место

Культуры освежают лоджию и обеспечивают единение с окружением, но предполагают взвешенного установки. Вертикальное озеленение помогает разводить цветы и зелень без задействования полового места. Настенные кашпо, подвесные контейнеры и целевые стеллажи используют высоту поверхностей, сохраняя пространство для обстановки.

Выбирание цветов определяется от уровня освещенности и погодных условий балкона. Тенелюбивые разновидности соответствуют для северной ориентации, солнцелюбивые виды хорошо чувствуют себя на южных балконах. Суккуленты нуждаются скромного обслуживания, ампельные растения красиво опускаются из емкостей. Душистые растения объединяют эстетическую задачу с практической выгодой.

Компактные емкости и многоуровневые стойки способствуют разместить ряд культур на ограниченной территории. Угловые полки эксплуатируют пространство, которое зачастую простаивает. Ограждение балкона разрешается задействовать для крепления специальных контейнеров. Озеленение на казино онлайн создаёт комфортный среду и повышает внешний вид, существенное — не обращать лоджию в лес.

Какие системы размещения пригодны для небольшого балкона

Устройство хранения на балконе обеспечивает поддерживать аккуратность и предельно использовать имеющееся пространство. Правильные механизмы утаивают предметы от взоров, сохраняя эстетичный образ пространства релаксации.

Результативные варианты для размещения на небольшом лоджии:

  • Лавочки с поднимающимися местами для накидок, думок и вещей
  • Компактные полки высотой до потолка
  • Настенные шкафчики на перегородках выше отметки головы
  • Емкости и емкости под скамейками или столиками
  • Крючки и рейлинги для принадлежностей
  • Раскладные хранилища для вещиц

Вертикальные системы хранения освобождают напольное и превращают балкон зрительно шире. Запертые шкафы предохраняют наполнение от загрязнений и сырости, доступные полки соответствуют для украшающих вещей. Составные решения обеспечивают изменять компоновку в соотношении от запросов. Хранение на 100Слотов обязано быть продуманным, чтобы требуемые объекты оставались под доступом, но не порождали бардака.

Как спроектировать лоджию с соблюдением сезона и климатических параметров

Периодические колебания требуют адаптации балконного пространства к метеорологическим условиям. Летом приоритетом выступает защита от тепла и света, зимой значимо сохранить теплоту. Адаптивное декорирование обеспечивает использовать балкон целый сезон, варьируя только некоторые детали украшения.

Летний период предполагает тонкие натуральные полотна, интенсивные тона и обилие зелени. Тенты или матерчатые укрытия образуют тень в обеденные моменты. Вентиляторы позволяют выносить зной на закрытых лоджиях. Съёмные антимоскитные сетки дают удобство без насекомых.

Зимнее время сезона предполагает теплоизоляции и организации камерной обстановки. Толстые гардины удерживают температуру внутри комнаты, тёплые покрывала и ворсистые пледы вносят уюта. Обогреватели инфракрасного вида качественно обогревают маленькое площадь. Уютное освещение возмещает недостаток естественного потока. Обустройство балкона с принятием онлайн казино обращает территорию рабочим в произвольную погоду, трансформируя его в настоящую область отдыха вне от температуры за стеклом.

Как сберечь свободное площадь и обустроить приятную область для отдыха

Гармония между полезностью и открытым площадью решает качество оформления небольшого балкона. Избыточность мебелью порождает чувство тесноты, лаконизм делает лоджию неуютным. Лучшее подход заключается в внимательном отборе объектов, каждый из которых осуществляет специфическую роль.

Оптическое раздвижение объема реализуется многими техниками оформления. Пастельные цвета перегородок и потолка рассеивают свет и порождают чувство воздушности. Отражающие покрытия или лакированные материалы удваивают оптический пространство. Прозрачная мебель из полимера или стекла не захламляет пространство.

Периодическая проверка вещей балкона помогает отделаться от избыточных вещей. Сезонные предметы следует прятать в чулан, оставляя лишь актуальные элементы. Многофункциональные решения сберегают площадь результативнее монофункциональных вещей. Продуманное планирование на казино онлайн трансформирует даже максимально маленький балкон в полноценное пространство для релаксации, где приятно организовывать моменты в тишине или компании.

Leave a Comment

Your email address will not be published. Required fields are marked *

Message Us on WhatsApp