@panneau/fields 5.0.0-alpha.8 → 5.0.0-alpha.9

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.
@@ -9,6 +9,7 @@ export declare function isRequired(field: Field): boolean;
9
9
  /** A setting of a field (`settings.<name>`), when it has the expected type. */
10
10
  export declare function getSetting<T>(field: Field, name: string, guard: (value: unknown) => value is T): T | undefined;
11
11
  export declare const isString: (value: unknown) => value is string;
12
+ export declare const isBoolean: (value: unknown) => value is boolean;
12
13
  export declare const isNumber: (value: unknown) => value is number;
13
14
  /**
14
15
  * The props that every field takes, from a registry entry's props: label (the field's name
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/shared/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3D,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAE3E;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAKnF;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEhD;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,iBAG9F;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAmC,CAAC;AACvF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACE,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,eAAe,GACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAe1E;AAED,wCAAwC;AACxC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,IAAI,CAQvD;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAGtD"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/shared/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3D,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAE3E;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAKnF;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEhD;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,iBAG9F;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAmC,CAAC;AACvF,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAAqC,CAAC;AAC1F,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACE,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,eAAe,GACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAe1E;AAED,wCAAwC;AACxC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,IAAI,CAQvD;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAGtD"}
@@ -18,6 +18,7 @@ function getSetting(field, name, guard) {
18
18
  return guard(value) ? value : void 0;
19
19
  }
20
20
  var isString = (value) => typeof value === "string";
21
+ var isBoolean = (value) => typeof value === "boolean";
21
22
  var isNumber = (value) => typeof value === "number" && !Number.isNaN(value);
22
23
  /**
23
24
  * The props that every field takes, from a registry entry's props: label (the field's name
@@ -51,6 +52,6 @@ function getMaxSize(field) {
51
52
  return rule !== void 0 && "value" in rule && isNumber(rule.value) ? rule.value : null;
52
53
  }
53
54
  //#endregion
54
- export { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, getSetting, isNumber, isRequired, isString };
55
+ export { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, getSetting, isBoolean, isNumber, isRequired, isString };
55
56
 
56
57
  //# sourceMappingURL=entry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","names":["Field","Rule","FieldEntryProps","FieldProps","findRule","field","rule","rules","find","candidate","getRuleNumber","found","undefined","value","isRequired","getSetting","name","guard","T","settings","isString","isNumber","Number","isNaN","getFieldProps","props","Omit","placeholder","path","label","description","help","required","readOnly","disabled","errors","onBlur","className","asString","getAccept","accept","length","Array","isArray","filter","getMaxSize"],"sources":["../../src/shared/entry.ts"],"sourcesContent":["import type { Field, Rule } from '@panneau/protocol';\n\nimport type { FieldEntryProps, FieldProps } from './types';\n\n/** The rule of a field with this name, if any. */\nexport function findRule(field: Field, rule: Rule['rule']): Rule | undefined {\n return field.rules?.find((candidate) => candidate.rule === rule);\n}\n\n/** The number of a `min` or `max` rule of a field, if any. */\nexport function getRuleNumber(field: Field, rule: 'min' | 'max'): number | undefined {\n const found = findRule(field, rule);\n return found !== undefined && 'value' in found && typeof found.value === 'number'\n ? found.value\n : undefined;\n}\n\n/** Whether a field has the `required` rule. */\nexport function isRequired(field: Field): boolean {\n return findRule(field, 'required') !== undefined;\n}\n\n/** A setting of a field (`settings.<name>`), when it has the expected type. */\nexport function getSetting<T>(field: Field, name: string, guard: (value: unknown) => value is T) {\n const value = field.settings?.[name];\n return guard(value) ? value : undefined;\n}\n\nexport const isString = (value: unknown): value is string => typeof value === 'string';\nexport const isNumber = (value: unknown): value is number =>\n typeof value === 'number' && !Number.isNaN(value);\n\n/**\n * The props that every field takes, from a registry entry's props: label (the field's name\n * without one), help, required mark, read-only, errors and handlers. Plugins use it to write their\n * own entries.\n */\nexport function getFieldProps(\n props: FieldEntryProps,\n): Omit<FieldProps<never>, 'value' | 'onChange'> & { placeholder?: string } {\n const { field } = props;\n return {\n name: props.path,\n // A field always has a label: its name when the definition gives none.\n label: field.label ?? field.name,\n description: field.help,\n ...(field.placeholder !== undefined ? { placeholder: field.placeholder } : {}),\n required: isRequired(field),\n readOnly: props.readOnly === true || field.readOnly === true,\n disabled: props.disabled === true,\n errors: props.errors ?? [],\n ...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {}),\n ...(props.className !== undefined ? { className: props.className } : {}),\n };\n}\n\n/** The value as a string, or `null`. */\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** The accepted MIME types of a field that takes files: its `accept`, or its `accept` rule. */\nexport function getAccept(field: Field): string[] | null {\n if (field.accept !== undefined && field.accept.length > 0) {\n return field.accept;\n }\n const rule = findRule(field, 'accept');\n return rule !== undefined && 'value' in rule && Array.isArray(rule.value)\n ? rule.value.filter(isString)\n : null;\n}\n\n/** The largest file of a field, in bytes: its `maxSize` rule. */\nexport function getMaxSize(field: Field): number | null {\n const rule = findRule(field, 'maxSize');\n return rule !== undefined && 'value' in rule && isNumber(rule.value) ? rule.value : null;\n}\n"],"mappings":";;AAKA,SAAgBI,SAASC,OAAcC,MAAsC;CACzE,OAAOD,MAAME,OAAOC,MAAMC,cAAcA,UAAUH,SAASA,IAAI;AACnE;;AAGA,SAAgBI,cAAcL,OAAcC,MAAyC;CACjF,MAAMK,QAAQP,SAASC,OAAOC,IAAI;CAClC,OAAOK,UAAUC,KAAAA,KAAa,WAAWD,SAAS,OAAOA,MAAME,UAAU,WACnEF,MAAME,QACND,KAAAA;AACV;;AAGA,SAAgBE,WAAWT,OAAuB;CAC9C,OAAOD,SAASC,OAAO,UAAU,MAAMO,KAAAA;AAC3C;;AAGA,SAAgBG,WAAcV,OAAcW,MAAcC,OAAuC;CAC7F,MAAMJ,QAAQR,MAAMc,WAAWH;CAC/B,OAAOC,MAAMJ,KAAK,IAAIA,QAAQD,KAAAA;AAClC;AAEA,IAAaQ,YAAYP,UAAoC,OAAOA,UAAU;AAC9E,IAAaQ,YAAYR,UACrB,OAAOA,UAAU,YAAY,CAACS,OAAOC,MAAMV,KAAK;;;;;;AAOpD,SAAgBW,cACZC,OACwE;CACxE,MAAM,EAAEpB,UAAUoB;CAClB,OAAO;EACHT,MAAMS,MAAMG;EAEZC,OAAOxB,MAAMwB,SAASxB,MAAMW;EAC5Bc,aAAazB,MAAM0B;EACnB,GAAI1B,MAAMsB,gBAAgBf,KAAAA,IAAY,EAAEe,aAAatB,MAAMsB,YAAY,IAAI,CAAC;EAC5EK,UAAUlB,WAAWT,KAAK;EAC1B4B,UAAUR,MAAMQ,aAAa,QAAQ5B,MAAM4B,aAAa;EACxDC,UAAUT,MAAMS,aAAa;EAC7BC,QAAQV,MAAMU,UAAU,CAAA;EACxB,GAAIV,MAAMW,WAAWxB,KAAAA,IAAY,EAAEwB,QAAQX,MAAMW,OAAO,IAAI,CAAC;EAC7D,GAAIX,MAAMY,cAAczB,KAAAA,IAAY,EAAEyB,WAAWZ,MAAMY,UAAU,IAAI,CAAC;CAC1E;AACJ;;AAQA,SAAgBE,UAAUlC,OAA+B;CACrD,IAAIA,MAAMmC,WAAW5B,KAAAA,KAAaP,MAAMmC,OAAOC,SAAS,GACpD,OAAOpC,MAAMmC;CAEjB,MAAMlC,OAAOF,SAASC,OAAO,QAAQ;CACrC,OAAOC,SAASM,KAAAA,KAAa,WAAWN,QAAQoC,MAAMC,QAAQrC,KAAKO,KAAK,IAClEP,KAAKO,MAAM+B,OAAOxB,QAAQ,IAC1B;AACV;;AAGA,SAAgByB,WAAWxC,OAA6B;CACpD,MAAMC,OAAOF,SAASC,OAAO,SAAS;CACtC,OAAOC,SAASM,KAAAA,KAAa,WAAWN,QAAQe,SAASf,KAAKO,KAAK,IAAIP,KAAKO,QAAQ;AACxF"}
1
+ {"version":3,"file":"entry.js","names":["Field","Rule","FieldEntryProps","FieldProps","findRule","field","rule","rules","find","candidate","getRuleNumber","found","undefined","value","isRequired","getSetting","name","guard","T","settings","isString","isBoolean","isNumber","Number","isNaN","getFieldProps","props","Omit","placeholder","path","label","description","help","required","readOnly","disabled","errors","onBlur","className","asString","getAccept","accept","length","Array","isArray","filter","getMaxSize"],"sources":["../../src/shared/entry.ts"],"sourcesContent":["import type { Field, Rule } from '@panneau/protocol';\n\nimport type { FieldEntryProps, FieldProps } from './types';\n\n/** The rule of a field with this name, if any. */\nexport function findRule(field: Field, rule: Rule['rule']): Rule | undefined {\n return field.rules?.find((candidate) => candidate.rule === rule);\n}\n\n/** The number of a `min` or `max` rule of a field, if any. */\nexport function getRuleNumber(field: Field, rule: 'min' | 'max'): number | undefined {\n const found = findRule(field, rule);\n return found !== undefined && 'value' in found && typeof found.value === 'number'\n ? found.value\n : undefined;\n}\n\n/** Whether a field has the `required` rule. */\nexport function isRequired(field: Field): boolean {\n return findRule(field, 'required') !== undefined;\n}\n\n/** A setting of a field (`settings.<name>`), when it has the expected type. */\nexport function getSetting<T>(field: Field, name: string, guard: (value: unknown) => value is T) {\n const value = field.settings?.[name];\n return guard(value) ? value : undefined;\n}\n\nexport const isString = (value: unknown): value is string => typeof value === 'string';\nexport const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';\nexport const isNumber = (value: unknown): value is number =>\n typeof value === 'number' && !Number.isNaN(value);\n\n/**\n * The props that every field takes, from a registry entry's props: label (the field's name\n * without one), help, required mark, read-only, errors and handlers. Plugins use it to write their\n * own entries.\n */\nexport function getFieldProps(\n props: FieldEntryProps,\n): Omit<FieldProps<never>, 'value' | 'onChange'> & { placeholder?: string } {\n const { field } = props;\n return {\n name: props.path,\n // A field always has a label: its name when the definition gives none.\n label: field.label ?? field.name,\n description: field.help,\n ...(field.placeholder !== undefined ? { placeholder: field.placeholder } : {}),\n required: isRequired(field),\n readOnly: props.readOnly === true || field.readOnly === true,\n disabled: props.disabled === true,\n errors: props.errors ?? [],\n ...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {}),\n ...(props.className !== undefined ? { className: props.className } : {}),\n };\n}\n\n/** The value as a string, or `null`. */\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** The accepted MIME types of a field that takes files: its `accept`, or its `accept` rule. */\nexport function getAccept(field: Field): string[] | null {\n if (field.accept !== undefined && field.accept.length > 0) {\n return field.accept;\n }\n const rule = findRule(field, 'accept');\n return rule !== undefined && 'value' in rule && Array.isArray(rule.value)\n ? rule.value.filter(isString)\n : null;\n}\n\n/** The largest file of a field, in bytes: its `maxSize` rule. */\nexport function getMaxSize(field: Field): number | null {\n const rule = findRule(field, 'maxSize');\n return rule !== undefined && 'value' in rule && isNumber(rule.value) ? rule.value : null;\n}\n"],"mappings":";;AAKA,SAAgBI,SAASC,OAAcC,MAAsC;CACzE,OAAOD,MAAME,OAAOC,MAAMC,cAAcA,UAAUH,SAASA,IAAI;AACnE;;AAGA,SAAgBI,cAAcL,OAAcC,MAAyC;CACjF,MAAMK,QAAQP,SAASC,OAAOC,IAAI;CAClC,OAAOK,UAAUC,KAAAA,KAAa,WAAWD,SAAS,OAAOA,MAAME,UAAU,WACnEF,MAAME,QACND,KAAAA;AACV;;AAGA,SAAgBE,WAAWT,OAAuB;CAC9C,OAAOD,SAASC,OAAO,UAAU,MAAMO,KAAAA;AAC3C;;AAGA,SAAgBG,WAAcV,OAAcW,MAAcC,OAAuC;CAC7F,MAAMJ,QAAQR,MAAMc,WAAWH;CAC/B,OAAOC,MAAMJ,KAAK,IAAIA,QAAQD,KAAAA;AAClC;AAEA,IAAaQ,YAAYP,UAAoC,OAAOA,UAAU;AAC9E,IAAaQ,aAAaR,UAAqC,OAAOA,UAAU;AAChF,IAAaS,YAAYT,UACrB,OAAOA,UAAU,YAAY,CAACU,OAAOC,MAAMX,KAAK;;;;;;AAOpD,SAAgBY,cACZC,OACwE;CACxE,MAAM,EAAErB,UAAUqB;CAClB,OAAO;EACHV,MAAMU,MAAMG;EAEZC,OAAOzB,MAAMyB,SAASzB,MAAMW;EAC5Be,aAAa1B,MAAM2B;EACnB,GAAI3B,MAAMuB,gBAAgBhB,KAAAA,IAAY,EAAEgB,aAAavB,MAAMuB,YAAY,IAAI,CAAC;EAC5EK,UAAUnB,WAAWT,KAAK;EAC1B6B,UAAUR,MAAMQ,aAAa,QAAQ7B,MAAM6B,aAAa;EACxDC,UAAUT,MAAMS,aAAa;EAC7BC,QAAQV,MAAMU,UAAU,CAAA;EACxB,GAAIV,MAAMW,WAAWzB,KAAAA,IAAY,EAAEyB,QAAQX,MAAMW,OAAO,IAAI,CAAC;EAC7D,GAAIX,MAAMY,cAAc1B,KAAAA,IAAY,EAAE0B,WAAWZ,MAAMY,UAAU,IAAI,CAAC;CAC1E;AACJ;;AAQA,SAAgBE,UAAUnC,OAA+B;CACrD,IAAIA,MAAMoC,WAAW7B,KAAAA,KAAaP,MAAMoC,OAAOC,SAAS,GACpD,OAAOrC,MAAMoC;CAEjB,MAAMnC,OAAOF,SAASC,OAAO,QAAQ;CACrC,OAAOC,SAASM,KAAAA,KAAa,WAAWN,QAAQqC,MAAMC,QAAQtC,KAAKO,KAAK,IAClEP,KAAKO,MAAMgC,OAAOzB,QAAQ,IAC1B;AACV;;AAGA,SAAgB0B,WAAWzC,OAA6B;CACpD,MAAMC,OAAOF,SAASC,OAAO,SAAS;CACtC,OAAOC,SAASM,KAAAA,KAAa,WAAWN,QAAQgB,SAAShB,KAAKO,KAAK,IAAIP,KAAKO,QAAQ;AACxF"}
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
3
  export interface TextFieldProps extends FieldProps<string> {
4
4
  placeholder?: string;
@@ -12,13 +12,21 @@ export interface TextFieldProps extends FieldProps<string> {
12
12
  type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';
13
13
  inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';
14
14
  autoComplete?: string;
15
+ /**
16
+ * A secret, such as an access key: typed in a password input, hidden until a button shows it,
17
+ * and never filled in by the browser.
18
+ */
19
+ secret?: boolean;
15
20
  controlClassName?: string;
16
21
  inputClassName?: string;
17
22
  }
18
23
  /** The description of a text field, with its character count. */
19
24
  export declare function useCountedDescription(description: ReactNode, value: string | null | undefined, maxLength: number | undefined): ReactNode;
20
25
  /** A single-line text. An empty text is `null`. */
21
- export declare function TextField({ value, onChange, description, maxLength, disabled, readOnly, required, ...props }: TextFieldProps): import("react").JSX.Element;
22
- /** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
26
+ export declare function TextField({ value, onChange, description, maxLength, disabled, readOnly, required, secret, ...props }: TextFieldProps): import("react").JSX.Element;
27
+ /**
28
+ * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`
29
+ * rule.
30
+ */
23
31
  export declare function TextFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
24
32
  //# sourceMappingURL=TextField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/text/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,SAAS,EACtB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAiBX;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAahB;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAepD"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/text/TextField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,SAAS,EACtB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAiBX;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAc,EACd,GAAG,KAAK,EACX,EAAE,cAAc,+BAkChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAiBpD"}
@@ -1,8 +1,10 @@
1
- import { getFieldProps, getRuleNumber, getSetting, isString } from "../shared/entry.js";
1
+ import { getFieldProps, getRuleNumber, getSetting, isBoolean, isString } from "../shared/entry.js";
2
2
  import { messages } from "../shared/messages.js";
3
3
  import { c } from "react/compiler-runtime";
4
- import { TextInput, usePanneauIntl } from "@panneau/ui";
4
+ import { IconButton, TextInput, usePanneauIntl } from "@panneau/ui";
5
+ import { useState } from "react";
5
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ import { Eye, EyeOff } from "lucide-react";
6
8
  //#region src/text/TextField.tsx
7
9
  /** The description of a text field, with its character count. */
8
10
  function useCountedDescription(description, value, maxLength) {
@@ -43,7 +45,7 @@ function useCountedDescription(description, value, maxLength) {
43
45
  }
44
46
  /** A single-line text. An empty text is `null`. */
45
47
  function TextField(t0) {
46
- const $ = c(19);
48
+ const $ = c(26);
47
49
  let description;
48
50
  let disabled;
49
51
  let maxLength;
@@ -51,9 +53,10 @@ function TextField(t0) {
51
53
  let props;
52
54
  let readOnly;
53
55
  let required;
56
+ let t1;
54
57
  let value;
55
58
  if ($[0] !== t0) {
56
- ({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
59
+ ({value, onChange, description, maxLength, disabled, readOnly, required, secret: t1, ...props} = t0);
57
60
  $[0] = t0;
58
61
  $[1] = description;
59
62
  $[2] = disabled;
@@ -62,7 +65,8 @@ function TextField(t0) {
62
65
  $[5] = props;
63
66
  $[6] = readOnly;
64
67
  $[7] = required;
65
- $[8] = value;
68
+ $[8] = t1;
69
+ $[9] = value;
66
70
  } else {
67
71
  description = $[1];
68
72
  disabled = $[2];
@@ -71,41 +75,72 @@ function TextField(t0) {
71
75
  props = $[5];
72
76
  readOnly = $[6];
73
77
  required = $[7];
74
- value = $[8];
78
+ t1 = $[8];
79
+ value = $[9];
75
80
  }
81
+ const secret = t1 === void 0 ? false : t1;
82
+ const intl = usePanneauIntl();
76
83
  const shownDescription = useCountedDescription(description, value, maxLength);
77
- const t1 = value ?? "";
84
+ const [shown, setShown] = useState(false);
78
85
  let t2;
79
- if ($[9] !== onChange) {
80
- t2 = (next) => onChange?.(next === "" ? null : next);
81
- $[9] = onChange;
82
- $[10] = t2;
83
- } else t2 = $[10];
84
- let t3;
85
- if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
86
- t3 = /* @__PURE__ */ jsx(TextInput, {
86
+ if ($[10] !== disabled || $[11] !== intl || $[12] !== secret || $[13] !== shown) {
87
+ t2 = secret ? {
88
+ type: shown ? "text" : "password",
89
+ autoComplete: "new-password",
90
+ spellCheck: "false",
91
+ suffix: /* @__PURE__ */ jsx(IconButton, {
92
+ icon: shown ? EyeOff : Eye,
93
+ label: intl.formatMessage(shown ? messages.hideSecret : messages.showSecret),
94
+ size: "sm",
95
+ "aria-pressed": shown,
96
+ isDisabled: disabled,
97
+ onPress: () => setShown(!shown)
98
+ })
99
+ } : {};
100
+ $[10] = disabled;
101
+ $[11] = intl;
102
+ $[12] = secret;
103
+ $[13] = shown;
104
+ $[14] = t2;
105
+ } else t2 = $[14];
106
+ const secretProps = t2;
107
+ const t3 = value ?? "";
108
+ let t4;
109
+ if ($[15] !== onChange) {
110
+ t4 = (next) => onChange?.(next === "" ? null : next);
111
+ $[15] = onChange;
112
+ $[16] = t4;
113
+ } else t4 = $[16];
114
+ let t5;
115
+ if ($[17] !== disabled || $[18] !== props || $[19] !== readOnly || $[20] !== required || $[21] !== secretProps || $[22] !== shownDescription || $[23] !== t3 || $[24] !== t4) {
116
+ t5 = /* @__PURE__ */ jsx(TextInput, {
87
117
  ...props,
88
- value: t1,
89
- onChange: t2,
118
+ ...secretProps,
119
+ value: t3,
120
+ onChange: t4,
90
121
  description: shownDescription,
91
122
  isDisabled: disabled,
92
123
  isReadOnly: readOnly,
93
124
  isRequired: required
94
125
  });
95
- $[11] = disabled;
96
- $[12] = props;
97
- $[13] = readOnly;
98
- $[14] = required;
99
- $[15] = shownDescription;
100
- $[16] = t1;
101
- $[17] = t2;
102
- $[18] = t3;
103
- } else t3 = $[18];
104
- return t3;
126
+ $[17] = disabled;
127
+ $[18] = props;
128
+ $[19] = readOnly;
129
+ $[20] = required;
130
+ $[21] = secretProps;
131
+ $[22] = shownDescription;
132
+ $[23] = t3;
133
+ $[24] = t4;
134
+ $[25] = t5;
135
+ } else t5 = $[25];
136
+ return t5;
105
137
  }
106
- /** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
138
+ /**
139
+ * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`
140
+ * rule.
141
+ */
107
142
  function TextFieldEntry(props) {
108
- const $ = c(21);
143
+ const $ = c(24);
109
144
  const { field } = props;
110
145
  let t0;
111
146
  if ($[0] !== field) {
@@ -129,49 +164,58 @@ function TextFieldEntry(props) {
129
164
  } else t2 = $[5];
130
165
  const max = t2;
131
166
  let t3;
132
- if ($[6] !== props) {
133
- t3 = getFieldProps(props);
134
- $[6] = props;
167
+ if ($[6] !== field) {
168
+ t3 = getSetting(field, "secret", isBoolean) ?? false;
169
+ $[6] = field;
135
170
  $[7] = t3;
136
171
  } else t3 = $[7];
137
- const t4 = isString(props.value) ? props.value : null;
138
- let t5;
139
- if ($[8] !== max) {
140
- t5 = max !== void 0 ? { maxLength: max } : {};
141
- $[8] = max;
142
- $[9] = t5;
143
- } else t5 = $[9];
172
+ const secret = t3;
173
+ let t4;
174
+ if ($[8] !== props) {
175
+ t4 = getFieldProps(props);
176
+ $[8] = props;
177
+ $[9] = t4;
178
+ } else t4 = $[9];
179
+ const t5 = isString(props.value) ? props.value : null;
144
180
  let t6;
145
- if ($[10] !== prefix) {
146
- t6 = prefix !== void 0 ? { prefix } : {};
147
- $[10] = prefix;
181
+ if ($[10] !== max) {
182
+ t6 = max !== void 0 ? { maxLength: max } : {};
183
+ $[10] = max;
148
184
  $[11] = t6;
149
185
  } else t6 = $[11];
150
186
  let t7;
151
- if ($[12] !== suffix) {
152
- t7 = suffix !== void 0 ? { suffix } : {};
153
- $[12] = suffix;
187
+ if ($[12] !== prefix) {
188
+ t7 = prefix !== void 0 ? { prefix } : {};
189
+ $[12] = prefix;
154
190
  $[13] = t7;
155
191
  } else t7 = $[13];
156
192
  let t8;
157
- if ($[14] !== props.onChange || $[15] !== t3 || $[16] !== t4 || $[17] !== t5 || $[18] !== t6 || $[19] !== t7) {
158
- t8 = /* @__PURE__ */ jsx(TextField, {
159
- ...t3,
160
- value: t4,
193
+ if ($[14] !== suffix) {
194
+ t8 = suffix !== void 0 ? { suffix } : {};
195
+ $[14] = suffix;
196
+ $[15] = t8;
197
+ } else t8 = $[15];
198
+ let t9;
199
+ if ($[16] !== props.onChange || $[17] !== secret || $[18] !== t4 || $[19] !== t5 || $[20] !== t6 || $[21] !== t7 || $[22] !== t8) {
200
+ t9 = /* @__PURE__ */ jsx(TextField, {
201
+ ...t4,
202
+ value: t5,
161
203
  onChange: props.onChange,
162
- ...t5,
163
204
  ...t6,
164
- ...t7
205
+ ...t7,
206
+ ...t8,
207
+ secret
165
208
  });
166
- $[14] = props.onChange;
167
- $[15] = t3;
168
- $[16] = t4;
169
- $[17] = t5;
170
- $[18] = t6;
171
- $[19] = t7;
172
- $[20] = t8;
173
- } else t8 = $[20];
174
- return t8;
209
+ $[16] = props.onChange;
210
+ $[17] = secret;
211
+ $[18] = t4;
212
+ $[19] = t5;
213
+ $[20] = t6;
214
+ $[21] = t7;
215
+ $[22] = t8;
216
+ $[23] = t9;
217
+ } else t9 = $[23];
218
+ return t9;
175
219
  }
176
220
  //#endregion
177
221
  export { TextField, TextFieldEntry, useCountedDescription };
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","names":["ReactNode","TextInput","usePanneauIntl","getFieldProps","getRuleNumber","getSetting","isString","messages","FieldEntryProps","FieldProps","TextFieldProps","placeholder","maxLength","prefix","suffix","type","inputMode","autoComplete","controlClassName","inputClassName","useCountedDescription","description","value","$","_c","intl","undefined","t0","formatMessage","characterCount","count","length","max","t1","t2","TextField","disabled","onChange","props","readOnly","required","shownDescription","next","t3","TextFieldEntry","field","t4","t5","t6","t7","t8","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextInput\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextField.js","names":["Eye","EyeOff","ReactNode","useState","IconButton","TextInput","usePanneauIntl","getFieldProps","getRuleNumber","getSetting","isBoolean","isString","messages","FieldEntryProps","FieldProps","TextFieldProps","placeholder","maxLength","prefix","suffix","type","inputMode","autoComplete","secret","controlClassName","inputClassName","useCountedDescription","description","value","$","_c","intl","undefined","t0","formatMessage","characterCount","count","length","max","t1","t2","TextField","disabled","onChange","props","readOnly","required","shownDescription","shown","setShown","const","spellCheck","hideSecret","showSecret","secretProps","t3","t4","next","t5","TextFieldEntry","field","t6","t7","t8","t9","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import { Eye, EyeOff } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport { IconButton, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isBoolean, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n /**\n * A secret, such as an access key: typed in a password input, hidden until a button shows it,\n * and never filled in by the browser.\n */\n secret?: boolean;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n secret = false,\n ...props\n}: TextFieldProps) {\n const intl = usePanneauIntl();\n const shownDescription = useCountedDescription(description, value, maxLength);\n const [shown, setShown] = useState(false);\n const secretProps = secret\n ? {\n type: shown ? ('text' as const) : ('password' as const),\n // Keeps password managers from filling in the user's own password\n autoComplete: 'new-password',\n spellCheck: 'false',\n suffix: (\n <IconButton\n icon={shown ? EyeOff : Eye}\n label={intl.formatMessage(shown ? messages.hideSecret : messages.showSecret)}\n size=\"sm\"\n aria-pressed={shown}\n isDisabled={disabled}\n onPress={() => setShown(!shown)}\n />\n ),\n }\n : {};\n return (\n <TextInput\n {...props}\n {...secretProps}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/**\n * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`\n * rule.\n */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n const secret = getSetting(field, 'secret', isBoolean) ?? false;\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n secret={secret}\n />\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/fields",
3
- "version": "5.0.0-alpha.8",
3
+ "version": "5.0.0-alpha.9",
4
4
  "description": "Controlled field components of Panneau for the protocol's built-in field types, one subpath per field, and uploads to storage (Uppy 6 in its own entry point).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -178,9 +178,9 @@
178
178
  },
179
179
  "dependencies": {
180
180
  "@internationalized/date": "^3.12.4",
181
- "@panneau/intl": "5.0.0-alpha.8",
182
- "@panneau/protocol": "5.0.0-alpha.8",
183
- "@panneau/ui": "5.0.0-alpha.8",
181
+ "@panneau/intl": "5.0.0-alpha.9",
182
+ "@panneau/protocol": "5.0.0-alpha.9",
183
+ "@panneau/ui": "5.0.0-alpha.9",
184
184
  "leaflet": "^1.9.4",
185
185
  "lucide-react": "^1.57.0"
186
186
  },