@mattermost/compass-ui 0.1.0-alpha.16 → 0.1.0-alpha.17

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.
Files changed (104) hide show
  1. package/dist/components/error-message/ErrorMessage.cjs +1 -1
  2. package/dist/components/error-message/ErrorMessage.cjs.map +1 -1
  3. package/dist/components/error-message/ErrorMessage.d.ts +2 -3
  4. package/dist/components/error-message/ErrorMessage.d.ts.map +1 -1
  5. package/dist/components/error-message/ErrorMessage.js +16 -14
  6. package/dist/components/error-message/ErrorMessage.js.map +1 -1
  7. package/dist/components/field/FieldClearButton.cjs +2 -0
  8. package/dist/components/field/FieldClearButton.cjs.map +1 -0
  9. package/dist/components/field/FieldClearButton.css +1 -0
  10. package/dist/components/field/FieldClearButton.d.ts +17 -0
  11. package/dist/components/field/FieldClearButton.d.ts.map +1 -0
  12. package/dist/components/field/FieldClearButton.js +40 -0
  13. package/dist/components/field/FieldClearButton.js.map +1 -0
  14. package/dist/components/field/FieldClearButton.module.scss.cjs +2 -0
  15. package/dist/components/field/FieldClearButton.module.scss.cjs.map +1 -0
  16. package/dist/components/field/FieldClearButton.module.scss.js +7 -0
  17. package/dist/components/field/FieldClearButton.module.scss.js.map +1 -0
  18. package/dist/components/field/fieldDescribedBy.cjs +2 -0
  19. package/dist/components/field/fieldDescribedBy.cjs.map +1 -0
  20. package/dist/components/field/fieldDescribedBy.d.ts +11 -0
  21. package/dist/components/field/fieldDescribedBy.d.ts.map +1 -0
  22. package/dist/components/field/fieldDescribedBy.js +15 -0
  23. package/dist/components/field/fieldDescribedBy.js.map +1 -0
  24. package/dist/components/field/useFieldClear.cjs +2 -0
  25. package/dist/components/field/useFieldClear.cjs.map +1 -0
  26. package/dist/components/field/useFieldClear.d.ts +21 -0
  27. package/dist/components/field/useFieldClear.d.ts.map +1 -0
  28. package/dist/components/field/useFieldClear.js +73 -0
  29. package/dist/components/field/useFieldClear.js.map +1 -0
  30. package/dist/components/field-message/FieldMessage.cjs +2 -0
  31. package/dist/components/field-message/FieldMessage.cjs.map +1 -0
  32. package/dist/components/field-message/FieldMessage.css +1 -0
  33. package/dist/components/field-message/FieldMessage.d.ts +17 -0
  34. package/dist/components/field-message/FieldMessage.d.ts.map +1 -0
  35. package/dist/components/field-message/FieldMessage.js +28 -0
  36. package/dist/components/field-message/FieldMessage.js.map +1 -0
  37. package/dist/components/field-message/FieldMessage.module.scss.cjs +2 -0
  38. package/dist/components/field-message/FieldMessage.module.scss.cjs.map +1 -0
  39. package/dist/components/field-message/FieldMessage.module.scss.js +13 -0
  40. package/dist/components/field-message/FieldMessage.module.scss.js.map +1 -0
  41. package/dist/components/field-message/index.cjs +2 -0
  42. package/dist/components/field-message/index.cjs.map +1 -0
  43. package/dist/components/field-message/index.d.ts +3 -0
  44. package/dist/components/field-message/index.d.ts.map +1 -0
  45. package/dist/components/field-message/index.js +5 -0
  46. package/dist/components/field-message/index.js.map +1 -0
  47. package/dist/components/password-input/PasswordInput.cjs +2 -0
  48. package/dist/components/password-input/PasswordInput.cjs.map +1 -0
  49. package/dist/components/password-input/PasswordInput.css +1 -0
  50. package/dist/components/password-input/PasswordInput.d.ts +49 -0
  51. package/dist/components/password-input/PasswordInput.d.ts.map +1 -0
  52. package/dist/components/password-input/PasswordInput.js +140 -0
  53. package/dist/components/password-input/PasswordInput.js.map +1 -0
  54. package/dist/components/password-input/PasswordInput.module.scss.cjs +2 -0
  55. package/dist/components/password-input/PasswordInput.module.scss.cjs.map +1 -0
  56. package/dist/components/password-input/PasswordInput.module.scss.js +18 -0
  57. package/dist/components/password-input/PasswordInput.module.scss.js.map +1 -0
  58. package/dist/components/password-input/index.cjs +2 -0
  59. package/dist/components/password-input/index.cjs.map +1 -0
  60. package/dist/components/password-input/index.d.ts +3 -0
  61. package/dist/components/password-input/index.d.ts.map +1 -0
  62. package/dist/components/password-input/index.js +5 -0
  63. package/dist/components/password-input/index.js.map +1 -0
  64. package/dist/components/search-input/SearchInput.cjs +1 -1
  65. package/dist/components/search-input/SearchInput.cjs.map +1 -1
  66. package/dist/components/search-input/SearchInput.css +1 -1
  67. package/dist/components/search-input/SearchInput.d.ts +8 -0
  68. package/dist/components/search-input/SearchInput.d.ts.map +1 -1
  69. package/dist/components/search-input/SearchInput.js +114 -115
  70. package/dist/components/search-input/SearchInput.js.map +1 -1
  71. package/dist/components/search-input/SearchInput.module.scss.cjs +1 -1
  72. package/dist/components/search-input/SearchInput.module.scss.js +15 -16
  73. package/dist/components/search-input/SearchInput.module.scss.js.map +1 -1
  74. package/dist/components/text-area/TextArea.cjs +1 -1
  75. package/dist/components/text-area/TextArea.cjs.map +1 -1
  76. package/dist/components/text-area/TextArea.css +1 -1
  77. package/dist/components/text-area/TextArea.d.ts +8 -0
  78. package/dist/components/text-area/TextArea.d.ts.map +1 -1
  79. package/dist/components/text-area/TextArea.js +86 -67
  80. package/dist/components/text-area/TextArea.js.map +1 -1
  81. package/dist/components/text-area/TextArea.module.scss.cjs +1 -1
  82. package/dist/components/text-area/TextArea.module.scss.js +12 -10
  83. package/dist/components/text-area/TextArea.module.scss.js.map +1 -1
  84. package/dist/components/text-input/TextInput.cjs +1 -1
  85. package/dist/components/text-input/TextInput.cjs.map +1 -1
  86. package/dist/components/text-input/TextInput.css +1 -1
  87. package/dist/components/text-input/TextInput.d.ts +38 -1
  88. package/dist/components/text-input/TextInput.d.ts.map +1 -1
  89. package/dist/components/text-input/TextInput.js +149 -93
  90. package/dist/components/text-input/TextInput.js.map +1 -1
  91. package/dist/components/text-input/TextInput.module.scss.cjs +1 -1
  92. package/dist/components/text-input/TextInput.module.scss.js +19 -14
  93. package/dist/components/text-input/TextInput.module.scss.js.map +1 -1
  94. package/dist/index.cjs +1 -1
  95. package/dist/index.d.ts +2 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +133 -129
  98. package/dist/index.js.map +1 -1
  99. package/package.json +7 -1
  100. package/dist/components/error-message/ErrorMessage.css +0 -1
  101. package/dist/components/error-message/ErrorMessage.module.scss.cjs +0 -2
  102. package/dist/components/error-message/ErrorMessage.module.scss.cjs.map +0 -1
  103. package/dist/components/error-message/ErrorMessage.module.scss.js +0 -9
  104. package/dist/components/error-message/ErrorMessage.module.scss.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),o=require("../icon/Icon.cjs"),__n=require("@mattermost/compass-icons/components/alert-circle-outline.js"),n=__n?.default??__n,r=require("./ErrorMessage.module.scss.cjs");function i({className:s="",message:t,...a}){const l=[r.default["error-message"],s].filter(Boolean).join(" ");return e.jsxs("div",{...a,className:l,role:"alert",children:[e.jsx("span",{className:r.default["error-message__icon"],"aria-hidden":!0,children:e.jsx(o.default,{size:"12",glyph:e.jsx(n,{})})}),e.jsx("span",{className:r.default["error-message__text"],children:t})]})}exports.default=i;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("react/jsx-runtime"),s=require("../field-message/FieldMessage.cjs");function o({className:e="",message:r,...t}){return u.jsx(s.default,{...t,className:e,message:r,tone:"error"})}exports.default=o;
2
2
  //# sourceMappingURL=ErrorMessage.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorMessage.cjs","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport Icon from '@/components/icon/Icon';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport styles from './ErrorMessage.module.scss';\n\nexport interface ErrorMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The error message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n}\n\n/**\n * Error Message is the inline red error line that appears below a form input when validation\n * fails. It pairs an alert glyph with a short, human-readable explanation so the user can\n * fix the field and move on.\n */\nexport default function ErrorMessage({\n className = '',\n message,\n ...rest\n}: ErrorMessageProps) {\n const rootClass = [styles['error-message'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div {...rest} className={rootClass} role=\"alert\">\n <span className={styles['error-message__icon']} aria-hidden>\n <Icon size=\"12\" glyph={<AlertCircleOutlineIcon />} />\n </span>\n <span className={styles['error-message__text']}>{message}</span>\n </div>\n );\n}\n"],"names":["ErrorMessage","className","message","rest","rootClass","styles","jsx","Icon","AlertCircleOutlineIcon"],"mappings":"kSAiBA,SAAwBA,EAAa,CACnC,UAAAC,EAAY,GACZ,QAAAC,EACA,GAAGC,CACL,EAAsB,CACpB,MAAMC,EAAY,CAACC,UAAO,eAAe,EAAGJ,CAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,cACG,MAAA,CAAK,GAAGE,EAAM,UAAWC,EAAW,KAAK,QACxC,SAAA,CAAAE,MAAC,OAAA,CAAK,UAAWD,EAAAA,QAAO,qBAAqB,EAAG,cAAW,GACzD,SAAAC,EAAAA,IAACC,EAAAA,QAAA,CAAK,KAAK,KAAK,MAAOD,EAAAA,IAACE,EAAA,CAAA,CAAuB,EAAI,EACrD,QACC,OAAA,CAAK,UAAWH,EAAAA,QAAO,qBAAqB,EAAI,SAAAH,CAAA,CAAQ,CAAA,EAC3D,CAEJ"}
