ngx-sfc-common 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +460 -0
  2. package/esm2020/lib/components/button/button-type.enum.mjs +9 -0
  3. package/esm2020/lib/components/button/button.component.mjs +38 -0
  4. package/esm2020/lib/components/checkmark/checkmark.component.mjs +27 -0
  5. package/esm2020/lib/components/delimeter/delimeter.component.mjs +11 -0
  6. package/esm2020/lib/components/dots/dots.component.mjs +30 -0
  7. package/esm2020/lib/components/hamburger/hamburger.component.mjs +24 -0
  8. package/esm2020/lib/components/index.mjs +20 -0
  9. package/esm2020/lib/components/loader/bounce/bounce-loader.component.mjs +13 -0
  10. package/esm2020/lib/components/loader/circle/circle-loader-type.enum.mjs +6 -0
  11. package/esm2020/lib/components/loader/circle/circle-loader.component.mjs +20 -0
  12. package/esm2020/lib/components/loader/loader-base.component.mjs +51 -0
  13. package/esm2020/lib/components/loader/loader.constants.mjs +6 -0
  14. package/esm2020/lib/components/loader/loader.event.mjs +2 -0
  15. package/esm2020/lib/components/loader/service/loader.service.mjs +76 -0
  16. package/esm2020/lib/components/modal/directive/modal-open-on-click.directive.mjs +50 -0
  17. package/esm2020/lib/components/modal/footer/default/default-modal-footer.component.mjs +48 -0
  18. package/esm2020/lib/components/modal/footer/default/default-modal-footer.model.mjs +2 -0
  19. package/esm2020/lib/components/modal/header/default/default-modal-header.component.mjs +31 -0
  20. package/esm2020/lib/components/modal/header/default/default-modal-header.model.mjs +2 -0
  21. package/esm2020/lib/components/modal/modal-template.enum.mjs +7 -0
  22. package/esm2020/lib/components/modal/modal.component.mjs +107 -0
  23. package/esm2020/lib/components/modal/service/modal.service.mjs +26 -0
  24. package/esm2020/lib/components/toggle-switcher/toggle-switcher.component.mjs +31 -0
  25. package/esm2020/lib/components/toggle-switcher/toggle-switcher.model.mjs +2 -0
  26. package/esm2020/lib/components/tooltip/tooltip-type.enum.mjs +6 -0
  27. package/esm2020/lib/components/tooltip/tooltip.component.mjs +69 -0
  28. package/esm2020/lib/constants/common.constants.mjs +6 -0
  29. package/esm2020/lib/constants/date-time.constants.mjs +8 -0
  30. package/esm2020/lib/constants/index.mjs +4 -0
  31. package/esm2020/lib/constants/ui.constants.mjs +16 -0
  32. package/esm2020/lib/directives/click-outside/click-outside.directive.mjs +65 -0
  33. package/esm2020/lib/directives/click-outside/click-outside.event.mjs +2 -0
  34. package/esm2020/lib/directives/component-size/component-size.directive.mjs +46 -0
  35. package/esm2020/lib/directives/index.mjs +7 -0
  36. package/esm2020/lib/directives/mouse-down/mouse-down.directive.mjs +37 -0
  37. package/esm2020/lib/directives/show-hide-element/show-hide-element.directive.mjs +42 -0
  38. package/esm2020/lib/directives/template-reference/template-reference.directive.mjs +21 -0
  39. package/esm2020/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.mjs +38 -0
  40. package/esm2020/lib/enums/common.enums.mjs +69 -0
  41. package/esm2020/lib/enums/index.mjs +2 -0
  42. package/esm2020/lib/ngx-sfc-common.module.mjs +135 -0
  43. package/esm2020/lib/services/document-ref.service.mjs +70 -0
  44. package/esm2020/lib/services/index.mjs +4 -0
  45. package/esm2020/lib/services/resize.service.mjs +42 -0
  46. package/esm2020/lib/services/window-ref.service.mjs +70 -0
  47. package/esm2020/lib/utils/collections.utils.mjs +244 -0
  48. package/esm2020/lib/utils/common.utils.mjs +86 -0
  49. package/esm2020/lib/utils/date-time.utils.mjs +208 -0
  50. package/esm2020/lib/utils/file.utils.mjs +52 -0
  51. package/esm2020/lib/utils/index.mjs +7 -0
  52. package/esm2020/lib/utils/string.utils.mjs +31 -0
  53. package/esm2020/lib/utils/ui.utils.mjs +39 -0
  54. package/esm2020/ngx-sfc-common.mjs +5 -0
  55. package/esm2020/public-api.mjs +11 -0
  56. package/fesm2015/ngx-sfc-common.mjs +1908 -0
  57. package/fesm2015/ngx-sfc-common.mjs.map +1 -0
  58. package/fesm2020/ngx-sfc-common.mjs +1900 -0
  59. package/fesm2020/ngx-sfc-common.mjs.map +1 -0
  60. package/lib/components/button/button-type.enum.d.ts +7 -0
  61. package/lib/components/button/button.component.d.ts +13 -0
  62. package/lib/components/checkmark/checkmark.component.d.ts +8 -0
  63. package/lib/components/delimeter/delimeter.component.d.ts +5 -0
  64. package/lib/components/dots/dots.component.d.ts +9 -0
  65. package/lib/components/hamburger/hamburger.component.d.ts +7 -0
  66. package/lib/components/index.d.ts +21 -0
  67. package/lib/components/loader/bounce/bounce-loader.component.d.ts +6 -0
  68. package/lib/components/loader/circle/circle-loader-type.enum.d.ts +4 -0
  69. package/lib/components/loader/circle/circle-loader.component.d.ts +8 -0
  70. package/lib/components/loader/loader-base.component.d.ts +27 -0
  71. package/lib/components/loader/loader.constants.d.ts +5 -0
  72. package/lib/components/loader/loader.event.d.ts +4 -0
  73. package/lib/components/loader/service/loader.service.d.ts +33 -0
  74. package/lib/components/modal/directive/modal-open-on-click.directive.d.ts +17 -0
  75. package/lib/components/modal/footer/default/default-modal-footer.component.d.ts +19 -0
  76. package/lib/components/modal/footer/default/default-modal-footer.model.d.ts +6 -0
  77. package/lib/components/modal/header/default/default-modal-header.component.d.ts +14 -0
  78. package/lib/components/modal/header/default/default-modal-header.model.d.ts +5 -0
  79. package/lib/components/modal/modal-template.enum.d.ts +5 -0
  80. package/lib/components/modal/modal.component.d.ts +25 -0
  81. package/lib/components/modal/service/modal.service.d.ts +12 -0
  82. package/lib/components/toggle-switcher/toggle-switcher.component.d.ts +11 -0
  83. package/lib/components/toggle-switcher/toggle-switcher.model.d.ts +4 -0
  84. package/lib/components/tooltip/tooltip-type.enum.d.ts +4 -0
  85. package/lib/components/tooltip/tooltip.component.d.ts +22 -0
  86. package/lib/constants/common.constants.d.ts +5 -0
  87. package/lib/constants/date-time.constants.d.ts +7 -0
  88. package/lib/constants/index.d.ts +3 -0
  89. package/lib/constants/ui.constants.d.ts +15 -0
  90. package/lib/directives/click-outside/click-outside.directive.d.ts +23 -0
  91. package/lib/directives/click-outside/click-outside.event.d.ts +4 -0
  92. package/lib/directives/component-size/component-size.directive.d.ts +13 -0
  93. package/lib/directives/index.d.ts +7 -0
  94. package/lib/directives/mouse-down/mouse-down.directive.d.ts +12 -0
  95. package/lib/directives/show-hide-element/show-hide-element.directive.d.ts +13 -0
  96. package/lib/directives/template-reference/template-reference.directive.d.ts +9 -0
  97. package/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.d.ts +13 -0
  98. package/lib/enums/common.enums.d.ts +61 -0
  99. package/lib/enums/index.d.ts +1 -0
  100. package/lib/ngx-sfc-common.module.d.ts +27 -0
  101. package/lib/services/document-ref.service.d.ts +43 -0
  102. package/lib/services/index.d.ts +3 -0
  103. package/lib/services/resize.service.d.ts +32 -0
  104. package/lib/services/window-ref.service.d.ts +43 -0
  105. package/lib/utils/collections.utils.d.ts +135 -0
  106. package/lib/utils/common.utils.d.ts +50 -0
  107. package/lib/utils/date-time.utils.d.ts +131 -0
  108. package/lib/utils/file.utils.d.ts +25 -0
  109. package/lib/utils/index.d.ts +6 -0
  110. package/lib/utils/string.utils.d.ts +19 -0
  111. package/lib/utils/ui.utils.d.ts +24 -0
  112. package/ngx-sfc-common.d.ts +5 -0
  113. package/package.json +53 -0
  114. package/public-api.d.ts +7 -0
