@cambly/syntax-core 2.9.0 → 3.0.0

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/dist/index.mjs CHANGED
@@ -729,10 +729,94 @@ var MiniActionCard_default = MiniActionCard;
729
729
 
730
730
  // src/RadioButton/RadioButton.tsx
731
731
  var import_classnames8 = __toESM(require_classnames());
732
- import { useState as useState2 } from "react";
732
+ import { useState as useState3 } from "react";
733
733
 
734
734
  // css-module:./RadioButton.module.css#css-module
735
- var RadioButton_module_default = { "radioButton": "_radioButton_1kj8n_1", "focusedRadioButton": "_focusedRadioButton_1kj8n_8", "smBase": "_smBase_1kj8n_13", "mdBase": "_mdBase_1kj8n_18", "radioStyleOverride": "_radioStyleOverride_1kj8n_23", "smOverride": "_smOverride_1kj8n_28", "mdOverride": "_mdOverride_1kj8n_33", "outer": "_outer_1kj8n_38", "sm": "_sm_1kj8n_13", "md": "_md_1kj8n_18", "errorOuterBackgroundColor": "_errorOuterBackgroundColor_1kj8n_57", "outerBackgroundColor": "_outerBackgroundColor_1kj8n_61", "background": "_background_1kj8n_65", "errorBorderColor": "_errorBorderColor_1kj8n_71", "borderColor": "_borderColor_1kj8n_75", "circle": "_circle_1kj8n_79", "smInner": "_smInner_1kj8n_83", "mdInner": "_mdInner_1kj8n_89" };
735
+ var RadioButton_module_default = { "radioBaseContainer": "_radioBaseContainer_x6och_1", "smBase": "_smBase_x6och_8", "mdBase": "_mdBase_x6och_13", "radioStyleOverride": "_radioStyleOverride_x6och_18", "smOverride": "_smOverride_x6och_23", "mdOverride": "_mdOverride_x6och_28", "background": "_background_x6och_33", "sm": "_sm_x6och_8", "md": "_md_x6och_13", "neutralBorder": "_neutralBorder_x6och_50", "smCheckedBorder": "_smCheckedBorder_x6och_54", "mdCheckedBorder": "_mdCheckedBorder_x6och_58", "errorBorderColor": "_errorBorderColor_x6och_62", "borderColor": "_borderColor_x6och_66", "focusedRadioButton": "_focusedRadioButton_x6och_70" };
736
+
737
+ // src/useFocusVisible.tsx
738
+ import { useState as useState2, useEffect } from "react";
739
+ var hasSetupGlobalListeners = false;
740
+ var currentModality = null;
741
+ var changeHandlers = /* @__PURE__ */ new Set();
742
+ var hasEventBeforeFocus = false;
743
+ var isMac = typeof window !== "undefined" && window.navigator != null ? /^Mac/.test(window.navigator.platform) : false;
744
+ function isValidKey(e) {
745
+ return !(e.metaKey || !isMac && e.altKey || e.ctrlKey);
746
+ }
747
+ function triggerChangeHandlers(modality, e) {
748
+ changeHandlers.forEach((handler) => {
749
+ handler(modality, e);
750
+ });
751
+ }
752
+ function handleKeyboardEvent(e) {
753
+ hasEventBeforeFocus = true;
754
+ if (isValidKey(e)) {
755
+ currentModality = "keyboard";
756
+ triggerChangeHandlers("keyboard", e);
757
+ }
758
+ }
759
+ function handlePointerEvent(e) {
760
+ currentModality = "pointer";
761
+ if (e.type === "mousedown" || e.type === "pointerdown") {
762
+ hasEventBeforeFocus = true;
763
+ triggerChangeHandlers("pointer", e);
764
+ }
765
+ }
766
+ function handleFocusEvent(e) {
767
+ if (e.target === window || e.target === document) {
768
+ return;
769
+ }
770
+ if (!hasEventBeforeFocus) {
771
+ currentModality = "keyboard";
772
+ triggerChangeHandlers("keyboard", e);
773
+ }
774
+ hasEventBeforeFocus = false;
775
+ }
776
+ function handleWindowBlur() {
777
+ hasEventBeforeFocus = false;
778
+ }
779
+ function isFocusVisible() {
780
+ return currentModality !== "pointer";
781
+ }
782
+ function setupGlobalFocusEvents() {
783
+ if (typeof window === "undefined" || hasSetupGlobalListeners) {
784
+ return;
785
+ }
786
+ const { focus } = HTMLElement.prototype;
787
+ HTMLElement.prototype.focus = function focusElement(...args) {
788
+ hasEventBeforeFocus = true;
789
+ focus.apply(this, args);
790
+ };
791
+ document.addEventListener("keydown", handleKeyboardEvent, true);
792
+ document.addEventListener("keyup", handleKeyboardEvent, true);
793
+ window.addEventListener("focus", handleFocusEvent, true);
794
+ window.addEventListener("blur", handleWindowBlur, false);
795
+ if (typeof PointerEvent !== "undefined") {
796
+ document.addEventListener("pointerdown", handlePointerEvent, true);
797
+ document.addEventListener("pointermove", handlePointerEvent, true);
798
+ document.addEventListener("pointerup", handlePointerEvent, true);
799
+ } else {
800
+ document.addEventListener("mousedown", handlePointerEvent, true);
801
+ document.addEventListener("mousemove", handlePointerEvent, true);
802
+ document.addEventListener("mouseup", handlePointerEvent, true);
803
+ }
804
+ hasSetupGlobalListeners = true;
805
+ }
806
+ function useFocusVisible() {
807
+ setupGlobalFocusEvents();
808
+ const [isFocusVisibleState, setFocusVisible] = useState2(isFocusVisible());
809
+ useEffect(() => {
810
+ const handler = () => {
811
+ setFocusVisible(isFocusVisible());
812
+ };
813
+ changeHandlers.add(handler);
814
+ return () => {
815
+ changeHandlers.delete(handler);
816
+ };
817
+ }, []);
818
+ return { isFocusVisible: isFocusVisibleState };
819
+ }
736
820
 