1
+ {"version":3,"file":"ErrorMessage.cjs","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport FieldMessage from '@/components/field-message/FieldMessage';\n\nexport interface ErrorMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The error message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n}\n\n/**\n * Error Message is the inline red error line under a form field. It is `FieldMessage` with\n * `tone=\"error\"` — kept so existing imports (e.g. Agents plugin) stay valid.\n */\nexport default function ErrorMessage({\n className = '',\n message,\n ...rest\n}: ErrorMessageProps) {\n return (\n <FieldMessage\n {...rest}\n className={className}\n message={message}\n tone=\"error\"\n />\n );\n}\n"],"names":["ErrorMessage","className","message","rest","jsx","FieldMessage"],"mappings":"+LAcA,SAAwBA,EAAa,CACnC,UAAAC,EAAY,GACZ,QAAAC,EACA,GAAGC,CACL,EAAsB,CACpB,OACEC,EAAAA,IAACC,EAAAA,QAAA,CACE,GAAGF,EACJ,UAAAF,EACA,QAAAC,EACA,KAAK,OAAA,CAAA,CAGX"}
@@ -6,9 +6,8 @@ export interface ErrorMessageProps extends HTMLAttributes<HTMLDivElement> {
6
6
  message: ReactNode;
7
7
  }
8
8
  /**
9
- * Error Message is the inline red error line that appears below a form input when validation
10
- * fails. It pairs an alert glyph with a short, human-readable explanation so the user can
11
- * fix the field and move on.
9
+ * Error Message is the inline red error line under a form field. It is `FieldMessage` with
10
+ * `tone="error"` — kept so existing imports (e.g. Agents plugin) stay valid.
12
11
  */
13
12
  export default function ErrorMessage({ className, message, ...rest }: ErrorMessageProps): import("react/jsx-runtime").JSX.Element;
14
13
  //# sourceMappingURL=ErrorMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACvE,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,OAAO,EAAE,SAAS,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,SAAc,EACd,OAAO,EACP,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAanB"}