package/README.md ADDED
@@ -0,0 +1,460 @@
1
+ # ngx-sfc-common
2
+
3
+ This is shared library for Street Football Club (SFC) project, that contains components, directives, utils, enums and constants that will be used in related libraries: [ngx-sfc-inputs](https://github.com/1kriva1/ngx-sfc/tree/master/projects/ngx-sfc-inputs) and [ngx-sfc-components](https://github.com/1kriva1/ngx-sfc/tree/master/projects/ngx-sfc-components)
4
+
5
+ ## Compatibility
6
+
7
+ ngx-sfc-common | Angular
8
+ ------------------------|--------
9
+ 0.x.x (latest `0.0.1`) | 13.x.x
10
+
11
+ ## Table of Contents
12
+
13
+ - [Get started](#get-started)
14
+ - [Directives](#directives)
15
+ - [Click out side](#click-out-side-sfcclickoutside)
16
+ - [Component size](#component-size-sfccomponentsize)
17
+ - [Mouse down](#mouse-down-sfcmousedown)
18
+ - [Show/Hide element](#showhide-element-sfcshowhideelement)
19
+ - [Template reference](#template-reference-sfctemplatereference)
20
+ - [Throw element on hover](#throw-element-on-hover-sfcthrowelementonhover)
21
+ - [Components](#components)
22
+ - [Button](#button-sfc-button)
23
+ - [Checkmark](#checkmark-sfc-checkmark)
24
+ - [Delimeter](#delimeter-sfc-delimeter)
25
+ - [Dots](#dots-sfc-dots)
26
+ - [Hamburger](#hamburger-sfc-hamburger)
27
+ - [Loader](#loader-sfc-bounce-loader-sfc-circle-loader)
28
+ - [Modal](#modal-sfc-modal)
29
+ - [Toggle-switcher](#toggle-switcher-sfc-toggle-switcher)
30
+ - [Tooltip](#tooltip-sfc-tooltip)
31
+ - [Services](#services)
32
+ - [Resize](#resize)
33
+ - [Utils](#utils)
34
+
35
+ ## Get started
36
+
37
+ 1. Run `npm install ngx-sfc-common` or `ng add ngx-sfc-common`.
38
+ 2. Import `NgxSfcCommonModule` into a module where you intend to use components and directives:
39
+
40
+ ```typescript
41
+ import { NgxSfcCommonModule } from 'ngx-sfc-common';
42
+ @NgModule({
43
+ imports: [ NgxSfcCommonModule ]
44
+ })
45
+ export class SomeModule { }
46
+ ```
47
+
48
+ ## Directives
49
+
50
+ ## **Click out side `[sfcClickOutside]`**
51
+
52
+ This directive can be usefull when need to detect if click event occured on specific HTML element (or it descendants) or outside it.
53
+
54
+ Add directive `[sfcClickOutside]` to element that you whant to check:
55
+
56
+ ```html
57
+ <div class="target" [sfcClickOutside]="value" (action)="onClick($event)"></div>
58
+ ```
59
+
60
+ Parameters:
61
+ 1. `[sfcClickOutside]="value"` - if value is true, directive will listen click events, othervise ignoring.
62
+ 2. `(action)` - function to handle click events
63
+
64
+ After clicking, directive will emit `ClickOutsideEvent` event for `(action)` output function.
65
+
66
+ `ClickOutsideEvent` has such structure:
67
+
68
+ ```typescript
69
+ export interface ClickOutsideEvent {
70
+ target: EventTarget | null;
71
+ value: boolean;
72
+ }
73
+ ```
74
+ 1. `target` - clicked element
75
+ 2. `value` - true if clicked outside target element (which has directive on it)
76
+
77
+ ## **Component size `[sfcComponentSize]`**
78
+
79
+ This directive allow to set defined size (Small, Medium or Large) or custom size in `em` units on element.
80
+
81
+ Add `[sfcComponentSize]` with value `ComponentSize` or add `[customSize]` for setting custom size:
82
+
83
+ ```html
84
+ <div class="target" [sfcComponentSize]="ComponentSize.Small" [customSize]="customSize">
85
+ ```
86
+
87
+ Parameters:
88
+ 1. `sfcComponentSize` expect enum `ComponentSize` value
89
+
90
+ `ComponentSize` has three posible values:
91
+
92
+ ComponentSize | CSS Value
93
+ --------------|-----------
94
+ Small | 0.5em
95
+ Medium | 1em
96
+ Large | 2em
97
+
98
+ 2. `customSize` - custom size as number (`em` unit will be added)
99
+
100
+ ## **Mouse down `(sfcMouseDown)`**
101
+
102
+ This directive allow clicking only by specific mouse button (by default allow left button click).
103
+
104
+ Add `(sfcMouseDown)="click($event)"` for defined click event handler and `[button]` to define what mouse button allowed to do this click:
105
+
106
+ ```html
107
+ <div class="target" (sfcMouseDown)="click($event)" [button]="button">
108
+ ```
109
+
110
+ Parameters:
111
+ 1. `(sfcMouseDown)` - if button allowed this action will be emitted
112
+ 2. `button` - define button, which will be allowed for clicking
113
+
114
+ ## **Show/Hide element `[sfcShowHideElement]`**
115
+
116
+ This directive allow to show or hide element with delay.
117
+
118
+ Add `[sfcShowHideElement]="show"` for defined show or hide element and `[delay]` for delay between show and hide states:
119
+
120
+ ```html
121
+ <div class="target" [sfcShowHideElement]="show" [delay]="delay">
122
+ ```
123
+
124
+ Parameters:
125
+ 1. `[sfcShowHideElement]` - if pass true value, than show element, otherwise hide
126
+ 2. `[delay]` - delay for show/hide animation (0.5s by default)
127
+
128
+ ## **Template reference `[sfcTemplateReference]`**
129
+
130
+ This directive allow to define templates by name and query these templates as array inside component.
131
+
132
+ Add `ng-template` with directive `[sfcTemplateReference]="ModalTemplate.Header"` (`ModalTemplate.Header` it's a name for template):
133
+
134
+ ```html
135
+ <ng-template [sfcTemplateReference]="ModalTemplate.Header">
136
+ <div>
137
+ <div>{{HEADER_MODEL.Title}}</div>
138
+ <i class="{{HEADER_MODEL.Icon}}"></i>
139
+ <button (click)="FOOTER_MODEL.Click()">hide model</button>
140
+ </div>
141
+ </ng-template>
142
+ ```
143
+
144
+ Inside component query all templates by directive:
145
+
146
+ ```typescript
147
+ @ContentChildren(TemplateReferenceDirective, { read: TemplateReferenceDirective })
148
+ private templates: QueryList<TemplateReferenceDirective> | undefined;
149
+ ```
150
+
151
+ Get template by name `templateName`:
152
+
153
+ ```typescript
154
+ const templateRef = firstOrDefault(this.templates?.toArray(),
155
+ t => t.templateName == ModalTemplate.Header);
156
+ ```
157
+
158
+ Parameters:
159
+ 1. `[sfcTemplateReference]` - name(identificator) for template
160
+
161
+ ## **Throw element on hover `[sfcThrowElementOnHover]`**
162
+
163
+ This directive allow to throw element on `mouseenter` by Y axis and than back element on `mouseleave`.
164
+
165
+ Add directive `[sfcThrowElementOnHover]` with throw power `value`:
166
+
167
+ ```html
168
+ <div class="target" [sfcThrowElementOnHover]="value">
169
+ ```
170
+
171
+ Parameters:
172
+ 1. `[sfcThrowElementOnHover]` - with which power will throw element
173
+
174
+ ## Components
175
+
176
+ ## **Button `<sfc-button>`**
177
+
178
+ Button component allow to define several visualization types, add text, icons before and after text and make button disabled.
179
+
180
+ ```html
181
+ <sfc-button iconBefore="fa fa-star" text="Button" iconAfter="fa fa-car" [disabled]="false" [types]="[ButtonType.Rounded,ButtonType.Filled]">
182
+ </sfc-button>
183
+ ```
184
+
185
+ Parameters:
186
+ 1. `iconBefore` - icon before text
187
+ 2. `iconAfter` - icon after text
188
+ 3. `text` - button text
189
+ 4. `[disabled]` - disable button
190
+ 5. `[types]` - visualization types
191
+
192
+ Visualization types:
193
+ 1. Bordered - `ButtonType.Bordered`
194
+ 2. Filled - `ButtonType.Filled`
195
+ 3. Texted - `ButtonType.Texted`
196
+ 4. Circled - `ButtonType.Circled`
197
+ 5. Rounded - `ButtonType.Rounded`
198
+
199
+ Types can be combinated.
200
+
201
+ ## **Checkmark `<sfc-checkmark>`**
202
+
203
+ Check mark with possibility to change icon value. Can be used for checking rows in table rows.
204
+
205
+ ```html
206
+ <sfc-checkmark [active]="value" icon="fa fa-star"></sfc-checkmark>
207
+ ```
208
+
209
+ Parameters:
210
+ 1. `[active]` - check value, if checked - will have true value
211
+ 2. `icon` - icon value inside checkmark (default value - `fa fa-check`)
212
+
213
+ ## **Delimeter `<sfc-delimeter>`**
214
+
215
+ Can be used for separate element on UI.
216
+
217
+ ```html
218
+ <sfc-delimeter></sfc-delimeter>
219
+ ```
220
+
221
+ ## **Dots `<sfc-dots>`**
222
+
223
+ Dots component for toggling menues or dropdowns visibility.
224
+
225
+ ```html
226
+ <sfc-dots [open]="open" [direction]="Direction.Horizontal"></sfc-dots>
227
+ ```
228
+
229
+ Parameters:
230
+ 1. `[open]` - define open/close state
231
+ 2. `[direction]` - dots direction
232
+
233
+ Directions:
234
+ 1. Horizontal - `Direction.Horizontal`
235
+ 2. Vertical - `Direction.Vertical`
236
+
237
+ ## **Hamburger `<sfc-hamburger>`**
238
+
239
+ Hamburger element for toggling menues.
240
+
241
+ ```html
242
+ <sfc-hamburger [open]="open"></sfc-hamburger>
243
+ ```
244
+
245
+ Parameters:
246
+ 1. `[open]` - define open/close state
247
+
248
+ ## **Loader `<sfc-bounce-loader>, <sfc-circle-loader>`**
249
+
250
+ Loader component allow to show/hide loaders on specific elements or globally on all window object.
251
+
252
+ There two types of loaders:
253
+ 1. Global - `id` value must be NULL
254
+ 2. Local - `id` value is required and must be unique
255
+
256
+ Add `<sfc-bounce-loader>` loader component:
257
+
258
+ ```html
259
+ <sfc-bounce-loader id="bounceLoader" [start]="true"></sfc-bounce-loader>
260
+ ```
261
+
262
+ Add `<button>` for showing and hidding loader (just for example):
263
+
264
+ ```html
265
+ <button (click)="showLoader('bounceLoader')">Show</button>
266
+ <button (click)="hideLoader('bounceLoader')">Hide</button>
267
+ ```
268
+
269
+ Inject `LoaderService` inside component:
270
+
271
+ ```typescript
272
+ constructor(private loaderService: LoaderService) { }
273
+ ```
274
+
275
+ Add `showLoader` and `hideLoader` methods for buttons:
276
+
277
+ ```typescript
278
+ public showLoader(id?: string): void {
279
+ this.loaderService.show(id);
280
+ }
281
+
282
+ public hideLoader(id?: string): void {
283
+ this.loaderService.hide(id);
284
+ }
285
+ ```
286
+
287
+ There are several types for visual representations of loaders:
288
+ 1. Bounce - `<sfc-bounce-loader>`
289
+ 2. Circle - `<sfc-circle-loader>`
290
+ 3. Circle-fading - `<sfc-circle-loader [type]="CircleLoaderType.Fading">`
291
+
292
+ Additional parameters:
293
+ 1. `[start]` - start loading on loader init (false by default)
294
+ 2. `[background]` - add overlay on loading (true by default)
295
+
296
+ ## **Modal `<sfc-modal>`**
297
+
298
+ Component allow to add/remove modal on all window object.
299
+ Modal contains three main parts: `header`, `body` and `footer`. All these parts can be replaced by reference or content templates.
300
+ If reference and content templates not provided, `header` and `footer` parts have default implementation.
301
+
302
+ Register button as modal handler by directive `*sfcModalOpenOnClick`. When click on this button, modal will add/removed:
303
+
304
+ ```html
305
+ <button #defaultModalBtn>Default modal</button>
306
+ <sfc-modal *sfcModalOpenOnClick="defaultModalBtn"></sfc-modal>
307
+ ```
308
+
309
+ Possible severals handlers:
310
+
311
+ ```html
312
+ <button #defaultOneModalBtn>Button 1</button>
313
+ <button #defaultSecondModalBtn>Button 1</button>
314
+ <sfc-modal *sfcModalOpenOnClick="[defaultOneModalBtn, defaultSecondModalBtn]"></sfc-modal>
315
+ ```
316
+
317
+ Examles of setting modal parts:
318
+
319
+ - References:
320
+
321
+ ```html
322
+ <ng-template #headerRef>
323
+ <div>
324
+ <div>{{HEADER_MODEL.Title}}</div>
325
+ </div>
326
+ </ng-template>
327
+
328
+ <ng-template #footerRef>
329
+ <div>
330
+ <div>{{FOOTER_MODEL.Title}}</div>
331
+ </div>
332
+ </ng-template>
333
+
334
+ <sfc-modal [header]="headerRef" [footer]="footerRef"></sfc-modal>
335
+ ```
336
+
337
+ - Templates:
338
+
339
+ ```html
340
+ <sfc-modal>
341
+ <ng-template [sfcTemplateReference]="ModalTemplate.Header">
342
+ <div>
343
+ <div>{{HEADER_MODEL.Title}}</div>
344
+ </div>
345
+ </ng-template>
346
+ <ng-template [sfcTemplateReference]="ModalTemplate.Footer">
347
+ <div>
348
+ <div>{{FOOTER_MODEL.Title}}</div>
349
+ </div>
350
+ </ng-template>
351
+ </sfc-modal>
352
+ ```
353
+
354
+ Modal can be added/removed by `ModalService`:
355
+
356
+ ```typescript
357
+ constructor(private modalService: ModalService) { }
358
+
359
+ // open
360
+ this.modalService.open();
361
+
362
+ // close
363
+ this.modalService.close();
364
+ ```
365
+
366
+ Additional parameters:
367
+ 1. `hideOnEsc` - if true, than modal can be removed on Escape button (by default true)
368
+ 2. `hideOnClickOutside` - if true, than modal can be removed on click outside of modal (by default true)
369
+
370
+ ## **Toggle-switcher `<sfc-toggle-switcher>`**
371
+
372
+ Component allow to add toggler with posibility to define text and icon for left and right part of component.
373
+ Can be used for toggling dark and light themes on page, toggling table types (rows or cards).
374
+
375
+ ```html
376
+ <sfc-toggle-switcher [active]="false" [leftModel]="{label:'test1', icon:'fa fa-car'}"
377
+ [rightModel]="{label:'test1', icon:'fa fa-star'}">
378
+ </sfc-toggle-switcher>
379
+ ```
380
+
381
+ Parameters:
382
+ 1. `[active]` - if true, toggler will move to right side
383
+ 2. `[leftModel]` - left model
384
+ 3. `[rightModel]` - right model
385
+
386
+ Model contract:
387
+
388
+ ```typescript
389
+ export interface IToggleSwitcherModel {
390
+ label: string,
391
+ icon?: string;
392
+ }
393
+ ```
394
+
395
+ ## **Tooltip `<sfc-tooltip>`**
396
+
397
+ Allow to add texted tooltip for element and define appearance position.
398
+ Also component has two types - show tooltip on hower and show tooltip on click.
399
+
400
+ ```html
401
+ <p sfc-tooltip="tooltip content" [tooltipPosition]="Position.Left" [tooltipType]="TooltipType.Click" [tooltipShow]="false">
402
+ ```
403
+
404
+ Parameters:
405
+ 1. `sfc-tooltip` - texted content of tooltip
406
+ 2. `[tooltipShow]` - show/hide tooltip
407
+ 3. `[tooltipPosition]` - tooltip appearance position
408
+ 4. `[tooltipType]` - type of tooltip
409
+
410
+ Positions:
411
+ - Top - `Position.Top`
412
+ - Bottom - `Position.Bottom`
413
+ - Left - `Position.Left`
414
+ - Right - `Position.Right`
415
+
416
+ Types:
417
+ - Hover - `TooltipType.Hover`
418
+ - Click - `TooltipType.Click`
419
+
420
+ ## Services
421
+
422
+ ## **Resize**
423
+
424
+ Service will emit on every window's resize event and provide current state of window object.
425
+
426
+ Inject service:
427
+
428
+ ```typescript
429
+ constructor(private resizeService: ResizeService) { }
430
+ ```
431
+
432
+ Subscribe on resize observable and handle emit result:
433
+
434
+ ```typescript
435
+ this._resizeSubscription = this.resizeService.onResize$
436
+ .pipe(startWith(this.window))
437
+ .subscribe(window => this.tooltipPosition = window.innerWidth <= MediaLimits.Tablet
438
+ ? Position.Bottom : this._position);
439
+ ```
440
+
441
+ ## Utils
442
+
443
+ - `Collection` utils
444
+
445
+ Methods for array(collection) opearations.
446
+ - `Common` utils
447
+
448
+ Methods for object checking, modification and operations.
449
+ - `DateTime` utils
450
+
451
+ Method for DATETime objects.
452
+ - `File` utils
453
+
454
+ Methods for IO and files.
455
+ - `String` utils
456
+
457
+ Methods for strings modification and operations on them.
458
+ - `UI` utils
459
+
460
+ Methods for UI operations.
@@ -0,0 +1,9 @@
1
+ export var ButtonType;
2
+ (function (ButtonType) {
3
+ ButtonType["Bordered"] = "bordered";
4
+ ButtonType["Filled"] = "filled";
5
+ ButtonType["Rounded"] = "rounded";
6
+ ButtonType["Circled"] = "circled";
7
+ ButtonType["Texted"] = "texted";
8
+ })(ButtonType || (ButtonType = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLXR5cGUuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLXR5cGUuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ2xCLG1DQUFxQixDQUFBO0lBQ3JCLCtCQUFpQixDQUFBO0lBQ2pCLGlDQUFtQixDQUFBO0lBQ25CLGlDQUFtQixDQUFBO0lBQ25CLCtCQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFOVyxVQUFVLEtBQVYsVUFBVSxRQU1yQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEJ1dHRvblR5cGUge1xyXG4gICAgQm9yZGVyZWQgPSAnYm9yZGVyZWQnLFxyXG4gICAgRmlsbGVkID0gJ2ZpbGxlZCcsXHJcbiAgICBSb3VuZGVkID0gJ3JvdW5kZWQnLFxyXG4gICAgQ2lyY2xlZCA9ICdjaXJjbGVkJyxcclxuICAgIFRleHRlZCA9ICd0ZXh0ZWQnXHJcbn0iXX0=
@@ -0,0 +1,38 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { UIClass } from '../../enums';
3
+ import { distinct } from '../../utils';
4
+ import { ButtonType } from './button-type.enum';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class ButtonComponent {
8
+ constructor() {
9
+ this.BUTTON_DEFAULT_TEXT = 'Button';
10
+ this.text = this.BUTTON_DEFAULT_TEXT;
11
+ this.disabled = false;
12
+ this.types = [ButtonType.Bordered];
13
+ }
14
+ get classes() {
15
+ const classes = {};
16
+ if (this.disabled)
17
+ classes[UIClass.Disabled] = true;
18
+ distinct(this.types).forEach(type => classes[type] = true);
19
+ return classes;
20
+ }
21
+ }
22
+ ButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
+ ButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.6", type: ButtonComponent, selector: "sfc-button", inputs: { text: "text", iconBefore: "iconBefore", iconAfter: "iconAfter", disabled: "disabled", types: "types" }, ngImport: i0, template: "<a class=\"button\" [ngClass]=\"classes\">\r\n <i *ngIf=\"iconBefore\" class=\"icon before\" [ngClass]=\"iconBefore\"></i>\r\n <span class=\"text\">{{text}}</span>\r\n <i *ngIf=\"iconAfter\" class=\"icon after\" [ngClass]=\"iconAfter\"></i>\r\n</a>", styles: [":host-context(.sfc-default-theme) .button.texted:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.texted:not(:hover):not(.disabled){color:#ccd1d9}.button.bordered{border:solid 2px}:host-context(.sfc-default-theme) .button.bordered:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.bordered:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.bordered:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.bordered:not(:hover):not(.disabled){border-color:#ccd1d9}.button.filled{color:#fff!important;border-color:#545e61;background:#545e61}.button.filled:hover{color:#fff!important;border-color:#aab2bd;background:#aab2bd}.button.filled.disabled{color:#fff!important;border-color:#bdbdbd;background:#bdbdbd}.button.rounded{border:solid 2px;border-radius:20px;padding:.4em 1.2em}:host-context(.sfc-default-theme) .button.rounded:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.rounded:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.rounded:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.rounded:not(:hover):not(.disabled){border-color:#ccd1d9}.button.circled{border:solid 2px;width:5em;height:5em;border-radius:50%}:host-context(.sfc-default-theme) .button.circled:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.circled:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.circled:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.circled:not(:hover):not(.disabled){border-color:#ccd1d9}.button.circled .text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host{display:inline-block;font-size:1em}.button{box-sizing:border-box;display:inline-flex;justify-content:center;flex-wrap:wrap;align-items:center;overflow:hidden;text-align:center;text-decoration:none;white-space:nowrap;font-size:.8em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .5s ease,border-color .5s ease,background .5s ease}.button:hover{color:#2bbbad;border-color:#2bbbad}.button.disabled{pointer-events:none}:host-context(.sfc-default-theme) .button.disabled{color:#bdbdbd}:host-context(.sfc-dark-theme) .button.disabled{color:#656d78}:host-context(.sfc-default-theme) .button.disabled{border-color:#bdbdbd}:host-context(.sfc-dark-theme) .button.disabled{border-color:#656d78}.button .icon{padding:3px}.button .text{padding:3px;white-space:initial}.button .text:empty{display:none}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ButtonComponent, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'sfc-button', template: "<a class=\"button\" [ngClass]=\"classes\">\r\n <i *ngIf=\"iconBefore\" class=\"icon before\" [ngClass]=\"iconBefore\"></i>\r\n <span class=\"text\">{{text}}</span>\r\n <i *ngIf=\"iconAfter\" class=\"icon after\" [ngClass]=\"iconAfter\"></i>\r\n</a>", styles: [":host-context(.sfc-default-theme) .button.texted:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.texted:not(:hover):not(.disabled){color:#ccd1d9}.button.bordered{border:solid 2px}:host-context(.sfc-default-theme) .button.bordered:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.bordered:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.bordered:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.bordered:not(:hover):not(.disabled){border-color:#ccd1d9}.button.filled{color:#fff!important;border-color:#545e61;background:#545e61}.button.filled:hover{color:#fff!important;border-color:#aab2bd;background:#aab2bd}.button.filled.disabled{color:#fff!important;border-color:#bdbdbd;background:#bdbdbd}.button.rounded{border:solid 2px;border-radius:20px;padding:.4em 1.2em}:host-context(.sfc-default-theme) .button.rounded:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.rounded:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.rounded:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.rounded:not(:hover):not(.disabled){border-color:#ccd1d9}.button.circled{border:solid 2px;width:5em;height:5em;border-radius:50%}:host-context(.sfc-default-theme) .button.circled:not(:hover):not(.disabled){color:#545e61}:host-context(.sfc-dark-theme) .button.circled:not(:hover):not(.disabled){color:#ccd1d9}:host-context(.sfc-default-theme) .button.circled:not(:hover):not(.disabled){border-color:#545e61}:host-context(.sfc-dark-theme) .button.circled:not(:hover):not(.disabled){border-color:#ccd1d9}.button.circled .text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host{display:inline-block;font-size:1em}.button{box-sizing:border-box;display:inline-flex;justify-content:center;flex-wrap:wrap;align-items:center;overflow:hidden;text-align:center;text-decoration:none;white-space:nowrap;font-size:.8em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .5s ease,border-color .5s ease,background .5s ease}.button:hover{color:#2bbbad;border-color:#2bbbad}.button.disabled{pointer-events:none}:host-context(.sfc-default-theme) .button.disabled{color:#bdbdbd}:host-context(.sfc-dark-theme) .button.disabled{color:#656d78}:host-context(.sfc-default-theme) .button.disabled{border-color:#bdbdbd}:host-context(.sfc-dark-theme) .button.disabled{border-color:#656d78}.button .icon{padding:3px}.button .text{padding:3px;white-space:initial}.button .text:empty{display:none}\n"] }]
27
+ }], propDecorators: { text: [{
28
+ type: Input
29
+ }], iconBefore: [{
30
+ type: Input
31
+ }], iconAfter: [{
32
+ type: Input
33
+ }], disabled: [{
34
+ type: Input
35
+ }], types: [{
36
+ type: Input
37
+ }] } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU9oRCxNQUFNLE9BQU8sZUFBZTtJQUw1QjtRQU9tQix3QkFBbUIsR0FBVyxRQUFRLENBQUM7UUFHeEQsU0FBSSxHQUFXLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQVN4QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRzFCLFVBQUssR0FBc0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7S0FZbEQ7SUFWQyxJQUFJLE9BQU87UUFDVCxNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUE7UUFFdkIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRW5DLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzRHQTVCVSxlQUFlO2dHQUFmLGVBQWUsb0tDVjVCLG1RQUlJOzJGRE1TLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsWUFBWTs4QkFTdEIsSUFBSTtzQkFESCxLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVUlDbGFzcyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgZGlzdGluY3QgfSBmcm9tICcuLi8uLi91dGlscyc7XHJcbmltcG9ydCB7IEJ1dHRvblR5cGUgfSBmcm9tICcuL2J1dHRvbi10eXBlLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZmMtYnV0dG9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9idXR0b24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnV0dG9uQ29tcG9uZW50IHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBCVVRUT05fREVGQVVMVF9URVhUOiBzdHJpbmcgPSAnQnV0dG9uJztcclxuXHJcbiAgQElucHV0KClcclxuICB0ZXh0OiBzdHJpbmcgPSB0aGlzLkJVVFRPTl9ERUZBVUxUX1RFWFQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaWNvbkJlZm9yZT86IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBpY29uQWZ0ZXI/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICB0eXBlczogQXJyYXk8QnV0dG9uVHlwZT4gPSBbQnV0dG9uVHlwZS5Cb3JkZXJlZF07XHJcblxyXG4gIGdldCBjbGFzc2VzKCkge1xyXG4gICAgY29uc3QgY2xhc3NlczogYW55ID0ge31cclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZClcclxuICAgICAgY2xhc3Nlc1tVSUNsYXNzLkRpc2FibGVkXSA9IHRydWU7XHJcblxyXG4gICAgZGlzdGluY3QodGhpcy50eXBlcykuZm9yRWFjaCh0eXBlID0+IGNsYXNzZXNbdHlwZV0gPSB0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gY2xhc3NlcztcclxuICB9XHJcbn1cclxuIiwiPGEgY2xhc3M9XCJidXR0b25cIiBbbmdDbGFzc109XCJjbGFzc2VzXCI+XHJcbiAgICA8aSAqbmdJZj1cImljb25CZWZvcmVcIiBjbGFzcz1cImljb24gYmVmb3JlXCIgW25nQ2xhc3NdPVwiaWNvbkJlZm9yZVwiPjwvaT5cclxuICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7dGV4dH19PC9zcGFuPlxyXG4gICAgPGkgKm5nSWY9XCJpY29uQWZ0ZXJcIiBjbGFzcz1cImljb24gYWZ0ZXJcIiBbbmdDbGFzc109XCJpY29uQWZ0ZXJcIj48L2k+XHJcbjwvYT4iXX0=
@@ -0,0 +1,27 @@
1
+ import { Component, HostBinding, HostListener, Input } from '@angular/core';
2
+ import { UIClass } from '../../enums';
3
+ import * as i0 from "@angular/core";
4
+ export class CheckmarkComponent {
5
+ constructor() {
6
+ this.active = false;
7
+ this.icon = 'fa fa-check';
8
+ this.onClick = () => this.active = !this.active;
9
+ }
10
+ }
11
+ CheckmarkComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: CheckmarkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ CheckmarkComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.6", type: CheckmarkComponent, selector: "sfc-checkmark", inputs: { active: "active", icon: "icon" }, host: { listeners: { "click": "onClick()" }, properties: { "class.active": "this.active" } }, ngImport: i0, template: "<div class=\"container\">\r\n <span class=\"check\">\r\n <i class=\"{{icon}}\"></i>\r\n </span>\r\n</div>", styles: [":host{display:inline-block}:host .check{border-radius:50%;border:.18em solid;background:#fff;border-color:#ccd1d9;width:1em;height:1em;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .3s ease}:host .check i{font-size:.8em;transition:opacity .3s ease;color:transparent;-webkit-text-stroke:1px #0003}:host-context(.sfc-default-theme) :host .check i{opacity:.5}:host-context(.sfc-dark-theme) :host .check i{opacity:.8}:host .check:hover{border-color:#2bbbad}:host .check:hover i{-webkit-text-stroke:initial;color:#2bbbad}:host-context(.sfc-default-theme) :host .check:hover i{opacity:.8}:host-context(.sfc-dark-theme) :host .check:hover i{opacity:1}:host.active .check{border-color:#2bbbad;background:#2bbbad}:host.active .check i{opacity:1;transform:scale(0);color:#fff;-webkit-text-stroke:0;animation:icon .3s cubic-bezier(1,.008,.565,1.65) .1s 1 forwards}@keyframes icon{0%{opacity:0;transform:scale(.3)}to{opacity:1;transform:scale(1)}}\n"] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: CheckmarkComponent, decorators: [{
14
+ type: Component,
15
+ args: [{ selector: 'sfc-checkmark', template: "<div class=\"container\">\r\n <span class=\"check\">\r\n <i class=\"{{icon}}\"></i>\r\n </span>\r\n</div>", styles: [":host{display:inline-block}:host .check{border-radius:50%;border:.18em solid;background:#fff;border-color:#ccd1d9;width:1em;height:1em;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .3s ease}:host .check i{font-size:.8em;transition:opacity .3s ease;color:transparent;-webkit-text-stroke:1px #0003}:host-context(.sfc-default-theme) :host .check i{opacity:.5}:host-context(.sfc-dark-theme) :host .check i{opacity:.8}:host .check:hover{border-color:#2bbbad}:host .check:hover i{-webkit-text-stroke:initial;color:#2bbbad}:host-context(.sfc-default-theme) :host .check:hover i{opacity:.8}:host-context(.sfc-dark-theme) :host .check:hover i{opacity:1}:host.active .check{border-color:#2bbbad;background:#2bbbad}:host.active .check i{opacity:1;transform:scale(0);color:#fff;-webkit-text-stroke:0;animation:icon .3s cubic-bezier(1,.008,.565,1.65) .1s 1 forwards}@keyframes icon{0%{opacity:0;transform:scale(.3)}to{opacity:1;transform:scale(1)}}\n"] }]
16
+ }], propDecorators: { active: [{
17
+ type: Input
18
+ }, {
19
+ type: HostBinding,
20
+ args: ['class.' + UIClass.Active]
21
+ }], icon: [{
22
+ type: Input
23
+ }], onClick: [{
24
+ type: HostListener,
25
+ args: ['click']
26
+ }] } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2ttYXJrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9jaGVja21hcmsvY2hlY2ttYXJrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9jaGVja21hcmsvY2hlY2ttYXJrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFPdEMsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQVNFLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsU0FBSSxHQUFZLGFBQWEsQ0FBQztRQUc5QixZQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7S0FFNUM7OytHQVpZLGtCQUFrQjttR0FBbEIsa0JBQWtCLCtMQ1IvQix3SEFJTTsyRkRJTyxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTs4QkFRekIsTUFBTTtzQkFGTCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTTtnQkFJdEMsSUFBSTtzQkFESCxLQUFLO2dCQUlOLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVSUNsYXNzIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZmMtY2hlY2ttYXJrJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hlY2ttYXJrLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGVja21hcmsuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hlY2ttYXJrQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KClcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLicgKyBVSUNsYXNzLkFjdGl2ZSlcclxuICBhY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBpY29uPzogc3RyaW5nID0gJ2ZhIGZhLWNoZWNrJztcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxyXG4gIG9uQ2xpY2sgPSAoKSA9PiB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJjaGVja1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+XHJcbiAgICA8L3NwYW4+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DelimeterComponent {
4
+ }
5
+ DelimeterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DelimeterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
+ DelimeterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.6", type: DelimeterComponent, selector: "sfc-delimeter", ngImport: i0, template: ``, isInline: true, styles: [":host{width:100%;height:.07em}:host :host-context(.sfc-default-theme){background:linear-gradient(to right,rgba(0,0,0,0) 0%,rgba(0,0,0,.3) 17%,rgba(0,0,0,.3) 83%,rgba(0,0,0,0) 100%)}:host :host-context(.sfc-dark-theme){background:linear-gradient(to right,rgba(255,255,255,0) 0%,rgba(255,255,255,.4) 17%,rgba(255,255,255,.4) 83%,rgba(255,255,255,0) 100%)}\n"] });
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DelimeterComponent, decorators: [{
8
+ type: Component,
9
+ args: [{ selector: 'sfc-delimeter', template: ``, styles: [":host{width:100%;height:.07em}:host :host-context(.sfc-default-theme){background:linear-gradient(to right,rgba(0,0,0,0) 0%,rgba(0,0,0,.3) 17%,rgba(0,0,0,.3) 83%,rgba(0,0,0,0) 100%)}:host :host-context(.sfc-dark-theme){background:linear-gradient(to right,rgba(255,255,255,0) 0%,rgba(255,255,255,.4) 17%,rgba(255,255,255,.4) 83%,rgba(255,255,255,0) 100%)}\n"] }]
10
+ }] });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaW1ldGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9kZWxpbWV0ZXIvZGVsaW1ldGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8xQyxNQUFNLE9BQU8sa0JBQWtCOzsrR0FBbEIsa0JBQWtCO21HQUFsQixrQkFBa0IscURBSG5CLEVBQUU7MkZBR0Qsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWUsWUFDZixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NmYy1kZWxpbWV0ZXInLFxyXG4gIHRlbXBsYXRlOiBgYCxcclxuICBzdHlsZVVybHM6IFsnLi9kZWxpbWV0ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVsaW1ldGVyQ29tcG9uZW50IHtcclxufVxyXG4iXX0=
@@ -0,0 +1,30 @@
1
+ import { Component, HostBinding, HostListener, Input } from '@angular/core';
2
+ import { Direction, UIClass } from '../../enums';
3
+ import * as i0 from "@angular/core";
4
+ export class DotsComponent {
5
+ constructor() {
6
+ this.open = false;
7
+ this.direction = Direction.Horizontal;
8
+ this.onClick = () => this.open = !this.open;
9
+ }
10
+ }
11
+ DotsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ DotsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.6", type: DotsComponent, selector: "sfc-dots", inputs: { open: "open", direction: "direction" }, host: { listeners: { "click": "onClick()" }, properties: { "class.open": "this.open", "class": "this.direction" } }, ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"dots-container\">\r\n <div class=\"dot\"></div>\r\n <div class=\"dot\"></div>\r\n <div class=\"dot\"></div>\r\n </div>\r\n</div>", styles: [":host{display:inline-flex;transform:rotate(90deg);transition:all .3s cubic-bezier(.175,.885,.32,1.275);cursor:pointer}:host.open{transform:rotate(0)}:host.vertical{transform:rotate(0)}:host.vertical.open{transform:rotate(90deg)}:host .container{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;flex:1;margin:.25em}:host .container .dots-container{display:flex;flex-flow:column,wrap;justify-content:center;align-items:center;position:relative}:host .container .dots-container .dot{width:.3125em;height:.3125em;transition:background .3s ease;margin:.06em;border-radius:50%;display:block}:host-context(.sfc-default-theme) :host .container .dots-container .dot{background:#545e61}:host-context(.sfc-dark-theme) :host .container .dots-container .dot{background:#ccd1d9}:host .container:hover,:host .container.open,:host .container:focus{outline:none}:host-context(.sfc-default-theme) :host .container:hover .dots-container .dot,:host-context(.sfc-default-theme) :host .container.open .dots-container .dot,:host-context(.sfc-default-theme) :host .container:focus .dots-container .dot{background:#2bbbad}:host-context(.sfc-dark-theme) :host .container:hover .dots-container .dot,:host-context(.sfc-dark-theme) :host .container.open .dots-container .dot,:host-context(.sfc-dark-theme) :host .container:focus .dots-container .dot{background:#2bbbad}\n"] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DotsComponent, decorators: [{
14
+ type: Component,
15
+ args: [{ selector: 'sfc-dots', template: "<div class=\"container\">\r\n <div class=\"dots-container\">\r\n <div class=\"dot\"></div>\r\n <div class=\"dot\"></div>\r\n <div class=\"dot\"></div>\r\n </div>\r\n</div>", styles: [":host{display:inline-flex;transform:rotate(90deg);transition:all .3s cubic-bezier(.175,.885,.32,1.275);cursor:pointer}:host.open{transform:rotate(0)}:host.vertical{transform:rotate(0)}:host.vertical.open{transform:rotate(90deg)}:host .container{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;flex:1;margin:.25em}:host .container .dots-container{display:flex;flex-flow:column,wrap;justify-content:center;align-items:center;position:relative}:host .container .dots-container .dot{width:.3125em;height:.3125em;transition:background .3s ease;margin:.06em;border-radius:50%;display:block}:host-context(.sfc-default-theme) :host .container .dots-container .dot{background:#545e61}:host-context(.sfc-dark-theme) :host .container .dots-container .dot{background:#ccd1d9}:host .container:hover,:host .container.open,:host .container:focus{outline:none}:host-context(.sfc-default-theme) :host .container:hover .dots-container .dot,:host-context(.sfc-default-theme) :host .container.open .dots-container .dot,:host-context(.sfc-default-theme) :host .container:focus .dots-container .dot{background:#2bbbad}:host-context(.sfc-dark-theme) :host .container:hover .dots-container .dot,:host-context(.sfc-dark-theme) :host .container.open .dots-container .dot,:host-context(.sfc-dark-theme) :host .container:focus .dots-container .dot{background:#2bbbad}\n"] }]
16
+ }], propDecorators: { open: [{
17
+ type: Input
18
+ }, {
19
+ type: HostBinding,
20
+ args: ['class.' + UIClass.Open]
21
+ }], direction: [{
22
+ type: Input
23
+ }, {
24
+ type: HostBinding,
25
+ args: ['class']
26
+ }], onClick: [{
27
+ type: HostListener,
28
+ args: ['click']
29
+ }] } });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL2NvbXBvbmVudHMvZG90cy9kb3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9kb3RzL2RvdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFPakQsTUFBTSxPQUFPLGFBQWE7SUFMMUI7UUFTRSxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSXRCLGNBQVMsR0FBYyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBRzVDLFlBQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztLQUV4Qzs7MEdBYlksYUFBYTs4RkFBYixhQUFhLHVOQ1IxQix3TUFNTTsyRkRFTyxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7OEJBUXBCLElBQUk7c0JBRkgsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUk7Z0JBS3BDLFNBQVM7c0JBRlIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxPQUFPO2dCQUlwQixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBVSUNsYXNzIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZmMtZG90cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RvdHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RvdHMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG90c0NvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy4nICsgVUlDbGFzcy5PcGVuKVxyXG4gIG9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcclxuICBkaXJlY3Rpb246IERpcmVjdGlvbiA9IERpcmVjdGlvbi5Ib3Jpem9udGFsO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXHJcbiAgb25DbGljayA9ICgpID0+IHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkb3RzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3RcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG90XCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRvdFwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { Component, HostBinding, HostListener, Input } from '@angular/core';
2
+ import { UIClass } from '../../enums';
3
+ import * as i0 from "@angular/core";
4
+ export class HamburgerComponent {
5
+ constructor() {
6
+ this.open = false;
7
+ this.onClick = () => this.open = !this.open;
8
+ }
9
+ }
10
+ HamburgerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: HamburgerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
+ HamburgerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.6", type: HamburgerComponent, selector: "sfc-hamburger", inputs: { open: "open" }, host: { listeners: { "click": "onClick()" }, properties: { "class.open": "this.open" } }, ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"line half start\"></div>\r\n <div class=\"line\"></div>\r\n <div class=\"line half end\"></div>\r\n</div>", styles: [".container{width:1em;height:1em;display:flex;flex-direction:column;justify-content:space-between;cursor:pointer;transition:transform .33s ease-out}:host(.open) .container{transform:rotate(-45deg)}.container .line{border-radius:.31em;width:100%;height:.25em}:host-context(.sfc-default-theme) .container .line{background-color:#545e61}:host-context(.sfc-dark-theme) .container .line{background-color:#ccd1d9}.container .line.half{width:50%}.container .line.start{transition:transform .33s cubic-bezier(.54,-.81,.57,.57);transform-origin:right}:host(.open) .container .line.start{transform:rotate(-90deg) translate(.1875em)}.container .line.end{align-self:flex-end;transition:transform .33s cubic-bezier(.54,-.81,.57,.57);transform-origin:left}:host(.open) .container .line.end{transform:rotate(-90deg) translate(-.1875em)}.container:hover .line{background-color:#2bbbad!important}\n"] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: HamburgerComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: 'sfc-hamburger', template: "<div class=\"container\">\r\n <div class=\"line half start\"></div>\r\n <div class=\"line\"></div>\r\n <div class=\"line half end\"></div>\r\n</div>", styles: [".container{width:1em;height:1em;display:flex;flex-direction:column;justify-content:space-between;cursor:pointer;transition:transform .33s ease-out}:host(.open) .container{transform:rotate(-45deg)}.container .line{border-radius:.31em;width:100%;height:.25em}:host-context(.sfc-default-theme) .container .line{background-color:#545e61}:host-context(.sfc-dark-theme) .container .line{background-color:#ccd1d9}.container .line.half{width:50%}.container .line.start{transition:transform .33s cubic-bezier(.54,-.81,.57,.57);transform-origin:right}:host(.open) .container .line.start{transform:rotate(-90deg) translate(.1875em)}.container .line.end{align-self:flex-end;transition:transform .33s cubic-bezier(.54,-.81,.57,.57);transform-origin:left}:host(.open) .container .line.end{transform:rotate(-90deg) translate(-.1875em)}.container:hover .line{background-color:#2bbbad!important}\n"] }]
15
+ }], propDecorators: { open: [{
16
+ type: Input
17
+ }, {
18
+ type: HostBinding,
19
+ args: ['class.' + UIClass.Open]
20
+ }], onClick: [{
21
+ type: HostListener,
22
+ args: ['click']
23
+ }] } });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtYnVyZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9oYW1idXJnZXIvaGFtYnVyZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9oYW1idXJnZXIvaGFtYnVyZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFPdEMsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQVNFLFNBQUksR0FBWSxLQUFLLENBQUM7UUFHdEIsWUFBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3hDOzsrR0FSWSxrQkFBa0I7bUdBQWxCLGtCQUFrQix5S0NSL0IsK0pBSU07MkZESU8sa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWU7OEJBUXpCLElBQUk7c0JBRkgsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUk7Z0JBSXBDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVSUNsYXNzIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZmMtaGFtYnVyZ2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaGFtYnVyZ2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9oYW1idXJnZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSGFtYnVyZ2VyQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KClcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLicgKyBVSUNsYXNzLk9wZW4pXHJcbiAgb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXHJcbiAgb25DbGljayA9ICgpID0+IHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmUgaGFsZiBzdGFydFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5lIGhhbGYgZW5kXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==