@brickclay-org/ui 0.1.89 → 0.1.91

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.
package/index.d.ts CHANGED
@@ -1579,7 +1579,7 @@ declare class BkSelect implements ControlValueAccessor, AfterViewInit, OnDestroy
1579
1579
  * existing click/Enter-to-open behaviour is unchanged.
1580
1580
  */
1581
1581
  openOnFocus: _angular_core.InputSignal<boolean>;
1582
- dropdownPosition: _angular_core.InputSignal<"top" | "bottom">;
1582
+ dropdownPosition: _angular_core.InputSignal<"bottom" | "top">;
1583
1583
  hasError: boolean;
1584
1584
  errorMessage: string;
1585
1585
  /**
@@ -1618,7 +1618,7 @@ declare class BkSelect implements ControlValueAccessor, AfterViewInit, OnDestroy
1618
1618
  private gridDraftOptions;
1619
1619
  searchTerm: _angular_core.WritableSignal<string>;
1620
1620
  markedIndex: _angular_core.WritableSignal<number>;
1621
- placement: _angular_core.WritableSignal<"top" | "bottom">;
1621
+ placement: _angular_core.WritableSignal<"bottom" | "top">;
1622
1622
  visibleCount: _angular_core.WritableSignal<number>;
1623
1623
  private resizeObserver?;
1624
1624
  /**
@@ -1868,6 +1868,19 @@ declare class BkInput implements OnInit, OnDestroy, AfterViewInit, ControlValueA
1868
1868
  phoneOverlay?: CdkConnectedOverlay;
1869
1869
  isFocused: boolean;
1870
1870
  inputValue: string;
1871
+ /**
1872
+ * What the template's `[value]` binding actually renders. Deliberately a separate property
1873
+ * from `inputValue` (which still mirrors the live text for `isFilled`/bookkeeping on every
1874
+ * keystroke): re-applying `[value]` to an element that already displays that exact text is a
1875
+ * no-op on most inputs, but on `type="number"` it isn't - Chromium doesn't skip the write just
1876
+ * because the string is unchanged, and since `type="number"` also refuses `setSelectionRange`
1877
+ * (it throws), we have no way to put the caret back afterwards. So `displayValue` is only ever
1878
+ * written by genuinely external changes (writeValue(), the phone country-prefix swap) - never
1879
+ * from handleInput() or the "parent mutated the native value" resync, both of which are only
1880
+ * echoing back text the DOM already has. That keeps every self-originated edit from re-touching
1881
+ * `.value` at all, which is the only reliable fix here given number inputs can't be caret-restored.
1882
+ */
1883
+ displayValue: string;
1871
1884
  isDropdownOpen: boolean;
1872
1885
  private pendingMaskedValue;
1873
1886
  private isPropagatingViewValue;
@@ -2921,7 +2934,7 @@ declare class BkHierarchicalSelect implements ControlValueAccessor, AfterViewIni
2921
2934
  */
2922
2935
  appendToBody: _angular_core.InputSignal<boolean>;
2923
2936
  /** Open above or below the trigger (also used when appendToBody is true for fixed coordinates). */
2924
- dropdownPosition: _angular_core.InputSignal<"top" | "bottom">;
2937
+ dropdownPosition: _angular_core.InputSignal<"bottom" | "top">;
2925
2938
  /** Key for option color (e.g. "color"). When set, option label and selected value use this color. */
2926
2939
  colorKey: _angular_core.InputSignal<string>;
2927
2940
  /**
@@ -2955,7 +2968,7 @@ declare class BkHierarchicalSelect implements ControlValueAccessor, AfterViewIni
2955
2968
  /** Index of the keyboard-highlighted option within the current level (`filteredItems`). */
2956
2969
  markedIndex: _angular_core.WritableSignal<number>;
2957
2970
  private el;
2958
- placement: _angular_core.WritableSignal<"top" | "bottom">;
2971
+ placement: _angular_core.WritableSignal<"bottom" | "top">;
2959
2972
  /**
2960
2973
  * Panel width, kept equal to the control's — matches the old `dropdownStyle().width`
2961
2974
  * behaviour. Set on open and re-measured by a ResizeObserver on the control while open, so a
@@ -3538,7 +3551,6 @@ interface MenuItem {
3538
3551
  * flip — they stay under their trigger and scroll instead.
3539
3552
  */