737
821
  // src/RadioButton/RadioButton.tsx
738
822
  import { jsx as jsx12, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -741,15 +825,22 @@ var RadioButton = ({
741
825
  disabled = false,
742
826
  error = false,
743
827
  label,
828
+ name,
744
829
  onChange,
745
830
  size = "md",
746
- value = ""
831
+ value
747
832
  }) => {
748
- const [isFocused, setIsFocused] = useState2(false);
833
+ const [isFocused, setIsFocused] = useState3(false);
834
+ const { isFocusVisible: isFocusVisible2 } = useFocusVisible();
835
+ const sharedStyles = (0, import_classnames8.default)(RadioButton_module_default.background, RadioButton_module_default[size], {
836
+ [RadioButton_module_default.errorBorderColor]: error,
837
+ [RadioButton_module_default.borderColor]: !error,
838
+ [RadioButton_module_default.focusedRadioButton]: isFocused && isFocusVisible2
839
+ });
749
840
  return /* @__PURE__ */ jsxs3(
750
841
  "label",
751
842
  {
752
- className: (0, import_classnames8.default)(RadioButton_module_default.radioButton, {
843
+ className: (0, import_classnames8.default)(RadioButton_module_default.radioBaseContainer, {
753
844
  [RadioButton_module_default.smBase]: size === "sm",
754
845
  [RadioButton_module_default.mdBase]: size === "md"
755
846
  }),
@@ -758,6 +849,7 @@ var RadioButton = ({
758
849
  "input",
759
850
  {
760
851
  type: "radio",
852
+ name,
761
853
  className: (0, import_classnames8.default)(RadioButton_module_default.radioStyleOverride, {
762
854
  [RadioButton_module_default.smOverride]: size === "sm",
763
855
  [RadioButton_module_default.mdOverride]: size === "md"
@@ -765,7 +857,7 @@ var RadioButton = ({
765
857
  checked,
766
858
  onChange,
767
859
  disabled,
768
- value: value != null ? value : label,
860
+ value,
769
861
  onFocus: () => {
770
862
  setIsFocused(true);
771
863
  },
@@ -777,31 +869,12 @@ var RadioButton = ({
777
869
  checked ? /* @__PURE__ */ jsx12(
778
870
  "div",
779
871
  {
780
- className: (0, import_classnames8.default)(RadioButton_module_default.outer, RadioButton_module_default[size], {
781
- [RadioButton_module_default.errorOuterBackgroundColor]: error,
782
- [RadioButton_module_default.outerBackgroundColor]: !error,
783
- [RadioButton_module_default.focusedRadioButton]: isFocused
784
- }),
785
- children: /* @__PURE__ */ jsx12(
786
- "div",
787
- {
788
- className: (0, import_classnames8.default)(RadioButton_module_default.circle, {
789
- [RadioButton_module_default.smInner]: size === "sm",
790
- [RadioButton_module_default.mdInner]: size === "md"
791
- })
792
- }
793
- )
794
- }
795
- ) : /* @__PURE__ */ jsx12(
796
- "div",
797
- {
798
- className: (0, import_classnames8.default)(RadioButton_module_default.background, RadioButton_module_default[size], {
799
- [RadioButton_module_default.errorBorderColor]: error,
800
- [RadioButton_module_default.borderColor]: !error,
801
- [RadioButton_module_default.focusedRadioButton]: isFocused
872
+ className: (0, import_classnames8.default)(sharedStyles, {
873
+ [RadioButton_module_default.mdCheckedBorder]: size === "md",
874
+ [RadioButton_module_default.smCheckedBorder]: size === "sm"
802
875
  })
803
876
  }
804
- ),
877
+ ) : /* @__PURE__ */ jsx12("div", { className: (0, import_classnames8.default)(sharedStyles, RadioButton_module_default.neutralBorder) }),
805
878
  /* @__PURE__ */ jsx12(
806
879
  Typography_default,
807
880
  {