@eduboxpro/studio 0.1.20 → 0.1.22

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.
@@ -98,6 +98,13 @@ class StudioConfigService {
98
98
  setThemeMode(mode, persist = true) {
99
99
  this.themeMode.set(mode);
100
100
  this.document.documentElement.setAttribute('data-theme', mode);
101
+ // Toggle .dark class for Tailwind CSS compatibility
102
+ if (mode === 'dark') {
103
+ this.document.documentElement.classList.add('dark');
104
+ }
105
+ else {
106
+ this.document.documentElement.classList.remove('dark');
107
+ }
101
108
  if (persist) {
102
109
  this.saveTheme(mode);
103
110
  }
@@ -4135,6 +4142,309 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
4135
4142
  args: ['keydown', ['$event']]
4136
4143
  }] } });
4137
4144
 
4145
+ const COUNTRY_OPTIONS = [
4146
+ { code: 'kz', name: 'Казахстан', dialCode: '+7', flag: '🇰🇿', minLength: 11, maxLength: 11, placeholder: '+7 XXX XXX XX XX' },
4147
+ { code: 'ru', name: 'Россия', dialCode: '+7', flag: '🇷🇺', minLength: 11, maxLength: 11, placeholder: '+7 XXX XXX XX XX' },
4148
+ { code: 'kg', name: 'Кыргызстан', dialCode: '+996', flag: '🇰🇬', minLength: 12, maxLength: 12, placeholder: '+996 XXX XXX XXX' },
4149
+ { code: 'uz', name: 'Узбекистан', dialCode: '+998', flag: '🇺🇿', minLength: 12, maxLength: 12, placeholder: '+998 XX XXX XX XX' },
4150
+ { code: 'tr', name: 'Турция', dialCode: '+90', flag: '🇹🇷', minLength: 12, maxLength: 12, placeholder: '+90 XXX XXX XX XX' },
4151
+ { code: 'az', name: 'Азербайджан', dialCode: '+994', flag: '🇦🇿', minLength: 12, maxLength: 12, placeholder: '+994 XX XXX XX XX' }
4152
+ ];
4153
+ class PhoneInputComponent {
4154
+ configService = inject(StudioConfigService);
4155
+ inputDefaults = computed(() => this.configService.config().components?.input, ...(ngDevMode ? [{ debugName: "inputDefaults" }] : []));
4156
+ inputEl = viewChild('inputElement', ...(ngDevMode ? [{ debugName: "inputEl" }] : []));
4157
+ // Styling
4158
+ variantInput = input(undefined, ...(ngDevMode ? [{ debugName: "variantInput", alias: 'variant' }] : [{ alias: 'variant' }]));
4159
+ sizeInput = input(undefined, ...(ngDevMode ? [{ debugName: "sizeInput", alias: 'size' }] : [{ alias: 'size' }]));
4160
+ radiusInput = input(undefined, ...(ngDevMode ? [{ debugName: "radiusInput", alias: 'radius' }] : [{ alias: 'radius' }]));
4161
+ variant = withConfigDefault(this.variantInput, computed(() => this.inputDefaults()?.variant), 'outline');
4162
+ size = withConfigDefault(this.sizeInput, computed(() => this.inputDefaults()?.size), 'md');
4163
+ radius = withConfigDefault(this.radiusInput, computed(() => this.inputDefaults()?.radius), 'md');
4164
+ // Phone specific
4165
+ country = model('kz', ...(ngDevMode ? [{ debugName: "country" }] : []));
4166
+ showCountrySelector = input(false, ...(ngDevMode ? [{ debugName: "showCountrySelector" }] : []));
4167
+ showFlag = input(true, ...(ngDevMode ? [{ debugName: "showFlag" }] : []));
4168
+ showCountryCode = input(true, ...(ngDevMode ? [{ debugName: "showCountryCode" }] : []));
4169
+ // States
4170
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
4171
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
4172
+ loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
4173
+ // Label & hints
4174
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
4175
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : []));
4176
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
4177
+ error = input(false, ...(ngDevMode ? [{ debugName: "error" }] : []));
4178
+ errorMessage = input(undefined, ...(ngDevMode ? [{ debugName: "errorMessage" }] : []));
4179
+ // Layout
4180
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : []));
4181
+ autoFocus = input(false, ...(ngDevMode ? [{ debugName: "autoFocus" }] : []));
4182
+ name = input(undefined, ...(ngDevMode ? [{ debugName: "name" }] : []));
4183
+ id = input(undefined, ...(ngDevMode ? [{ debugName: "id" }] : []));
4184
+ ariaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
4185
+ // Events
4186
+ valueChange = output();
4187
+ countryChange = output();
4188
+ focused = output();
4189
+ blurred = output();
4190
+ // Internal state
4191
+ value = signal('', ...(ngDevMode ? [{ debugName: "value" }] : []));
4192
+ displayValue = signal('', ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
4193
+ isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : []));
4194
+ isTouched = signal(false, ...(ngDevMode ? [{ debugName: "isTouched" }] : []));
4195
+ isDropdownOpen = signal(false, ...(ngDevMode ? [{ debugName: "isDropdownOpen" }] : []));
4196
+ generatedId = `studio-phone-input-${Math.random().toString(36).substr(2, 9)}`;
4197
+ onChange = () => { };
4198
+ onTouched = () => { };
4199
+ // Country options
4200
+ countryOptions = COUNTRY_OPTIONS;
4201
+ // Computed
4202
+ currentCountry = computed(() => {
4203
+ return COUNTRY_OPTIONS.find(c => c.code === this.country()) || COUNTRY_OPTIONS[0];
4204
+ }, ...(ngDevMode ? [{ debugName: "currentCountry" }] : []));
4205
+ currentFlag = computed(() => this.currentCountry().flag, ...(ngDevMode ? [{ debugName: "currentFlag" }] : []));
4206
+ currentCode = computed(() => this.currentCountry().dialCode, ...(ngDevMode ? [{ debugName: "currentCode" }] : []));
4207
+ currentPlaceholder = computed(() => this.currentCountry().placeholder, ...(ngDevMode ? [{ debugName: "currentPlaceholder" }] : []));
4208
+ isComplete = computed(() => {
4209
+ const digits = this.value().replace(/\D/g, '');
4210
+ const config = this.currentCountry();
4211
+ return digits.length >= config.minLength;
4212
+ }, ...(ngDevMode ? [{ debugName: "isComplete" }] : []));
4213
+ hasValue = computed(() => {
4214
+ const val = this.value();
4215
+ return val !== '' && val !== null && val !== undefined;
4216
+ }, ...(ngDevMode ? [{ debugName: "hasValue" }] : []));
4217
+ hostClasses = computed(() => classNames('studio-phone-input', `studio-phone-input--${this.variant()}`, `studio-phone-input--${this.size()}`, `studio-phone-input--radius-${this.radius()}`, this.error() && 'studio-phone-input--error', this.disabled() && 'studio-phone-input--disabled', this.readonly() && 'studio-phone-input--readonly', this.loading() && 'studio-phone-input--loading', this.fullWidth() && 'studio-phone-input--full-width', this.isFocused() && 'studio-phone-input--focused', this.isTouched() && 'studio-phone-input--touched', this.hasValue() && 'studio-phone-input--has-value', this.showCountrySelector() && 'studio-phone-input--with-selector'), ...(ngDevMode ? [{ debugName: "hostClasses" }] : []));
4218
+ ariaDescribedByValue = computed(() => {
4219
+ const ids = [];
4220
+ if (this.hint())
4221
+ ids.push(this.hintId);
4222
+ if (this.error() && this.errorMessage())
4223
+ ids.push(this.errorId);
4224
+ return ids.length > 0 ? ids.join(' ') : null;
4225
+ }, ...(ngDevMode ? [{ debugName: "ariaDescribedByValue" }] : []));
4226
+ hintId = `${this.generatedId}-hint`;
4227
+ errorId = `${this.generatedId}-error`;
4228
+ constructor() {
4229
+ effect(() => {
4230
+ if (this.autoFocus() && this.inputEl()) {
4231
+ setTimeout(() => this.inputEl()?.nativeElement.focus(), 0);
4232
+ }
4233
+ });
4234
+ // Re-format when country changes
4235
+ effect(() => {
4236
+ const country = this.country();
4237
+ const currentValue = this.value();
4238
+ if (currentValue) {
4239
+ const formatted = this.formatPhoneNumber(currentValue);
4240
+ this.displayValue.set(formatted);
4241
+ }
4242
+ });
4243
+ }
4244
+ // ControlValueAccessor
4245
+ writeValue(value) {
4246
+ const formatted = this.formatPhoneNumber(value ?? '');
4247
+ this.value.set(value ?? '');
4248
+ this.displayValue.set(formatted);
4249
+ }
4250
+ registerOnChange(fn) {
4251
+ this.onChange = fn;
4252
+ }
4253
+ registerOnTouched(fn) {
4254
+ this.onTouched = fn;
4255
+ }
4256
+ setDisabledState(isDisabled) { }
4257
+ // Validator
4258
+ validate(control) {
4259
+ if (!control.value)
4260
+ return null;
4261
+ const digits = control.value.replace(/\D/g, '');
4262
+ const config = this.currentCountry();
4263
+ if (digits.length < config.minLength) {
4264
+ return { phoneIncomplete: { value: control.value, required: config.minLength, actual: digits.length } };
4265
+ }
4266
+ return null;
4267
+ }
4268
+ // Country selector
4269
+ toggleDropdown() {
4270
+ if (this.disabled() || this.readonly())
4271
+ return;
4272
+ this.isDropdownOpen.update(v => !v);
4273
+ }
4274
+ selectCountry(country) {
4275
+ this.country.set(country.code);
4276
+ this.isDropdownOpen.set(false);
4277
+ this.countryChange.emit(country.code);
4278
+ // Clear current value and set new country code
4279
+ const newCode = country.dialCode;
4280
+ this.value.set('');
4281
+ this.displayValue.set('');
4282
+ // Focus input after selecting
4283
+ setTimeout(() => {
4284
+ this.inputEl()?.nativeElement.focus();
4285
+ }, 0);
4286
+ }
4287
+ closeDropdown() {
4288
+ this.isDropdownOpen.set(false);
4289
+ }
4290
+ // Format phone number for display
4291
+ formatPhoneNumber(value) {
4292
+ let digits = value.replace(/\D/g, '');
4293
+ if (!digits)
4294
+ return '';
4295
+ const config = this.currentCountry();
4296
+ digits = digits.slice(0, config.maxLength);
4297
+ return this.formatByCountry(digits, this.country());
4298
+ }
4299
+ formatByCountry(digits, country) {
4300
+ switch (country) {
4301
+ case 'kz':
4302
+ case 'ru':
4303
+ // +7 XXX XXX XX XX
4304
+ return this.formatPattern(digits, [1, 3, 3, 2, 2], '+');
4305
+ case 'kg':
4306
+ // +996 XXX XXX XXX
4307
+ return this.formatPattern(digits, [3, 3, 3, 3], '+');
4308
+ case 'uz':
4309
+ // +998 XX XXX XX XX
4310
+ return this.formatPattern(digits, [3, 2, 3, 2, 2], '+');
4311
+ case 'tr':
4312
+ // +90 XXX XXX XX XX
4313
+ return this.formatPattern(digits, [2, 3, 3, 2, 2], '+');
4314
+ case 'az':
4315
+ // +994 XX XXX XX XX
4316
+ return this.formatPattern(digits, [3, 2, 3, 2, 2], '+');
4317
+ default:
4318
+ return '+' + digits;
4319
+ }
4320
+ }
4321
+ formatPattern(digits, groups, prefix) {
4322
+ let result = prefix;
4323
+ let index = 0;
4324
+ for (let i = 0; i < groups.length && index < digits.length; i++) {
4325
+ const groupSize = groups[i];
4326
+ const chunk = digits.slice(index, index + groupSize);
4327
+ if (i > 0 && chunk) {
4328
+ result += ' ';
4329
+ }
4330
+ result += chunk;
4331
+ index += groupSize;
4332
+ }
4333
+ return result;
4334
+ }
4335
+ // Event handlers
4336
+ handleInput(event) {
4337
+ const target = event.target;
4338
+ const cursorPos = target.selectionStart || 0;
4339
+ const oldValue = this.displayValue();
4340
+ let rawValue = target.value;
4341
+ const formatted = this.formatPhoneNumber(rawValue);
4342
+ const rawDigits = rawValue.replace(/\D/g, '');
4343
+ this.value.set(rawDigits ? '+' + rawDigits : '');
4344
+ this.displayValue.set(formatted);
4345
+ target.value = formatted;
4346
+ const lengthDiff = formatted.length - oldValue.length;
4347
+ let newCursorPos = cursorPos + lengthDiff;
4348
+ newCursorPos = Math.max(0, Math.min(newCursorPos, formatted.length));
4349
+ setTimeout(() => {
4350
+ target.setSelectionRange(newCursorPos, newCursorPos);
4351
+ }, 0);
4352
+ const outputValue = rawDigits ? '+' + rawDigits : '';
4353
+ this.onChange(outputValue);
4354
+ this.valueChange.emit(outputValue);
4355
+ }
4356
+ handleFocus(event) {
4357
+ this.isFocused.set(true);
4358
+ if (!this.displayValue() && this.showCountryCode()) {
4359
+ const code = this.currentCountry().dialCode;
4360
+ this.displayValue.set(code + ' ');
4361
+ const target = event.target;
4362
+ target.value = code + ' ';
4363
+ setTimeout(() => {
4364
+ target.setSelectionRange(target.value.length, target.value.length);
4365
+ }, 0);
4366
+ }
4367
+ this.focused.emit(event);
4368
+ }
4369
+ handleBlur(event) {
4370
+ this.isFocused.set(false);
4371
+ this.isTouched.set(true);
4372
+ const digits = this.value().replace(/\D/g, '');
4373
+ const codeDigits = this.currentCountry().dialCode.replace(/\D/g, '');
4374
+ if (digits === codeDigits || digits.length <= codeDigits.length) {
4375
+ this.value.set('');
4376
+ this.displayValue.set('');
4377
+ const target = event.target;
4378
+ target.value = '';
4379
+ this.onChange('');
4380
+ }
4381
+ this.onTouched();
4382
+ this.blurred.emit(event);
4383
+ }
4384
+ handleKeyDown(event) {
4385
+ const target = event.target;
4386
+ const cursorPos = target.selectionStart || 0;
4387
+ // Allow: backspace, delete, tab, escape, enter, arrows
4388
+ if ([8, 46, 9, 27, 13, 37, 38, 39, 40].includes(event.keyCode)) {
4389
+ return;
4390
+ }
4391
+ // Allow: Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X
4392
+ if ((event.ctrlKey || event.metaKey) && ['a', 'c', 'v', 'x'].includes(event.key.toLowerCase())) {
4393
+ return;
4394
+ }
4395
+ // Allow: + at the beginning
4396
+ if (event.key === '+' && cursorPos === 0) {
4397
+ return;
4398
+ }
4399
+ // Block non-numeric
4400
+ if (!/^\d$/.test(event.key)) {
4401
+ event.preventDefault();
4402
+ }
4403
+ // Block if max length reached
4404
+ const digits = target.value.replace(/\D/g, '');
4405
+ if (digits.length >= this.currentCountry().maxLength && target.selectionStart === target.selectionEnd) {
4406
+ event.preventDefault();
4407
+ }
4408
+ }
4409
+ handleContainerClick(event) {
4410
+ // Close dropdown when clicking outside selector
4411
+ const target = event.target;
4412
+ if (!target.closest('.studio-phone-input__selector')) {
4413
+ this.isDropdownOpen.set(false);
4414
+ }
4415
+ }
4416
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: PhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4417
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: PhoneInputComponent, isStandalone: true, selector: "studio-phone-input", inputs: { variantInput: { classPropertyName: "variantInput", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, sizeInput: { classPropertyName: "sizeInput", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, radiusInput: { classPropertyName: "radiusInput", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, country: { classPropertyName: "country", publicName: "country", isSignal: true, isRequired: false, transformFunction: null }, showCountrySelector: { classPropertyName: "showCountrySelector", publicName: "showCountrySelector", isSignal: true, isRequired: false, transformFunction: null }, showFlag: { classPropertyName: "showFlag", publicName: "showFlag", isSignal: true, isRequired: false, transformFunction: null }, showCountryCode: { classPropertyName: "showCountryCode", publicName: "showCountryCode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { country: "countryChange", valueChange: "valueChange", countryChange: "countryChange", focused: "focused", blurred: "blurred" }, host: { properties: { "class": "hostClasses()" } }, providers: [
4418
+ {
4419
+ provide: NG_VALUE_ACCESSOR,
4420
+ useExisting: forwardRef(() => PhoneInputComponent),
4421
+ multi: true
4422
+ },
4423
+ {
4424
+ provide: NG_VALIDATORS,
4425
+ useExisting: forwardRef(() => PhoneInputComponent),
4426
+ multi: true
4427
+ }
4428
+ ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label [for]=\"id() || generatedId\" class=\"studio-phone-input__label\">\n {{ label() }}\n @if (required()) {\n <span class=\"studio-phone-input__required\">*</span>\n }\n </label>\n}\n\n<div class=\"studio-phone-input__container\" (click)=\"handleContainerClick($event)\">\n @if (showCountrySelector()) {\n <div class=\"studio-phone-input__selector\">\n <button\n type=\"button\"\n class=\"studio-phone-input__selector-btn\"\n [disabled]=\"disabled() || readonly()\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n aria-haspopup=\"listbox\">\n <span class=\"studio-phone-input__selector-flag\">{{ currentFlag() }}</span>\n <studio-icon name=\"chevron-down\" [size]=\"14\" class=\"studio-phone-input__selector-arrow\" />\n </button>\n\n @if (isDropdownOpen()) {\n <div class=\"studio-phone-input__dropdown\" role=\"listbox\">\n @for (option of countryOptions; track option.code) {\n <button\n type=\"button\"\n class=\"studio-phone-input__dropdown-item\"\n [class.studio-phone-input__dropdown-item--selected]=\"option.code === country()\"\n role=\"option\"\n [attr.aria-selected]=\"option.code === country()\"\n (click)=\"selectCountry(option)\">\n <span class=\"studio-phone-input__dropdown-flag\">{{ option.flag }}</span>\n <span class=\"studio-phone-input__dropdown-name\">{{ option.name }}</span>\n <span class=\"studio-phone-input__dropdown-code\">{{ option.dialCode }}</span>\n </button>\n }\n </div>\n }\n </div>\n } @else if (showFlag()) {\n <span class=\"studio-phone-input__flag\">\n {{ currentFlag() }}\n </span>\n }\n\n <input\n #inputElement\n type=\"tel\"\n inputmode=\"tel\"\n class=\"studio-phone-input__field\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"currentPlaceholder()\"\n [required]=\"required()\"\n [name]=\"name()\"\n [id]=\"id() || generatedId\"\n [attr.aria-label]=\"ariaLabel() || label() || 'Phone number'\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"ariaDescribedByValue()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n @if (loading()) {\n <span class=\"studio-phone-input__loading\">\n <studio-icon name=\"loader-2\" [size]=\"16\" class=\"studio-icon--spin\" />\n </span>\n }\n</div>\n\n@if (hint() && !error()) {\n <span class=\"studio-phone-input__hint\" [id]=\"hintId\">\n {{ hint() }}\n </span>\n}\n\n@if (error() && errorMessage()) {\n <span class=\"studio-phone-input__error\" [id]=\"errorId\" role=\"alert\">\n <studio-icon name=\"alert-circle\" [size]=\"14\" />\n {{ errorMessage() }}\n </span>\n}\n", styles: [":host{display:flex;flex-direction:column;gap:.375rem;font-family:var(--studio-font-family)}:host(.studio-phone-input--full-width){width:100%}.studio-phone-input__label{display:block;font-size:.875rem;font-weight:var(--studio-font-weight-medium);color:var(--studio-text-primary);margin-bottom:.25rem}.studio-phone-input__label .studio-phone-input__required{color:var(--studio-error);margin-left:.125rem}.studio-phone-input__container{position:relative;display:flex;align-items:center;transition:all var(--studio-transition-fast)}.studio-phone-input__flag{display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.studio-phone-input__selector{position:relative;display:flex;align-items:center;flex-shrink:0}.studio-phone-input__selector-btn{display:flex;align-items:center;gap:.25rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--studio-text-primary);transition:all var(--studio-transition-fast)}.studio-phone-input__selector-btn:hover:not(:disabled){opacity:.8}.studio-phone-input__selector-btn:disabled{cursor:not-allowed;opacity:.6}.studio-phone-input__selector-flag{font-size:1.25rem;line-height:1}.studio-phone-input__selector-arrow{color:var(--studio-text-secondary);transition:transform var(--studio-transition-fast)}:host(.studio-phone-input--focused) .studio-phone-input__selector-arrow{color:var(--studio-primary)}.studio-phone-input__dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;min-width:200px;max-height:280px;overflow-y:auto;background:var(--studio-bg-primary);border:1px solid var(--studio-border-primary);border-radius:var(--studio-radius-md);box-shadow:var(--studio-shadow-lg);padding:.25rem}.studio-phone-input__dropdown-item{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;background:transparent;border:none;border-radius:var(--studio-radius-sm);cursor:pointer;text-align:left;color:var(--studio-text-primary);transition:all var(--studio-transition-fast)}.studio-phone-input__dropdown-item:hover{background:var(--studio-bg-secondary)}.studio-phone-input__dropdown-item--selected{background:var(--studio-primary-bg);color:var(--studio-primary)}.studio-phone-input__dropdown-flag{font-size:1.25rem;line-height:1;flex-shrink:0}.studio-phone-input__dropdown-name{flex:1;font-size:.875rem;white-space:nowrap}.studio-phone-input__dropdown-code{font-size:.75rem;color:var(--studio-text-secondary);flex-shrink:0}.studio-phone-input__field{flex:1;width:100%;font-family:inherit;font-size:1rem;color:var(--studio-text-primary);background:transparent;border:none;outline:none;transition:all var(--studio-transition-fast)}.studio-phone-input__field::placeholder{color:var(--studio-text-tertiary)}.studio-phone-input__field:disabled{cursor:not-allowed;opacity:.6}.studio-phone-input__field:read-only{cursor:default}.studio-phone-input__loading{display:flex;align-items:center;color:var(--studio-primary);flex-shrink:0}.studio-phone-input__loading .studio-icon--spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.studio-phone-input__hint{font-size:.75rem;color:var(--studio-text-secondary);line-height:1.4}.studio-phone-input__error{display:flex;align-items:center;gap:.25rem;font-size:.75rem;color:var(--studio-error);line-height:1.4}:host(.studio-phone-input--outline) .studio-phone-input__container{border:1px solid var(--studio-border-primary);background:var(--studio-bg-primary);border-radius:var(--studio-radius-md)}:host(.studio-phone-input--outline) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){border-color:var(--studio-primary)}:host(.studio-phone-input--outline.studio-phone-input--focused) .studio-phone-input__container{border-color:var(--studio-primary);box-shadow:0 0 0 3px var(--studio-primary-bg)}:host(.studio-phone-input--outline.studio-phone-input--error) .studio-phone-input__container{border-color:var(--studio-error)}:host(.studio-phone-input--outline.studio-phone-input--error) .studio-phone-input__container:hover{border-color:var(--studio-error)}:host(.studio-phone-input--outline.studio-phone-input--error.studio-phone-input--focused) .studio-phone-input__container{box-shadow:0 0 0 3px #ef44441a}:host(.studio-phone-input--outline.studio-phone-input--disabled) .studio-phone-input__container{background:var(--studio-bg-secondary);border-color:var(--studio-border-secondary)}:host(.studio-phone-input--filled) .studio-phone-input__container{background:var(--studio-bg-secondary);border:none;border-bottom:2px solid var(--studio-border-primary);border-radius:var(--studio-radius-md) var(--studio-radius-md) 0 0}:host(.studio-phone-input--filled) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){background:var(--studio-bg-tertiary)}:host(.studio-phone-input--filled.studio-phone-input--focused) .studio-phone-input__container{border-bottom-color:var(--studio-primary);background:var(--studio-bg-tertiary)}:host(.studio-phone-input--filled.studio-phone-input--error) .studio-phone-input__container{border-bottom-color:var(--studio-error)}:host(.studio-phone-input--filled.studio-phone-input--disabled) .studio-phone-input__container{background:var(--studio-bg-secondary);opacity:.6}:host(.studio-phone-input--underline) .studio-phone-input__container{background:transparent;border:none;border-bottom:1px solid var(--studio-border-primary);border-radius:0}:host(.studio-phone-input--underline) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){border-bottom-color:var(--studio-primary)}:host(.studio-phone-input--underline.studio-phone-input--focused) .studio-phone-input__container{border-bottom:2px solid var(--studio-primary)}:host(.studio-phone-input--underline.studio-phone-input--error) .studio-phone-input__container{border-bottom-color:var(--studio-error)}:host(.studio-phone-input--underline.studio-phone-input--disabled) .studio-phone-input__container{border-bottom-style:dashed;opacity:.6}:host(.studio-phone-input--sm) .studio-phone-input__field{height:2rem;font-size:.875rem;padding:0 .75rem}:host(.studio-phone-input--sm) .studio-phone-input__flag{padding-left:.75rem;font-size:1rem}:host(.studio-phone-input--sm) .studio-phone-input__selector{padding-left:.75rem}:host(.studio-phone-input--sm) .studio-phone-input__selector-flag{font-size:1rem}:host(.studio-phone-input--sm) .studio-phone-input__loading{padding-right:.5rem}:host(.studio-phone-input--md) .studio-phone-input__field{height:2.5rem;font-size:1rem;padding:0 1rem}:host(.studio-phone-input--md) .studio-phone-input__flag{padding-left:1rem;font-size:1.25rem}:host(.studio-phone-input--md) .studio-phone-input__selector{padding-left:1rem}:host(.studio-phone-input--md) .studio-phone-input__selector-flag{font-size:1.25rem}:host(.studio-phone-input--md) .studio-phone-input__loading{padding-right:.75rem}:host(.studio-phone-input--lg) .studio-phone-input__field{height:3rem;font-size:1.125rem;padding:0 1.25rem}:host(.studio-phone-input--lg) .studio-phone-input__flag{padding-left:1.25rem;font-size:1.5rem}:host(.studio-phone-input--lg) .studio-phone-input__selector{padding-left:1.25rem}:host(.studio-phone-input--lg) .studio-phone-input__selector-flag{font-size:1.5rem}:host(.studio-phone-input--lg) .studio-phone-input__loading{padding-right:1rem}:host(.studio-phone-input--radius-none) .studio-phone-input__container{border-radius:0}:host(.studio-phone-input--radius-sm) .studio-phone-input__container{border-radius:var(--studio-radius-sm)}:host(.studio-phone-input--radius-md) .studio-phone-input__container{border-radius:var(--studio-radius-md)}:host(.studio-phone-input--radius-lg) .studio-phone-input__container{border-radius:var(--studio-radius-lg)}:host(.studio-phone-input--radius-full) .studio-phone-input__container{border-radius:9999px}:host(.studio-phone-input--filled.studio-phone-input--radius-none) .studio-phone-input__container{border-radius:0}:host(.studio-phone-input--filled.studio-phone-input--radius-sm) .studio-phone-input__container{border-radius:var(--studio-radius-sm) var(--studio-radius-sm) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-md) .studio-phone-input__container{border-radius:var(--studio-radius-md) var(--studio-radius-md) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-lg) .studio-phone-input__container{border-radius:var(--studio-radius-lg) var(--studio-radius-lg) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-full) .studio-phone-input__container{border-radius:9999px 9999px 0 0}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "studio-icon", inputs: ["name", "size", "color", "strokeWidth", "absoluteStrokeWidth", "showFallback", "fallbackIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4429
+ }
4430
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: PhoneInputComponent, decorators: [{
4431
+ type: Component,
4432
+ args: [{ selector: 'studio-phone-input', imports: [IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
4433
+ {
4434
+ provide: NG_VALUE_ACCESSOR,
4435
+ useExisting: forwardRef(() => PhoneInputComponent),
4436
+ multi: true
4437
+ },
4438
+ {
4439
+ provide: NG_VALIDATORS,
4440
+ useExisting: forwardRef(() => PhoneInputComponent),
4441
+ multi: true
4442
+ }
4443
+ ], host: {
4444
+ '[class]': 'hostClasses()',
4445
+ }, template: "@if (label()) {\n <label [for]=\"id() || generatedId\" class=\"studio-phone-input__label\">\n {{ label() }}\n @if (required()) {\n <span class=\"studio-phone-input__required\">*</span>\n }\n </label>\n}\n\n<div class=\"studio-phone-input__container\" (click)=\"handleContainerClick($event)\">\n @if (showCountrySelector()) {\n <div class=\"studio-phone-input__selector\">\n <button\n type=\"button\"\n class=\"studio-phone-input__selector-btn\"\n [disabled]=\"disabled() || readonly()\"\n (click)=\"toggleDropdown()\"\n [attr.aria-expanded]=\"isDropdownOpen()\"\n aria-haspopup=\"listbox\">\n <span class=\"studio-phone-input__selector-flag\">{{ currentFlag() }}</span>\n <studio-icon name=\"chevron-down\" [size]=\"14\" class=\"studio-phone-input__selector-arrow\" />\n </button>\n\n @if (isDropdownOpen()) {\n <div class=\"studio-phone-input__dropdown\" role=\"listbox\">\n @for (option of countryOptions; track option.code) {\n <button\n type=\"button\"\n class=\"studio-phone-input__dropdown-item\"\n [class.studio-phone-input__dropdown-item--selected]=\"option.code === country()\"\n role=\"option\"\n [attr.aria-selected]=\"option.code === country()\"\n (click)=\"selectCountry(option)\">\n <span class=\"studio-phone-input__dropdown-flag\">{{ option.flag }}</span>\n <span class=\"studio-phone-input__dropdown-name\">{{ option.name }}</span>\n <span class=\"studio-phone-input__dropdown-code\">{{ option.dialCode }}</span>\n </button>\n }\n </div>\n }\n </div>\n } @else if (showFlag()) {\n <span class=\"studio-phone-input__flag\">\n {{ currentFlag() }}\n </span>\n }\n\n <input\n #inputElement\n type=\"tel\"\n inputmode=\"tel\"\n class=\"studio-phone-input__field\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"currentPlaceholder()\"\n [required]=\"required()\"\n [name]=\"name()\"\n [id]=\"id() || generatedId\"\n [attr.aria-label]=\"ariaLabel() || label() || 'Phone number'\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"ariaDescribedByValue()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n @if (loading()) {\n <span class=\"studio-phone-input__loading\">\n <studio-icon name=\"loader-2\" [size]=\"16\" class=\"studio-icon--spin\" />\n </span>\n }\n</div>\n\n@if (hint() && !error()) {\n <span class=\"studio-phone-input__hint\" [id]=\"hintId\">\n {{ hint() }}\n </span>\n}\n\n@if (error() && errorMessage()) {\n <span class=\"studio-phone-input__error\" [id]=\"errorId\" role=\"alert\">\n <studio-icon name=\"alert-circle\" [size]=\"14\" />\n {{ errorMessage() }}\n </span>\n}\n", styles: [":host{display:flex;flex-direction:column;gap:.375rem;font-family:var(--studio-font-family)}:host(.studio-phone-input--full-width){width:100%}.studio-phone-input__label{display:block;font-size:.875rem;font-weight:var(--studio-font-weight-medium);color:var(--studio-text-primary);margin-bottom:.25rem}.studio-phone-input__label .studio-phone-input__required{color:var(--studio-error);margin-left:.125rem}.studio-phone-input__container{position:relative;display:flex;align-items:center;transition:all var(--studio-transition-fast)}.studio-phone-input__flag{display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.studio-phone-input__selector{position:relative;display:flex;align-items:center;flex-shrink:0}.studio-phone-input__selector-btn{display:flex;align-items:center;gap:.25rem;padding:0;background:transparent;border:none;cursor:pointer;color:var(--studio-text-primary);transition:all var(--studio-transition-fast)}.studio-phone-input__selector-btn:hover:not(:disabled){opacity:.8}.studio-phone-input__selector-btn:disabled{cursor:not-allowed;opacity:.6}.studio-phone-input__selector-flag{font-size:1.25rem;line-height:1}.studio-phone-input__selector-arrow{color:var(--studio-text-secondary);transition:transform var(--studio-transition-fast)}:host(.studio-phone-input--focused) .studio-phone-input__selector-arrow{color:var(--studio-primary)}.studio-phone-input__dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;min-width:200px;max-height:280px;overflow-y:auto;background:var(--studio-bg-primary);border:1px solid var(--studio-border-primary);border-radius:var(--studio-radius-md);box-shadow:var(--studio-shadow-lg);padding:.25rem}.studio-phone-input__dropdown-item{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;background:transparent;border:none;border-radius:var(--studio-radius-sm);cursor:pointer;text-align:left;color:var(--studio-text-primary);transition:all var(--studio-transition-fast)}.studio-phone-input__dropdown-item:hover{background:var(--studio-bg-secondary)}.studio-phone-input__dropdown-item--selected{background:var(--studio-primary-bg);color:var(--studio-primary)}.studio-phone-input__dropdown-flag{font-size:1.25rem;line-height:1;flex-shrink:0}.studio-phone-input__dropdown-name{flex:1;font-size:.875rem;white-space:nowrap}.studio-phone-input__dropdown-code{font-size:.75rem;color:var(--studio-text-secondary);flex-shrink:0}.studio-phone-input__field{flex:1;width:100%;font-family:inherit;font-size:1rem;color:var(--studio-text-primary);background:transparent;border:none;outline:none;transition:all var(--studio-transition-fast)}.studio-phone-input__field::placeholder{color:var(--studio-text-tertiary)}.studio-phone-input__field:disabled{cursor:not-allowed;opacity:.6}.studio-phone-input__field:read-only{cursor:default}.studio-phone-input__loading{display:flex;align-items:center;color:var(--studio-primary);flex-shrink:0}.studio-phone-input__loading .studio-icon--spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.studio-phone-input__hint{font-size:.75rem;color:var(--studio-text-secondary);line-height:1.4}.studio-phone-input__error{display:flex;align-items:center;gap:.25rem;font-size:.75rem;color:var(--studio-error);line-height:1.4}:host(.studio-phone-input--outline) .studio-phone-input__container{border:1px solid var(--studio-border-primary);background:var(--studio-bg-primary);border-radius:var(--studio-radius-md)}:host(.studio-phone-input--outline) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){border-color:var(--studio-primary)}:host(.studio-phone-input--outline.studio-phone-input--focused) .studio-phone-input__container{border-color:var(--studio-primary);box-shadow:0 0 0 3px var(--studio-primary-bg)}:host(.studio-phone-input--outline.studio-phone-input--error) .studio-phone-input__container{border-color:var(--studio-error)}:host(.studio-phone-input--outline.studio-phone-input--error) .studio-phone-input__container:hover{border-color:var(--studio-error)}:host(.studio-phone-input--outline.studio-phone-input--error.studio-phone-input--focused) .studio-phone-input__container{box-shadow:0 0 0 3px #ef44441a}:host(.studio-phone-input--outline.studio-phone-input--disabled) .studio-phone-input__container{background:var(--studio-bg-secondary);border-color:var(--studio-border-secondary)}:host(.studio-phone-input--filled) .studio-phone-input__container{background:var(--studio-bg-secondary);border:none;border-bottom:2px solid var(--studio-border-primary);border-radius:var(--studio-radius-md) var(--studio-radius-md) 0 0}:host(.studio-phone-input--filled) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){background:var(--studio-bg-tertiary)}:host(.studio-phone-input--filled.studio-phone-input--focused) .studio-phone-input__container{border-bottom-color:var(--studio-primary);background:var(--studio-bg-tertiary)}:host(.studio-phone-input--filled.studio-phone-input--error) .studio-phone-input__container{border-bottom-color:var(--studio-error)}:host(.studio-phone-input--filled.studio-phone-input--disabled) .studio-phone-input__container{background:var(--studio-bg-secondary);opacity:.6}:host(.studio-phone-input--underline) .studio-phone-input__container{background:transparent;border:none;border-bottom:1px solid var(--studio-border-primary);border-radius:0}:host(.studio-phone-input--underline) .studio-phone-input__container:hover:not(:has(.studio-phone-input__field:disabled)){border-bottom-color:var(--studio-primary)}:host(.studio-phone-input--underline.studio-phone-input--focused) .studio-phone-input__container{border-bottom:2px solid var(--studio-primary)}:host(.studio-phone-input--underline.studio-phone-input--error) .studio-phone-input__container{border-bottom-color:var(--studio-error)}:host(.studio-phone-input--underline.studio-phone-input--disabled) .studio-phone-input__container{border-bottom-style:dashed;opacity:.6}:host(.studio-phone-input--sm) .studio-phone-input__field{height:2rem;font-size:.875rem;padding:0 .75rem}:host(.studio-phone-input--sm) .studio-phone-input__flag{padding-left:.75rem;font-size:1rem}:host(.studio-phone-input--sm) .studio-phone-input__selector{padding-left:.75rem}:host(.studio-phone-input--sm) .studio-phone-input__selector-flag{font-size:1rem}:host(.studio-phone-input--sm) .studio-phone-input__loading{padding-right:.5rem}:host(.studio-phone-input--md) .studio-phone-input__field{height:2.5rem;font-size:1rem;padding:0 1rem}:host(.studio-phone-input--md) .studio-phone-input__flag{padding-left:1rem;font-size:1.25rem}:host(.studio-phone-input--md) .studio-phone-input__selector{padding-left:1rem}:host(.studio-phone-input--md) .studio-phone-input__selector-flag{font-size:1.25rem}:host(.studio-phone-input--md) .studio-phone-input__loading{padding-right:.75rem}:host(.studio-phone-input--lg) .studio-phone-input__field{height:3rem;font-size:1.125rem;padding:0 1.25rem}:host(.studio-phone-input--lg) .studio-phone-input__flag{padding-left:1.25rem;font-size:1.5rem}:host(.studio-phone-input--lg) .studio-phone-input__selector{padding-left:1.25rem}:host(.studio-phone-input--lg) .studio-phone-input__selector-flag{font-size:1.5rem}:host(.studio-phone-input--lg) .studio-phone-input__loading{padding-right:1rem}:host(.studio-phone-input--radius-none) .studio-phone-input__container{border-radius:0}:host(.studio-phone-input--radius-sm) .studio-phone-input__container{border-radius:var(--studio-radius-sm)}:host(.studio-phone-input--radius-md) .studio-phone-input__container{border-radius:var(--studio-radius-md)}:host(.studio-phone-input--radius-lg) .studio-phone-input__container{border-radius:var(--studio-radius-lg)}:host(.studio-phone-input--radius-full) .studio-phone-input__container{border-radius:9999px}:host(.studio-phone-input--filled.studio-phone-input--radius-none) .studio-phone-input__container{border-radius:0}:host(.studio-phone-input--filled.studio-phone-input--radius-sm) .studio-phone-input__container{border-radius:var(--studio-radius-sm) var(--studio-radius-sm) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-md) .studio-phone-input__container{border-radius:var(--studio-radius-md) var(--studio-radius-md) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-lg) .studio-phone-input__container{border-radius:var(--studio-radius-lg) var(--studio-radius-lg) 0 0}:host(.studio-phone-input--filled.studio-phone-input--radius-full) .studio-phone-input__container{border-radius:9999px 9999px 0 0}\n"] }]
4446
+ }], ctorParameters: () => [], propDecorators: { inputEl: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], variantInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], sizeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], radiusInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], country: [{ type: i0.Input, args: [{ isSignal: true, alias: "country", required: false }] }, { type: i0.Output, args: ["countryChange"] }], showCountrySelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCountrySelector", required: false }] }], showFlag: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFlag", required: false }] }], showCountryCode: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCountryCode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], autoFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFocus", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], countryChange: [{ type: i0.Output, args: ["countryChange"] }], focused: [{ type: i0.Output, args: ["focused"] }], blurred: [{ type: i0.Output, args: ["blurred"] }] } });
4447
+
4138
4448
  class ModalComponent {
4139
4449
  destroyRef = inject(DestroyRef);
4140
4450
  // Inputs
@@ -6905,5 +7215,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
6905
7215
  * Generated bundle index. Do not edit.
6906
7216
  */
6907
7217
 
6908
- export { BadgeComponent, BadgeWrapperComponent, BottomNavigationComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, CardComponent, ChatComponent, ChatInputComponent, ChatMessageComponent, CheckboxComponent, ColorPickerCompactComponent, ColorPickerComponent, DEFAULT_COLOR_PRESETS, DrawerComponent, DrawerService, DropdownComponent, IconComponent, InputComponent, InspectorComponent, MASK_PRESETS, MaskDirective, MaskEngine, MenuComponent, ModalComponent, NavbarComponent, PopoverComponent, RadioButtonComponent, STUDIO_CONFIG, SelectComponent, SidebarComponent, StudioConfigService, SwitchComponent, TableColumnDirective, TableComponent, TabsComponent, TextareaComponent, ThemeSwitchComponent, TooltipComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
7218
+ export { BadgeComponent, BadgeWrapperComponent, BottomNavigationComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, COUNTRY_OPTIONS, CardComponent, ChatComponent, ChatInputComponent, ChatMessageComponent, CheckboxComponent, ColorPickerCompactComponent, ColorPickerComponent, DEFAULT_COLOR_PRESETS, DrawerComponent, DrawerService, DropdownComponent, IconComponent, InputComponent, InspectorComponent, MASK_PRESETS, MaskDirective, MaskEngine, MenuComponent, ModalComponent, NavbarComponent, PhoneInputComponent, PopoverComponent, RadioButtonComponent, STUDIO_CONFIG, SelectComponent, SidebarComponent, StudioConfigService, SwitchComponent, TableColumnDirective, TableComponent, TabsComponent, TextareaComponent, ThemeSwitchComponent, TooltipComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
6909
7219
  //# sourceMappingURL=eduboxpro-studio.mjs.map