3540
3553
  declare class BkMenu implements OnChanges, OnDestroy {
3541
- private readonly host;
3542
3554
  items: MenuItem[];
3543
3555
  orientation: MenuOrientation;
3544
3556
  submenuMode: MenuSubmenuMode;
@@ -3609,7 +3621,6 @@ declare class BkMenu implements OnChanges, OnDestroy {
3609
3621
  */
3610
3622
  private static popupHeightCeiling;
3611
3623
  private closeTimer;
3612
- constructor(host: ElementRef<HTMLElement>);
3613
3624
  /**
3614
3625
  * Inline mode: whenever the active leaf is (re)set — including the very
3615
3626
  * first binding, so a deep link or a page refresh lands with the section
@@ -3658,7 +3669,7 @@ declare class BkMenu implements OnChanges, OnDestroy {
3658
3669
  private toggle;
3659
3670
  private closeBranch;
3660
3671
  private closeAll;
3661
- onDocumentClick(event: MouseEvent): void;
3672
+ onDocumentClick(): void;
3662
3673
  onViewportChange(): void;
3663
3674
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkMenu, never>;
3664
3675
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkMenu, "bk-menu", never, { "items": { "alias": "items"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "submenuMode": { "alias": "submenuMode"; "required": false; }; "trigger": { "alias": "trigger"; "required": false; }; "size": { "alias": "size"; "required": false; }; "hoverCloseDelay": { "alias": "hoverCloseDelay"; "required": false; }; "singleOpen": { "alias": "singleOpen"; "required": false; }; "submenuBackground": { "alias": "submenuBackground"; "required": false; }; "emitParentClick": { "alias": "emitParentClick"; "required": false; }; "activeItemId": { "alias": "activeItemId"; "required": false; }; "tintIcons": { "alias": "tintIcons"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; }, { "activeItemIdChange": "activeItemIdChange"; "itemClick": "itemClick"; }, never, never, true, never>;
@@ -4568,7 +4579,7 @@ declare class BkTd extends BkCellBase implements AfterViewInit, OnDestroy {
4568
4579
  */
4569
4580
  protected readonly truncatedTooltip: _angular_core.WritableSignal<string>;
4570
4581
  /** Forwarded to the content wrapper's `bkTooltip`. Override on a column whose default 'right' would run into its neighbour. */
4571
- tooltipPosition: _angular_core.InputSignal<"left" | "right" | "top" | "bottom">;
4582
+ tooltipPosition: _angular_core.InputSignal<"left" | "right" | "bottom" | "top">;
4572
4583
  /** Only present when `ellipsis()` is true — see the `@else` branch in the template. */
4573
4584
  private ellipsisTextRef?;
4574
4585
  checkbox: _angular_core.InputSignal<boolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brickclay-org/ui",
3
- "version": "0.1.89",
3
+ "version": "0.1.91",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "ng-add": {
6
6
  "save": "dependencies"
@@ -598,129 +598,6 @@
598
598
  justify-content: center;
599
599
  } */
600
600
 
601
- /* --------------------------
602
- CUSTOM TIME PICKER
603
- ---------------------------*/
604
- .custom-time-picker {
605
- display: flex;
606
- flex-direction: column;
607
- gap: 8px;
608
- align-items: start;
609
- }
610
-
611
- .time-input-group {
612
- display: flex;
613
- align-items: center;
614
- justify-content: center;
615
- /*width: 100%;*/
616
- gap: 8px;
617
- background: #f8f9fa;
618
- padding: 12px;
619
- border-radius: 8px;
620
- border: 1px solid #e0e0e0;
621
- }
622
-
623
- .time-control {
624
- display: flex;
625
- flex-direction: column;
626
- align-items: center;
627
- /* gap: 4px; */
628
- }
629
-
630
- .time-btn {
631
- background: #fff;
632
- border: 1px solid #ddd;
633
- width: 28px;
634
- height: 20px;
635
- cursor: pointer;
636
- font-size: 10px;
637
- color: #666;
638
- border-radius: 4px;
639
- transition: all 0.2s;
640
- display: flex;
641
- align-items: center;
642
- justify-content: center;
643
- padding: 0;
644
- line-height: 1;
645
- }
646
-
647
- .time-btn:hover {
648
- background: #e4e4e4;
649
- color: white;
650
- border-color: #e4e4e4;
651
- }
652
-
653
- .time-btn.up {
654
- border-bottom-left-radius: 0;
655
- border-bottom-right-radius: 0;
656
- border-bottom: none;
657
- }
658
-
659
- .time-btn.down {
660
- border-top-left-radius: 0;
661
- border-top-right-radius: 0;
662
- border-top: none;
663
- }
664
-
665
- .time-input {
666
- width: 40px;
667
- height: 32px;
668
- text-align: center;
669
- border: 1px solid #ddd;
670
- border-radius: 4px;
671
- font-size: 16px;
672
- font-weight: 600;
673
- background: #fff;
674
- color: #333;
675
- }
676
-
677
- .time-separator {
678
- font-size: 18px;
679
- font-weight: 600;
680
- color: #666;
681
- margin: 0 2px;
682
- }
683
-
684
- .ampm-control {
685
- display: flex;
686
- flex-direction: column;
687
- gap: 4px;
688
- margin-left: 8px;
689
- }
690
-
691
- .ampm-btn {
692
- padding: 6px 12px;
693
- border: 1px solid #ddd;
694
- background: #fff;
695
- border-radius: 4px;
696
- cursor: pointer;
697
- font-size: 12px;
698
- font-weight: 600;
699
- color: #666;
700
- transition: all 0.2s;
701
- min-width: 45px;
702
- }
703
-
704
- .ampm-btn:hover {
705
- background: #f0f0f0;
706
- }
707
-
708
- .ampm-btn.active {
709
- background: #000;
710
- color: white;
711
- border-color: #000;
712
- }
713
-
714
- .html5-time-input {
715
- margin-top: 8px;
716
- padding: 8px;
717
- border: 1px solid #ddd;
718
- border-radius: 6px;
719
- font-size: 14px;
720
- width: 100%;
721
- max-width: 120px;
722
- }
723
-
724
601
  /* --------------------------
725
602
  FOOTER (Apply/Cancel Buttons)
726
603
  ---------------------------*/
@@ -830,10 +707,6 @@
830
707
  margin-bottom: 16px;
831
708
  }
832
709
 
833
- .time-input-group {
834
- flex-wrap: wrap;
835
- justify-content: center;
836
- }
837
710
  }