1
+ {"version":3,"file":"ErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACvE,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,OAAO,EAAE,SAAS,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,SAAc,EACd,OAAO,EACP,GAAG,IAAI,EACR,EAAE,iBAAiB,2CASnB"}
@@ -1,19 +1,21 @@
1
- import { jsxs as i, jsx as r } from "react/jsx-runtime";
2
- import l from "../icon/Icon.js";
3
- import __n from "@mattermost/compass-icons/components/alert-circle-outline.js";const n=__n&&__n.default?__n.default:__n;
4
- import e from "./ErrorMessage.module.scss.js";
5
- function f({
6
- className: s = "",
7
- message: o,
8
- ...a
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import s from "../field-message/FieldMessage.js";
3
+ function i({
4
+ className: r = "",
5
+ message: e,
6
+ ...o
9
7
  }) {
10
- const t = [e["error-message"], s].filter(Boolean).join(" ");
11
- return /* @__PURE__ */ i("div", { ...a, className: t, role: "alert", children: [
12
- /* @__PURE__ */ r("span", { className: e["error-message__icon"], "aria-hidden": !0, children: /* @__PURE__ */ r(l, { size: "12", glyph: /* @__PURE__ */ r(n, {}) }) }),
13
- /* @__PURE__ */ r("span", { className: e["error-message__text"], children: o })
14
- ] });
8
+ return /* @__PURE__ */ t(
9
+ s,
10
+ {
11
+ ...o,
12
+ className: r,
13
+ message: e,
14
+ tone: "error"
15
+ }
16
+ );
15
17
  }
16
18
  export {
17
- f as default
19
+ i as default
18
20
  };
19
21
  //# sourceMappingURL=ErrorMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorMessage.js","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport Icon from '@/components/icon/Icon';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport styles from './ErrorMessage.module.scss';\n\nexport interface ErrorMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The error message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n}\n\n/**\n * Error Message is the inline red error line that appears below a form input when validation\n * fails. It pairs an alert glyph with a short, human-readable explanation so the user can\n * fix the field and move on.\n */\nexport default function ErrorMessage({\n className = '',\n message,\n ...rest\n}: ErrorMessageProps) {\n const rootClass = [styles['error-message'], className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div {...rest} className={rootClass} role=\"alert\">\n <span className={styles['error-message__icon']} aria-hidden>\n <Icon size=\"12\" glyph={<AlertCircleOutlineIcon />} />\n </span>\n <span className={styles['error-message__text']}>{message}</span>\n </div>\n );\n}\n"],"names":["ErrorMessage","className","message","rest","rootClass","styles","jsx","Icon","AlertCircleOutlineIcon"],"mappings":";;;;AAiBA,SAAwBA,EAAa;AAAA,EACnC,WAAAC,IAAY;AAAA,EACZ,SAAAC;AAAA,EACA,GAAGC;AACL,GAAsB;AACpB,QAAMC,IAAY,CAACC,EAAO,eAAe,GAAGJ,CAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACG,OAAA,EAAK,GAAGE,GAAM,WAAWC,GAAW,MAAK,SACxC,UAAA;AAAA,IAAA,gBAAAE,EAAC,QAAA,EAAK,WAAWD,EAAO,qBAAqB,GAAG,eAAW,IACzD,UAAA,gBAAAC,EAACC,GAAA,EAAK,MAAK,MAAK,OAAO,gBAAAD,EAACE,GAAA,CAAA,CAAuB,GAAI,GACrD;AAAA,sBACC,QAAA,EAAK,WAAWH,EAAO,qBAAqB,GAAI,UAAAH,EAAA,CAAQ;AAAA,EAAA,GAC3D;AAEJ;"}
1
+ {"version":3,"file":"ErrorMessage.js","sources":["../../../src/components/error-message/ErrorMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport FieldMessage from '@/components/field-message/FieldMessage';\n\nexport interface ErrorMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The error message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n}\n\n/**\n * Error Message is the inline red error line under a form field. It is `FieldMessage` with\n * `tone=\"error\"` — kept so existing imports (e.g. Agents plugin) stay valid.\n */\nexport default function ErrorMessage({\n className = '',\n message,\n ...rest\n}: ErrorMessageProps) {\n return (\n <FieldMessage\n {...rest}\n className={className}\n message={message}\n tone=\"error\"\n />\n );\n}\n"],"names":["ErrorMessage","className","message","rest","jsx","FieldMessage"],"mappings":";;AAcA,SAAwBA,EAAa;AAAA,EACnC,WAAAC,IAAY;AAAA,EACZ,SAAAC;AAAA,EACA,GAAGC;AACL,GAAsB;AACpB,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,WAAAF;AAAA,MACA,SAAAC;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGX;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),m=require("../icon/Icon.cjs"),__b=require("@mattermost/compass-icons/components/close-circle.js"),b=__b?.default??__b,c=require("../../utils/props.cjs"),o=require("./FieldClearButton.module.scss.cjs"),r={small:"12",medium:"16",large:"16"};function x({size:d="medium",clearLabel:l,clearButtonProps:e,onClick:s,tabIndex:n,className:u}){const t=r[d],a=n??(e==null?void 0:e.tabIndex)??void 0;return i.jsx("button",{...e,type:"button",className:c.mergeClassNames(o.default["field-clear-button"],u,e==null?void 0:e.className),onClick:s,"aria-label":l,tabIndex:a,children:i.jsx(m.default,{size:t,glyph:i.jsx(b,{})})})}exports.default=x;
2
+ //# sourceMappingURL=FieldClearButton.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldClearButton.cjs","sources":["../../../src/components/field/FieldClearButton.tsx"],"sourcesContent":["import type { IconSize } from '@/components/icon/Icon';\nimport Icon from '@/components/icon/Icon';\nimport CloseCircleIcon from '@mattermost/compass-icons/components/close-circle';\nimport type { BuiltInButtonProps } from '@/utils/props';\nimport { mergeClassNames } from '@/utils/props';\nimport styles from './FieldClearButton.module.scss';\n\nexport type FieldClearButtonSize = 'small' | 'medium' | 'large';\n\nconst CLEAR_ICON_SIZE_MAP: Record<FieldClearButtonSize, IconSize> = {\n small: '12',\n medium: '16',\n large: '16',\n};\n\nexport interface FieldClearButtonProps {\n size?: FieldClearButtonSize;\n clearLabel: string;\n clearButtonProps?: BuiltInButtonProps;\n onClick: () => void;\n /** When set, overrides the default tabIndex (SearchInput uses `-1`). */\n tabIndex?: number;\n className?: string;\n}\n\n/**\n * Built-in clear control for text fields. Hosts size the button via `size`;\n * accessible name comes from `clearLabel` (hosts should pass a translated string).\n */\nexport default function FieldClearButton({\n size = 'medium',\n clearLabel,\n clearButtonProps,\n onClick,\n tabIndex,\n className,\n}: FieldClearButtonProps) {\n const iconSize = CLEAR_ICON_SIZE_MAP[size];\n const resolvedTabIndex = tabIndex ?? clearButtonProps?.tabIndex ?? undefined;\n\n return (\n <button\n {...clearButtonProps}\n type=\"button\"\n className={mergeClassNames(\n styles['field-clear-button'],\n className,\n clearButtonProps?.className,\n )}\n onClick={onClick}\n aria-label={clearLabel}\n tabIndex={resolvedTabIndex}\n >\n <Icon size={iconSize} glyph={<CloseCircleIcon />} />\n </button>\n );\n}\n"],"names":["CLEAR_ICON_SIZE_MAP","FieldClearButton","size","clearLabel","clearButtonProps","onClick","tabIndex","className","iconSize","resolvedTabIndex","jsx","mergeClassNames","styles","Icon","CloseCircleIcon"],"mappings":"iUASMA,EAA8D,CAClE,MAAO,KACP,OAAQ,KACR,MAAO,IACT,EAgBA,SAAwBC,EAAiB,CACvC,KAAAC,EAAO,SACP,WAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,CACF,EAA0B,CACxB,MAAMC,EAAWR,EAAoBE,CAAI,EACnCO,EAAmBH,IAAYF,GAAA,YAAAA,EAAkB,WAAY,OAEnE,OACEM,EAAAA,IAAC,SAAA,CACE,GAAGN,EACJ,KAAK,SACL,UAAWO,EAAAA,gBACTC,EAAAA,QAAO,oBAAoB,EAC3BL,EACAH,GAAA,YAAAA,EAAkB,SAAA,EAEpB,QAAAC,EACA,aAAYF,EACZ,SAAUM,EAEV,eAACI,EAAAA,QAAA,CAAK,KAAML,EAAU,MAAOE,EAAAA,IAACI,IAAgB,CAAA,CAAI,CAAA,CAAA,CAGxD"}
@@ -0,0 +1 @@
1
+ ._field-clear-button_2k9rm_2{display:inline-flex;align-items:center;justify-content:center;margin:0;padding:0;border:0;border-radius:var(--radius-xs);background:transparent;cursor:pointer;color:inherit;outline:2px solid color-mix(in srgb,var(--focus-ring-color) 0%,transparent);outline-offset:0;transition:color var(--duration-quick) var(--ease-transition),outline-color var(--duration-quick) var(--ease-transition),outline-offset var(--duration-quick) var(--ease-transition)}._field-clear-button_2k9rm_2:hover{color:var(--center-channel-color)}._field-clear-button_2k9rm_2:focus-visible{outline-color:var(--focus-ring-color);outline-offset:3px}
@@ -0,0 +1,17 @@
1
+ import { BuiltInButtonProps } from '../../utils/props';
2
+ export type FieldClearButtonSize = 'small' | 'medium' | 'large';
3
+ export interface FieldClearButtonProps {
4
+ size?: FieldClearButtonSize;
5
+ clearLabel: string;
6
+ clearButtonProps?: BuiltInButtonProps;
7
+ onClick: () => void;
8
+ /** When set, overrides the default tabIndex (SearchInput uses `-1`). */
9
+ tabIndex?: number;
10
+ className?: string;
11
+ }
12
+ /**
13
+ * Built-in clear control for text fields. Hosts size the button via `size`;
14
+ * accessible name comes from `clearLabel` (hosts should pass a translated string).
15
+ */
16
+ export default function FieldClearButton({ size, clearLabel, clearButtonProps, onClick, tabIndex, className, }: FieldClearButtonProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=FieldClearButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldClearButton.d.ts","sourceRoot":"","sources":["../../../src/components/field/FieldClearButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAQhE,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,IAAe,EACf,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE,qBAAqB,2CAoBvB"}
@@ -0,0 +1,40 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import n from "../icon/Icon.js";
3
+ import __I from "@mattermost/compass-icons/components/close-circle.js";const I=__I&&__I.default?__I.default:__I;
4
+ import { mergeClassNames as C } from "../../utils/props.js";
5
+ import o from "./FieldClearButton.module.scss.js";
6
+ const x = {
7
+ small: "12",
8
+ medium: "16",
9
+ large: "16"
10
+ };
11
+ function c({
12
+ size: i = "medium",
13
+ clearLabel: d,
14
+ clearButtonProps: m,
15
+ onClick: l,
16
+ tabIndex: a,
17
+ className: f
18
+ }) {
19
+ const s = x[i], b = a ?? (m == null ? void 0 : m.tabIndex) ?? void 0;
20
+ return /* @__PURE__ */ e(
21
+ "button",
22
+ {
23
+ ...m,
24
+ type: "button",
25
+ className: C(
26
+ o["field-clear-button"],
27
+ f,
28
+ m == null ? void 0 : m.className
29
+ ),
30
+ onClick: l,
31
+ "aria-label": d,
32
+ tabIndex: b,
33
+ children: /* @__PURE__ */ e(n, { size: s, glyph: /* @__PURE__ */ e(I, {}) })
34
+ }
35
+ );
36
+ }
37
+ export {
38
+ c as default
39
+ };
40
+ //# sourceMappingURL=FieldClearButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldClearButton.js","sources":["../../../src/components/field/FieldClearButton.tsx"],"sourcesContent":["import type { IconSize } from '@/components/icon/Icon';\nimport Icon from '@/components/icon/Icon';\nimport CloseCircleIcon from '@mattermost/compass-icons/components/close-circle';\nimport type { BuiltInButtonProps } from '@/utils/props';\nimport { mergeClassNames } from '@/utils/props';\nimport styles from './FieldClearButton.module.scss';\n\nexport type FieldClearButtonSize = 'small' | 'medium' | 'large';\n\nconst CLEAR_ICON_SIZE_MAP: Record<FieldClearButtonSize, IconSize> = {\n small: '12',\n medium: '16',\n large: '16',\n};\n\nexport interface FieldClearButtonProps {\n size?: FieldClearButtonSize;\n clearLabel: string;\n clearButtonProps?: BuiltInButtonProps;\n onClick: () => void;\n /** When set, overrides the default tabIndex (SearchInput uses `-1`). */\n tabIndex?: number;\n className?: string;\n}\n\n/**\n * Built-in clear control for text fields. Hosts size the button via `size`;\n * accessible name comes from `clearLabel` (hosts should pass a translated string).\n */\nexport default function FieldClearButton({\n size = 'medium',\n clearLabel,\n clearButtonProps,\n onClick,\n tabIndex,\n className,\n}: FieldClearButtonProps) {\n const iconSize = CLEAR_ICON_SIZE_MAP[size];\n const resolvedTabIndex = tabIndex ?? clearButtonProps?.tabIndex ?? undefined;\n\n return (\n <button\n {...clearButtonProps}\n type=\"button\"\n className={mergeClassNames(\n styles['field-clear-button'],\n className,\n clearButtonProps?.className,\n )}\n onClick={onClick}\n aria-label={clearLabel}\n tabIndex={resolvedTabIndex}\n >\n <Icon size={iconSize} glyph={<CloseCircleIcon />} />\n </button>\n );\n}\n"],"names":["CLEAR_ICON_SIZE_MAP","FieldClearButton","size","clearLabel","clearButtonProps","onClick","tabIndex","className","iconSize","resolvedTabIndex","jsx","mergeClassNames","styles","Icon","CloseCircleIcon"],"mappings":";;;;;AASA,MAAMA,IAA8D;AAAA,EAClE,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAgBA,SAAwBC,EAAiB;AAAA,EACvC,MAAAC,IAAO;AAAA,EACP,YAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAA0B;AACxB,QAAMC,IAAWR,EAAoBE,CAAI,GACnCO,IAAmBH,MAAYF,KAAA,gBAAAA,EAAkB,aAAY;AAEnE,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGN;AAAA,MACJ,MAAK;AAAA,MACL,WAAWO;AAAA,QACTC,EAAO,oBAAoB;AAAA,QAC3BL;AAAA,QACAH,KAAA,gBAAAA,EAAkB;AAAA,MAAA;AAAA,MAEpB,SAAAC;AAAA,MACA,cAAYF;AAAA,MACZ,UAAUM;AAAA,MAEV,4BAACI,GAAA,EAAK,MAAML,GAAU,OAAO,gBAAAE,EAACI,KAAgB,EAAA,CAAI;AAAA,IAAA;AAAA,EAAA;AAGxD;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./FieldClearButton.css');const e={"field-clear-button":"_field-clear-button_2k9rm_2"};exports.default=e;
2
+ //# sourceMappingURL=FieldClearButton.module.scss.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldClearButton.module.scss.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import './FieldClearButton.css';const t = {
2
+ "field-clear-button": "_field-clear-button_2k9rm_2"
3
+ };
4
+ export {
5
+ t as default
6
+ };
7
+ //# sourceMappingURL=FieldClearButton.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldClearButton.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function n(e){return!(e==null||e===!1||e==="")}function l(e,r,i){return e?!0:n(r)?(i??"error")==="error":!1}function t(e,r,i){return[e,r,i].filter(Boolean).join(" ")||void 0}exports.hasFieldMessage=n;exports.isFieldInvalid=l;exports.mergeFieldDescribedBy=t;
2
+ //# sourceMappingURL=fieldDescribedBy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldDescribedBy.cjs","sources":["../../../src/components/field/fieldDescribedBy.ts"],"sourcesContent":["import type { FieldMessageTone } from '@/components/field-message/FieldMessage';\n\n/**\n * True when a field message should render / contribute describedby / invalid chrome.\n * Treats `null`, `undefined`, `false`, and `''` as absent.\n */\nexport function hasFieldMessage(message: unknown): boolean {\n return !(message == null || message === false || message === '');\n}\n\n/** True when the field should show invalid chrome from props or an error message. */\nexport function isFieldInvalid(\n invalid: boolean,\n message: unknown,\n messageTone: FieldMessageTone | undefined,\n): boolean {\n if (invalid) return true;\n if (!hasFieldMessage(message)) return false;\n return (messageTone ?? 'error') === 'error';\n}\n\n/** Merge host `aria-describedby` with message and counter ids (message before counter). */\nexport function mergeFieldDescribedBy(\n hostDescribedBy: string | undefined,\n messageId: string | undefined,\n counterId: string | undefined,\n): string | undefined {\n const joined = [hostDescribedBy, messageId, counterId]\n .filter(Boolean)\n .join(' ');\n return joined || undefined;\n}\n"],"names":["hasFieldMessage","message","isFieldInvalid","invalid","messageTone","mergeFieldDescribedBy","hostDescribedBy","messageId","counterId"],"mappings":"gFAMO,SAASA,EAAgBC,EAA2B,CACzD,MAAO,EAAEA,GAAW,MAAQA,IAAY,IAASA,IAAY,GAC/D,CAGO,SAASC,EACdC,EACAF,EACAG,EACS,CACT,OAAID,EAAgB,GACfH,EAAgBC,CAAO,GACpBG,GAAe,WAAa,QADE,EAExC,CAGO,SAASC,EACdC,EACAC,EACAC,EACoB,CAIpB,MAHe,CAACF,EAAiBC,EAAWC,CAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG,GACM,MACnB"}
@@ -0,0 +1,11 @@
1
+ import { FieldMessageTone } from '../field-message/FieldMessage';
2
+ /**
3
+ * True when a field message should render / contribute describedby / invalid chrome.
4
+ * Treats `null`, `undefined`, `false`, and `''` as absent.
5
+ */
6
+ export declare function hasFieldMessage(message: unknown): boolean;
7
+ /** True when the field should show invalid chrome from props or an error message. */
8
+ export declare function isFieldInvalid(invalid: boolean, message: unknown, messageTone: FieldMessageTone | undefined): boolean;
9
+ /** Merge host `aria-describedby` with message and counter ids (message before counter). */
10
+ export declare function mergeFieldDescribedBy(hostDescribedBy: string | undefined, messageId: string | undefined, counterId: string | undefined): string | undefined;
11
+ //# sourceMappingURL=fieldDescribedBy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldDescribedBy.d.ts","sourceRoot":"","sources":["../../../src/components/field/fieldDescribedBy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,gBAAgB,GAAG,SAAS,GACxC,OAAO,CAIT;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,GAAG,SAAS,CAKpB"}
@@ -0,0 +1,15 @@
1
+ function i(r) {
2
+ return !(r == null || r === !1 || r === "");
3
+ }
4
+ function t(r, e, n) {
5
+ return r ? !0 : i(e) ? (n ?? "error") === "error" : !1;
6
+ }
7
+ function l(r, e, n) {
8
+ return [r, e, n].filter(Boolean).join(" ") || void 0;
9
+ }
10
+ export {
11
+ i as hasFieldMessage,
12
+ t as isFieldInvalid,
13
+ l as mergeFieldDescribedBy
14
+ };
15
+ //# sourceMappingURL=fieldDescribedBy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldDescribedBy.js","sources":["../../../src/components/field/fieldDescribedBy.ts"],"sourcesContent":["import type { FieldMessageTone } from '@/components/field-message/FieldMessage';\n\n/**\n * True when a field message should render / contribute describedby / invalid chrome.\n * Treats `null`, `undefined`, `false`, and `''` as absent.\n */\nexport function hasFieldMessage(message: unknown): boolean {\n return !(message == null || message === false || message === '');\n}\n\n/** True when the field should show invalid chrome from props or an error message. */\nexport function isFieldInvalid(\n invalid: boolean,\n message: unknown,\n messageTone: FieldMessageTone | undefined,\n): boolean {\n if (invalid) return true;\n if (!hasFieldMessage(message)) return false;\n return (messageTone ?? 'error') === 'error';\n}\n\n/** Merge host `aria-describedby` with message and counter ids (message before counter). */\nexport function mergeFieldDescribedBy(\n hostDescribedBy: string | undefined,\n messageId: string | undefined,\n counterId: string | undefined,\n): string | undefined {\n const joined = [hostDescribedBy, messageId, counterId]\n .filter(Boolean)\n .join(' ');\n return joined || undefined;\n}\n"],"names":["hasFieldMessage","message","isFieldInvalid","invalid","messageTone","mergeFieldDescribedBy","hostDescribedBy","messageId","counterId"],"mappings":"AAMO,SAASA,EAAgBC,GAA2B;AACzD,SAAO,EAAEA,KAAW,QAAQA,MAAY,MAASA,MAAY;AAC/D;AAGO,SAASC,EACdC,GACAF,GACAG,GACS;AACT,SAAID,IAAgB,KACfH,EAAgBC,CAAO,KACpBG,KAAe,aAAa,UADE;AAExC;AAGO,SAASC,EACdC,GACAC,GACAC,GACoB;AAIpB,SAHe,CAACF,GAAiBC,GAAWC,CAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG,KACM;AACnB;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react");function g(u){let a=!1,s=!1;const e=new Event("change",{bubbles:!0,cancelable:!0});return{nativeEvent:e,type:"change",target:u,currentTarget:u,bubbles:!0,cancelable:!0,defaultPrevented:!1,eventPhase:0,isTrusted:!1,timeStamp:Date.now(),preventDefault(){var t;a=!0,this.defaultPrevented=!0,(t=e.preventDefault)==null||t.call(e)},isDefaultPrevented(){return a},stopPropagation(){var t;s=!0,(t=e.stopPropagation)==null||t.call(e)},isPropagationStopped(){return s},persist(){}}}function S({disabled:u,hasValue:a,clearEnabled:s=!0,isControlled:e,onClear:c,onChange:t,onKeyDown:f,inputRef:l,setUncontrolledValue:p}){const P=!!(s&&a&&!u),n=o.useCallback(()=>{var i;if(u||!s)return;if(c){c(),(i=l.current)==null||i.focus();return}const r=l.current;r!=null&&(r.value="",e||p(""),t==null||t(g(r)),r.focus())},[s,u,l,e,t,c,p]),v=o.useCallback(r=>{f==null||f(r),!(r.defaultPrevented||u||!s)&&r.key==="Escape"&&a&&(r.preventDefault(),n())},[s,u,n,a,f]);return{showClearButton:P,handleClear:n,handleKeyDown:v}}exports.useFieldClear=S;
2
+ //# sourceMappingURL=useFieldClear.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFieldClear.cjs","sources":["../../../src/components/field/useFieldClear.ts"],"sourcesContent":["import type {\n ChangeEvent,\n KeyboardEvent,\n RefObject,\n SyntheticEvent,\n} from 'react';\nimport { useCallback } from 'react';\n\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport interface UseFieldClearOptions<T extends FieldElement> {\n disabled?: boolean;\n hasValue: boolean;\n /** When false, clear is hidden and Escape does not clear. Default true. */\n clearEnabled?: boolean;\n isControlled: boolean;\n onClear?: () => void;\n onChange?: (e: ChangeEvent<T>) => void;\n onKeyDown?: (e: KeyboardEvent<T>) => void;\n inputRef: RefObject<T | null>;\n setUncontrolledValue: (value: string) => void;\n}\n\n/** Minimal ChangeEvent so host `preventDefault` / `nativeEvent` access won't throw. */\nfunction createClearChangeEvent<T extends FieldElement>(\n input: T,\n): ChangeEvent<T> {\n let defaultPrevented = false;\n let propagationStopped = false;\n const nativeEvent = new Event('change', { bubbles: true, cancelable: true });\n\n const event = {\n nativeEvent,\n type: 'change',\n target: input,\n currentTarget: input,\n bubbles: true,\n cancelable: true,\n defaultPrevented: false,\n eventPhase: 0,\n isTrusted: false,\n timeStamp: Date.now(),\n preventDefault() {\n defaultPrevented = true;\n this.defaultPrevented = true;\n nativeEvent.preventDefault?.();\n },\n isDefaultPrevented() {\n return defaultPrevented;\n },\n stopPropagation() {\n propagationStopped = true;\n nativeEvent.stopPropagation?.();\n },\n isPropagationStopped() {\n return propagationStopped;\n },\n persist() {},\n } as ChangeEvent<T> & SyntheticEvent<T, Event>;\n\n return event;\n}\n\nexport function useFieldClear<T extends FieldElement>({\n disabled,\n hasValue,\n clearEnabled = true,\n isControlled,\n onClear,\n onChange,\n onKeyDown,\n inputRef,\n setUncontrolledValue,\n}: UseFieldClearOptions<T>) {\n const showClearButton = Boolean(clearEnabled && hasValue && !disabled);\n\n const handleClear = useCallback(() => {\n if (disabled || !clearEnabled) return;\n\n if (onClear) {\n onClear();\n inputRef.current?.focus();\n return;\n }\n\n const input = inputRef.current;\n if (input == null) return;\n\n input.value = '';\n if (!isControlled) setUncontrolledValue('');\n\n onChange?.(createClearChangeEvent(input));\n input.focus();\n }, [\n clearEnabled,\n disabled,\n inputRef,\n isControlled,\n onChange,\n onClear,\n setUncontrolledValue,\n ]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<T>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || disabled || !clearEnabled) return;\n if (e.key === 'Escape' && hasValue) {\n e.preventDefault();\n handleClear();\n }\n },\n [clearEnabled, disabled, handleClear, hasValue, onKeyDown],\n );\n\n return { showClearButton, handleClear, handleKeyDown };\n}\n"],"names":["createClearChangeEvent","input","defaultPrevented","propagationStopped","nativeEvent","_a","useFieldClear","disabled","hasValue","clearEnabled","isControlled","onClear","onChange","onKeyDown","inputRef","setUncontrolledValue","showClearButton","handleClear","useCallback","handleKeyDown","e"],"mappings":"yGAwBA,SAASA,EACPC,EACgB,CAChB,IAAIC,EAAmB,GACnBC,EAAqB,GACzB,MAAMC,EAAc,IAAI,MAAM,SAAU,CAAE,QAAS,GAAM,WAAY,GAAM,EA+B3E,MA7Bc,CACZ,YAAAA,EACA,KAAM,SACN,OAAQH,EACR,cAAeA,EACf,QAAS,GACT,WAAY,GACZ,iBAAkB,GAClB,WAAY,EACZ,UAAW,GACX,UAAW,KAAK,IAAA,EAChB,gBAAiB,OACfC,EAAmB,GACnB,KAAK,iBAAmB,IACxBG,EAAAD,EAAY,iBAAZ,MAAAC,EAAA,KAAAD,EACF,EACA,oBAAqB,CACnB,OAAOF,CACT,EACA,iBAAkB,OAChBC,EAAqB,IACrBE,EAAAD,EAAY,kBAAZ,MAAAC,EAAA,KAAAD,EACF,EACA,sBAAuB,CACrB,OAAOD,CACT,EACA,SAAU,CAAC,CAAA,CAIf,CAEO,SAASG,EAAsC,CACpD,SAAAC,EACA,SAAAC,EACA,aAAAC,EAAe,GACf,aAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAC,EACA,qBAAAC,CACF,EAA4B,CAC1B,MAAMC,EAAkB,GAAQP,GAAgBD,GAAY,CAACD,GAEvDU,EAAcC,EAAAA,YAAY,IAAM,OACpC,GAAIX,GAAY,CAACE,EAAc,OAE/B,GAAIE,EAAS,CACXA,EAAA,GACAN,EAAAS,EAAS,UAAT,MAAAT,EAAkB,QAClB,MACF,CAEA,MAAMJ,EAAQa,EAAS,QACnBb,GAAS,OAEbA,EAAM,MAAQ,GACTS,GAAcK,EAAqB,EAAE,EAE1CH,GAAA,MAAAA,EAAWZ,EAAuBC,CAAK,GACvCA,EAAM,MAAA,EACR,EAAG,CACDQ,EACAF,EACAO,EACAJ,EACAE,EACAD,EACAI,CAAA,CACD,EAEKI,EAAgBD,EAAAA,YACnBE,GAAwB,CACvBP,GAAA,MAAAA,EAAYO,GACR,EAAAA,EAAE,kBAAoBb,GAAY,CAACE,IACnCW,EAAE,MAAQ,UAAYZ,IACxBY,EAAE,eAAA,EACFH,EAAA,EAEJ,EACA,CAACR,EAAcF,EAAUU,EAAaT,EAAUK,CAAS,CAAA,EAG3D,MAAO,CAAE,gBAAAG,EAAiB,YAAAC,EAAa,cAAAE,CAAA,CACzC"}
@@ -0,0 +1,21 @@
1
+ import { ChangeEvent, KeyboardEvent, RefObject } from 'react';
2
+ type FieldElement = HTMLInputElement | HTMLTextAreaElement;
3
+ export interface UseFieldClearOptions<T extends FieldElement> {
4
+ disabled?: boolean;
5
+ hasValue: boolean;
6
+ /** When false, clear is hidden and Escape does not clear. Default true. */
7
+ clearEnabled?: boolean;
8
+ isControlled: boolean;
9
+ onClear?: () => void;
10
+ onChange?: (e: ChangeEvent<T>) => void;
11
+ onKeyDown?: (e: KeyboardEvent<T>) => void;
12
+ inputRef: RefObject<T | null>;
13
+ setUncontrolledValue: (value: string) => void;
14
+ }
15
+ export declare function useFieldClear<T extends FieldElement>({ disabled, hasValue, clearEnabled, isControlled, onClear, onChange, onKeyDown, inputRef, setUncontrolledValue, }: UseFieldClearOptions<T>): {
16
+ showClearButton: boolean;
17
+ handleClear: () => void;
18
+ handleKeyDown: (e: KeyboardEvent<T>) => void;
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=useFieldClear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFieldClear.d.ts","sourceRoot":"","sources":["../../../src/components/field/useFieldClear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,SAAS,EAEV,MAAM,OAAO,CAAC;AAGf,KAAK,YAAY,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAE3D,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,YAAY;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AA0CD,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAAE,EACpD,QAAQ,EACR,QAAQ,EACR,YAAmB,EACnB,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,oBAAoB,GACrB,EAAE,oBAAoB,CAAC,CAAC,CAAC;;;uBA+BlB,aAAa,CAAC,CAAC,CAAC;EAYvB"}
@@ -0,0 +1,73 @@
1
+ import { useCallback as o } from "react";
2
+ function g(u) {
3
+ let s = !1, f = !1;
4
+ const t = new Event("change", { bubbles: !0, cancelable: !0 });
5
+ return {
6
+ nativeEvent: t,
7
+ type: "change",
8
+ target: u,
9
+ currentTarget: u,
10
+ bubbles: !0,
11
+ cancelable: !0,
12
+ defaultPrevented: !1,
13
+ eventPhase: 0,
14
+ isTrusted: !1,
15
+ timeStamp: Date.now(),
16
+ preventDefault() {
17
+ var e;
18
+ s = !0, this.defaultPrevented = !0, (e = t.preventDefault) == null || e.call(t);
19
+ },
20
+ isDefaultPrevented() {
21
+ return s;
22
+ },
23
+ stopPropagation() {
24
+ var e;
25
+ f = !0, (e = t.stopPropagation) == null || e.call(t);
26
+ },
27
+ isPropagationStopped() {
28
+ return f;
29
+ },
30
+ persist() {
31
+ }
32
+ };
33
+ }
34
+ function S({
35
+ disabled: u,
36
+ hasValue: s,
37
+ clearEnabled: f = !0,
38
+ isControlled: t,
39
+ onClear: p,
40
+ onChange: e,
41
+ onKeyDown: a,
42
+ inputRef: c,
43
+ setUncontrolledValue: l
44
+ }) {
45
+ const P = !!(f && s && !u), n = o(() => {
46
+ var i;
47
+ if (u || !f) return;
48
+ if (p) {
49
+ p(), (i = c.current) == null || i.focus();
50
+ return;
51
+ }
52
+ const r = c.current;
53
+ r != null && (r.value = "", t || l(""), e == null || e(g(r)), r.focus());
54
+ }, [
55
+ f,
56
+ u,
57
+ c,
58
+ t,
59
+ e,
60
+ p,
61
+ l
62
+ ]), v = o(
63
+ (r) => {
64
+ a == null || a(r), !(r.defaultPrevented || u || !f) && r.key === "Escape" && s && (r.preventDefault(), n());
65
+ },
66
+ [f, u, n, s, a]
67
+ );
68
+ return { showClearButton: P, handleClear: n, handleKeyDown: v };
69
+ }
70
+ export {
71
+ S as useFieldClear
72
+ };
73
+ //# sourceMappingURL=useFieldClear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFieldClear.js","sources":["../../../src/components/field/useFieldClear.ts"],"sourcesContent":["import type {\n ChangeEvent,\n KeyboardEvent,\n RefObject,\n SyntheticEvent,\n} from 'react';\nimport { useCallback } from 'react';\n\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport interface UseFieldClearOptions<T extends FieldElement> {\n disabled?: boolean;\n hasValue: boolean;\n /** When false, clear is hidden and Escape does not clear. Default true. */\n clearEnabled?: boolean;\n isControlled: boolean;\n onClear?: () => void;\n onChange?: (e: ChangeEvent<T>) => void;\n onKeyDown?: (e: KeyboardEvent<T>) => void;\n inputRef: RefObject<T | null>;\n setUncontrolledValue: (value: string) => void;\n}\n\n/** Minimal ChangeEvent so host `preventDefault` / `nativeEvent` access won't throw. */\nfunction createClearChangeEvent<T extends FieldElement>(\n input: T,\n): ChangeEvent<T> {\n let defaultPrevented = false;\n let propagationStopped = false;\n const nativeEvent = new Event('change', { bubbles: true, cancelable: true });\n\n const event = {\n nativeEvent,\n type: 'change',\n target: input,\n currentTarget: input,\n bubbles: true,\n cancelable: true,\n defaultPrevented: false,\n eventPhase: 0,\n isTrusted: false,\n timeStamp: Date.now(),\n preventDefault() {\n defaultPrevented = true;\n this.defaultPrevented = true;\n nativeEvent.preventDefault?.();\n },\n isDefaultPrevented() {\n return defaultPrevented;\n },\n stopPropagation() {\n propagationStopped = true;\n nativeEvent.stopPropagation?.();\n },\n isPropagationStopped() {\n return propagationStopped;\n },\n persist() {},\n } as ChangeEvent<T> & SyntheticEvent<T, Event>;\n\n return event;\n}\n\nexport function useFieldClear<T extends FieldElement>({\n disabled,\n hasValue,\n clearEnabled = true,\n isControlled,\n onClear,\n onChange,\n onKeyDown,\n inputRef,\n setUncontrolledValue,\n}: UseFieldClearOptions<T>) {\n const showClearButton = Boolean(clearEnabled && hasValue && !disabled);\n\n const handleClear = useCallback(() => {\n if (disabled || !clearEnabled) return;\n\n if (onClear) {\n onClear();\n inputRef.current?.focus();\n return;\n }\n\n const input = inputRef.current;\n if (input == null) return;\n\n input.value = '';\n if (!isControlled) setUncontrolledValue('');\n\n onChange?.(createClearChangeEvent(input));\n input.focus();\n }, [\n clearEnabled,\n disabled,\n inputRef,\n isControlled,\n onChange,\n onClear,\n setUncontrolledValue,\n ]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<T>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || disabled || !clearEnabled) return;\n if (e.key === 'Escape' && hasValue) {\n e.preventDefault();\n handleClear();\n }\n },\n [clearEnabled, disabled, handleClear, hasValue, onKeyDown],\n );\n\n return { showClearButton, handleClear, handleKeyDown };\n}\n"],"names":["createClearChangeEvent","input","defaultPrevented","propagationStopped","nativeEvent","_a","useFieldClear","disabled","hasValue","clearEnabled","isControlled","onClear","onChange","onKeyDown","inputRef","setUncontrolledValue","showClearButton","handleClear","useCallback","handleKeyDown","e"],"mappings":";AAwBA,SAASA,EACPC,GACgB;AAChB,MAAIC,IAAmB,IACnBC,IAAqB;AACzB,QAAMC,IAAc,IAAI,MAAM,UAAU,EAAE,SAAS,IAAM,YAAY,IAAM;AA+B3E,SA7Bc;AAAA,IACZ,aAAAA;AAAA,IACA,MAAM;AAAA,IACN,QAAQH;AAAA,IACR,eAAeA;AAAA,IACf,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW,KAAK,IAAA;AAAA,IAChB,iBAAiB;;AACf,MAAAC,IAAmB,IACnB,KAAK,mBAAmB,KACxBG,IAAAD,EAAY,mBAAZ,QAAAC,EAAA,KAAAD;AAAA,IACF;AAAA,IACA,qBAAqB;AACnB,aAAOF;AAAA,IACT;AAAA,IACA,kBAAkB;;AAChB,MAAAC,IAAqB,KACrBE,IAAAD,EAAY,oBAAZ,QAAAC,EAAA,KAAAD;AAAA,IACF;AAAA,IACA,uBAAuB;AACrB,aAAOD;AAAA,IACT;AAAA,IACA,UAAU;AAAA,IAAC;AAAA,EAAA;AAIf;AAEO,SAASG,EAAsC;AAAA,EACpD,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,sBAAAC;AACF,GAA4B;AAC1B,QAAMC,IAAkB,GAAQP,KAAgBD,KAAY,CAACD,IAEvDU,IAAcC,EAAY,MAAM;;AACpC,QAAIX,KAAY,CAACE,EAAc;AAE/B,QAAIE,GAAS;AACX,MAAAA,EAAA,IACAN,IAAAS,EAAS,YAAT,QAAAT,EAAkB;AAClB;AAAA,IACF;AAEA,UAAMJ,IAAQa,EAAS;AACvB,IAAIb,KAAS,SAEbA,EAAM,QAAQ,IACTS,KAAcK,EAAqB,EAAE,GAE1CH,KAAA,QAAAA,EAAWZ,EAAuBC,CAAK,IACvCA,EAAM,MAAA;AAAA,EACR,GAAG;AAAA,IACDQ;AAAA,IACAF;AAAA,IACAO;AAAA,IACAJ;AAAA,IACAE;AAAA,IACAD;AAAA,IACAI;AAAA,EAAA,CACD,GAEKI,IAAgBD;AAAA,IACpB,CAACE,MAAwB;AAEvB,MADAP,KAAA,QAAAA,EAAYO,IACR,EAAAA,EAAE,oBAAoBb,KAAY,CAACE,MACnCW,EAAE,QAAQ,YAAYZ,MACxBY,EAAE,eAAA,GACFH,EAAA;AAAA,IAEJ;AAAA,IACA,CAACR,GAAcF,GAAUU,GAAaT,GAAUK,CAAS;AAAA,EAAA;AAG3D,SAAO,EAAE,iBAAAG,GAAiB,aAAAC,GAAa,eAAAE,EAAA;AACzC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),__u=require("@mattermost/compass-icons/components/alert-circle-outline.js"),u=__u?.default??__u,__d=require("@mattermost/compass-icons/components/alert-outline.js"),d=__d?.default??__d,__f=require("@mattermost/compass-icons/components/check.js"),f=__f?.default??__f,g=require("../icon/Icon.cjs"),j=require("../../utils/string.cjs"),r=require("./FieldMessage.module.scss.cjs"),m={error:e.jsx(u,{}),warning:e.jsx(d,{}),success:e.jsx(f,{})};function x({className:n="",message:i,tone:s="error",...l}){const o=r.default[`field-message--tone-${j.toKebab(s)}`],a=[r.default["field-message"],o,n].filter(Boolean).join(" "),c=s==="error"||s==="warning",t=m[s];return e.jsxs("div",{...l,className:a,role:c?"alert":l.role,children:[t!=null&&e.jsx("span",{className:r.default["field-message__icon"],"aria-hidden":!0,children:e.jsx(g.default,{size:"12",glyph:t})}),e.jsx("span",{className:r.default["field-message__text"],children:i})]})}exports.default=x;
2
+ //# sourceMappingURL=FieldMessage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldMessage.cjs","sources":["../../../src/components/field-message/FieldMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport Icon from '@/components/icon/Icon';\nimport { toKebab } from '@/utils/string';\nimport styles from './FieldMessage.module.scss';\n\nexport type FieldMessageTone = 'error' | 'warning' | 'info' | 'success';\n\nexport interface FieldMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n /** Visual tone. Default: `error`. Info has no icon. */\n tone?: FieldMessageTone;\n}\n\nconst TONE_ICONS: Partial<Record<FieldMessageTone, ReactNode>> = {\n error: <AlertCircleOutlineIcon />,\n warning: <AlertOutlineIcon />,\n success: <CheckIcon />,\n};\n\n/**\n * Field Message is the inline status line under a form field — validation errors, warnings,\n * hints, or success. Error, warning, and success pair a tone glyph with the copy; info is\n * text-only at muted center-channel color.\n */\nexport default function FieldMessage({\n className = '',\n message,\n tone = 'error',\n ...rest\n}: FieldMessageProps) {\n const toneClass = styles[`field-message--tone-${toKebab(tone)}`];\n const rootClass = [styles['field-message'], toneClass, className]\n .filter(Boolean)\n .join(' ');\n\n const isAlert = tone === 'error' || tone === 'warning';\n const glyph = TONE_ICONS[tone];\n\n return (\n <div {...rest} className={rootClass} role={isAlert ? 'alert' : rest.role}>\n {glyph != null && (\n <span className={styles['field-message__icon']} aria-hidden>\n <Icon size=\"12\" glyph={glyph} />\n </span>\n )}\n <span className={styles['field-message__text']}>{message}</span>\n </div>\n );\n}\n"],"names":["TONE_ICONS","AlertCircleOutlineIcon","AlertOutlineIcon","CheckIcon","FieldMessage","className","message","tone","rest","toneClass","styles","toKebab","rootClass","isAlert","glyph","jsxs","jsx","Icon"],"mappings":"8bAmBMA,EAA2D,CAC/D,YAAQC,EAAA,EAAuB,EAC/B,cAAUC,EAAA,EAAiB,EAC3B,cAAUC,EAAA,CAAA,CAAU,CACtB,EAOA,SAAwBC,EAAa,CACnC,UAAAC,EAAY,GACZ,QAAAC,EACA,KAAAC,EAAO,QACP,GAAGC,CACL,EAAsB,CACpB,MAAMC,EAAYC,EAAAA,QAAO,uBAAuBC,EAAAA,QAAQJ,CAAI,CAAC,EAAE,EACzDK,EAAY,CAACF,UAAO,eAAe,EAAGD,EAAWJ,CAAS,EAC7D,OAAO,OAAO,EACd,KAAK,GAAG,EAELQ,EAAUN,IAAS,SAAWA,IAAS,UACvCO,EAAQd,EAAWO,CAAI,EAE7B,OACEQ,EAAAA,KAAC,MAAA,CAAK,GAAGP,EAAM,UAAWI,EAAW,KAAMC,EAAU,QAAUL,EAAK,KACjE,SAAA,CAAAM,GAAS,MACRE,MAAC,OAAA,CAAK,UAAWN,EAAAA,QAAO,qBAAqB,EAAG,cAAW,GACzD,SAAAM,EAAAA,IAACC,UAAA,CAAK,KAAK,KAAK,MAAAH,EAAc,EAChC,QAED,OAAA,CAAK,UAAWJ,EAAAA,QAAO,qBAAqB,EAAI,SAAAJ,CAAA,CAAQ,CAAA,EAC3D,CAEJ"}
@@ -0,0 +1 @@
1
+ ._field-message_10eh8_2{display:flex;align-items:flex-start;gap:var(--spacing-xxs)}._field-message__icon_10eh8_7{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding-top:2px}._field-message__text_10eh8_14{font-size:var(--font-size-75);font-weight:var(--font-weight-regular);line-height:var(--line-height-75);flex:1 0 0;min-width:0}._field-message--tone-error_10eh8_21 ._field-message__icon_10eh8_7,._field-message--tone-error_10eh8_21 ._field-message__text_10eh8_14{color:var(--error-text, var(--color-danger))}._field-message--tone-warning_10eh8_25 ._field-message__icon_10eh8_7,._field-message--tone-warning_10eh8_25 ._field-message__text_10eh8_14{color:var(--away-indicator, var(--color-warning))}._field-message--tone-info_10eh8_29 ._field-message__text_10eh8_14{color:rgba(var(--center-channel-color-rgb),.75)}._field-message--tone-success_10eh8_32 ._field-message__icon_10eh8_7,._field-message--tone-success_10eh8_32 ._field-message__text_10eh8_14{color:var(--online-indicator, var(--color-success))}
@@ -0,0 +1,17 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ export type FieldMessageTone = 'error' | 'warning' | 'info' | 'success';
3
+ export interface FieldMessageProps extends HTMLAttributes<HTMLDivElement> {
4
+ /** Optional CSS class name. */
5
+ className?: string;
6
+ /** The message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */
7
+ message: ReactNode;
8
+ /** Visual tone. Default: `error`. Info has no icon. */
9
+ tone?: FieldMessageTone;
10
+ }
11
+ /**
12
+ * Field Message is the inline status line under a form field — validation errors, warnings,
13
+ * hints, or success. Error, warning, and success pair a tone glyph with the copy; info is
14
+ * text-only at muted center-channel color.
15
+ */
16
+ export default function FieldMessage({ className, message, tone, ...rest }: FieldMessageProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=FieldMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldMessage.d.ts","sourceRoot":"","sources":["../../../src/components/field-message/FieldMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACvE,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,SAAS,CAAC;IACnB,uDAAuD;IACvD,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAQD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,SAAc,EACd,OAAO,EACP,IAAc,EACd,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAmBnB"}
@@ -0,0 +1,28 @@
1
+ import { jsxs as m, jsx as e } from "react/jsx-runtime";
2
+ import __f from "@mattermost/compass-icons/components/alert-circle-outline.js";const f=__f&&__f.default?__f.default:__f;
3
+ import __d from "@mattermost/compass-icons/components/alert-outline.js";const d=__d&&__d.default?__d.default:__d;
4
+ import __p from "@mattermost/compass-icons/components/check.js";const p=__p&&__p.default?__p.default:__p;
5
+ import g from "../icon/Icon.js";
6
+ import { toKebab as u } from "../../utils/string.js";
7
+ import s from "./FieldMessage.module.scss.js";
8
+ const h = {
9
+ error: /* @__PURE__ */ e(f, {}),
10
+ warning: /* @__PURE__ */ e(d, {}),
11
+ success: /* @__PURE__ */ e(p, {})
12
+ };
13
+ function A({
14
+ className: l = "",
15
+ message: n,
16
+ tone: r = "error",
17
+ ...o
18
+ }) {
19
+ const t = s[`field-message--tone-${u(r)}`], a = [s["field-message"], t, l].filter(Boolean).join(" "), c = r === "error" || r === "warning", i = h[r];
20
+ return /* @__PURE__ */ m("div", { ...o, className: a, role: c ? "alert" : o.role, children: [
21
+ i != null && /* @__PURE__ */ e("span", { className: s["field-message__icon"], "aria-hidden": !0, children: /* @__PURE__ */ e(g, { size: "12", glyph: i }) }),
22
+ /* @__PURE__ */ e("span", { className: s["field-message__text"], children: n })
23
+ ] });
24
+ }
25
+ export {
26
+ A as default
27
+ };
28
+ //# sourceMappingURL=FieldMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldMessage.js","sources":["../../../src/components/field-message/FieldMessage.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport AlertCircleOutlineIcon from '@mattermost/compass-icons/components/alert-circle-outline';\nimport AlertOutlineIcon from '@mattermost/compass-icons/components/alert-outline';\nimport CheckIcon from '@mattermost/compass-icons/components/check';\nimport Icon from '@/components/icon/Icon';\nimport { toKebab } from '@/utils/string';\nimport styles from './FieldMessage.module.scss';\n\nexport type FieldMessageTone = 'error' | 'warning' | 'info' | 'success';\n\nexport interface FieldMessageProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional CSS class name. */\n className?: string;\n /** The message. Accepts translated nodes (e.g. `<FormattedMessage/>`). */\n message: ReactNode;\n /** Visual tone. Default: `error`. Info has no icon. */\n tone?: FieldMessageTone;\n}\n\nconst TONE_ICONS: Partial<Record<FieldMessageTone, ReactNode>> = {\n error: <AlertCircleOutlineIcon />,\n warning: <AlertOutlineIcon />,\n success: <CheckIcon />,\n};\n\n/**\n * Field Message is the inline status line under a form field — validation errors, warnings,\n * hints, or success. Error, warning, and success pair a tone glyph with the copy; info is\n * text-only at muted center-channel color.\n */\nexport default function FieldMessage({\n className = '',\n message,\n tone = 'error',\n ...rest\n}: FieldMessageProps) {\n const toneClass = styles[`field-message--tone-${toKebab(tone)}`];\n const rootClass = [styles['field-message'], toneClass, className]\n .filter(Boolean)\n .join(' ');\n\n const isAlert = tone === 'error' || tone === 'warning';\n const glyph = TONE_ICONS[tone];\n\n return (\n <div {...rest} className={rootClass} role={isAlert ? 'alert' : rest.role}>\n {glyph != null && (\n <span className={styles['field-message__icon']} aria-hidden>\n <Icon size=\"12\" glyph={glyph} />\n </span>\n )}\n <span className={styles['field-message__text']}>{message}</span>\n </div>\n );\n}\n"],"names":["TONE_ICONS","AlertCircleOutlineIcon","AlertOutlineIcon","CheckIcon","FieldMessage","className","message","tone","rest","toneClass","styles","toKebab","rootClass","isAlert","glyph","jsxs","jsx","Icon"],"mappings":";;;;;;;AAmBA,MAAMA,IAA2D;AAAA,EAC/D,yBAAQC,GAAA,EAAuB;AAAA,EAC/B,2BAAUC,GAAA,EAAiB;AAAA,EAC3B,2BAAUC,GAAA,CAAA,CAAU;AACtB;AAOA,SAAwBC,EAAa;AAAA,EACnC,WAAAC,IAAY;AAAA,EACZ,SAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,GAAsB;AACpB,QAAMC,IAAYC,EAAO,uBAAuBC,EAAQJ,CAAI,CAAC,EAAE,GACzDK,IAAY,CAACF,EAAO,eAAe,GAAGD,GAAWJ,CAAS,EAC7D,OAAO,OAAO,EACd,KAAK,GAAG,GAELQ,IAAUN,MAAS,WAAWA,MAAS,WACvCO,IAAQd,EAAWO,CAAI;AAE7B,SACE,gBAAAQ,EAAC,OAAA,EAAK,GAAGP,GAAM,WAAWI,GAAW,MAAMC,IAAU,UAAUL,EAAK,MACjE,UAAA;AAAA,IAAAM,KAAS,QACR,gBAAAE,EAAC,QAAA,EAAK,WAAWN,EAAO,qBAAqB,GAAG,eAAW,IACzD,UAAA,gBAAAM,EAACC,GAAA,EAAK,MAAK,MAAK,OAAAH,GAAc,GAChC;AAAA,sBAED,QAAA,EAAK,WAAWJ,EAAO,qBAAqB,GAAI,UAAAJ,EAAA,CAAQ;AAAA,EAAA,GAC3D;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./FieldMessage.css');const e={"field-message":"_field-message_10eh8_2","field-message__icon":"_field-message__icon_10eh8_7","field-message__text":"_field-message__text_10eh8_14","field-message--tone-error":"_field-message--tone-error_10eh8_21","field-message--tone-warning":"_field-message--tone-warning_10eh8_25","field-message--tone-info":"_field-message--tone-info_10eh8_29","field-message--tone-success":"_field-message--tone-success_10eh8_32"};exports.default=e;
2
+ //# sourceMappingURL=FieldMessage.module.scss.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldMessage.module.scss.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import './FieldMessage.css';const e = {
2
+ "field-message": "_field-message_10eh8_2",
3
+ "field-message__icon": "_field-message__icon_10eh8_7",
4
+ "field-message__text": "_field-message__text_10eh8_14",
5
+ "field-message--tone-error": "_field-message--tone-error_10eh8_21",
6
+ "field-message--tone-warning": "_field-message--tone-warning_10eh8_25",
7
+ "field-message--tone-info": "_field-message--tone-info_10eh8_29",
8
+ "field-message--tone-success": "_field-message--tone-success_10eh8_32"
9
+ };
10
+ export {
11
+ e as default
12
+ };
13
+ //# sourceMappingURL=FieldMessage.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldMessage.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./FieldMessage.cjs");exports.FieldMessage=e.default;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { default as FieldMessage } from './FieldMessage';
2
+ export type { FieldMessageProps, FieldMessageTone } from './FieldMessage';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/field-message/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { default as s } from "./FieldMessage.js";
2
+ export {
3
+ s as FieldMessage
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),t=require("react"),__ds=require("@mattermost/compass-icons/components/eye-off-outline.js"),ds=__ds?.default??__ds,__rs=require("@mattermost/compass-icons/components/eye-outline.js"),rs=__rs?.default??__rs,us=require("../icon/Icon.cjs"),j=require("../field/fieldDescribedBy.cjs"),cs=require("../field-message/FieldMessage.cjs"),ps=require("../../utils/props.cjs"),fs=require("../../utils/string.cjs"),l=require("./PasswordInput.module.scss.cjs"),vs={small:"12",medium:"16",large:"16"},ws=t.forwardRef(function({className:k="",size:x="medium",label:u,invalid:F=!1,message:c,messageTone:y,showPasswordLabel:R="Show password",hidePasswordLabel:D="Hide password",revealButtonProps:V,revealed:N,defaultRevealed:z=!1,onRevealedChange:n,id:E,value:p,defaultValue:q,placeholder:O,onFocus:o,onBlur:d,onChange:r,disabled:f,"aria-describedby":P,...U},a){const $=t.useId(),v=E??$,A=t.useRef(null),i=p!==void 0,[H,K]=t.useState(q??""),h=i?p:H,T=h!=null&&h!=="",w=N!==void 0,[Z,B]=t.useState(z),b=w?N:Z,m=b&&!f,[G,S]=t.useState(!1),J=G||T,L=t.useCallback(s=>{S(!0),o==null||o(s)},[o]),Q=t.useCallback(s=>{S(!1),d==null||d(s)},[d]),W=t.useCallback(s=>{i||K(s.target.value),r==null||r(s)},[i,r]),X=t.useCallback(s=>{A.current=s,typeof a=="function"?a(s):a&&(a.current=s)},[a]),Y=t.useCallback(()=>{const s=!b;w||B(s),n==null||n(s)},[w,n,b]),{className:ss,onClick:_,onMouseDown:I,...es}=V??{},g=j.isFieldInvalid(F,c,y),C=j.hasFieldMessage(c),ts=l.default[`password-input--size-${fs.toKebab(x)}`],ls=g?l.default["password-input--invalid"]:"",as=u!=null&&J?l.default["password-input--label-floated"]:"",is=vs[x],ns=[l.default["password-input"],ts,ls,as,l.default["password-input--has-trailing-icon"],k].filter(Boolean).join(" "),M=C?`${v}-message`:void 0,os=y??"error";return e.jsxs("div",{className:ns,children:[e.jsxs("div",{className:l.default["password-input__wrapper"],children:[u!=null&&e.jsx("label",{className:l.default["password-input__label"],htmlFor:v,children:u}),e.jsxs("div",{className:l.default["password-input__inner"],children:[e.jsx("input",{ref:X,id:v,type:m?"text":"password",className:l.default["password-input__input"],value:i?p:void 0,defaultValue:i?void 0:q,placeholder:O,disabled:f,onFocus:L,onBlur:Q,onChange:W,"aria-invalid":g?!0:void 0,"aria-describedby":j.mergeFieldDescribedBy(P,M,void 0),...U}),e.jsx("span",{className:l.default["password-input__trailing-icon"],children:e.jsx("button",{...es,type:"button",className:ps.mergeClassNames(l.default["password-input__reveal"],ss),"aria-label":m?D:R,disabled:f,onClick:s=>{_==null||_(s),!s.defaultPrevented&&Y()},onMouseDown:s=>{s.preventDefault(),I==null||I(s)},children:e.jsx(us.default,{size:is,glyph:m?e.jsx(ds,{}):e.jsx(rs,{})})})})]})]}),C&&e.jsx(cs.default,{id:M,message:c,tone:os})]})});exports.default=ws;
2
+ //# sourceMappingURL=PasswordInput.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordInput.cjs","sources":["../../../src/components/password-input/PasswordInput.tsx"],"sourcesContent":["import type { ChangeEvent, InputHTMLAttributes, ReactNode } from 'react';\nimport { forwardRef, useCallback, useId, useRef, useState } from 'react';\nimport EyeOffOutlineIcon from '@mattermost/compass-icons/components/eye-off-outline';\nimport EyeOutlineIcon from '@mattermost/compass-icons/components/eye-outline';\nimport type { IconSize } from '@/components/icon/Icon';\nimport Icon from '@/components/icon/Icon';\nimport {\n hasFieldMessage,\n isFieldInvalid,\n mergeFieldDescribedBy,\n} from '@/components/field/fieldDescribedBy';\nimport FieldMessage from '@/components/field-message/FieldMessage';\nimport type { FieldMessageTone } from '@/components/field-message/FieldMessage';\nimport type { BuiltInButtonProps } from '@/utils/props';\nimport { mergeClassNames } from '@/utils/props';\nimport { toKebab } from '@/utils/string';\nimport styles from './PasswordInput.module.scss';\n\nexport type PasswordInputSize = 'small' | 'medium' | 'large';\n\n/** Matches Text Input / FieldClearButton trailing chrome per size. */\nconst ICON_SIZE_MAP: Record<PasswordInputSize, IconSize> = {\n small: '12',\n medium: '16',\n large: '16',\n};\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label. Floats above the border when focused or filled. */\n label?: ReactNode;\n /** Size variant. Default: Medium. */\n size?: PasswordInputSize;\n /**\n * Field message under the field. Accepts translated nodes (e.g. `<FormattedMessage/>`).\n * Defaults to error tone (invalid chrome) when set without `messageTone`.\n */\n message?: ReactNode;\n /** Visual tone for `message`. Default: `error` when `message` is set. */\n messageTone?: FieldMessageTone;\n /**\n * Accessible name for the reveal toggle when the password is hidden.\n * Default: `\"Show password\"`.\n */\n showPasswordLabel?: string;\n /**\n * Accessible name for the reveal toggle when the password is visible.\n * Default: `\"Hide password\"`.\n */\n hidePasswordLabel?: string;\n /** Extra attributes for the reveal toggle (e.g. `data-testid`). */\n revealButtonProps?: BuiltInButtonProps;\n /**\n * Controlled reveal state. Omit for uncontrolled (use `defaultRevealed`).\n */\n revealed?: boolean;\n /** Uncontrolled initial reveal state. Default: `false`. */\n defaultRevealed?: boolean;\n /** Called when the reveal toggle changes visibility. */\n onRevealedChange?: (revealed: boolean) => void;\n}\n\n/**\n * Password Inputs are the dedicated field for secrets — login, signup, invite\n * passwords. They look like a text input with a built-in show/hide toggle so the\n * affordance is obvious, the same way Search Input always ships a magnifier.\n */\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n className = '',\n size = 'medium',\n label,\n invalid = false,\n message,\n messageTone,\n showPasswordLabel = 'Show password',\n hidePasswordLabel = 'Hide password',\n revealButtonProps,\n revealed: revealedProp,\n defaultRevealed = false,\n onRevealedChange,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n 'aria-describedby': describedBy,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const isValueControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isValueControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const isRevealControlled = revealedProp !== undefined;\n const [uncontrolledRevealed, setUncontrolledRevealed] =\n useState(defaultRevealed);\n const revealed = isRevealControlled ? revealedProp : uncontrolledRevealed;\n const visible = revealed && !disabled;\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isValueControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isValueControlled, onChange],\n );\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const toggleRevealed = useCallback(() => {\n const next = !revealed;\n if (!isRevealControlled) setUncontrolledRevealed(next);\n onRevealedChange?.(next);\n }, [isRevealControlled, onRevealedChange, revealed]);\n\n const {\n className: revealClassName,\n onClick: revealOnClick,\n onMouseDown: revealOnMouseDown,\n ...revealRest\n } = revealButtonProps ?? {};\n\n const showInvalid = isFieldInvalid(invalid, message, messageTone);\n const showMessage = hasFieldMessage(message);\n const sizeClass = styles[`password-input--size-${toKebab(size)}`];\n const invalidClass = showInvalid ? styles['password-input--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated\n ? styles['password-input--label-floated']\n : '';\n const iconSize = ICON_SIZE_MAP[size];\n\n const rootClass = [\n styles['password-input'],\n sizeClass,\n invalidClass,\n labelFloatedClass,\n styles['password-input--has-trailing-icon'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const messageId = showMessage ? `${id}-message` : undefined;\n const resolvedTone = messageTone ?? 'error';\n\n return (\n <div className={rootClass}>\n <div className={styles['password-input__wrapper']}>\n {label != null && (\n <label className={styles['password-input__label']} htmlFor={id}>\n {label}\n </label>\n )}\n <div className={styles['password-input__inner']}>\n <input\n ref={setInputRef}\n id={id}\n type={visible ? 'text' : 'password'}\n className={styles['password-input__input']}\n value={isValueControlled ? valueProp : undefined}\n defaultValue={isValueControlled ? undefined : defaultValue}\n placeholder={placeholder}\n disabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n aria-invalid={showInvalid ? true : undefined}\n aria-describedby={mergeFieldDescribedBy(\n describedBy,\n messageId,\n undefined,\n )}\n {...rest}\n />\n <span className={styles['password-input__trailing-icon']}>\n <button\n {...revealRest}\n type=\"button\"\n className={mergeClassNames(\n styles['password-input__reveal'],\n revealClassName,\n )}\n aria-label={visible ? hidePasswordLabel : showPasswordLabel}\n disabled={disabled}\n onClick={(e) => {\n revealOnClick?.(e);\n if (e.defaultPrevented) return;\n toggleRevealed();\n }}\n onMouseDown={(e) => {\n // Keep focus in the field when pressing the toggle.\n e.preventDefault();\n revealOnMouseDown?.(e);\n }}\n >\n <Icon\n size={iconSize}\n glyph={visible ? <EyeOffOutlineIcon /> : <EyeOutlineIcon />}\n />\n </button>\n </span>\n </div>\n </div>\n {showMessage && (\n <FieldMessage id={messageId} message={message} tone={resolvedTone} />\n )}\n </div>\n );\n },\n);\n\nexport default PasswordInput;\n"],"names":["ICON_SIZE_MAP","PasswordInput","forwardRef","className","size","label","invalid","message","messageTone","showPasswordLabel","hidePasswordLabel","revealButtonProps","revealedProp","defaultRevealed","onRevealedChange","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","describedBy","rest","ref","generatedId","useId","id","inputRef","useRef","isValueControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isRevealControlled","uncontrolledRevealed","setUncontrolledRevealed","revealed","visible","isFocused","setIsFocused","labelFloated","handleFocus","useCallback","e","handleBlur","handleChange","setInputRef","node","toggleRevealed","next","revealClassName","revealOnClick","revealOnMouseDown","revealRest","showInvalid","isFieldInvalid","showMessage","hasFieldMessage","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","iconSize","rootClass","messageId","resolvedTone","jsxs","jsx","mergeFieldDescribedBy","mergeClassNames","Icon","EyeOffOutlineIcon","EyeOutlineIcon","FieldMessage"],"mappings":"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"}