@jsenv/navi 0.14.29 → 0.14.31

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.
@@ -13848,6 +13848,27 @@ const installCustomConstraintValidation = (
13848
13848
  });
13849
13849
  }
13850
13850
 
13851
+ request_on_checkbox_change: {
13852
+ const isCheckbox =
13853
+ element.tagName === "INPUT" && element.type === "checkbox";
13854
+ if (!isCheckbox) {
13855
+ break request_on_checkbox_change;
13856
+ }
13857
+ const onchange = (e) => {
13858
+ if (element.parentNode.hasAttribute("data-action")) {
13859
+ dispatchActionRequestedCustomEvent(element, {
13860
+ event: e,
13861
+ requester: element,
13862
+ });
13863
+ return;
13864
+ }
13865
+ };
13866
+ element.addEventListener("change", onchange);
13867
+ addTeardown(() => {
13868
+ element.removeEventListener("change", onchange);
13869
+ });
13870
+ }
13871
+
13851
13872
  execute_on_form_submit: {
13852
13873
  if (!isForm) {
13853
13874
  break execute_on_form_submit;
@@ -16048,6 +16069,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16048
16069
  --button-border-color: light-dark(#767676, #8e8e93);
16049
16070
  --button-background-color: light-dark(#f3f4f6, #2d3748);
16050
16071
  --button-color: currentColor;
16072
+ --button-cursor: pointer;
16051
16073
 
16052
16074
  /* Hover */
16053
16075
  --button-border-color-hover: color-mix(
@@ -16101,6 +16123,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16101
16123
  --x-button-border-color: var(--button-border-color);
16102
16124
  --x-button-background-color: var(--button-background-color);
16103
16125
  --x-button-color: var(--button-color);
16126
+ --x-button-cursor: var(--button-cursor);
16104
16127
 
16105
16128
  position: relative;
16106
16129
  box-sizing: border-box;
@@ -16111,7 +16134,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16111
16134
  border: none;
16112
16135
  border-radius: var(--x-button-border-radius);
16113
16136
  outline: none;
16114
- cursor: pointer;
16137
+ cursor: var(--x-button-cursor);
16115
16138
 
16116
16139
  &[data-icon] {
16117
16140
  --button-padding: 0;
@@ -16199,6 +16222,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16199
16222
  --x-button-border-color: var(--button-border-color-readonly);
16200
16223
  --x-button-background-color: var(--button-background-color-readonly);
16201
16224
  --x-button-color: var(--button-color-readonly);
16225
+ --x-button-cursor: default;
16202
16226
  }
16203
16227
  /* Focus */
16204
16228
  &[data-focus-visible] {
@@ -16215,9 +16239,9 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16215
16239
  --x-button-border-color: var(--button-border-color-disabled);
16216
16240
  --x-button-background-color: var(--button-background-color-disabled);
16217
16241
  --x-button-color: var(--button-color-disabled);
16242
+ --x-button-cursor: default;
16218
16243
 
16219
16244
  color: unset;
16220
- cursor: default;
16221
16245
 
16222
16246
  /* Remove active effects */
16223
16247
  .navi_button_content {
@@ -16625,7 +16649,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
16625
16649
  .navi_message_box {
16626
16650
  .navi_title {
16627
16651
  margin-top: 0;
16628
- margin-bottom: var(--navi-spacing-s);
16652
+ margin-bottom: var(--navi-s);
16629
16653
  color: var(--x-message-color);
16630
16654
  }
16631
16655
  }
@@ -17603,6 +17627,7 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
17603
17627
  `;
17604
17628
  const ReportReadOnlyOnLabelContext = createContext();
17605
17629
  const ReportDisabledOnLabelContext = createContext();
17630
+ const LabelPseudoClasses = [":hover", ":active", ":focus", ":focus-visible", ":read-only", ":disabled", ":-navi-loading"];
17606
17631
  const Label = props => {
17607
17632
  const {
17608
17633
  readOnly,
@@ -17617,9 +17642,10 @@ const Label = props => {
17617
17642
  return jsx(Box, {
17618
17643
  ...rest,
17619
17644
  as: "label",
17645
+ pseudoClasses: LabelPseudoClasses,
17620
17646
  basePseudoState: {
17621
- readOnly: innerReadOnly,
17622
- disabled: innerDisabled
17647
+ ":read-only": innerReadOnly,
17648
+ ":disabled": innerDisabled
17623
17649
  },
17624
17650
  children: jsx(ReportReadOnlyOnLabelContext.Provider, {
17625
17651
  value: setInputReadOnly,
@@ -17645,7 +17671,8 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
17645
17671
  --loader-color: var(--navi-loader-color);
17646
17672
  --border-color: light-dark(#767676, #8e8e93);
17647
17673
  --background-color: white;
17648
- --color: light-dark(#4476ff, #3b82f6);
17674
+ --background-color-checked: var(--color, light-dark(#4476ff, #3b82f6));
17675
+ --border-color-checked: var(--color, light-dark(#4476ff, #3b82f6));
17649
17676
  --checkmark-color-light: white;
17650
17677
  --checkmark-color-dark: rgb(55, 55, 55);
17651
17678
  --checkmark-color: var(--checkmark-color-light);
@@ -17658,12 +17685,13 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
17658
17685
  --border-color-hover: color-mix(in srgb, var(--border-color) 60%, black);
17659
17686
  --border-color-hover-checked: color-mix(
17660
17687
  in srgb,
17661
- var(--color) 80%,
17688
+ var(--border-color-checked) 80%,
17662
17689
  var(--color-mix)
17663
17690
  );
17691
+ --background-color-hover: var(--background-color);
17664
17692
  --background-color-hover-checked: color-mix(
17665
17693
  in srgb,
17666
- var(--color) 80%,
17694
+ var(--background-color-checked) 80%,
17667
17695
  var(--color-mix)
17668
17696
  );
17669
17697
  /* Readonly */
@@ -17681,20 +17709,15 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
17681
17709
  --checkmark-color-disabled: #eeeeee;
17682
17710
  --border-color-disabled-checked: #d3d3d3;
17683
17711
  --background-color-disabled-checked: #d3d3d3;
17684
- }
17685
17712
 
17686
- .navi_checkbox[data-dark] {
17687
- --color-mix: var(--color-mix-dark);
17688
- --checkmark-color: var(--navi-checkmark-color-dark);
17713
+ &[data-dark] {
17714
+ --color-mix: var(--color-mix-dark);
17715
+ --checkmark-color: var(--navi-checkmark-color-dark);
17716
+ }
17689
17717
  }
17690
17718
  }
17691
17719
 
17692
17720
  .navi_checkbox {
17693
- position: relative;
17694
- display: inline-flex;
17695
- box-sizing: content-box;
17696
- margin: 3px 3px 3px 4px;
17697
-
17698
17721
  --x-border-radius: var(--border-radius);
17699
17722
  --x-outline-offset: var(--outline-offset);
17700
17723
  --x-outline-width: var(--outline-width);
@@ -17706,82 +17729,206 @@ installImportMetaCss(import.meta);import.meta.css = /* css */`
17706
17729
  --x-border-color: var(--border-color);
17707
17730
  --x-color: var(--color);
17708
17731
  --x-checkmark-color: var(--checkmark-color);
17709
- }
17710
- .navi_checkbox .navi_native_field {
17711
- position: absolute;
17712
- inset: 0;
17713
- margin: 0;
17714
- padding: 0;
17715
- border: none;
17716
- opacity: 0;
17717
- cursor: inherit;
17718
- }
17719
- .navi_checkbox .navi_checkbox_field {
17732
+
17733
+ position: relative;
17720
17734
  display: inline-flex;
17721
- box-sizing: border-box;
17722
- width: var(--x-width);
17723
- height: var(--x-height);
17724
- background-color: var(--x-background-color);
17725
- border-width: var(--x-border-width);
17726
- border-style: solid;
17727
- border-color: var(--x-border-color);
17728
- border-radius: var(--x-border-radius);
17729
- outline-width: var(--x-outline-width);
17730
- outline-style: none;
17731
- outline-color: var(--x-outline-color);
17732
- outline-offset: var(--x-outline-offset);
17733
- }
17734
- .navi_checkbox_marker {
17735
- width: 100%;
17736
- height: 100%;
17737
- opacity: 0;
17738
- stroke: var(--x-checkmark-color);
17739
- transform: scale(0.5);
17740
- transition: all 0.15s ease;
17741
- pointer-events: none;
17742
- }
17743
- .navi_checkbox[data-checked] .navi_checkbox_marker {
17744
- opacity: 1;
17745
- transform: scale(1);
17746
- }
17735
+ box-sizing: content-box;
17736
+ margin: 3px 3px 3px 4px;
17747
17737
 
17748
- /* Focus */
17749
- .navi_checkbox[data-focus-visible] .navi_checkbox_field {
17750
- outline-style: solid;
17751
- }
17752
- /* Hover */
17753
- .navi_checkbox[data-hover] {
17754
- --x-border-color: var(--border-color-hover);
17755
- }
17756
- .navi_checkbox[data-checked][data-hover] {
17757
- --x-border-color: var(--border-color-hover-checked);
17758
- --x-background-color: var(--background-color-hover-checked);
17759
- }
17760
- /* Checked */
17761
- .navi_checkbox[data-checked] {
17762
- --x-background-color: var(--x-color);
17763
- --x-border-color: var(--x-color);
17764
- }
17765
- /* Readonly */
17766
- .navi_checkbox[data-readonly],
17767
- .navi_checkbox[data-readonly][data-hover] {
17768
- --x-border-color: var(--border-color-readonly);
17769
- --x-background-color: var(--background-color-readonly);
17770
- }
17771
- .navi_checkbox[data-readonly][data-checked] {
17772
- --x-border-color: var(--border-color-readonly-checked);
17773
- --x-background-color: var(--background-color-readonly-checked);
17774
- --x-checkmark-color: var(--checkmark-color-readonly);
17775
- }
17776
- /* Disabled */
17777
- .navi_checkbox[data-disabled] {
17778
- --x-border-color: var(--border-color-disabled);
17779
- --x-background-color: var(--background-color-disabled);
17780
- }
17781
- .navi_checkbox[data-disabled][data-checked] {
17782
- --x-border-color: var(--border-color-disabled-checked);
17783
- --x-background-color: var(--background-color-disabled-checked);
17784
- --x-checkmark-color: var(--checkmark-color-disabled);
17738
+ .navi_native_field {
17739
+ position: absolute;
17740
+ inset: 0;
17741
+ margin: 0;
17742
+ padding: 0;
17743
+ border: none;
17744
+ opacity: 0;
17745
+ cursor: inherit;
17746
+ }
17747
+
17748
+ .navi_checkbox_field {
17749
+ display: inline-flex;
17750
+ box-sizing: border-box;
17751
+ width: var(--x-width);
17752
+ height: var(--x-height);
17753
+ background-color: var(--x-background-color);
17754
+ border-width: var(--x-border-width);
17755
+ border-style: solid;
17756
+ border-color: var(--x-border-color);
17757
+ border-radius: var(--x-border-radius);
17758
+ outline-width: var(--x-outline-width);
17759
+ outline-style: none;
17760
+ outline-color: var(--x-outline-color);
17761
+ outline-offset: var(--x-outline-offset);
17762
+ pointer-events: none;
17763
+
17764
+ .navi_checkbox_marker {
17765
+ width: 100%;
17766
+ height: 100%;
17767
+ opacity: 0;
17768
+ stroke: var(--x-checkmark-color);
17769
+ transform: scale(0.5);
17770
+ }
17771
+ }
17772
+
17773
+ /* Focus */
17774
+ &[data-focus-visible] {
17775
+ .navi_checkbox_field {
17776
+ outline-style: solid;
17777
+ }
17778
+ }
17779
+ /* Hover */
17780
+ &[data-hover] {
17781
+ --x-background-color: var(--background-color-hover);
17782
+ --x-border-color: var(--border-color-hover);
17783
+
17784
+ &[data-checked] {
17785
+ --x-border-color: var(--border-color-hover-checked);
17786
+ --x-background-color: var(--background-color-hover-checked);
17787
+ }
17788
+ }
17789
+ /* Checked */
17790
+ &[data-checked] {
17791
+ --x-background-color: var(--background-color-checked);
17792
+ --x-border-color: var(--border-color-checked);
17793
+
17794
+ .navi_checkbox_marker {
17795
+ opacity: 1;
17796
+ transform: scale(1);
17797
+ transition-property: opacity, transform;
17798
+ transition-duration: 0.15s;
17799
+ transition-timing-function: ease;
17800
+ }
17801
+ }
17802
+ /* Readonly */
17803
+ &[data-readonly],
17804
+ &[data-readonly][data-hover] {
17805
+ --x-border-color: var(--border-color-readonly);
17806
+ --x-background-color: var(--background-color-readonly);
17807
+
17808
+ &[data-checked] {
17809
+ --x-border-color: var(--border-color-readonly-checked);
17810
+ --x-background-color: var(--background-color-readonly-checked);
17811
+ --x-checkmark-color: var(--checkmark-color-readonly);
17812
+ }
17813
+ }
17814
+
17815
+ /* Disabled */
17816
+ &[data-disabled] {
17817
+ --x-border-color: var(--border-color-disabled);
17818
+ --x-background-color: var(--background-color-disabled);
17819
+
17820
+ &[data-checked] {
17821
+ --x-border-color: var(--border-color-disabled-checked);
17822
+ --x-background-color: var(--background-color-disabled-checked);
17823
+ --x-checkmark-color: var(--checkmark-color-disabled);
17824
+ }
17825
+ }
17826
+
17827
+ /* Toggle appearance */
17828
+ &[data-toggle] {
17829
+ --toggle-width: 2.5em;
17830
+ --toggle-thumb-size: 1.2em;
17831
+ --toggle-padding: 0.125em;
17832
+ --toggle-thumb-border-radius: 50%;
17833
+ --toggle-background-color: light-dark(#767676, #8e8e93);
17834
+ --toggle-background-color-checked: var(
17835
+ --color,
17836
+ light-dark(#4476ff, #3b82f6)
17837
+ );
17838
+ --toggle-background-color-hover: color-mix(
17839
+ in srgb,
17840
+ var(--toggle-background-color) 60%,
17841
+ white
17842
+ );
17843
+ --toggle-background-color-readonly: color-mix(
17844
+ in srgb,
17845
+ var(--toggle-background-color) 40%,
17846
+ transparent
17847
+ );
17848
+ --toggle-background-color-disabled: color-mix(
17849
+ in srgb,
17850
+ var(--toggle-background-color) 15%,
17851
+ #d3d3d3
17852
+ );
17853
+ --toggle-background-color-hover-checked: color-mix(
17854
+ in srgb,
17855
+ var(--toggle-background-color-checked) 80%,
17856
+ black
17857
+ );
17858
+ --toggle-background-color-readonly-checked: color-mix(
17859
+ in srgb,
17860
+ var(--toggle-background-color-checked) 40%,
17861
+ transparent
17862
+ );
17863
+ --toggle-background-color-disabled-checked: color-mix(
17864
+ in srgb,
17865
+ var(--toggle-background-color-checked) 15%,
17866
+ #d3d3d3
17867
+ );
17868
+
17869
+ --toggle-thumb-color: white;
17870
+
17871
+ --background-color: var(--toggle-background-color);
17872
+ --background-color-hover: var(--toggle-background-color-hover);
17873
+ --background-color-readonly: var(--toggle-background-color-readonly);
17874
+ --background-color-disabled: var(--toggle-background-color-disabled);
17875
+ --background-color-checked: var(--toggle-background-color-checked);
17876
+ --background-color-hover-checked: var(
17877
+ --toggle-background-color-hover-checked
17878
+ );
17879
+ --background-color-readonly-checked: var(
17880
+ --toggle-background-color-readonly-checked
17881
+ );
17882
+ --background-color-disabled-checked: var(
17883
+ --toggle-background-color-disabled-checked
17884
+ );
17885
+
17886
+ margin: 2px;
17887
+ border-radius: calc(
17888
+ var(--toggle-thumb-size) / 2 + calc(var(--toggle-padding) * 2)
17889
+ );
17890
+
17891
+ .navi_native_field {
17892
+ border-radius: inherit;
17893
+ appearance: none; /* This allows border-radius to have an effect */
17894
+ }
17895
+
17896
+ .navi_checkbox_field {
17897
+ position: relative;
17898
+ box-sizing: border-box;
17899
+ width: var(--toggle-width);
17900
+ height: auto;
17901
+ padding: var(--toggle-padding);
17902
+ background-color: var(--x-background-color);
17903
+ border-color: transparent;
17904
+ border-radius: inherit;
17905
+ user-select: none;
17906
+
17907
+ .navi_checkbox_marker {
17908
+ /* position: absolute; */
17909
+ width: var(--toggle-thumb-size);
17910
+ height: var(--toggle-thumb-size);
17911
+ border-radius: var(--toggle-thumb-border-radius);
17912
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
17913
+ opacity: 1;
17914
+ fill: var(--toggle-thumb-color);
17915
+ transform: translateX(0);
17916
+ transition: transform 0.2s ease;
17917
+ }
17918
+ }
17919
+
17920
+ &[data-checked] {
17921
+ .navi_checkbox_marker {
17922
+ transform: translateX(
17923
+ calc(
17924
+ var(--toggle-width) - var(--toggle-thumb-size) - var(
17925
+ --toggle-padding
17926
+ ) - var(--toggle-padding)
17927
+ )
17928
+ );
17929
+ }
17930
+ }
17931
+ }
17785
17932
  }
17786
17933
  `;
17787
17934
  const InputCheckbox = props => {
@@ -17809,6 +17956,8 @@ const InputCheckbox = props => {
17809
17956
  });
17810
17957
  };
17811
17958
  const CheckboxStyleCSSVars = {
17959
+ "width": "--toggle-width",
17960
+ "height": "--toggle-height",
17812
17961
  "outlineWidth": "--outline-width",
17813
17962
  "borderWidth": "--border-width",
17814
17963
  "borderRadius": "--border-radius",
@@ -17853,6 +18002,7 @@ const InputCheckboxBasic = props => {
17853
18002
  defaultChecked,
17854
18003
  /* eslint-enable no-unused-vars */
17855
18004
 
18005
+ id,
17856
18006
  name,
17857
18007
  readOnly,
17858
18008
  disabled,
@@ -17862,6 +18012,7 @@ const InputCheckboxBasic = props => {
17862
18012
  onClick,
17863
18013
  onInput,
17864
18014
  color,
18015
+ toggle,
17865
18016
  ...rest
17866
18017
  } = props;
17867
18018
  const defaultRef = useRef();
@@ -17890,6 +18041,7 @@ const InputCheckboxBasic = props => {
17890
18041
  });
17891
18042
  const renderCheckbox = checkboxProps => jsx(Box, {
17892
18043
  ...checkboxProps,
18044
+ id: id,
17893
18045
  as: "input",
17894
18046
  ref: ref,
17895
18047
  type: "checkbox",
@@ -17907,7 +18059,7 @@ const InputCheckboxBasic = props => {
17907
18059
  uiStateController.setUIState(e.detail.value, e);
17908
18060
  }
17909
18061
  });
17910
- const renderCheckboxMemoized = useCallback(renderCheckbox, [innerName, checked, innerRequired]);
18062
+ const renderCheckboxMemoized = useCallback(renderCheckbox, [id, innerName, checked, innerRequired]);
17911
18063
  useLayoutEffect(() => {
17912
18064
  const naviCheckbox = ref.current;
17913
18065
  const lightColor = "var(--checkmark-color-light)";
@@ -17923,6 +18075,7 @@ const InputCheckboxBasic = props => {
17923
18075
  as: "span",
17924
18076
  ...remainingProps,
17925
18077
  ref: undefined,
18078
+ "data-toggle": toggle ? "" : undefined,
17926
18079
  baseClassName: "navi_checkbox",
17927
18080
  pseudoStateSelector: ".navi_native_field",
17928
18081
  styleCSSVars: CheckboxStyleCSSVars,
@@ -17935,16 +18088,31 @@ const InputCheckboxBasic = props => {
17935
18088
  },
17936
18089
  color: color,
17937
18090
  hasChildFunction: true,
18091
+ preventInitialTransition: true,
17938
18092
  children: [jsx(LoaderBackground, {
17939
18093
  loading: innerLoading,
17940
18094
  inset: -1,
17941
- color: "var(--loader-color)"
18095
+ color: "var(--loader-color)",
18096
+ targetSelector: ".navi_checkbox_field"
17942
18097
  }), renderCheckboxMemoized, jsx("div", {
17943
18098
  className: "navi_checkbox_field",
17944
- children: jsx("svg", {
18099
+ children: toggle ? jsx(Box, {
18100
+ as: "svg",
18101
+ viewBox: "0 0 12 12",
18102
+ "aria-hidden": "true",
18103
+ className: "navi_checkbox_marker",
18104
+ preventInitialTransition: true,
18105
+ children: jsx("circle", {
18106
+ cx: "6",
18107
+ cy: "6",
18108
+ r: "5"
18109
+ })
18110
+ }) : jsx(Box, {
18111
+ as: "svg",
17945
18112
  viewBox: "0 0 12 12",
17946
18113
  "aria-hidden": "true",
17947
18114
  className: "navi_checkbox_marker",
18115
+ preventInitialTransition: true,
17948
18116
  children: jsx("path", {
17949
18117
  d: "M10.5 2L4.5 9L1.5 5.5",
17950
18118
  fill: "none",
@@ -17960,7 +18128,6 @@ const InputCheckboxWithAction = props => {
17960
18128
  const {
17961
18129
  action,
17962
18130
  onCancel,
17963
- onChange,
17964
18131
  actionErrorEffect,
17965
18132
  onActionPrevented,
17966
18133
  onActionStart,
@@ -17991,6 +18158,7 @@ const InputCheckboxWithAction = props => {
17991
18158
  uiStateController.resetUIState(e);
17992
18159
  onCancel?.(e, reason);
17993
18160
  },
18161
+ onRequested: e => forwardActionRequested(e, actionBoundToUIState),
17994
18162
  onPrevented: onActionPrevented,
17995
18163
  onAction: executeAction,
17996
18164
  onStart: onActionStart,
@@ -18010,13 +18178,7 @@ const InputCheckboxWithAction = props => {
18010
18178
  "data-action": actionBoundToUIState.name,
18011
18179
  ...rest,
18012
18180
  ref: ref,
18013
- loading: loading || actionLoading,
18014
- onChange: e => {
18015
- requestAction(e.target, actionBoundToUIState, {
18016
- event: e
18017
- });
18018
- onChange?.(e);
18019
- }
18181
+ loading: loading || actionLoading
18020
18182
  });
18021
18183
  };
18022
18184