838
711
 
839
712
  /* --------------------------
@@ -131,10 +131,28 @@
131
131
  @apply rounded-r-[var(--menu-radius)];
132
132
  }
133
133
 
134
+ /* Inline only: once the last vertical item's submenu opens, it sits flush
135
+ below the button — the rounded-bottom corner above no longer matches the
136
+ container's true edge, so it'd leave an odd notch against the flat panel
137
+ underneath. Square it off while open. Pop-up fly-outs go sideways, not
138
+ below, so they never hit this — hence the :not(.bk-menu--popup) guard. */
139
+ .bk-menu--vertical:not(.bk-menu--popup) > .bk-menu__list > .bk-menu__item--open:last-child > .bk-menu__button {
140
+ border-bottom-left-radius: 0;
141
+ border-bottom-right-radius: 0;
142
+ }
143
+
134
144
  .bk-menu__button:hover:not(:disabled):not(.bk-menu__button--active) {
135
145
  @apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];
136
146
  }
137
147
 
148
+ /* Open state (submenu expanded — inline or flown-out): same tint as hover,
149
+ so a parent stays visibly "open" once the pointer moves off it instead of
150
+ reading as a plain unhovered row. Skipped when it's also the active
151
+ button — the dark active background already marks that more strongly. */
152
+ .bk-menu__item--open > .bk-menu__button:not(.bk-menu__button--active) {
153
+ @apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];
154
+ }
155
+
138
156
  .bk-menu__button--active {
139
157
  @apply bg-[var(--menu-active-bg)] text-[color:var(--menu-active-text)];
140
158
  }
@@ -14,8 +14,10 @@
14
14
  pointer-events: none;
15
15
  }
16
16
 
17
- /* Guarantee toasts stack above dialogs/popovers/etc. that also use CDK overlays CDK's own
18
- z-index otherwise just reflects creation order. Targets the pane CDK wraps this panel in. */
17
+ /* Belt-and-braces: pins the pane itself in case some future overlay ever nests a pane inside
18
+ this one's wrapper. The stacking fight against *other* overlays (dialogs, selects, popovers)
19
+ actually happens one level up, at the wrapper CDK puts around the pane — see the
20
+ `hostElement.style.zIndex` line in toastr.service.ts, which is the real fix for that. */
19
21
  .cdk-overlay-pane.bk-toastr-panel {
20
22
  z-index: 2147483647 !important;
21
23
  }