ngx-strata 0.6.0 → 0.6.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.
@@ -99,6 +99,22 @@ const baseIconConfigs = [
99
99
  {
100
100
  name: 'calendar',
101
101
  url: 'assets/icons/calendar.svg'
102
+ },
103
+ {
104
+ name: 'clock',
105
+ url: 'assets/icons/clock.svg'
106
+ },
107
+ {
108
+ name: 'upload',
109
+ url: 'assets/icons/upload.svg'
110
+ },
111
+ {
112
+ name: 'camera',
113
+ url: 'assets/icons/camera.svg'
114
+ },
115
+ {
116
+ name: 'image',
117
+ url: 'assets/icons/image.svg'
102
118
  }
103
119
  ];
104
120
 
@@ -1220,6 +1236,8 @@ class StrataOverlayDirective {
1220
1236
  ...(ngDevMode ? [{ debugName: "overlayOffset" }] : /* istanbul ignore next */ []));
1221
1237
  overlayFitViewport = input(true, /* @ts-ignore */
1222
1238
  ...(ngDevMode ? [{ debugName: "overlayFitViewport" }] : /* istanbul ignore next */ []));
1239
+ overlayTarget = input(null, /* @ts-ignore */
1240
+ ...(ngDevMode ? [{ debugName: "overlayTarget" }] : /* istanbul ignore next */ []));
1223
1241
  element = inject(ElementRef);
1224
1242
  viewContainerRef = inject(ViewContainerRef);
1225
1243
  config = inject(STRATA_CONFIG, { optional: true });
@@ -1228,12 +1246,25 @@ class StrataOverlayDirective {
1228
1246
  viewRef;
1229
1247
  ngOnChanges() {
1230
1248
  if (this.overlayOpen()) {
1231
- this.create();
1249
+ if (!this.overlayEl) {
1250
+ this.create();
1251
+ }
1252
+ else {
1253
+ if (this.cleanup) {
1254
+ this.cleanup();
1255
+ }
1256
+ const target = this.getTarget();
1257
+ this.cleanup = autoUpdate(target, this.overlayEl, () => this.updatePosition());
1258
+ this.updatePosition();
1259
+ }
1232
1260
  }
1233
1261
  else {
1234
1262
  this.destroy();
1235
1263
  }
1236
1264
  }
1265
+ getTarget() {
1266
+ return this.overlayTarget() ?? this.element.nativeElement;
1267
+ }
1237
1268
  async create() {
1238
1269
  if (this.overlayEl)
1239
1270
  return;
@@ -1241,7 +1272,8 @@ class StrataOverlayDirective {
1241
1272
  this.viewRef.detectChanges();
1242
1273
  this.overlayEl = this.viewRef.rootNodes[0];
1243
1274
  document.body.appendChild(this.overlayEl);
1244
- this.cleanup = autoUpdate(this.element.nativeElement, this.overlayEl, () => this.updatePosition());
1275
+ const target = this.getTarget();
1276
+ this.cleanup = autoUpdate(target, this.overlayEl, () => this.updatePosition());
1245
1277
  }
1246
1278
  async updatePosition() {
1247
1279
  if (!this.overlayEl)
@@ -1264,14 +1296,15 @@ class StrataOverlayDirective {
1264
1296
  else {
1265
1297
  this.overlayEl.style.maxHeight = '';
1266
1298
  }
1267
- const { x, y } = await computePosition(this.element.nativeElement, this.overlayEl, {
1299
+ const target = this.getTarget();
1300
+ const { x, y } = await computePosition(target, this.overlayEl, {
1268
1301
  placement: this.overlayPlacement(),
1269
1302
  strategy: 'fixed',
1270
1303
  middleware
1271
1304
  });
1272
1305
  if (!this.overlayEl)
1273
1306
  return;
1274
- const { width } = this.element.nativeElement.getBoundingClientRect();
1307
+ const width = 'getBoundingClientRect' in target ? target.getBoundingClientRect().width : 0;
1275
1308
  Object.assign(this.overlayEl.style, {
1276
1309
  position: 'fixed',
1277
1310
  left: `${x}px`,
@@ -1298,14 +1331,14 @@ class StrataOverlayDirective {
1298
1331
  this.destroy();
1299
1332
  }
1300
1333
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1301
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: StrataOverlayDirective, isStandalone: true, selector: "[stOverlay]", inputs: { stOverlay: { classPropertyName: "stOverlay", publicName: "stOverlay", isSignal: true, isRequired: true, transformFunction: null }, overlayOpen: { classPropertyName: "overlayOpen", publicName: "overlayOpen", isSignal: true, isRequired: false, transformFunction: null }, overlayPlacement: { classPropertyName: "overlayPlacement", publicName: "overlayPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayOffset: { classPropertyName: "overlayOffset", publicName: "overlayOffset", isSignal: true, isRequired: false, transformFunction: null }, overlayFitViewport: { classPropertyName: "overlayFitViewport", publicName: "overlayFitViewport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overlayOpen: "overlayOpenChange" }, usesOnChanges: true, ngImport: i0 });
1334
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: StrataOverlayDirective, isStandalone: true, selector: "[stOverlay]", inputs: { stOverlay: { classPropertyName: "stOverlay", publicName: "stOverlay", isSignal: true, isRequired: true, transformFunction: null }, overlayOpen: { classPropertyName: "overlayOpen", publicName: "overlayOpen", isSignal: true, isRequired: false, transformFunction: null }, overlayPlacement: { classPropertyName: "overlayPlacement", publicName: "overlayPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayOffset: { classPropertyName: "overlayOffset", publicName: "overlayOffset", isSignal: true, isRequired: false, transformFunction: null }, overlayFitViewport: { classPropertyName: "overlayFitViewport", publicName: "overlayFitViewport", isSignal: true, isRequired: false, transformFunction: null }, overlayTarget: { classPropertyName: "overlayTarget", publicName: "overlayTarget", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overlayOpen: "overlayOpenChange" }, usesOnChanges: true, ngImport: i0 });
1302
1335
  }
1303
1336
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataOverlayDirective, decorators: [{
1304
1337
  type: Directive,
1305
1338
  args: [{
1306
1339
  selector: '[stOverlay]'
1307
1340
  }]
1308
- }], propDecorators: { stOverlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "stOverlay", required: true }] }], overlayOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOpen", required: false }] }, { type: i0.Output, args: ["overlayOpenChange"] }], overlayPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPlacement", required: false }] }], overlayOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOffset", required: false }] }], overlayFitViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayFitViewport", required: false }] }] } });
1341
+ }], propDecorators: { stOverlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "stOverlay", required: true }] }], overlayOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOpen", required: false }] }, { type: i0.Output, args: ["overlayOpenChange"] }], overlayPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPlacement", required: false }] }], overlayOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOffset", required: false }] }], overlayFitViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayFitViewport", required: false }] }], overlayTarget: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayTarget", required: false }] }] } });
1309
1342
 
1310
1343
  class StrataActionMenuComponent {
1311
1344
  projectedButton = contentChild(StrataButtonDirective, { ...(ngDevMode ? { debugName: "projectedButton" } : /* istanbul ignore next */ {}), descendants: true,
@@ -1321,18 +1354,28 @@ class StrataActionMenuComponent {
1321
1354
  ...(ngDevMode ? [{ debugName: "buttonSize" }] : /* istanbul ignore next */ []));
1322
1355
  closeOnOutsideClick = input(true, /* @ts-ignore */
1323
1356
  ...(ngDevMode ? [{ debugName: "closeOnOutsideClick" }] : /* istanbul ignore next */ []));
1357
+ trigger = input(true, /* @ts-ignore */
1358
+ ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
1324
1359
  elementRef = inject(ElementRef);
1325
1360
  renderer = inject(Renderer2);
1326
1361
  menuOpen = signal(false, /* @ts-ignore */
1327
1362
  ...(ngDevMode ? [{ debugName: "menuOpen" }] : /* istanbul ignore next */ []));
1363
+ customTarget = signal(null, /* @ts-ignore */
1364
+ ...(ngDevMode ? [{ debugName: "customTarget" }] : /* istanbul ignore next */ []));
1365
+ contextMenuPlacement = signal(null, /* @ts-ignore */
1366
+ ...(ngDevMode ? [{ debugName: "contextMenuPlacement" }] : /* istanbul ignore next */ []));
1367
+ effectivePlacement = computed(() => {
1368
+ return this.contextMenuPlacement() ?? this.placement();
1369
+ }, /* @ts-ignore */
1370
+ ...(ngDevMode ? [{ debugName: "effectivePlacement" }] : /* istanbul ignore next */ []));
1328
1371
  constructor() {
1329
1372
  effect((onCleanup) => {
1330
1373
  const button = this.projectedButton() ?? this.defaultButton();
1331
- if (!button) {
1374
+ if (!button || !this.trigger()) {
1332
1375
  return;
1333
1376
  }
1334
1377
  const unlisten = this.renderer.listen(button.nativeElement, 'click', () => {
1335
- this.menuOpen.set(!this.menuOpen());
1378
+ this.toggle();
1336
1379
  });
1337
1380
  onCleanup(() => {
1338
1381
  unlisten();
@@ -1352,7 +1395,20 @@ class StrataActionMenuComponent {
1352
1395
  if (hostEl.contains(target) || (overlayEl && overlayEl.contains(target))) {
1353
1396
  return;
1354
1397
  }
1355
- this.menuOpen.set(false);
1398
+ this.close();
1399
+ });
1400
+ onCleanup(() => {
1401
+ unlisten();
1402
+ });
1403
+ });
1404
+ effect((onCleanup) => {
1405
+ if (!this.menuOpen()) {
1406
+ return;
1407
+ }
1408
+ const unlisten = this.renderer.listen('document', 'keydown', (event) => {
1409
+ if (event.key === 'Escape') {
1410
+ this.close();
1411
+ }
1356
1412
  });
1357
1413
  onCleanup(() => {
1358
1414
  unlisten();
@@ -1361,7 +1417,7 @@ class StrataActionMenuComponent {
1361
1417
  effect((onCleanup) => {
1362
1418
  const subs = this.actionMenuItems().map((item) => item.menuItemClicked.subscribe((shouldClose) => {
1363
1419
  if (shouldClose) {
1364
- this.menuOpen.set(false);
1420
+ this.close();
1365
1421
  }
1366
1422
  }));
1367
1423
  onCleanup(() => {
@@ -1369,18 +1425,95 @@ class StrataActionMenuComponent {
1369
1425
  });
1370
1426
  });
1371
1427
  }
1428
+ open() {
1429
+ this.customTarget.set(null);
1430
+ this.contextMenuPlacement.set(null);
1431
+ this.menuOpen.set(true);
1432
+ }
1433
+ close() {
1434
+ this.menuOpen.set(false);
1435
+ this.customTarget.set(null);
1436
+ this.contextMenuPlacement.set(null);
1437
+ }
1438
+ toggle() {
1439
+ if (this.menuOpen()) {
1440
+ this.close();
1441
+ }
1442
+ else {
1443
+ this.open();
1444
+ }
1445
+ }
1446
+ openAt(position, placement = 'bottom-start') {
1447
+ const clientX = 'clientX' in position ? position.clientX : position.x;
1448
+ const clientY = 'clientY' in position ? position.clientY : position.y;
1449
+ const virtualElement = {
1450
+ getBoundingClientRect() {
1451
+ return {
1452
+ x: clientX,
1453
+ y: clientY,
1454
+ top: clientY,
1455
+ left: clientX,
1456
+ bottom: clientY,
1457
+ right: clientX,
1458
+ width: 0,
1459
+ height: 0
1460
+ };
1461
+ }
1462
+ };
1463
+ this.customTarget.set(virtualElement);
1464
+ this.contextMenuPlacement.set(placement);
1465
+ this.menuOpen.set(true);
1466
+ }
1372
1467
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1373
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataActionMenuComponent, isStandalone: true, selector: "st-action-menu", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, buttonSize: { classPropertyName: "buttonSize", publicName: "buttonSize", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "closeOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "projectedButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "actionMenuItems", predicate: StrataActionMenuItemComponent, isSignal: true }], viewQueries: [{ propertyName: "defaultButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div [stOverlay]=\"menu\" [overlayOpen]=\"menuOpen()\" [overlayPlacement]=\"placement()\">\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton [size]=\"buttonSize()\"><st-icon name=\"more\"></st-icon></button>\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"], dependencies: [{ kind: "component", type: StrataCardComponent, selector: "st-card", inputs: ["elevated", "selectable", "padding", "variant"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1468
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataActionMenuComponent, isStandalone: true, selector: "st-action-menu", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, buttonSize: { classPropertyName: "buttonSize", publicName: "buttonSize", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "closeOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "projectedButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "actionMenuItems", predicate: StrataActionMenuItemComponent, isSignal: true }], viewQueries: [{ propertyName: "defaultButton", first: true, predicate: StrataButtonDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [stOverlay]=\"menu\"\n [overlayOpen]=\"menuOpen()\"\n [overlayPlacement]=\"effectivePlacement()\"\n [overlayTarget]=\"customTarget()\">\n @if (trigger()) {\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton [size]=\"buttonSize()\"><st-icon name=\"more\"></st-icon></button>\n }\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"], dependencies: [{ kind: "component", type: StrataCardComponent, selector: "st-card", inputs: ["elevated", "selectable", "padding", "variant"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport", "overlayTarget"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
1374
1469
  }
1375
1470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataActionMenuComponent, decorators: [{
1376
1471
  type: Component,
1377
- args: [{ selector: 'st-action-menu', imports: [StrataCardComponent, StrataOverlayDirective, StrataIconComponent, StrataButtonDirective], template: "<div [stOverlay]=\"menu\" [overlayOpen]=\"menuOpen()\" [overlayPlacement]=\"placement()\">\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton [size]=\"buttonSize()\"><st-icon name=\"more\"></st-icon></button>\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"] }]
1472
+ args: [{ selector: 'st-action-menu', imports: [StrataCardComponent, StrataOverlayDirective, StrataIconComponent, StrataButtonDirective], template: "<div\n [stOverlay]=\"menu\"\n [overlayOpen]=\"menuOpen()\"\n [overlayPlacement]=\"effectivePlacement()\"\n [overlayTarget]=\"customTarget()\">\n @if (trigger()) {\n <ng-content select=\"button[stButton]\"></ng-content>\n @if (!projectedButton()) {\n <button stButton [size]=\"buttonSize()\"><st-icon name=\"more\"></st-icon></button>\n }\n }\n</div>\n\n<ng-template #menu>\n <st-card [padding]=\"false\" class=\"action-menu-card\"><ng-content select=\"st-action-menu-item\"></ng-content></st-card>\n</ng-template>\n", styles: ["st-card{width:fit-content}\n"] }]
1378
1473
  }], ctorParameters: () => [], propDecorators: { projectedButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrataButtonDirective), { ...{
1379
1474
  descendants: true,
1380
1475
  read: ElementRef
1381
1476
  }, isSignal: true }] }], defaultButton: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataButtonDirective), { ...{
1382
1477
  read: ElementRef
1383
- }, isSignal: true }] }], overlayDirective: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataOverlayDirective), { isSignal: true }] }], actionMenuItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataActionMenuItemComponent), { isSignal: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], buttonSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonSize", required: false }] }], closeOnOutsideClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsideClick", required: false }] }] } });
1478
+ }, isSignal: true }] }], overlayDirective: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataOverlayDirective), { isSignal: true }] }], actionMenuItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataActionMenuItemComponent), { isSignal: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], buttonSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonSize", required: false }] }], closeOnOutsideClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnOutsideClick", required: false }] }], trigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "trigger", required: false }] }] } });
1479
+
1480
+ class StrataContextMenuDirective {
1481
+ stContextMenu = input.required(/* @ts-ignore */
1482
+ ...(ngDevMode ? [{ debugName: "stContextMenu" }] : /* istanbul ignore next */ []));
1483
+ stContextMenuDisabled = input(false, /* @ts-ignore */
1484
+ ...(ngDevMode ? [{ debugName: "stContextMenuDisabled" }] : /* istanbul ignore next */ []));
1485
+ stContextMenuPlacement = input('bottom-start', /* @ts-ignore */
1486
+ ...(ngDevMode ? [{ debugName: "stContextMenuPlacement" }] : /* istanbul ignore next */ []));
1487
+ contextMenuOpened = output();
1488
+ elementRef = inject(ElementRef);
1489
+ renderer = inject(Renderer2);
1490
+ unlisten;
1491
+ ngOnInit() {
1492
+ this.unlisten = this.renderer.listen(this.elementRef.nativeElement, 'contextmenu', (event) => {
1493
+ const menu = this.stContextMenu();
1494
+ if (this.stContextMenuDisabled() || !menu) {
1495
+ return;
1496
+ }
1497
+ event.preventDefault();
1498
+ event.stopPropagation();
1499
+ this.contextMenuOpened.emit(event);
1500
+ menu.openAt(event, this.stContextMenuPlacement());
1501
+ });
1502
+ }
1503
+ ngOnDestroy() {
1504
+ if (this.unlisten) {
1505
+ this.unlisten();
1506
+ }
1507
+ }
1508
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1509
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: StrataContextMenuDirective, isStandalone: true, selector: "[stContextMenu]", inputs: { stContextMenu: { classPropertyName: "stContextMenu", publicName: "stContextMenu", isSignal: true, isRequired: true, transformFunction: null }, stContextMenuDisabled: { classPropertyName: "stContextMenuDisabled", publicName: "stContextMenuDisabled", isSignal: true, isRequired: false, transformFunction: null }, stContextMenuPlacement: { classPropertyName: "stContextMenuPlacement", publicName: "stContextMenuPlacement", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contextMenuOpened: "contextMenuOpened" }, ngImport: i0 });
1510
+ }
1511
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataContextMenuDirective, decorators: [{
1512
+ type: Directive,
1513
+ args: [{
1514
+ selector: '[stContextMenu]'
1515
+ }]
1516
+ }], propDecorators: { stContextMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "stContextMenu", required: true }] }], stContextMenuDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "stContextMenuDisabled", required: false }] }], stContextMenuPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "stContextMenuPlacement", required: false }] }], contextMenuOpened: [{ type: i0.Output, args: ["contextMenuOpened"] }] } });
1384
1517
 
1385
1518
  class StrataTextStackComponent {
1386
1519
  overflow = input('truncate', /* @ts-ignore */
@@ -1652,7 +1785,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
1652
1785
  }, template: "<ng-content select=\"[stButton], st-divider\" #buttons></ng-content>\n" }]
1653
1786
  }], propDecorators: { justification: [{ type: i0.Input, args: [{ isSignal: true, alias: "justification", required: false }] }] } });
1654
1787
 
1655
- class StrataTimePickerComponent {
1788
+ class StrataTimeStepperComponent {
1656
1789
  format = input('24h', /* @ts-ignore */
1657
1790
  ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
1658
1791
  showSeconds = input(false, /* @ts-ignore */
@@ -1820,30 +1953,264 @@ class StrataTimePickerComponent {
1820
1953
  setDisabledState(isDisabled) {
1821
1954
  this.cvaDisabled.set(isDisabled);
1822
1955
  }
1823
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1824
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataTimePickerComponent, isStandalone: true, selector: "st-time-picker", inputs: { format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.st-time-picker": "true", "class.st-disabled": "effectiveDisabled()", "attr.aria-disabled": "effectiveDisabled() ? \"true\" : null" } }, providers: [
1956
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimeStepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1957
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataTimeStepperComponent, isStandalone: true, selector: "st-time-stepper", inputs: { format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.st-time-stepper": "true", "class.st-disabled": "effectiveDisabled()", "attr.aria-disabled": "effectiveDisabled() ? \"true\" : null" } }, providers: [
1825
1958
  {
1826
1959
  provide: NG_VALUE_ACCESSOR,
1827
- useExisting: forwardRef(() => StrataTimePickerComponent),
1960
+ useExisting: forwardRef(() => StrataTimeStepperComponent),
1828
1961
  multi: true
1829
1962
  }
1830
- ], ngImport: i0, template: "<div class=\"st-time-picker-inner\">\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementHours()\"\n aria-label=\"Increment hours\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementHours()\" (keydown.arrowdown)=\"decrementHours()\">\n {{ displayHours() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementHours()\"\n aria-label=\"Decrement hours\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementMinutes()\"\n aria-label=\"Increment minutes\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementMinutes()\" (keydown.arrowdown)=\"decrementMinutes()\">\n {{ displayMinutes() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementMinutes()\"\n aria-label=\"Decrement minutes\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementSeconds()\"\n aria-label=\"Increment seconds\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementSeconds()\" (keydown.arrowdown)=\"decrementSeconds()\">\n {{ displaySeconds() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementSeconds()\"\n aria-label=\"Decrement seconds\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n }\n\n @if (is12h()) {\n <div class=\"st-time-col st-meridiem-col\">\n <button\n type=\"button\"\n class=\"st-meridiem-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"toggleMeridiem()\"\n aria-label=\"Toggle AM PM\"\n >\n {{ meridiem() }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:inline-flex;align-items:center;box-sizing:border-box}:host.st-size-sm .st-time-val{min-width:34px;height:32px;font-size:var(--st-font-md);border-radius:var(--st-border-radius-sm)}:host.st-size-sm .st-time-arrow-btn{width:34px;height:20px}:host.st-size-sm .st-time-sep{font-size:var(--st-font-lg);margin:0 2px}:host.st-size-sm .st-meridiem-btn{height:32px;font-size:var(--st-font-xs);padding:0 var(--st-space-2);border-radius:var(--st-border-radius-sm)}:host.st-size-lg .st-time-val{min-width:54px;height:50px;font-size:1.5rem;border-radius:var(--st-border-radius-lg)}:host.st-size-lg .st-time-arrow-btn{width:54px;height:28px}:host.st-size-lg .st-time-sep{font-size:1.75rem;margin:0 6px}:host.st-size-lg .st-meridiem-btn{height:50px;font-size:var(--st-font-md);padding:0 var(--st-space-4);border-radius:var(--st-border-radius-lg)}:host.st-disabled{opacity:.55;pointer-events:none}.st-time-picker-inner{display:inline-flex;align-items:center;gap:var(--st-space-1);padding:0;background:transparent;border:none;color:var(--st-color-text-primary);-webkit-user-select:none;user-select:none}.st-time-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-1)}.st-time-arrow-btn{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);width:44px;height:24px;border-radius:var(--st-border-radius-sm);transition:background var(--st-transition-fast),color var(--st-transition-fast)}.st-time-arrow-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-time-arrow-btn:disabled{opacity:.4;cursor:not-allowed}.st-time-val{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:42px;font-family:var(--st-font-mono);font-size:var(--st-font-lg);font-weight:var(--st-font-weight-semibold);background:transparent;border:1px solid var(--st-border);border-radius:var(--st-border-radius-md);color:var(--st-color-text-primary);outline:none;cursor:default;transition:border-color var(--st-transition-fast)}.st-time-val:focus-visible{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}.st-time-sep{font-weight:var(--st-font-weight-bold);color:var(--st-color-text-secondary);font-size:var(--st-font-xl);margin:0 4px}.st-meridiem-col{margin-left:var(--st-space-1)}.st-meridiem-btn{background:transparent;border:1px solid var(--st-border);color:var(--st-color-text-primary);border-radius:var(--st-border-radius-md);height:42px;font-size:var(--st-font-sm);font-weight:var(--st-font-weight-semibold);padding:0 var(--st-space-3);cursor:pointer;transition:background var(--st-transition-fast),border-color var(--st-transition-fast)}.st-meridiem-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));border-color:var(--st-color-border-strong)}.st-meridiem-btn:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }] });
1963
+ ], ngImport: i0, template: "<div class=\"st-time-stepper-inner\">\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementHours()\"\n aria-label=\"Increment hours\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementHours()\" (keydown.arrowdown)=\"decrementHours()\">\n {{ displayHours() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementHours()\"\n aria-label=\"Decrement hours\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementMinutes()\"\n aria-label=\"Increment minutes\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementMinutes()\" (keydown.arrowdown)=\"decrementMinutes()\">\n {{ displayMinutes() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementMinutes()\"\n aria-label=\"Decrement minutes\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementSeconds()\"\n aria-label=\"Increment seconds\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementSeconds()\" (keydown.arrowdown)=\"decrementSeconds()\">\n {{ displaySeconds() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementSeconds()\"\n aria-label=\"Decrement seconds\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n }\n\n @if (is12h()) {\n <div class=\"st-time-col st-meridiem-col\">\n <button\n type=\"button\"\n class=\"st-meridiem-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"toggleMeridiem()\"\n aria-label=\"Toggle AM PM\"\n >\n {{ meridiem() }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:inline-flex;align-items:center;box-sizing:border-box}:host.st-disabled{opacity:.55;pointer-events:none}.st-time-stepper-inner{display:inline-flex;align-items:center;gap:var(--st-space-1);padding:0;background:transparent;border:none;color:var(--st-color-text-primary);-webkit-user-select:none;user-select:none}.st-time-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-1)}.st-time-arrow-btn{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);width:44px;height:24px;border-radius:var(--st-border-radius-sm);transition:background var(--st-transition-fast),color var(--st-transition-fast)}.st-time-arrow-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-time-arrow-btn:disabled{opacity:.4;cursor:not-allowed}.st-time-val{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:42px;font-family:var(--st-font-mono);font-size:var(--st-font-lg);font-weight:var(--st-font-weight-semibold);background:transparent;border:1px solid var(--st-border);border-radius:var(--st-border-radius-md);color:var(--st-color-text-primary);outline:none;cursor:default;transition:border-color var(--st-transition-fast)}.st-time-val:focus-visible{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}.st-time-sep{font-weight:var(--st-font-weight-bold);color:var(--st-color-text-secondary);font-size:var(--st-font-xl);margin:0 4px}.st-meridiem-col{margin-left:var(--st-space-1)}.st-meridiem-btn{background:transparent;border:1px solid var(--st-border);color:var(--st-color-text-primary);border-radius:var(--st-border-radius-md);height:42px;font-size:var(--st-font-sm);font-weight:var(--st-font-weight-semibold);padding:0 var(--st-space-3);cursor:pointer;transition:background var(--st-transition-fast),border-color var(--st-transition-fast)}.st-meridiem-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));border-color:var(--st-color-border-strong)}.st-meridiem-btn:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }] });
1831
1964
  }
1832
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimePickerComponent, decorators: [{
1965
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimeStepperComponent, decorators: [{
1833
1966
  type: Component,
1834
- args: [{ selector: 'st-time-picker', imports: [CommonModule, StrataIconComponent], providers: [
1967
+ args: [{ selector: 'st-time-stepper', imports: [CommonModule, StrataIconComponent], providers: [
1835
1968
  {
1836
1969
  provide: NG_VALUE_ACCESSOR,
1837
- useExisting: forwardRef(() => StrataTimePickerComponent),
1970
+ useExisting: forwardRef(() => StrataTimeStepperComponent),
1838
1971
  multi: true
1839
1972
  }
1840
1973
  ], host: {
1841
- '[class.st-time-picker]': 'true',
1974
+ '[class.st-time-stepper]': 'true',
1842
1975
  '[class.st-disabled]': 'effectiveDisabled()',
1843
1976
  '[attr.aria-disabled]': 'effectiveDisabled() ? "true" : null'
1844
- }, template: "<div class=\"st-time-picker-inner\">\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementHours()\"\n aria-label=\"Increment hours\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementHours()\" (keydown.arrowdown)=\"decrementHours()\">\n {{ displayHours() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementHours()\"\n aria-label=\"Decrement hours\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementMinutes()\"\n aria-label=\"Increment minutes\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementMinutes()\" (keydown.arrowdown)=\"decrementMinutes()\">\n {{ displayMinutes() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementMinutes()\"\n aria-label=\"Decrement minutes\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementSeconds()\"\n aria-label=\"Increment seconds\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementSeconds()\" (keydown.arrowdown)=\"decrementSeconds()\">\n {{ displaySeconds() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementSeconds()\"\n aria-label=\"Decrement seconds\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n }\n\n @if (is12h()) {\n <div class=\"st-time-col st-meridiem-col\">\n <button\n type=\"button\"\n class=\"st-meridiem-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"toggleMeridiem()\"\n aria-label=\"Toggle AM PM\"\n >\n {{ meridiem() }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:inline-flex;align-items:center;box-sizing:border-box}:host.st-size-sm .st-time-val{min-width:34px;height:32px;font-size:var(--st-font-md);border-radius:var(--st-border-radius-sm)}:host.st-size-sm .st-time-arrow-btn{width:34px;height:20px}:host.st-size-sm .st-time-sep{font-size:var(--st-font-lg);margin:0 2px}:host.st-size-sm .st-meridiem-btn{height:32px;font-size:var(--st-font-xs);padding:0 var(--st-space-2);border-radius:var(--st-border-radius-sm)}:host.st-size-lg .st-time-val{min-width:54px;height:50px;font-size:1.5rem;border-radius:var(--st-border-radius-lg)}:host.st-size-lg .st-time-arrow-btn{width:54px;height:28px}:host.st-size-lg .st-time-sep{font-size:1.75rem;margin:0 6px}:host.st-size-lg .st-meridiem-btn{height:50px;font-size:var(--st-font-md);padding:0 var(--st-space-4);border-radius:var(--st-border-radius-lg)}:host.st-disabled{opacity:.55;pointer-events:none}.st-time-picker-inner{display:inline-flex;align-items:center;gap:var(--st-space-1);padding:0;background:transparent;border:none;color:var(--st-color-text-primary);-webkit-user-select:none;user-select:none}.st-time-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-1)}.st-time-arrow-btn{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);width:44px;height:24px;border-radius:var(--st-border-radius-sm);transition:background var(--st-transition-fast),color var(--st-transition-fast)}.st-time-arrow-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-time-arrow-btn:disabled{opacity:.4;cursor:not-allowed}.st-time-val{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:42px;font-family:var(--st-font-mono);font-size:var(--st-font-lg);font-weight:var(--st-font-weight-semibold);background:transparent;border:1px solid var(--st-border);border-radius:var(--st-border-radius-md);color:var(--st-color-text-primary);outline:none;cursor:default;transition:border-color var(--st-transition-fast)}.st-time-val:focus-visible{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}.st-time-sep{font-weight:var(--st-font-weight-bold);color:var(--st-color-text-secondary);font-size:var(--st-font-xl);margin:0 4px}.st-meridiem-col{margin-left:var(--st-space-1)}.st-meridiem-btn{background:transparent;border:1px solid var(--st-border);color:var(--st-color-text-primary);border-radius:var(--st-border-radius-md);height:42px;font-size:var(--st-font-sm);font-weight:var(--st-font-weight-semibold);padding:0 var(--st-space-3);cursor:pointer;transition:background var(--st-transition-fast),border-color var(--st-transition-fast)}.st-meridiem-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));border-color:var(--st-color-border-strong)}.st-meridiem-btn:disabled{opacity:.4;cursor:not-allowed}\n"] }]
1977
+ }, template: "<div class=\"st-time-stepper-inner\">\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementHours()\"\n aria-label=\"Increment hours\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementHours()\" (keydown.arrowdown)=\"decrementHours()\">\n {{ displayHours() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementHours()\"\n aria-label=\"Decrement hours\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementMinutes()\"\n aria-label=\"Increment minutes\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementMinutes()\" (keydown.arrowdown)=\"decrementMinutes()\">\n {{ displayMinutes() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementMinutes()\"\n aria-label=\"Decrement minutes\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"st-time-sep\">:</span>\n\n <div class=\"st-time-col\">\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"incrementSeconds()\"\n aria-label=\"Increment seconds\"\n >\n <st-icon name=\"arrow-up\" size=\"xs\"></st-icon>\n </button>\n <span class=\"st-time-val\" tabindex=\"0\" (keydown.arrowup)=\"incrementSeconds()\" (keydown.arrowdown)=\"decrementSeconds()\">\n {{ displaySeconds() }}\n </span>\n <button\n type=\"button\"\n class=\"st-time-arrow-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"decrementSeconds()\"\n aria-label=\"Decrement seconds\"\n >\n <st-icon name=\"arrow-down\" size=\"xs\"></st-icon>\n </button>\n </div>\n }\n\n @if (is12h()) {\n <div class=\"st-time-col st-meridiem-col\">\n <button\n type=\"button\"\n class=\"st-meridiem-btn\"\n [disabled]=\"effectiveDisabled()\"\n (click)=\"toggleMeridiem()\"\n aria-label=\"Toggle AM PM\"\n >\n {{ meridiem() }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:inline-flex;align-items:center;box-sizing:border-box}:host.st-disabled{opacity:.55;pointer-events:none}.st-time-stepper-inner{display:inline-flex;align-items:center;gap:var(--st-space-1);padding:0;background:transparent;border:none;color:var(--st-color-text-primary);-webkit-user-select:none;user-select:none}.st-time-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-1)}.st-time-arrow-btn{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);width:44px;height:24px;border-radius:var(--st-border-radius-sm);transition:background var(--st-transition-fast),color var(--st-transition-fast)}.st-time-arrow-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-time-arrow-btn:disabled{opacity:.4;cursor:not-allowed}.st-time-val{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:42px;font-family:var(--st-font-mono);font-size:var(--st-font-lg);font-weight:var(--st-font-weight-semibold);background:transparent;border:1px solid var(--st-border);border-radius:var(--st-border-radius-md);color:var(--st-color-text-primary);outline:none;cursor:default;transition:border-color var(--st-transition-fast)}.st-time-val:focus-visible{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}.st-time-sep{font-weight:var(--st-font-weight-bold);color:var(--st-color-text-secondary);font-size:var(--st-font-xl);margin:0 4px}.st-meridiem-col{margin-left:var(--st-space-1)}.st-meridiem-btn{background:transparent;border:1px solid var(--st-border);color:var(--st-color-text-primary);border-radius:var(--st-border-radius-md);height:42px;font-size:var(--st-font-sm);font-weight:var(--st-font-weight-semibold);padding:0 var(--st-space-3);cursor:pointer;transition:background var(--st-transition-fast),border-color var(--st-transition-fast)}.st-meridiem-btn:hover:not(:disabled){background:var(--st-color-control-bg-hover, var(--st-color-bg-default));border-color:var(--st-color-border-strong)}.st-meridiem-btn:disabled{opacity:.4;cursor:not-allowed}\n"] }]
1845
1978
  }], ctorParameters: () => [], propDecorators: { format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
1846
1979
 
1980
+ let nextUniqueTimepickerId = 0;
1981
+ class StrataTimepickerComponent {
1982
+ defaultId = `st-timepicker-${nextUniqueTimepickerId++}`;
1983
+ label = input(undefined, /* @ts-ignore */
1984
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1985
+ id = input(undefined, /* @ts-ignore */
1986
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
1987
+ name = input(undefined, /* @ts-ignore */
1988
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1989
+ placeholder = input('Select time', /* @ts-ignore */
1990
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
1991
+ size = input('md', /* @ts-ignore */
1992
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1993
+ placement = input('bottom-start', /* @ts-ignore */
1994
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
1995
+ format = input('24h', /* @ts-ignore */
1996
+ ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
1997
+ showSeconds = input(false, { ...(ngDevMode ? { debugName: "showSeconds" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1998
+ minuteStep = input(1, /* @ts-ignore */
1999
+ ...(ngDevMode ? [{ debugName: "minuteStep" }] : /* istanbul ignore next */ []));
2000
+ clearable = input(true, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2001
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2002
+ readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2003
+ fullWidth = input(false, { ...(ngDevMode ? { debugName: "fullWidth" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2004
+ state = input(undefined, /* @ts-ignore */
2005
+ ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
2006
+ error = input(false, { ...(ngDevMode ? { debugName: "error" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2007
+ message = input(undefined, /* @ts-ignore */
2008
+ ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
2009
+ colorMessage = input(true, { ...(ngDevMode ? { debugName: "colorMessage" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2010
+ value = model(null, /* @ts-ignore */
2011
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2012
+ timeSelected = output();
2013
+ open = signal(false, /* @ts-ignore */
2014
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
2015
+ textInputValue = signal('', /* @ts-ignore */
2016
+ ...(ngDevMode ? [{ debugName: "textInputValue" }] : /* istanbul ignore next */ []));
2017
+ cvaDisabled = signal(false, /* @ts-ignore */
2018
+ ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
2019
+ effectiveDisabled = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
2020
+ ...(ngDevMode ? [{ debugName: "effectiveDisabled" }] : /* istanbul ignore next */ []));
2021
+ effectiveId = computed(() => this.id() ?? this.name() ?? this.defaultId, /* @ts-ignore */
2022
+ ...(ngDevMode ? [{ debugName: "effectiveId" }] : /* istanbul ignore next */ []));
2023
+ effectiveState = computed(() => {
2024
+ if (this.error()) {
2025
+ return 'error';
2026
+ }
2027
+ return this.state() ?? 'default';
2028
+ }, /* @ts-ignore */
2029
+ ...(ngDevMode ? [{ debugName: "effectiveState" }] : /* istanbul ignore next */ []));
2030
+ isMessageError = computed(() => this.effectiveState() === 'error' && this.colorMessage(), /* @ts-ignore */
2031
+ ...(ngDevMode ? [{ debugName: "isMessageError" }] : /* istanbul ignore next */ []));
2032
+ isMessageSuccess = computed(() => this.effectiveState() === 'success' && this.colorMessage(), /* @ts-ignore */
2033
+ ...(ngDevMode ? [{ debugName: "isMessageSuccess" }] : /* istanbul ignore next */ []));
2034
+ isMessageWarning = computed(() => this.effectiveState() === 'warning' && this.colorMessage(), /* @ts-ignore */
2035
+ ...(ngDevMode ? [{ debugName: "isMessageWarning" }] : /* istanbul ignore next */ []));
2036
+ onChange = () => undefined;
2037
+ onTouched = () => undefined;
2038
+ overlayDirective = viewChild(StrataOverlayDirective, /* @ts-ignore */
2039
+ ...(ngDevMode ? [{ debugName: "overlayDirective" }] : /* istanbul ignore next */ []));
2040
+ elementRef = inject(ElementRef);
2041
+ renderer = inject(Renderer2);
2042
+ destroyRef = inject(DestroyRef);
2043
+ constructor() {
2044
+ const unlisten = this.renderer.listen('document', 'pointerdown', (event) => {
2045
+ if (!this.open())
2046
+ return;
2047
+ const target = event.target;
2048
+ if (!target)
2049
+ return;
2050
+ const hostEl = this.elementRef.nativeElement;
2051
+ const overlayEl = this.overlayDirective()?.getOverlayElement();
2052
+ if (hostEl.contains(target) || (overlayEl && overlayEl.contains(target))) {
2053
+ return;
2054
+ }
2055
+ this.open.set(false);
2056
+ });
2057
+ this.destroyRef.onDestroy(() => unlisten());
2058
+ }
2059
+ toggle(event) {
2060
+ if (this.effectiveDisabled() || this.readonly())
2061
+ return;
2062
+ if (event) {
2063
+ event.preventDefault();
2064
+ event.stopPropagation();
2065
+ }
2066
+ this.open.set(!this.open());
2067
+ }
2068
+ onInputTextChange(value) {
2069
+ this.textInputValue.set(value);
2070
+ if (!value.trim()) {
2071
+ this.updateTimeValue(null);
2072
+ return;
2073
+ }
2074
+ const parsed = this.parseTimeString(value);
2075
+ if (parsed) {
2076
+ this.updateTimeValue(parsed);
2077
+ }
2078
+ }
2079
+ onInputBlur() {
2080
+ this.onTouched();
2081
+ const val = this.value();
2082
+ if (val) {
2083
+ this.textInputValue.set(this.formatTimeValue(val));
2084
+ }
2085
+ else {
2086
+ this.textInputValue.set('');
2087
+ }
2088
+ }
2089
+ onStepperTimeSelected(val) {
2090
+ this.updateTimeValue(val);
2091
+ }
2092
+ clear(event) {
2093
+ event.stopPropagation();
2094
+ if (this.effectiveDisabled() || this.readonly())
2095
+ return;
2096
+ this.updateTimeValue(null);
2097
+ }
2098
+ formatTimeValue(val) {
2099
+ if (!val)
2100
+ return '';
2101
+ let hours = 0;
2102
+ let minutes = 0;
2103
+ let seconds = 0;
2104
+ if (val instanceof Date) {
2105
+ hours = val.getHours();
2106
+ minutes = val.getMinutes();
2107
+ seconds = val.getSeconds();
2108
+ }
2109
+ else if (typeof val === 'string') {
2110
+ const parts = val.trim().split(':');
2111
+ hours = parseInt(parts[0], 10) || 0;
2112
+ minutes = parseInt(parts[1], 10) || 0;
2113
+ seconds = parts[2] ? parseInt(parts[2], 10) || 0 : 0;
2114
+ }
2115
+ const pad = (n) => n.toString().padStart(2, '0');
2116
+ if (this.format() === '12h') {
2117
+ const isPM = hours >= 12;
2118
+ const h12 = hours % 12 || 12;
2119
+ const meridiem = isPM ? 'PM' : 'AM';
2120
+ return this.showSeconds()
2121
+ ? `${pad(h12)}:${pad(minutes)}:${pad(seconds)} ${meridiem}`
2122
+ : `${pad(h12)}:${pad(minutes)} ${meridiem}`;
2123
+ }
2124
+ return this.showSeconds()
2125
+ ? `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`
2126
+ : `${pad(hours)}:${pad(minutes)}`;
2127
+ }
2128
+ parseTimeString(input) {
2129
+ const trimmed = input.trim();
2130
+ if (!trimmed)
2131
+ return null;
2132
+ const is12hInput = /am|pm/i.test(trimmed);
2133
+ const cleanTime = trimmed.replace(/\s*(am|pm)/i, '').trim();
2134
+ const parts = cleanTime.split(':').map((p) => parseInt(p, 10));
2135
+ if (parts.some((n) => isNaN(n)))
2136
+ return null;
2137
+ let [h, m, s] = parts;
2138
+ m = m ?? 0;
2139
+ s = s ?? 0;
2140
+ if (is12hInput || this.format() === '12h') {
2141
+ const isPM = /pm/i.test(trimmed);
2142
+ if (h < 1 || h > 12 || m < 0 || m > 59 || s < 0 || s > 59)
2143
+ return null;
2144
+ if (isPM && h < 12)
2145
+ h += 12;
2146
+ if (!isPM && h === 12)
2147
+ h = 0;
2148
+ }
2149
+ else {
2150
+ if (h < 0 || h > 23 || m < 0 || m > 59 || s < 0 || s > 59)
2151
+ return null;
2152
+ }
2153
+ const pad = (n) => n.toString().padStart(2, '0');
2154
+ return this.showSeconds() ? `${pad(h)}:${pad(m)}:${pad(s)}` : `${pad(h)}:${pad(m)}`;
2155
+ }
2156
+ updateTimeValue(val) {
2157
+ this.value.set(val);
2158
+ this.textInputValue.set(this.formatTimeValue(val));
2159
+ this.timeSelected.emit(val);
2160
+ this.onChange(val);
2161
+ this.onTouched();
2162
+ }
2163
+ writeValue(val) {
2164
+ this.value.set(val);
2165
+ this.textInputValue.set(this.formatTimeValue(val));
2166
+ }
2167
+ registerOnChange(fn) {
2168
+ this.onChange = fn;
2169
+ }
2170
+ registerOnTouched(fn) {
2171
+ this.onTouched = fn;
2172
+ }
2173
+ setDisabledState(isDisabled) {
2174
+ this.cvaDisabled.set(isDisabled);
2175
+ }
2176
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataTimepickerComponent, isStandalone: true, selector: "st-timepicker", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", 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 }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, colorMessage: { classPropertyName: "colorMessage", publicName: "colorMessage", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", timeSelected: "timeSelected" }, host: { properties: { "class.st-timepicker": "true", "class.st-size-sm": "size() === \"sm\"", "class.st-size-md": "size() === \"md\"", "class.st-size-lg": "size() === \"lg\"", "class.st-disabled": "effectiveDisabled()", "attr.aria-disabled": "effectiveDisabled() ? \"true\" : null", "class.st-state-error": "effectiveState() === \"error\"", "class.st-state-success": "effectiveState() === \"success\"", "class.st-state-warning": "effectiveState() === \"warning\"", "class.st-error": "effectiveState() === \"error\"", "attr.aria-invalid": "effectiveState() === \"error\" ? \"true\" : null" } }, providers: [
2178
+ {
2179
+ provide: NG_VALUE_ACCESSOR,
2180
+ useExisting: forwardRef(() => StrataTimepickerComponent),
2181
+ multi: true
2182
+ }
2183
+ ], viewQueries: [{ propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"timeOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear time\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"clock\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #timeOverlay>\n <div class=\"st-timepicker-dropdown\">\n <st-time-stepper\n [value]=\"value()\"\n [format]=\"format()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onStepperTimeSelected($event)\"\n ></st-time-stepper>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-timepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport", "overlayTarget"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataTimeStepperComponent, selector: "st-time-stepper", inputs: ["format", "showSeconds", "minuteStep", "disabled", "value"], outputs: ["valueChange"] }] });
2184
+ }
2185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataTimepickerComponent, decorators: [{
2186
+ type: Component,
2187
+ args: [{ selector: 'st-timepicker', imports: [
2188
+ CommonModule,
2189
+ FormsModule,
2190
+ StrataIconComponent,
2191
+ StrataOverlayDirective,
2192
+ StrataTimeStepperComponent
2193
+ ], providers: [
2194
+ {
2195
+ provide: NG_VALUE_ACCESSOR,
2196
+ useExisting: forwardRef(() => StrataTimepickerComponent),
2197
+ multi: true
2198
+ }
2199
+ ], host: {
2200
+ '[class.st-timepicker]': 'true',
2201
+ '[class.st-size-sm]': 'size() === "sm"',
2202
+ '[class.st-size-md]': 'size() === "md"',
2203
+ '[class.st-size-lg]': 'size() === "lg"',
2204
+ '[class.st-disabled]': 'effectiveDisabled()',
2205
+ '[attr.aria-disabled]': 'effectiveDisabled() ? "true" : null',
2206
+ '[class.st-state-error]': 'effectiveState() === "error"',
2207
+ '[class.st-state-success]': 'effectiveState() === "success"',
2208
+ '[class.st-state-warning]': 'effectiveState() === "warning"',
2209
+ '[class.st-error]': 'effectiveState() === "error"',
2210
+ '[attr.aria-invalid]': 'effectiveState() === "error" ? "true" : null'
2211
+ }, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"timeOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear time\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"clock\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #timeOverlay>\n <div class=\"st-timepicker-dropdown\">\n <st-time-stepper\n [value]=\"value()\"\n [format]=\"format()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onStepperTimeSelected($event)\"\n ></st-time-stepper>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-timepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out;display:flex;align-items:center;justify-content:center}\n"] }]
2212
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], colorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorMessage", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], timeSelected: [{ type: i0.Output, args: ["timeSelected"] }], overlayDirective: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataOverlayDirective), { isSignal: true }] }] } });
2213
+
1847
2214
  function isSameDay(a, b) {
1848
2215
  if (!a || !b)
1849
2216
  return false;
@@ -2622,7 +2989,7 @@ class StrataDatePickerComponent {
2622
2989
  useExisting: forwardRef(() => StrataDatePickerComponent),
2623
2990
  multi: true
2624
2991
  }
2625
- ], viewQueries: [{ propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"calendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #calendarOverlay>\n <div class=\"st-datepicker-dropdown\" [class.st-datepicker-with-time]=\"showTime()\">\n <st-calendar\n mode=\"single\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [value]=\"value()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (dateSelected)=\"onCalendarDateSelected($event)\"\n ></st-calendar>\n @if (showTime()) {\n <div class=\"st-datepicker-time-side\">\n <st-time-picker\n [value]=\"value()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onTimeSelected($event)\"\n ></st-time-picker>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-datepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-datepicker-dropdown.st-datepicker-with-time{display:flex;align-items:stretch;gap:0;padding:0}.st-datepicker-dropdown.st-datepicker-with-time>st-calendar{padding:var(--st-space-3)}.st-datepicker-time-side{display:flex;align-items:center;justify-content:center;padding:var(--st-space-3) var(--st-space-4);border-left:1px solid var(--st-border-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataCalendarComponent, selector: "st-calendar", inputs: ["mode", "size", "locale", "value", "rangeValue", "viewDate", "minDate", "maxDate", "disabledDates", "firstDayOfWeek", "showAdjacentMonths", "disabled"], outputs: ["valueChange", "rangeValueChange", "viewDateChange", "dateSelected", "rangeSelected"] }, { kind: "component", type: StrataTimePickerComponent, selector: "st-time-picker", inputs: ["format", "showSeconds", "minuteStep", "disabled", "value"], outputs: ["valueChange"] }] });
2992
+ ], viewQueries: [{ propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"calendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #calendarOverlay>\n <div class=\"st-datepicker-dropdown\" [class.st-datepicker-with-time]=\"showTime()\">\n <st-calendar\n mode=\"single\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [value]=\"value()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (dateSelected)=\"onCalendarDateSelected($event)\"\n ></st-calendar>\n @if (showTime()) {\n <div class=\"st-datepicker-time-side\">\n <st-time-stepper\n [value]=\"value()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onTimeSelected($event)\"\n ></st-time-stepper>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-datepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-datepicker-dropdown.st-datepicker-with-time{display:flex;align-items:stretch;gap:0;padding:0}.st-datepicker-dropdown.st-datepicker-with-time>st-calendar{padding:var(--st-space-3)}.st-datepicker-time-side{display:flex;align-items:center;justify-content:center;padding:var(--st-space-3) var(--st-space-4);border-left:1px solid var(--st-border-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport", "overlayTarget"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataCalendarComponent, selector: "st-calendar", inputs: ["mode", "size", "locale", "value", "rangeValue", "viewDate", "minDate", "maxDate", "disabledDates", "firstDayOfWeek", "showAdjacentMonths", "disabled"], outputs: ["valueChange", "rangeValueChange", "viewDateChange", "dateSelected", "rangeSelected"] }, { kind: "component", type: StrataTimeStepperComponent, selector: "st-time-stepper", inputs: ["format", "showSeconds", "minuteStep", "disabled", "value"], outputs: ["valueChange"] }] });
2626
2993
  }
2627
2994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataDatePickerComponent, decorators: [{
2628
2995
  type: Component,
@@ -2632,7 +2999,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
2632
2999
  StrataIconComponent,
2633
3000
  StrataOverlayDirective,
2634
3001
  StrataCalendarComponent,
2635
- StrataTimePickerComponent
3002
+ StrataTimeStepperComponent
2636
3003
  ], providers: [
2637
3004
  {
2638
3005
  provide: NG_VALUE_ACCESSOR,
@@ -2651,7 +3018,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
2651
3018
  '[class.st-state-warning]': 'effectiveState() === "warning"',
2652
3019
  '[class.st-error]': 'effectiveState() === "error"',
2653
3020
  '[attr.aria-invalid]': 'effectiveState() === "error" ? "true" : null'
2654
- }, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"calendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #calendarOverlay>\n <div class=\"st-datepicker-dropdown\" [class.st-datepicker-with-time]=\"showTime()\">\n <st-calendar\n mode=\"single\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [value]=\"value()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (dateSelected)=\"onCalendarDateSelected($event)\"\n ></st-calendar>\n @if (showTime()) {\n <div class=\"st-datepicker-time-side\">\n <st-time-picker\n [value]=\"value()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onTimeSelected($event)\"\n ></st-time-picker>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-datepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-datepicker-dropdown.st-datepicker-with-time{display:flex;align-items:stretch;gap:0;padding:0}.st-datepicker-dropdown.st-datepicker-with-time>st-calendar{padding:var(--st-space-3)}.st-datepicker-time-side{display:flex;align-items:center;justify-content:center;padding:var(--st-space-3) var(--st-space-4);border-left:1px solid var(--st-border-subtle)}\n"] }]
3021
+ }, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"calendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #calendarOverlay>\n <div class=\"st-datepicker-dropdown\" [class.st-datepicker-with-time]=\"showTime()\">\n <st-calendar\n mode=\"single\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [value]=\"value()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (dateSelected)=\"onCalendarDateSelected($event)\"\n ></st-calendar>\n @if (showTime()) {\n <div class=\"st-datepicker-time-side\">\n <st-time-stepper\n [value]=\"value()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [minuteStep]=\"minuteStep()\"\n [disabled]=\"effectiveDisabled()\"\n (valueChange)=\"onTimeSelected($event)\"\n ></st-time-stepper>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-datepicker-dropdown{border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);background-color:var(--st-color-bg-raised);box-shadow:var(--st-shadow-2);padding:var(--st-space-3);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-datepicker-dropdown.st-datepicker-with-time{display:flex;align-items:stretch;gap:0;padding:0}.st-datepicker-dropdown.st-datepicker-with-time>st-calendar{padding:var(--st-space-3)}.st-datepicker-time-side{display:flex;align-items:center;justify-content:center;padding:var(--st-space-3) var(--st-space-4);border-left:1px solid var(--st-border-subtle)}\n"] }]
2655
3022
  }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], showTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTime", required: false }] }], timeFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeFormat", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], colorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorMessage", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], dateSelected: [{ type: i0.Output, args: ["dateSelected"] }], overlayDirective: [{ type: i0.ViewChild, args: [i0.forwardRef(() => StrataOverlayDirective), { isSignal: true }] }] } });
2656
3023
 
2657
3024
  let nextUniqueDateRangePickerId = 0;
@@ -2916,7 +3283,7 @@ class StrataDateRangePickerComponent {
2916
3283
  useExisting: forwardRef(() => StrataDateRangePickerComponent),
2917
3284
  multi: true
2918
3285
  }
2919
- ], viewQueries: [{ propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"rangeCalendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date range\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #rangeCalendarOverlay>\n <div class=\"st-date-range-dropdown\">\n @if (showPresets() && presets().length > 0) {\n <div class=\"st-date-range-presets\">\n <div class=\"st-presets-title\">Presets</div>\n @for (preset of presets(); track preset.label) {\n <button\n type=\"button\"\n class=\"st-preset-btn\"\n (click)=\"applyPreset(preset)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <div class=\"st-date-range-calendars\">\n <st-calendar\n mode=\"range\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [rangeValue]=\"value()\"\n [viewDate]=\"calendarViewDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (rangeSelected)=\"onCalendarRangeSelected($event)\"\n (viewDateChange)=\"calendarViewDate.set($event)\"\n ></st-calendar>\n\n @if (numberOfMonths() >= 2) {\n <st-calendar\n mode=\"range\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [rangeValue]=\"value()\"\n [viewDate]=\"secondCalendarViewDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (rangeSelected)=\"onCalendarRangeSelected($event)\"\n (viewDateChange)=\"onSecondCalendarViewDateChange($event)\"\n ></st-calendar>\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-date-range-dropdown{display:flex;background-color:var(--st-color-bg-raised);border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);box-shadow:var(--st-shadow-2);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-date-range-presets{display:flex;flex-direction:column;padding:var(--st-space-2);border-right:1px solid var(--st-border-subtle);min-width:130px;gap:2px}.st-presets-title{font-size:.75rem;font-weight:var(--st-font-weight-semibold);color:var(--st-color-text-tertiary);padding:4px 8px;text-transform:uppercase;letter-spacing:.05em}.st-preset-btn{background:transparent;border:none;font-family:inherit;font-size:var(--st-font-sm);color:var(--st-color-text-secondary);padding:6px 8px;border-radius:var(--st-border-radius-sm);text-align:left;cursor:pointer;transition:background-color var(--st-transition-fast),color var(--st-transition-fast)}.st-preset-btn:hover{background-color:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-date-range-calendars{display:flex;gap:var(--st-space-4);padding:var(--st-space-3)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataCalendarComponent, selector: "st-calendar", inputs: ["mode", "size", "locale", "value", "rangeValue", "viewDate", "minDate", "maxDate", "disabledDates", "firstDayOfWeek", "showAdjacentMonths", "disabled"], outputs: ["valueChange", "rangeValueChange", "viewDateChange", "dateSelected", "rangeSelected"] }] });
3286
+ ], viewQueries: [{ propertyName: "overlayDirective", first: true, predicate: StrataOverlayDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n <label class=\"st-label\" [for]=\"effectiveId()\">{{ label() }}</label>\n}\n\n<div\n class=\"st-input-wrapper\"\n [class.full-width]=\"fullWidth()\"\n [class.disabled]=\"effectiveDisabled()\"\n [class.open]=\"open()\"\n [stOverlay]=\"rangeCalendarOverlay\"\n [overlayOpen]=\"open()\"\n [overlayPlacement]=\"placement()\"\n>\n <input\n type=\"text\"\n [id]=\"effectiveId()\"\n [placeholder]=\"placeholder()\"\n [value]=\"textInputValue()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onInputTextChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.escape)=\"open.set(false)\"\n />\n\n <div class=\"affix\">\n @if (clearable() && value() && !effectiveDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"st-icon-btn\"\n (click)=\"clear($event)\"\n aria-label=\"Clear date range\"\n >\n <st-icon name=\"close\" size=\"xs\"></st-icon>\n </button>\n }\n\n <span class=\"st-trigger-icon\" (click)=\"toggle($event)\">\n <st-icon name=\"calendar\" size=\"xs\"></st-icon>\n </span>\n </div>\n</div>\n\n@if (message()) {\n <div class=\"st-input-field-footer\">\n <span\n class=\"st-input-field-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </span>\n </div>\n}\n\n<ng-template #rangeCalendarOverlay>\n <div class=\"st-date-range-dropdown\">\n @if (showPresets() && presets().length > 0) {\n <div class=\"st-date-range-presets\">\n <div class=\"st-presets-title\">Presets</div>\n @for (preset of presets(); track preset.label) {\n <button\n type=\"button\"\n class=\"st-preset-btn\"\n (click)=\"applyPreset(preset)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <div class=\"st-date-range-calendars\">\n <st-calendar\n mode=\"range\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [rangeValue]=\"value()\"\n [viewDate]=\"calendarViewDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (rangeSelected)=\"onCalendarRangeSelected($event)\"\n (viewDateChange)=\"calendarViewDate.set($event)\"\n ></st-calendar>\n\n @if (numberOfMonths() >= 2) {\n <st-calendar\n mode=\"range\"\n [size]=\"calendarSize()\"\n [locale]=\"locale()\"\n [rangeValue]=\"value()\"\n [viewDate]=\"secondCalendarViewDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [disabledDates]=\"disabledDates()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n (rangeSelected)=\"onCalendarRangeSelected($event)\"\n (viewDateChange)=\"onSecondCalendarViewDateChange($event)\"\n ></st-calendar>\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;box-sizing:border-box;width:100%}:host label{margin-bottom:var(--st-space-2)}.st-input-wrapper{display:flex;align-items:center;box-sizing:border-box;height:var(--st-interactive-element-height-md);background-color:var(--st-color-bg-raised);border:1px solid var(--st-border-muted);border-radius:var(--st-border-radius-md);overflow:hidden;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast)}.st-input-wrapper:hover{background-color:var(--st-color-input-hover);border-color:var(--st-color-border-strong)}.st-input-wrapper:focus-within,.st-input-wrapper.open{outline:var(--st-focus-ring-width) var(--st-focus-ring-style) var(--st-focus-ring-color);outline-offset:var(--st-focus-ring-offset);border-color:var(--st-color-border-strong)}:host(.st-size-sm) .st-input-wrapper{height:var(--st-interactive-element-height-sm);border-radius:var(--st-border-radius-sm)}:host(.st-size-sm) input{padding:0 var(--st-size-xxs);font-size:var(--st-font-sm)}:host(.st-size-sm) .affix{padding-right:var(--st-size-xxs)}:host(.st-size-lg) .st-input-wrapper{height:var(--st-interactive-element-height-lg)}:host(.st-state-error) .st-input-wrapper,:host(.st-error) .st-input-wrapper{border-color:var(--st-color-feedback-error-default);outline-color:var(--st-color-feedback-error-default)}:host(.st-state-success) .st-input-wrapper{border-color:var(--st-color-feedback-success-default);outline-color:var(--st-color-feedback-success-default)}:host(.st-state-warning) .st-input-wrapper{border-color:var(--st-color-feedback-warning-default);outline-color:var(--st-color-feedback-warning-default)}:host(.st-disabled){opacity:.55;pointer-events:none;cursor:not-allowed}input{border:none;background:none;width:100%;padding:0 var(--st-size-xs);color:var(--st-color-text-primary);font-size:var(--st-font-md);font-family:inherit;height:100%;cursor:pointer;outline:none}input::placeholder{color:var(--st-color-text-tertiary)}.affix{display:flex;align-items:center;padding-right:var(--st-size-xs);gap:var(--st-space-1);color:var(--st-color-text-tertiary)}.st-icon-btn,.st-trigger-icon{background:transparent;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--st-color-text-tertiary);transition:color var(--st-transition-fast)}.st-icon-btn:hover,.st-trigger-icon:hover{color:var(--st-color-text-primary)}.st-input-field-footer{display:flex;margin-top:var(--st-space-1);line-height:1.25}.st-input-field-message{font-size:var(--st-font-sm);color:var(--st-color-text-secondary)}.st-input-field-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-input-field-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-input-field-message.st-message-warning{color:var(--st-color-feedback-warning-text)}.st-date-range-dropdown{display:flex;background-color:var(--st-color-bg-raised);border:1px solid var(--st-border);border-radius:var(--st-border-radius-lg);box-shadow:var(--st-shadow-2);overflow:hidden;animation:st-popover-in var(--st-transition-fast) ease-out}.st-date-range-presets{display:flex;flex-direction:column;padding:var(--st-space-2);border-right:1px solid var(--st-border-subtle);min-width:130px;gap:2px}.st-presets-title{font-size:.75rem;font-weight:var(--st-font-weight-semibold);color:var(--st-color-text-tertiary);padding:4px 8px;text-transform:uppercase;letter-spacing:.05em}.st-preset-btn{background:transparent;border:none;font-family:inherit;font-size:var(--st-font-sm);color:var(--st-color-text-secondary);padding:6px 8px;border-radius:var(--st-border-radius-sm);text-align:left;cursor:pointer;transition:background-color var(--st-transition-fast),color var(--st-transition-fast)}.st-preset-btn:hover{background-color:var(--st-color-control-bg-hover, var(--st-color-bg-default));color:var(--st-color-text-primary)}.st-date-range-calendars{display:flex;gap:var(--st-space-4);padding:var(--st-space-3)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport", "overlayTarget"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataCalendarComponent, selector: "st-calendar", inputs: ["mode", "size", "locale", "value", "rangeValue", "viewDate", "minDate", "maxDate", "disabledDates", "firstDayOfWeek", "showAdjacentMonths", "disabled"], outputs: ["valueChange", "rangeValueChange", "viewDateChange", "dateSelected", "rangeSelected"] }] });
2920
3287
  }
2921
3288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataDateRangePickerComponent, decorators: [{
2922
3289
  type: Component,
@@ -2964,6 +3331,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
2964
3331
  class StrataFileUploadComponent {
2965
3332
  fileInput = viewChild('fileInput', /* @ts-ignore */
2966
3333
  ...(ngDevMode ? [{ debugName: "fileInput" }] : /* istanbul ignore next */ []));
3334
+ cameraInput = viewChild('cameraInput', /* @ts-ignore */
3335
+ ...(ngDevMode ? [{ debugName: "cameraInput" }] : /* istanbul ignore next */ []));
2967
3336
  accept = input('*', /* @ts-ignore */
2968
3337
  ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
2969
3338
  multiple = input(false, /* @ts-ignore */
@@ -2976,6 +3345,24 @@ class StrataFileUploadComponent {
2976
3345
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2977
3346
  hint = input(undefined, /* @ts-ignore */
2978
3347
  ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
3348
+ camera = input(undefined, { ...(ngDevMode ? { debugName: "camera" } : /* istanbul ignore next */ {}), transform: (val) => {
3349
+ if (val === undefined || val === null) {
3350
+ return undefined;
3351
+ }
3352
+ if (typeof val === 'string') {
3353
+ if (val === '' || val === 'true') {
3354
+ return true;
3355
+ }
3356
+ if (val === 'false') {
3357
+ return false;
3358
+ }
3359
+ }
3360
+ return Boolean(val);
3361
+ } });
3362
+ choosePhotoLabel = input('Choose Photo', /* @ts-ignore */
3363
+ ...(ngDevMode ? [{ debugName: "choosePhotoLabel" }] : /* istanbul ignore next */ []));
3364
+ takePhotoLabel = input('Take Photo', /* @ts-ignore */
3365
+ ...(ngDevMode ? [{ debugName: "takePhotoLabel" }] : /* istanbul ignore next */ []));
2979
3366
  state = input(undefined, /* @ts-ignore */
2980
3367
  ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
2981
3368
  error = input(false, { ...(ngDevMode ? { debugName: "error" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -2997,6 +3384,29 @@ class StrataFileUploadComponent {
2997
3384
  ...(ngDevMode ? [{ debugName: "isMessageSuccess" }] : /* istanbul ignore next */ []));
2998
3385
  isMessageWarning = computed(() => this.effectiveState() === 'warning' && this.colorMessage(), /* @ts-ignore */
2999
3386
  ...(ngDevMode ? [{ debugName: "isMessageWarning" }] : /* istanbul ignore next */ []));
3387
+ isImageAccept = computed(() => {
3388
+ const acc = this.accept().toLowerCase();
3389
+ if (!acc || acc === '*' || acc === '*/*') {
3390
+ return false;
3391
+ }
3392
+ const rules = acc.split(',').map((r) => r.trim());
3393
+ return rules.some((rule) => {
3394
+ return (rule.startsWith('image/') ||
3395
+ ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.heic', '.heif', '.svg'].some((ext) => rule.endsWith(ext)));
3396
+ });
3397
+ }, /* @ts-ignore */
3398
+ ...(ngDevMode ? [{ debugName: "isImageAccept" }] : /* istanbul ignore next */ []));
3399
+ showCamera = computed(() => {
3400
+ const cam = this.camera();
3401
+ if (cam === false) {
3402
+ return false;
3403
+ }
3404
+ if (cam === true) {
3405
+ return true;
3406
+ }
3407
+ return this.isImageAccept();
3408
+ }, /* @ts-ignore */
3409
+ ...(ngDevMode ? [{ debugName: "showCamera" }] : /* istanbul ignore next */ []));
3000
3410
  fileSelect = output();
3001
3411
  filesSelect = output();
3002
3412
  fileRejected = output();
@@ -3026,12 +3436,19 @@ class StrataFileUploadComponent {
3026
3436
  }
3027
3437
  onClick(event) {
3028
3438
  const target = event.target;
3029
- if (target === this.fileInput()?.nativeElement) {
3439
+ if (target === this.fileInput()?.nativeElement || target === this.cameraInput()?.nativeElement) {
3440
+ return;
3441
+ }
3442
+ if (target.closest('.st-file-upload-actions')) {
3030
3443
  return;
3031
3444
  }
3032
3445
  this.browse();
3033
3446
  }
3034
3447
  onKeydown(event) {
3448
+ const target = event.target;
3449
+ if (target.closest('.st-file-upload-actions')) {
3450
+ return;
3451
+ }
3035
3452
  event.preventDefault();
3036
3453
  this.browse();
3037
3454
  }
@@ -3067,16 +3484,27 @@ class StrataFileUploadComponent {
3067
3484
  this.processFiles(Array.from(inputEl.files));
3068
3485
  inputEl.value = '';
3069
3486
  }
3070
- browse() {
3487
+ browse(event) {
3488
+ event?.stopPropagation();
3071
3489
  if (this.disabled())
3072
3490
  return;
3073
3491
  this.fileInput()?.nativeElement.click();
3074
3492
  }
3493
+ browseCamera(event) {
3494
+ event?.stopPropagation();
3495
+ if (this.disabled())
3496
+ return;
3497
+ this.cameraInput()?.nativeElement.click();
3498
+ }
3075
3499
  clear() {
3076
3500
  const inputEl = this.fileInput()?.nativeElement;
3077
3501
  if (inputEl) {
3078
3502
  inputEl.value = '';
3079
3503
  }
3504
+ const cameraEl = this.cameraInput()?.nativeElement;
3505
+ if (cameraEl) {
3506
+ cameraEl.value = '';
3507
+ }
3080
3508
  }
3081
3509
  processFiles(files) {
3082
3510
  const acceptedFiles = [];
@@ -3119,12 +3547,17 @@ class StrataFileUploadComponent {
3119
3547
  });
3120
3548
  }
3121
3549
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataFileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataFileUploadComponent, isStandalone: true, selector: "st-file-upload", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", 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 }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, colorMessage: { classPropertyName: "colorMessage", publicName: "colorMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileSelect: "fileSelect", filesSelect: "filesSelect", fileRejected: "fileRejected" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onKeydown($event)", "keydown.space": "onKeydown($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, properties: { "class.st-disabled": "this.hostDisabled", "class.st-state-error": "this.hostError", "class.st-error": "this.hostError", "class.st-state-success": "this.hostSuccess", "class.st-state-warning": "this.hostWarning", "attr.aria-invalid": "this.hostAriaInvalid", "class.st-drag-over": "this.hostDragOver", "attr.role": "this.hostRole", "attr.tabindex": "this.hostTabIndex" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<input\n #fileInput\n type=\"file\"\n class=\"st-file-upload-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n/>\n\n<div class=\"st-file-upload-content\">\n <div class=\"st-file-upload-icon-wrapper\">\n <ng-content select=\"[uploadIcon]\">\n <svg\n class=\"st-file-upload-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"st-file-upload-text\">\n <span class=\"st-file-upload-label\">{{ label() }}</span>\n @if (displayMessage()) {\n <span\n class=\"st-file-upload-hint\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >{{ displayMessage() }}</span>\n }\n </div>\n\n <ng-content></ng-content>\n</div>\n" });
3550
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataFileUploadComponent, isStandalone: true, selector: "st-file-upload", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", 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 }, camera: { classPropertyName: "camera", publicName: "camera", isSignal: true, isRequired: false, transformFunction: null }, choosePhotoLabel: { classPropertyName: "choosePhotoLabel", publicName: "choosePhotoLabel", isSignal: true, isRequired: false, transformFunction: null }, takePhotoLabel: { classPropertyName: "takePhotoLabel", publicName: "takePhotoLabel", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, colorMessage: { classPropertyName: "colorMessage", publicName: "colorMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileSelect: "fileSelect", filesSelect: "filesSelect", fileRejected: "fileRejected" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onKeydown($event)", "keydown.space": "onKeydown($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, properties: { "class.st-disabled": "this.hostDisabled", "class.st-state-error": "this.hostError", "class.st-error": "this.hostError", "class.st-state-success": "this.hostSuccess", "class.st-state-warning": "this.hostWarning", "attr.aria-invalid": "this.hostAriaInvalid", "class.st-drag-over": "this.hostDragOver", "attr.role": "this.hostRole", "attr.tabindex": "this.hostTabIndex" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }, { propertyName: "cameraInput", first: true, predicate: ["cameraInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<input\n #fileInput\n type=\"file\"\n class=\"st-file-upload-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n/>\n\n@if (showCamera()) {\n <input\n #cameraInput\n type=\"file\"\n class=\"st-file-upload-input\"\n accept=\"image/*\"\n capture=\"environment\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n />\n}\n\n<div class=\"st-file-upload-content\">\n <ng-content select=\"[uploadIcon]\">\n <st-avatar size=\"md\" variant=\"rounded\" class=\"st-file-upload-avatar\">\n <st-icon name=\"upload\"></st-icon>\n </st-avatar>\n </ng-content>\n\n <div class=\"st-file-upload-text\">\n <span class=\"st-file-upload-label\">{{ label() }}</span>\n @if (displayMessage()) {\n <span\n class=\"st-file-upload-hint\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >{{ displayMessage() }}</span>\n }\n </div>\n\n @if (showCamera()) {\n <st-button-group justification=\"center\" class=\"st-file-upload-actions\">\n <button\n stButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"browse($event)\"\n >\n <st-icon name=\"image\" size=\"sm\"></st-icon>\n <span>{{ choosePhotoLabel() }}</span>\n </button>\n\n <button\n stButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n class=\"st-file-upload-action-camera\"\n [disabled]=\"disabled()\"\n (click)=\"browseCamera($event)\"\n >\n <st-icon name=\"camera\" size=\"sm\"></st-icon>\n <span>{{ takePhotoLabel() }}</span>\n </button>\n </st-button-group>\n }\n\n <ng-content></ng-content>\n</div>\n", styles: [":host{--st-file-upload-bg: var(--st-color-bg-default);--st-file-upload-border: var(--st-color-border-default);--st-file-upload-text: var(--st-color-text-primary);--st-file-upload-hint: var(--st-color-text-secondary);--st-file-upload-hover-bg: var(--st-color-bg-raised);--st-file-upload-hover-border: var(--st-color-accent-default);--st-file-upload-active-border: var(--st-color-accent-default);--st-file-upload-active-bg: var(--st-color-accent-subtle, var(--st-color-bg-raised));--st-file-upload-radius: var(--st-border-radius-xl);display:block;position:relative;box-sizing:border-box;background-color:var(--st-file-upload-bg);border:2px dashed var(--st-file-upload-border);border-radius:var(--st-file-upload-radius);padding:var(--st-space-6) var(--st-space-4);text-align:center;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast),transform var(--st-transition-fast);-webkit-user-select:none;user-select:none;outline:none}:host st-avatar{transition:transform .2s ease}:host:hover:not(.st-disabled){background-color:var(--st-file-upload-hover-bg);border-color:var(--st-file-upload-hover-border)}:host:hover:not(.st-disabled) st-avatar{transform:translateY(-2px)}:host:focus-visible:not(.st-disabled){outline:2px solid var(--st-color-accent-default);outline-offset:2px}:host.st-drag-over{background-color:var(--st-file-upload-active-bg);border-color:var(--st-file-upload-active-border);border-style:solid;transform:scale(1.01)}:host.st-drag-over st-avatar{transform:translateY(-4px) scale(1.05)}:host.st-disabled{opacity:.5;cursor:not-allowed;pointer-events:none}:host .st-file-upload-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host .st-file-upload-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-3)}:host .st-file-upload-text{display:flex;flex-direction:column;gap:var(--st-space-1)}:host .st-file-upload-label{font-size:.95rem;font-weight:500;color:var(--st-file-upload-text)}:host.st-state-error,:host.st-error{--st-file-upload-border: var(--st-color-feedback-error-default);--st-file-upload-hover-border: var(--st-color-feedback-error-hover, var(--st-color-feedback-error-default))}:host.st-state-error:focus-visible:not(.st-disabled),:host.st-error:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-error-default)}:host.st-state-success{--st-file-upload-border: var(--st-color-feedback-success-default);--st-file-upload-hover-border: var(--st-color-feedback-success-hover, var(--st-color-feedback-success-default))}:host.st-state-success:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-success-default)}:host.st-state-warning{--st-file-upload-border: var(--st-color-feedback-warning-default);--st-file-upload-hover-border: var(--st-color-feedback-warning-hover, var(--st-color-feedback-warning-default))}:host.st-state-warning:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-warning-default)}:host .st-file-upload-hint{font-size:.8rem;color:var(--st-file-upload-hint)}:host .st-file-upload-hint.st-message-error{color:var(--st-color-feedback-error-text)}:host .st-file-upload-hint.st-message-success{color:var(--st-color-feedback-success-text)}:host .st-file-upload-hint.st-message-warning{color:var(--st-color-feedback-warning-text)}:host .st-file-upload-actions{margin-top:var(--st-space-2)}\n"], dependencies: [{ kind: "component", type: StrataAvatarComponent, selector: "st-avatar", inputs: ["src", "alt", "text", "size", "variant"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }, { kind: "component", type: StrataButtonGroupComponent, selector: "st-button-group", inputs: ["justification"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }] });
3123
3551
  }
3124
3552
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataFileUploadComponent, decorators: [{
3125
3553
  type: Component,
3126
- args: [{ selector: 'st-file-upload', imports: [], template: "<input\n #fileInput\n type=\"file\"\n class=\"st-file-upload-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n/>\n\n<div class=\"st-file-upload-content\">\n <div class=\"st-file-upload-icon-wrapper\">\n <ng-content select=\"[uploadIcon]\">\n <svg\n class=\"st-file-upload-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"st-file-upload-text\">\n <span class=\"st-file-upload-label\">{{ label() }}</span>\n @if (displayMessage()) {\n <span\n class=\"st-file-upload-hint\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >{{ displayMessage() }}</span>\n }\n </div>\n\n <ng-content></ng-content>\n</div>\n" }]
3127
- }], propDecorators: { fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], colorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorMessage", required: false }] }], fileSelect: [{ type: i0.Output, args: ["fileSelect"] }], filesSelect: [{ type: i0.Output, args: ["filesSelect"] }], fileRejected: [{ type: i0.Output, args: ["fileRejected"] }], hostDisabled: [{
3554
+ args: [{ selector: 'st-file-upload', imports: [
3555
+ StrataAvatarComponent,
3556
+ StrataButtonDirective,
3557
+ StrataButtonGroupComponent,
3558
+ StrataIconComponent
3559
+ ], template: "<input\n #fileInput\n type=\"file\"\n class=\"st-file-upload-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n/>\n\n@if (showCamera()) {\n <input\n #cameraInput\n type=\"file\"\n class=\"st-file-upload-input\"\n accept=\"image/*\"\n capture=\"environment\"\n [disabled]=\"disabled()\"\n (change)=\"onFileChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n />\n}\n\n<div class=\"st-file-upload-content\">\n <ng-content select=\"[uploadIcon]\">\n <st-avatar size=\"md\" variant=\"rounded\" class=\"st-file-upload-avatar\">\n <st-icon name=\"upload\"></st-icon>\n </st-avatar>\n </ng-content>\n\n <div class=\"st-file-upload-text\">\n <span class=\"st-file-upload-label\">{{ label() }}</span>\n @if (displayMessage()) {\n <span\n class=\"st-file-upload-hint\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >{{ displayMessage() }}</span>\n }\n </div>\n\n @if (showCamera()) {\n <st-button-group justification=\"center\" class=\"st-file-upload-actions\">\n <button\n stButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"browse($event)\"\n >\n <st-icon name=\"image\" size=\"sm\"></st-icon>\n <span>{{ choosePhotoLabel() }}</span>\n </button>\n\n <button\n stButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n class=\"st-file-upload-action-camera\"\n [disabled]=\"disabled()\"\n (click)=\"browseCamera($event)\"\n >\n <st-icon name=\"camera\" size=\"sm\"></st-icon>\n <span>{{ takePhotoLabel() }}</span>\n </button>\n </st-button-group>\n }\n\n <ng-content></ng-content>\n</div>\n", styles: [":host{--st-file-upload-bg: var(--st-color-bg-default);--st-file-upload-border: var(--st-color-border-default);--st-file-upload-text: var(--st-color-text-primary);--st-file-upload-hint: var(--st-color-text-secondary);--st-file-upload-hover-bg: var(--st-color-bg-raised);--st-file-upload-hover-border: var(--st-color-accent-default);--st-file-upload-active-border: var(--st-color-accent-default);--st-file-upload-active-bg: var(--st-color-accent-subtle, var(--st-color-bg-raised));--st-file-upload-radius: var(--st-border-radius-xl);display:block;position:relative;box-sizing:border-box;background-color:var(--st-file-upload-bg);border:2px dashed var(--st-file-upload-border);border-radius:var(--st-file-upload-radius);padding:var(--st-space-6) var(--st-space-4);text-align:center;cursor:pointer;transition:border-color var(--st-transition-fast),background-color var(--st-transition-fast),transform var(--st-transition-fast);-webkit-user-select:none;user-select:none;outline:none}:host st-avatar{transition:transform .2s ease}:host:hover:not(.st-disabled){background-color:var(--st-file-upload-hover-bg);border-color:var(--st-file-upload-hover-border)}:host:hover:not(.st-disabled) st-avatar{transform:translateY(-2px)}:host:focus-visible:not(.st-disabled){outline:2px solid var(--st-color-accent-default);outline-offset:2px}:host.st-drag-over{background-color:var(--st-file-upload-active-bg);border-color:var(--st-file-upload-active-border);border-style:solid;transform:scale(1.01)}:host.st-drag-over st-avatar{transform:translateY(-4px) scale(1.05)}:host.st-disabled{opacity:.5;cursor:not-allowed;pointer-events:none}:host .st-file-upload-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host .st-file-upload-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--st-space-3)}:host .st-file-upload-text{display:flex;flex-direction:column;gap:var(--st-space-1)}:host .st-file-upload-label{font-size:.95rem;font-weight:500;color:var(--st-file-upload-text)}:host.st-state-error,:host.st-error{--st-file-upload-border: var(--st-color-feedback-error-default);--st-file-upload-hover-border: var(--st-color-feedback-error-hover, var(--st-color-feedback-error-default))}:host.st-state-error:focus-visible:not(.st-disabled),:host.st-error:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-error-default)}:host.st-state-success{--st-file-upload-border: var(--st-color-feedback-success-default);--st-file-upload-hover-border: var(--st-color-feedback-success-hover, var(--st-color-feedback-success-default))}:host.st-state-success:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-success-default)}:host.st-state-warning{--st-file-upload-border: var(--st-color-feedback-warning-default);--st-file-upload-hover-border: var(--st-color-feedback-warning-hover, var(--st-color-feedback-warning-default))}:host.st-state-warning:focus-visible:not(.st-disabled){outline-color:var(--st-color-feedback-warning-default)}:host .st-file-upload-hint{font-size:.8rem;color:var(--st-file-upload-hint)}:host .st-file-upload-hint.st-message-error{color:var(--st-color-feedback-error-text)}:host .st-file-upload-hint.st-message-success{color:var(--st-color-feedback-success-text)}:host .st-file-upload-hint.st-message-warning{color:var(--st-color-feedback-warning-text)}:host .st-file-upload-actions{margin-top:var(--st-space-2)}\n"] }]
3560
+ }], propDecorators: { fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], cameraInput: [{ type: i0.ViewChild, args: ['cameraInput', { isSignal: true }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], camera: [{ type: i0.Input, args: [{ isSignal: true, alias: "camera", required: false }] }], choosePhotoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "choosePhotoLabel", required: false }] }], takePhotoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "takePhotoLabel", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], colorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorMessage", required: false }] }], fileSelect: [{ type: i0.Output, args: ["fileSelect"] }], filesSelect: [{ type: i0.Output, args: ["filesSelect"] }], fileRejected: [{ type: i0.Output, args: ["fileRejected"] }], hostDisabled: [{
3128
3561
  type: HostBinding,
3129
3562
  args: ['class.st-disabled']
3130
3563
  }], hostError: [{
@@ -5602,7 +6035,7 @@ class StrataSegmentedControlItemComponent {
5602
6035
  this.onClick();
5603
6036
  }
5604
6037
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSegmentedControlItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5605
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataSegmentedControlItemComponent, isStandalone: true, selector: "st-segmented-control-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, badgeVariant: { classPropertyName: "badgeVariant", publicName: "badgeVariant", isSignal: true, isRequired: false, transformFunction: null }, badgeSize: { classPropertyName: "badgeSize", publicName: "badgeSize", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", selectionChanged: "selectionChanged" }, host: { attributes: { "role": "tab" }, listeners: { "click": "onClick()", "keydown.space": "onKeydown($event)", "keydown.enter": "onKeydown($event)" }, properties: { "attr.aria-selected": "selected()", "attr.aria-disabled": "effectiveDisabled()", "class.st-disabled": "effectiveDisabled()", "attr.tabindex": "this.tabIndex", "attr.disabled": "this.disabledAttribute" } }, ngImport: i0, template: "<span>{{ text() }}</span>\n@if (badge() !== undefined) {\n <st-badge [value]=\"badge()\" [variant]=\"badgeVariant()\" [size]=\"badgeSize()\"></st-badge>\n}\n<ng-content select=\"st-badge\"></ng-content>\n", styles: [""], dependencies: [{ kind: "component", type: StrataBadgeComponent, selector: "st-badge", inputs: ["value", "icon", "max", "variant", "size", "placement", "visible", "showZero", "ariaLabel"] }] });
6038
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: StrataSegmentedControlItemComponent, isStandalone: true, selector: "st-segmented-control-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, badgeVariant: { classPropertyName: "badgeVariant", publicName: "badgeVariant", isSignal: true, isRequired: false, transformFunction: null }, badgeSize: { classPropertyName: "badgeSize", publicName: "badgeSize", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", selectionChanged: "selectionChanged" }, host: { attributes: { "role": "tab" }, listeners: { "click": "onClick()", "keydown.space": "onKeydown($event)", "keydown.enter": "onKeydown($event)" }, properties: { "attr.aria-selected": "selected()", "attr.aria-disabled": "effectiveDisabled()", "class.st-disabled": "effectiveDisabled()", "attr.tabindex": "this.tabIndex", "attr.disabled": "this.disabledAttribute" } }, ngImport: i0, template: "<span>{{ text() }}</span>\n@if (badge() !== undefined) {\n <st-badge [value]=\"badge()\" [variant]=\"badgeVariant()\" [size]=\"badgeSize()\"></st-badge>\n}\n<ng-content select=\"st-badge\"></ng-content>\n", styles: [":host{display:flex;align-items:center;justify-content:center;gap:var(--st-space-2, 8px);height:var(--st-segmented-control-item-height);padding:0 var(--st-segmented-control-padding-x);border-radius:calc(var(--st-segmented-control-border-radius) - 2px);font-size:var(--st-segmented-control-font-size);font-weight:500;-webkit-user-select:none;user-select:none;transition:background-color var(--st-transition-fast),color var(--st-transition-fast);border:none;color:var(--st-color-text-primary);flex-shrink:0;text-wrap:nowrap;background-color:transparent;position:relative;z-index:1;box-sizing:border-box}:host:hover:not([disabled]):not(.st-disabled):not([aria-selected=true]){cursor:pointer;background-color:var(--st-color-control-bg-hover);color:var(--st-color-text-primary)}:host[aria-selected=true]{color:var(--st-color-control-primary-text);cursor:default}:host[disabled],:host.st-disabled{pointer-events:none;color:var(--st-color-text-tertiary);cursor:unset}:host st-badge{flex-shrink:0}:host-context(.st-segmented-control-full-width){flex:1}\n"], dependencies: [{ kind: "component", type: StrataBadgeComponent, selector: "st-badge", inputs: ["value", "icon", "max", "variant", "size", "placement", "visible", "showZero", "ariaLabel"] }] });
5606
6039
  }
5607
6040
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSegmentedControlItemComponent, decorators: [{
5608
6041
  type: Component,
@@ -5614,7 +6047,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
5614
6047
  '(click)': 'onClick()',
5615
6048
  '(keydown.space)': 'onKeydown($event)',
5616
6049
  '(keydown.enter)': 'onKeydown($event)'
5617
- }, template: "<span>{{ text() }}</span>\n@if (badge() !== undefined) {\n <st-badge [value]=\"badge()\" [variant]=\"badgeVariant()\" [size]=\"badgeSize()\"></st-badge>\n}\n<ng-content select=\"st-badge\"></ng-content>\n" }]
6050
+ }, template: "<span>{{ text() }}</span>\n@if (badge() !== undefined) {\n <st-badge [value]=\"badge()\" [variant]=\"badgeVariant()\" [size]=\"badgeSize()\"></st-badge>\n}\n<ng-content select=\"st-badge\"></ng-content>\n", styles: [":host{display:flex;align-items:center;justify-content:center;gap:var(--st-space-2, 8px);height:var(--st-segmented-control-item-height);padding:0 var(--st-segmented-control-padding-x);border-radius:calc(var(--st-segmented-control-border-radius) - 2px);font-size:var(--st-segmented-control-font-size);font-weight:500;-webkit-user-select:none;user-select:none;transition:background-color var(--st-transition-fast),color var(--st-transition-fast);border:none;color:var(--st-color-text-primary);flex-shrink:0;text-wrap:nowrap;background-color:transparent;position:relative;z-index:1;box-sizing:border-box}:host:hover:not([disabled]):not(.st-disabled):not([aria-selected=true]){cursor:pointer;background-color:var(--st-color-control-bg-hover);color:var(--st-color-text-primary)}:host[aria-selected=true]{color:var(--st-color-control-primary-text);cursor:default}:host[disabled],:host.st-disabled{pointer-events:none;color:var(--st-color-text-tertiary);cursor:unset}:host st-badge{flex-shrink:0}:host-context(.st-segmented-control-full-width){flex:1}\n"] }]
5618
6051
  }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], badgeVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeVariant", required: false }] }], badgeSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeSize", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChanged: [{ type: i0.Output, args: ["selectionChanged"] }], tabIndex: [{
5619
6052
  type: HostBinding,
5620
6053
  args: ['attr.tabindex']
@@ -5784,7 +6217,7 @@ class StrataSegmentedControlComponent {
5784
6217
  useExisting: forwardRef(() => StrataSegmentedControlComponent),
5785
6218
  multi: true
5786
6219
  }
5787
- ], queries: [{ propertyName: "segmentItems", predicate: StrataSegmentedControlItemComponent, isSignal: true }, { propertyName: "segmentItemsRefs", predicate: StrataSegmentedControlItemComponent, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"st-segmented-control-track\">\n <ng-content select=\"st-segmented-control-item\"></ng-content>\n <div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\"></div>\n</div>\n@if (message()) {\n <div\n class=\"st-segmented-control-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n" });
6220
+ ], queries: [{ propertyName: "segmentItems", predicate: StrataSegmentedControlItemComponent, isSignal: true }, { propertyName: "segmentItemsRefs", predicate: StrataSegmentedControlItemComponent, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"st-segmented-control-track\">\n <ng-content select=\"st-segmented-control-item\"></ng-content>\n <div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\"></div>\n</div>\n@if (message()) {\n <div\n class=\"st-segmented-control-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n", styles: [":host{--st-segmented-control-height: var(--st-interactive-element-height-md);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 14px;--st-segmented-control-padding-x: var(--st-size-xxs);--st-segmented-control-border-radius: var(--st-border-radius-md);--st-segmented-control-border-color: transparent;--st-segmented-control-error-border: var(--st-color-feedback-error-default);--st-segmented-control-success-border: var(--st-color-feedback-success-default);--st-segmented-control-warning-border: var(--st-color-feedback-warning-default);display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;box-sizing:border-box}:host.st-size-sm{--st-segmented-control-height: var(--st-interactive-element-height-sm);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 4px);--st-segmented-control-font-size: 12px;--st-segmented-control-padding-x: var(--st-size-xxxs)}:host.st-size-sm .st-segmented-control-track{padding:2px;gap:2px}:host.st-size-md{--st-segmented-control-height: var(--st-interactive-element-height-md);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 14px;--st-segmented-control-padding-x: var(--st-size-xxs)}:host.st-size-md .st-segmented-control-track{padding:4px;gap:4px}:host.st-size-lg{--st-segmented-control-height: var(--st-interactive-element-height-lg);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 16px;--st-segmented-control-padding-x: var(--st-size-xs)}:host.st-size-lg .st-segmented-control-track{padding:4px;gap:4px}:host.st-state-error{--st-segmented-control-border-color: var(--st-segmented-control-error-border)}:host.st-state-success{--st-segmented-control-border-color: var(--st-segmented-control-success-border)}:host.st-state-warning{--st-segmented-control-border-color: var(--st-segmented-control-warning-border)}:host.st-segmented-control-full-width{width:100%}:host.st-segmented-control-full-width .st-segmented-control-track{display:flex;width:100%}.st-segmented-control-track{display:inline-flex;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;width:fit-content;max-width:100%;min-width:0;position:relative;border-radius:var(--st-segmented-control-border-radius);border:1px solid var(--st-segmented-control-border-color);box-sizing:border-box;background-color:var(--st-color-bg-raised);height:var(--st-segmented-control-height);padding:4px;gap:4px;transition:border-color var(--st-transition-fast);-ms-overflow-style:none;scrollbar-width:none}.st-segmented-control-track::-webkit-scrollbar{display:none}.selection-item{display:flex;align-items:center;justify-content:center;gap:var(--st-space-2, 8px);height:var(--st-segmented-control-item-height);padding:0 var(--st-segmented-control-padding-x);border-radius:calc(var(--st-segmented-control-border-radius) - 2px);font-size:var(--st-segmented-control-font-size);font-weight:500;-webkit-user-select:none;user-select:none;transition:background-color var(--st-transition-fast),color var(--st-transition-fast)}#selection-indicator{cursor:default;position:absolute;top:0;left:0;z-index:0;pointer-events:none;border-radius:calc(var(--st-segmented-control-border-radius) - 2px);background-color:var(--st-color-control-primary-bg);color:var(--st-color-control-primary-text);text-wrap:nowrap;box-shadow:var(--st-shadow-1);transition:left var(--st-transition-fast),width var(--st-transition-fast)}.st-segmented-control-message{margin-top:var(--st-space-1);font-size:var(--st-font-size-sm, 12px);color:var(--st-color-text-secondary)}.st-segmented-control-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-segmented-control-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-segmented-control-message.st-message-warning{color:var(--st-color-feedback-warning-text)}\n"] });
5788
6221
  }
5789
6222
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSegmentedControlComponent, decorators: [{
5790
6223
  type: Component,
@@ -5807,7 +6240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
5807
6240
  '[attr.aria-invalid]': 'effectiveState() === "error" ? "true" : null',
5808
6241
  '[class.st-disabled]': 'effectiveDisabled()',
5809
6242
  '[attr.aria-disabled]': 'effectiveDisabled()'
5810
- }, template: "<div class=\"st-segmented-control-track\">\n <ng-content select=\"st-segmented-control-item\"></ng-content>\n <div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\"></div>\n</div>\n@if (message()) {\n <div\n class=\"st-segmented-control-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n" }]
6243
+ }, template: "<div class=\"st-segmented-control-track\">\n <ng-content select=\"st-segmented-control-item\"></ng-content>\n <div class=\"selection-item\" id=\"selection-indicator\" \n [style.left]=\"this.offset() + 'px'\"\n [style.top]=\"this.indicatorTop() + 'px'\"\n [style.width]=\"this.indicatorWidth() + 'px'\"\n [style.height]=\"this.indicatorHeight() + 'px'\"></div>\n</div>\n@if (message()) {\n <div\n class=\"st-segmented-control-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n", styles: [":host{--st-segmented-control-height: var(--st-interactive-element-height-md);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 14px;--st-segmented-control-padding-x: var(--st-size-xxs);--st-segmented-control-border-radius: var(--st-border-radius-md);--st-segmented-control-border-color: transparent;--st-segmented-control-error-border: var(--st-color-feedback-error-default);--st-segmented-control-success-border: var(--st-color-feedback-success-default);--st-segmented-control-warning-border: var(--st-color-feedback-warning-default);display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;box-sizing:border-box}:host.st-size-sm{--st-segmented-control-height: var(--st-interactive-element-height-sm);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 4px);--st-segmented-control-font-size: 12px;--st-segmented-control-padding-x: var(--st-size-xxxs)}:host.st-size-sm .st-segmented-control-track{padding:2px;gap:2px}:host.st-size-md{--st-segmented-control-height: var(--st-interactive-element-height-md);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 14px;--st-segmented-control-padding-x: var(--st-size-xxs)}:host.st-size-md .st-segmented-control-track{padding:4px;gap:4px}:host.st-size-lg{--st-segmented-control-height: var(--st-interactive-element-height-lg);--st-segmented-control-item-height: calc(var(--st-segmented-control-height) - 8px);--st-segmented-control-font-size: 16px;--st-segmented-control-padding-x: var(--st-size-xs)}:host.st-size-lg .st-segmented-control-track{padding:4px;gap:4px}:host.st-state-error{--st-segmented-control-border-color: var(--st-segmented-control-error-border)}:host.st-state-success{--st-segmented-control-border-color: var(--st-segmented-control-success-border)}:host.st-state-warning{--st-segmented-control-border-color: var(--st-segmented-control-warning-border)}:host.st-segmented-control-full-width{width:100%}:host.st-segmented-control-full-width .st-segmented-control-track{display:flex;width:100%}.st-segmented-control-track{display:inline-flex;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;width:fit-content;max-width:100%;min-width:0;position:relative;border-radius:var(--st-segmented-control-border-radius);border:1px solid var(--st-segmented-control-border-color);box-sizing:border-box;background-color:var(--st-color-bg-raised);height:var(--st-segmented-control-height);padding:4px;gap:4px;transition:border-color var(--st-transition-fast);-ms-overflow-style:none;scrollbar-width:none}.st-segmented-control-track::-webkit-scrollbar{display:none}.selection-item{display:flex;align-items:center;justify-content:center;gap:var(--st-space-2, 8px);height:var(--st-segmented-control-item-height);padding:0 var(--st-segmented-control-padding-x);border-radius:calc(var(--st-segmented-control-border-radius) - 2px);font-size:var(--st-segmented-control-font-size);font-weight:500;-webkit-user-select:none;user-select:none;transition:background-color var(--st-transition-fast),color var(--st-transition-fast)}#selection-indicator{cursor:default;position:absolute;top:0;left:0;z-index:0;pointer-events:none;border-radius:calc(var(--st-segmented-control-border-radius) - 2px);background-color:var(--st-color-control-primary-bg);color:var(--st-color-control-primary-text);text-wrap:nowrap;box-shadow:var(--st-shadow-1);transition:left var(--st-transition-fast),width var(--st-transition-fast)}.st-segmented-control-message{margin-top:var(--st-space-1);font-size:var(--st-font-size-sm, 12px);color:var(--st-color-text-secondary)}.st-segmented-control-message.st-message-error{color:var(--st-color-feedback-error-text)}.st-segmented-control-message.st-message-success{color:var(--st-color-feedback-success-text)}.st-segmented-control-message.st-message-warning{color:var(--st-color-feedback-warning-text)}\n"] }]
5811
6244
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], colorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorMessage", required: false }] }], segmentItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataSegmentedControlItemComponent), { isSignal: true }] }], segmentItemsRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrataSegmentedControlItemComponent), { ...{
5812
6245
  read: ElementRef
5813
6246
  }, isSignal: true }] }] } });
@@ -6184,7 +6617,7 @@ class StrataSingleSelectComponent {
6184
6617
  useExisting: forwardRef(() => StrataSingleSelectComponent),
6185
6618
  multi: true
6186
6619
  }
6187
- ], queries: [{ propertyName: "selectItems", predicate: StrataSelectItemComponent, isSignal: true }, { propertyName: "triggerTemplate", first: true, predicate: StrataSelectTriggerDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "inputField", first: true, predicate: StrataInputFieldComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [class.disabled]=\"effectiveDisabled()\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" (keydown.space)=\"toggle($event)\" (keydown.enter)=\"toggle($event)\" (keydown.escape)=\"open.set(false)\" [attr.data-open]=\"open()\"\n [attr.tabindex]=\"effectiveDisabled() ? -1 : 0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n@if (message()) {\n <div\n class=\"st-select-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <div class=\"single-select-items-container\">\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataInputFieldComponent, selector: "st-input-field", inputs: ["size", "label", "id", "name", "state", "error", "message", "colorMessage", "disabled", "maxLength", "showCharacterCounter", "characterCounterFormatter"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: StrataNativeInputRefDirective, selector: "input[stInput], textarea[stInput]" }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
6620
+ ], queries: [{ propertyName: "selectItems", predicate: StrataSelectItemComponent, isSignal: true }, { propertyName: "triggerTemplate", first: true, predicate: StrataSelectTriggerDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "inputField", first: true, predicate: StrataInputFieldComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (label()) {\n<label class=\"st-label\" [for]=\"name()\"> {{ label() }}</label>\n}\n<div class=\"single-select-input\" [class.disabled]=\"effectiveDisabled()\" [id]=\"name()\" #singleSelectInput (click)=\"toggle($event)\" (keydown.space)=\"toggle($event)\" (keydown.enter)=\"toggle($event)\" (keydown.escape)=\"open.set(false)\" [attr.data-open]=\"open()\"\n [attr.tabindex]=\"effectiveDisabled() ? -1 : 0\" [stOverlay]=\"selector\" [overlayOpen]=\"open()\" [overlayPlacement]=\"placement()\">\n @if (selectedItem()) {\n @if (triggerTemplate()) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate()!\"></ng-container>\n } @else {\n {{ selectedItem()!.text() }}\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n\n <st-icon name=\"expand-up-down\"></st-icon>\n</div>\n@if (message()) {\n <div\n class=\"st-select-message\"\n [class.st-message-error]=\"isMessageError()\"\n [class.st-message-success]=\"isMessageSuccess()\"\n [class.st-message-warning]=\"isMessageWarning()\"\n [attr.role]=\"isMessageError() ? 'alert' : null\"\n >\n {{ message() }}\n </div>\n}\n\n<ng-template #selector>\n <div class=\"single-select-selector\" #singleSelectSelector [class.full-width]=\"fullWidth()\">\n @if (searchable()) {\n <st-input-field>\n <input stInput #searchField type=\"text\" [value]=\"searchQuery() || ''\" (input)=\"searchQuery.set($any($event.target).value); onSearchChange(searchQuery())\" [placeholder]=\"searchPlaceholder()\" />\n <button stButton variant=\"ghost\" [class.visible]=\"searchQuery() !== undefined && searchQuery()!.length > 0\" suffix\n size=\"sm\" (click)=\"searchQuery.set(undefined); onSearchChange(undefined)\">\n x\n </button>\n </st-input-field>\n }\n <div class=\"single-select-items-container\">\n <ng-content select=\"st-select-item\"></ng-content>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrataIconComponent, selector: "st-icon", inputs: ["name", "size", "ariaLabel"], outputs: ["sizeChange"] }, { kind: "directive", type: StrataOverlayDirective, selector: "[stOverlay]", inputs: ["stOverlay", "overlayOpen", "overlayPlacement", "overlayOffset", "overlayFitViewport", "overlayTarget"], outputs: ["overlayOpenChange"] }, { kind: "component", type: StrataInputFieldComponent, selector: "st-input-field", inputs: ["size", "label", "id", "name", "state", "error", "message", "colorMessage", "disabled", "maxLength", "showCharacterCounter", "characterCounterFormatter"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: StrataNativeInputRefDirective, selector: "input[stInput], textarea[stInput]" }, { kind: "directive", type: StrataButtonDirective, selector: "[stButton]", inputs: ["variant", "size", "fullWidth"] }] });
6188
6621
  }
6189
6622
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: StrataSingleSelectComponent, decorators: [{
6190
6623
  type: Component,
@@ -6645,5 +7078,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
6645
7078
  * Generated bundle index. Do not edit.
6646
7079
  */
6647
7080
 
6648
- export { BreakpointService, CapitalizePipe, DEFAULT_DATE_RANGE_PRESETS, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, DeviceService, HotkeyService, HttpIconLoader, IconLoader, IconRegistry, IconRegistryService, ModalService, NotificationService, STRATA_CONFIG, StrataAccordionGroupComponent, StrataAccordionItemComponent, StrataActionMenuComponent, StrataActionMenuItemComponent, StrataActivatableDirective, StrataAlertComponent, StrataAlertContentComponent, StrataAutoResizeDirective, StrataAvatarComponent, StrataAvatarStackComponent, StrataBadgeComponent, StrataBreadcrumbComponent, StrataBreadcrumbItemComponent, StrataButtonDirective, StrataButtonGroupComponent, StrataCalendarComponent, StrataCardComponent, StrataCheckboxComponent, StrataDatePickerComponent, StrataDateRangePickerComponent, StrataDividerComponent, StrataFileUploadComponent, StrataIconComponent, StrataImageCropperComponent, StrataInputFieldComponent, StrataItemComponent, StrataItemListComponent, StrataKbdComponent, StrataMessageStateComponent, StrataModalBodyComponent, StrataModalComponent, StrataModalContainerComponent, StrataModalFooterComponent, StrataModalHeaderComponent, StrataModalRef, StrataNativeInputRefDirective, StrataNotificationComponent, StrataNotificationContainerComponent, StrataNumberDisplayComponent, StrataNumberStepperComponent, StrataOtpComponent, StrataOverlayDirective, StrataPaginationComponent, StrataProgressLinearComponent, StrataProgressRadialComponent, StrataRadioComponent, StrataRadioGroupComponent, StrataSegmentedControlComponent, StrataSegmentedControlItemComponent, StrataSelectItemComponent, StrataSelectTriggerDirective, StrataShellComponent, StrataSidemenuComponent, StrataSidemenuItemDirective, StrataSidemenuItemGroupComponent, StrataSidemenuSectionComponent, StrataSingleSelectComponent, StrataSkeletonComponent, StrataSliderComponent, StrataSpinnerComponent, StrataStepComponent, StrataStepperComponent, StrataTabItemComponent, StrataTabsComponent, StrataTagComponent, StrataTextStackComponent, StrataThemeDirective, StrataTimePickerComponent, StrataToggleComponent, StrataTooltipDirective, addDays, addMonths, addYears, createCalendarGrid, disableDateRange, disableDaysOfWeek, disableFutureDates, disablePastDates, disableWeekends, endOfDay, endOfMonth, formatDate, formatMonthTitle, getDayOfWeek, getDaysInMonth, getDefaultShortcutLabels, getLocaleDefaultDateFormat, getMonthNames, getWeekdayNames, isAfterDay, isApplePlatform, isBeforeDay, isSameDay, isSameMonth, isSameYear, isWeekend, isWithinDayRange, parseDate, provideBaseIcons, provideIcons, provideStrata, resolveIsApple, startOfDay, startOfMonth };
7081
+ export { BreakpointService, CapitalizePipe, DEFAULT_DATE_RANGE_PRESETS, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, DeviceService, HotkeyService, HttpIconLoader, IconLoader, IconRegistry, IconRegistryService, ModalService, NotificationService, STRATA_CONFIG, StrataAccordionGroupComponent, StrataAccordionItemComponent, StrataActionMenuComponent, StrataActionMenuItemComponent, StrataActivatableDirective, StrataAlertComponent, StrataAlertContentComponent, StrataAutoResizeDirective, StrataAvatarComponent, StrataAvatarStackComponent, StrataBadgeComponent, StrataBreadcrumbComponent, StrataBreadcrumbItemComponent, StrataButtonDirective, StrataButtonGroupComponent, StrataCalendarComponent, StrataCardComponent, StrataCheckboxComponent, StrataContextMenuDirective, StrataDatePickerComponent, StrataDateRangePickerComponent, StrataDividerComponent, StrataFileUploadComponent, StrataIconComponent, StrataImageCropperComponent, StrataInputFieldComponent, StrataItemComponent, StrataItemListComponent, StrataKbdComponent, StrataMessageStateComponent, StrataModalBodyComponent, StrataModalComponent, StrataModalContainerComponent, StrataModalFooterComponent, StrataModalHeaderComponent, StrataModalRef, StrataNativeInputRefDirective, StrataNotificationComponent, StrataNotificationContainerComponent, StrataNumberDisplayComponent, StrataNumberStepperComponent, StrataOtpComponent, StrataOverlayDirective, StrataPaginationComponent, StrataProgressLinearComponent, StrataProgressRadialComponent, StrataRadioComponent, StrataRadioGroupComponent, StrataSegmentedControlComponent, StrataSegmentedControlItemComponent, StrataSelectItemComponent, StrataSelectTriggerDirective, StrataShellComponent, StrataSidemenuComponent, StrataSidemenuItemDirective, StrataSidemenuItemGroupComponent, StrataSidemenuSectionComponent, StrataSingleSelectComponent, StrataSkeletonComponent, StrataSliderComponent, StrataSpinnerComponent, StrataStepComponent, StrataStepperComponent, StrataTabItemComponent, StrataTabsComponent, StrataTagComponent, StrataTextStackComponent, StrataThemeDirective, StrataTimeStepperComponent, StrataTimepickerComponent, StrataToggleComponent, StrataTooltipDirective, addDays, addMonths, addYears, createCalendarGrid, disableDateRange, disableDaysOfWeek, disableFutureDates, disablePastDates, disableWeekends, endOfDay, endOfMonth, formatDate, formatMonthTitle, getDayOfWeek, getDaysInMonth, getDefaultShortcutLabels, getLocaleDefaultDateFormat, getMonthNames, getWeekdayNames, isAfterDay, isApplePlatform, isBeforeDay, isSameDay, isSameMonth, isSameYear, isWeekend, isWithinDayRange, parseDate, provideBaseIcons, provideIcons, provideStrata, resolveIsApple, startOfDay, startOfMonth };
6649
7082
  //# sourceMappingURL=ngx-strata.mjs.map