mogh_ui 1.3.1 → 1.3.3

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.
@@ -44,18 +44,34 @@ function ConfigGroup({
44
44
  }
45
45
  switch (value !== void 0 && value !== null ? typeof value : args?.type) {
46
46
  case "string":
47
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
48
- import_item.ConfigInput,
49
- {
50
- label: args?.label ?? key,
51
- value,
52
- onValueChange: (value2) => setUpdate({ [key]: value2 }),
53
- disabled: args?.disabled || disabled,
54
- placeholder: args?.placeholder,
55
- description: args?.description
56
- },
57
- key
58
- );
47
+ if (args?.options) {
48
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49
+ import_item.ConfigSelector,
50
+ {
51
+ label: args?.label ?? key,
52
+ value,
53
+ options: args.options,
54
+ onValueChange: (value2) => setUpdate({ [key]: value2 }),
55
+ disabled: args?.disabled || disabled,
56
+ placeholder: args?.placeholder,
57
+ description: args?.description
58
+ },
59
+ key
60
+ );
61
+ } else {
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
+ import_item.ConfigInput,
64
+ {
65
+ label: args?.label ?? key,
66
+ value,
67
+ onValueChange: (value2) => setUpdate({ [key]: value2 }),
68
+ disabled: args?.disabled || disabled,
69
+ placeholder: args?.placeholder,
70
+ description: args?.description
71
+ },
72
+ key
73
+ );
74
+ }
59
75
  case "number":
60
76
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
77
  import_item.ConfigInput,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/group.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { ConfigFieldArgs, ConfigGroupArgs } from \".\";\nimport { ConfigInput, ConfigSwitch } from \"./item\";\nimport { Group, Stack } from \"@mantine/core\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport function ConfigGroup<T>({\n config,\n update,\n setUpdate,\n disabled,\n fields,\n}: {\n config: T;\n update: Partial<T>;\n setUpdate: (update: Partial<T>) => void;\n disabled: boolean;\n fields: ConfigGroupArgs<T>[\"fields\"];\n}) {\n return (\n <Stack gap=\"xl\">\n {Object.entries(fields).map(([key, field]) => {\n const value =\n (update as { [key: string]: unknown })[key] ??\n (config as { [key: string]: unknown })[key];\n if (typeof field === \"function\") {\n return <Fragment key={key}>{field(value, setUpdate)}</Fragment>;\n } else if (typeof field === \"object\" || field === true) {\n const args =\n typeof field === \"object\" ? (field as ConfigFieldArgs) : undefined;\n\n if (args?.hidden) {\n return null;\n }\n\n switch (\n value !== undefined && value !== null ? typeof value : args?.type\n ) {\n case \"string\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={value as string}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"number\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={Number(value)}\n onValueChange={(value) =>\n setUpdate({ [key]: Number(value) } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"boolean\":\n return (\n <ConfigSwitch\n key={key}\n label={args?.label ?? key}\n value={value as boolean}\n onCheckedChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n description={args?.description}\n />\n );\n\n default:\n return (\n <Group>\n Config '{args?.label ?? key}':{\" \"}\n <CircleQuestionMark size=\"1rem\" />\n </Group>\n );\n }\n } else {\n return <Fragment key={key} />;\n }\n })}\n </Stack>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BiB;AA1BjB,mBAAyB;AAEzB,kBAA0C;AAC1C,kBAA6B;AAC7B,0BAAmC;AAE5B,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,4CAAC,qBAAM,KAAI,MACR,iBAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,UAAM,QACH,OAAsC,GAAG,KACzC,OAAsC,GAAG;AAC5C,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,4CAAC,yBAAoB,gBAAM,OAAO,SAAS,KAA5B,GAA8B;AAAA,IACtD,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,YAAM,OACJ,OAAO,UAAU,WAAY,QAA4B;AAE3D,UAAI,MAAM,QAAQ;AAChB,eAAO;AAAA,MACT;AAEA,cACE,UAAU,UAAa,UAAU,OAAO,OAAO,QAAQ,MAAM,MAC7D;AAAA,QACA,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB,OAAO,OAAO,KAAK;AAAA,cACnB,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAG,OAAOA,MAAK,EAAE,CAAe;AAAA,cAElD,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,iBAAiB,CAACA,WAChB,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA;AAAA,YAPd;AAAA,UAQP;AAAA,QAGJ;AACE,iBACE,6CAAC,qBAAM;AAAA;AAAA,YACI,MAAM,SAAS;AAAA,YAAI;AAAA,YAAG;AAAA,YAC/B,4CAAC,0CAAmB,MAAK,QAAO;AAAA,aAClC;AAAA,MAEN;AAAA,IACF,OAAO;AACL,aAAO,4CAAC,2BAAc,GAAK;AAAA,IAC7B;AAAA,EACF,CAAC,GACH;AAEJ;","names":["value"]}
1
+ {"version":3,"sources":["../../../src/components/config/group.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { ConfigFieldArgs, ConfigGroupArgs } from \".\";\nimport { ConfigInput, ConfigSelector, ConfigSwitch } from \"./item\";\nimport { Group, Stack } from \"@mantine/core\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport function ConfigGroup<T>({\n config,\n update,\n setUpdate,\n disabled,\n fields,\n}: {\n config: T;\n update: Partial<T>;\n setUpdate: (update: Partial<T>) => void;\n disabled: boolean;\n fields: ConfigGroupArgs<T>[\"fields\"];\n}) {\n return (\n <Stack gap=\"xl\">\n {Object.entries(fields).map(([key, field]) => {\n const value =\n (update as { [key: string]: unknown })[key] ??\n (config as { [key: string]: unknown })[key];\n if (typeof field === \"function\") {\n return <Fragment key={key}>{field(value, setUpdate)}</Fragment>;\n } else if (typeof field === \"object\" || field === true) {\n const args =\n typeof field === \"object\" ? (field as ConfigFieldArgs) : undefined;\n\n if (args?.hidden) {\n return null;\n }\n\n switch (\n value !== undefined && value !== null ? typeof value : args?.type\n ) {\n case \"string\":\n if (args?.options) {\n return (\n <ConfigSelector\n key={key}\n label={args?.label ?? key}\n value={value as string}\n options={args.options}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n } else {\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={value as string}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n }\n\n case \"number\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={Number(value)}\n onValueChange={(value) =>\n setUpdate({ [key]: Number(value) } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"boolean\":\n return (\n <ConfigSwitch\n key={key}\n label={args?.label ?? key}\n value={value as boolean}\n onCheckedChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n description={args?.description}\n />\n );\n\n default:\n return (\n <Group>\n Config '{args?.label ?? key}':{\" \"}\n <CircleQuestionMark size=\"1rem\" />\n </Group>\n );\n }\n } else {\n return <Fragment key={key} />;\n }\n })}\n </Stack>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BiB;AA1BjB,mBAAyB;AAEzB,kBAA0D;AAC1D,kBAA6B;AAC7B,0BAAmC;AAE5B,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,4CAAC,qBAAM,KAAI,MACR,iBAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,UAAM,QACH,OAAsC,GAAG,KACzC,OAAsC,GAAG;AAC5C,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,4CAAC,yBAAoB,gBAAM,OAAO,SAAS,KAA5B,GAA8B;AAAA,IACtD,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,YAAM,OACJ,OAAO,UAAU,WAAY,QAA4B;AAE3D,UAAI,MAAM,QAAQ;AAChB,eAAO;AAAA,MACT;AAEA,cACE,UAAU,UAAa,UAAU,OAAO,OAAO,QAAQ,MAAM,MAC7D;AAAA,QACA,KAAK;AACH,cAAI,MAAM,SAAS;AACjB,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,MAAM,SAAS;AAAA,gBACtB;AAAA,gBACA,SAAS,KAAK;AAAA,gBACd,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,gBAE1C,UAAU,MAAM,YAAY;AAAA,gBAC5B,aAAa,MAAM;AAAA,gBACnB,aAAa,MAAM;AAAA;AAAA,cATd;AAAA,YAUP;AAAA,UAEJ,OAAO;AACL,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,MAAM,SAAS;AAAA,gBACtB;AAAA,gBACA,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,gBAE1C,UAAU,MAAM,YAAY;AAAA,gBAC5B,aAAa,MAAM;AAAA,gBACnB,aAAa,MAAM;AAAA;AAAA,cARd;AAAA,YASP;AAAA,UAEJ;AAAA,QAEF,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB,OAAO,OAAO,KAAK;AAAA,cACnB,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAG,OAAOA,MAAK,EAAE,CAAe;AAAA,cAElD,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,iBAAiB,CAACA,WAChB,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA;AAAA,YAPd;AAAA,UAQP;AAAA,QAGJ;AACE,iBACE,6CAAC,qBAAM;AAAA;AAAA,YACI,MAAM,SAAS;AAAA,YAAI;AAAA,YAAG;AAAA,YAC/B,4CAAC,0CAAmB,MAAK,QAAO;AAAA,aAClC;AAAA,MAEN;AAAA,IACF,OAAO;AACL,aAAO,4CAAC,2BAAc,GAAK;AAAA,IAC7B;AAAA,EACF,CAAC,GACH;AAEJ;","names":["value"]}
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/components/config/group.tsx"],"names":[],"mappings":"AACA,OAAO,EAAmB,eAAe,EAAE,MAAM,GAAG,CAAC;AAKrD,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAC7B,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,GACP,EAAE;IACD,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;CACtC,+BA8EA"}
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/components/config/group.tsx"],"names":[],"mappings":"AACA,OAAO,EAAmB,eAAe,EAAE,MAAM,GAAG,CAAC;AAKrD,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAC7B,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,GACP,EAAE;IACD,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;CACtC,+BA+FA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Fragment } from "react";
3
- import { ConfigInput, ConfigSwitch } from "./item";
3
+ import { ConfigInput, ConfigSelector, ConfigSwitch } from "./item";
4
4
  import { Group, Stack } from "@mantine/core";
5
5
  import { CircleQuestionMark } from "lucide-react";
6
6
  function ConfigGroup({
@@ -21,18 +21,34 @@ function ConfigGroup({
21
21
  }
22
22
  switch (value !== void 0 && value !== null ? typeof value : args?.type) {
23
23
  case "string":
24
- return /* @__PURE__ */ jsx(
25
- ConfigInput,
26
- {
27
- label: args?.label ?? key,
28
- value,
29
- onValueChange: (value2) => setUpdate({ [key]: value2 }),
30
- disabled: args?.disabled || disabled,
31
- placeholder: args?.placeholder,
32
- description: args?.description
33
- },
34
- key
35
- );
24
+ if (args?.options) {
25
+ return /* @__PURE__ */ jsx(
26
+ ConfigSelector,
27
+ {
28
+ label: args?.label ?? key,
29
+ value,
30
+ options: args.options,
31
+ onValueChange: (value2) => setUpdate({ [key]: value2 }),
32
+ disabled: args?.disabled || disabled,
33
+ placeholder: args?.placeholder,
34
+ description: args?.description
35
+ },
36
+ key
37
+ );
38
+ } else {
39
+ return /* @__PURE__ */ jsx(
40
+ ConfigInput,
41
+ {
42
+ label: args?.label ?? key,
43
+ value,
44
+ onValueChange: (value2) => setUpdate({ [key]: value2 }),
45
+ disabled: args?.disabled || disabled,
46
+ placeholder: args?.placeholder,
47
+ description: args?.description
48
+ },
49
+ key
50
+ );
51
+ }
36
52
  case "number":
37
53
  return /* @__PURE__ */ jsx(
38
54
  ConfigInput,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/group.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { ConfigFieldArgs, ConfigGroupArgs } from \".\";\nimport { ConfigInput, ConfigSwitch } from \"./item\";\nimport { Group, Stack } from \"@mantine/core\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport function ConfigGroup<T>({\n config,\n update,\n setUpdate,\n disabled,\n fields,\n}: {\n config: T;\n update: Partial<T>;\n setUpdate: (update: Partial<T>) => void;\n disabled: boolean;\n fields: ConfigGroupArgs<T>[\"fields\"];\n}) {\n return (\n <Stack gap=\"xl\">\n {Object.entries(fields).map(([key, field]) => {\n const value =\n (update as { [key: string]: unknown })[key] ??\n (config as { [key: string]: unknown })[key];\n if (typeof field === \"function\") {\n return <Fragment key={key}>{field(value, setUpdate)}</Fragment>;\n } else if (typeof field === \"object\" || field === true) {\n const args =\n typeof field === \"object\" ? (field as ConfigFieldArgs) : undefined;\n\n if (args?.hidden) {\n return null;\n }\n\n switch (\n value !== undefined && value !== null ? typeof value : args?.type\n ) {\n case \"string\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={value as string}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"number\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={Number(value)}\n onValueChange={(value) =>\n setUpdate({ [key]: Number(value) } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"boolean\":\n return (\n <ConfigSwitch\n key={key}\n label={args?.label ?? key}\n value={value as boolean}\n onCheckedChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n description={args?.description}\n />\n );\n\n default:\n return (\n <Group>\n Config '{args?.label ?? key}':{\" \"}\n <CircleQuestionMark size=\"1rem\" />\n </Group>\n );\n }\n } else {\n return <Fragment key={key} />;\n }\n })}\n </Stack>\n );\n}\n"],"mappings":"AA0BiB,cA0DD,YA1DC;AA1BjB,SAAS,gBAAgB;AAEzB,SAAS,aAAa,oBAAoB;AAC1C,SAAS,OAAO,aAAa;AAC7B,SAAS,0BAA0B;AAE5B,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,oBAAC,SAAM,KAAI,MACR,iBAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,UAAM,QACH,OAAsC,GAAG,KACzC,OAAsC,GAAG;AAC5C,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,oBAAC,YAAoB,gBAAM,OAAO,SAAS,KAA5B,GAA8B;AAAA,IACtD,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,YAAM,OACJ,OAAO,UAAU,WAAY,QAA4B;AAE3D,UAAI,MAAM,QAAQ;AAChB,eAAO;AAAA,MACT;AAEA,cACE,UAAU,UAAa,UAAU,OAAO,OAAO,QAAQ,MAAM,MAC7D;AAAA,QACA,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB,OAAO,OAAO,KAAK;AAAA,cACnB,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAG,OAAOA,MAAK,EAAE,CAAe;AAAA,cAElD,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,iBAAiB,CAACA,WAChB,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA;AAAA,YAPd;AAAA,UAQP;AAAA,QAGJ;AACE,iBACE,qBAAC,SAAM;AAAA;AAAA,YACI,MAAM,SAAS;AAAA,YAAI;AAAA,YAAG;AAAA,YAC/B,oBAAC,sBAAmB,MAAK,QAAO;AAAA,aAClC;AAAA,MAEN;AAAA,IACF,OAAO;AACL,aAAO,oBAAC,cAAc,GAAK;AAAA,IAC7B;AAAA,EACF,CAAC,GACH;AAEJ;","names":["value"]}
1
+ {"version":3,"sources":["../../../src/components/config/group.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { ConfigFieldArgs, ConfigGroupArgs } from \".\";\nimport { ConfigInput, ConfigSelector, ConfigSwitch } from \"./item\";\nimport { Group, Stack } from \"@mantine/core\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport function ConfigGroup<T>({\n config,\n update,\n setUpdate,\n disabled,\n fields,\n}: {\n config: T;\n update: Partial<T>;\n setUpdate: (update: Partial<T>) => void;\n disabled: boolean;\n fields: ConfigGroupArgs<T>[\"fields\"];\n}) {\n return (\n <Stack gap=\"xl\">\n {Object.entries(fields).map(([key, field]) => {\n const value =\n (update as { [key: string]: unknown })[key] ??\n (config as { [key: string]: unknown })[key];\n if (typeof field === \"function\") {\n return <Fragment key={key}>{field(value, setUpdate)}</Fragment>;\n } else if (typeof field === \"object\" || field === true) {\n const args =\n typeof field === \"object\" ? (field as ConfigFieldArgs) : undefined;\n\n if (args?.hidden) {\n return null;\n }\n\n switch (\n value !== undefined && value !== null ? typeof value : args?.type\n ) {\n case \"string\":\n if (args?.options) {\n return (\n <ConfigSelector\n key={key}\n label={args?.label ?? key}\n value={value as string}\n options={args.options}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n } else {\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={value as string}\n onValueChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n }\n\n case \"number\":\n return (\n <ConfigInput\n key={key}\n label={args?.label ?? key}\n value={Number(value)}\n onValueChange={(value) =>\n setUpdate({ [key]: Number(value) } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n placeholder={args?.placeholder}\n description={args?.description}\n />\n );\n\n case \"boolean\":\n return (\n <ConfigSwitch\n key={key}\n label={args?.label ?? key}\n value={value as boolean}\n onCheckedChange={(value) =>\n setUpdate({ [key]: value } as Partial<T>)\n }\n disabled={args?.disabled || disabled}\n description={args?.description}\n />\n );\n\n default:\n return (\n <Group>\n Config '{args?.label ?? key}':{\" \"}\n <CircleQuestionMark size=\"1rem\" />\n </Group>\n );\n }\n } else {\n return <Fragment key={key} />;\n }\n })}\n </Stack>\n );\n}\n"],"mappings":"AA0BiB,cA2ED,YA3EC;AA1BjB,SAAS,gBAAgB;AAEzB,SAAS,aAAa,gBAAgB,oBAAoB;AAC1D,SAAS,OAAO,aAAa;AAC7B,SAAS,0BAA0B;AAE5B,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,oBAAC,SAAM,KAAI,MACR,iBAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,UAAM,QACH,OAAsC,GAAG,KACzC,OAAsC,GAAG;AAC5C,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,oBAAC,YAAoB,gBAAM,OAAO,SAAS,KAA5B,GAA8B;AAAA,IACtD,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,YAAM,OACJ,OAAO,UAAU,WAAY,QAA4B;AAE3D,UAAI,MAAM,QAAQ;AAChB,eAAO;AAAA,MACT;AAEA,cACE,UAAU,UAAa,UAAU,OAAO,OAAO,QAAQ,MAAM,MAC7D;AAAA,QACA,KAAK;AACH,cAAI,MAAM,SAAS;AACjB,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,MAAM,SAAS;AAAA,gBACtB;AAAA,gBACA,SAAS,KAAK;AAAA,gBACd,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,gBAE1C,UAAU,MAAM,YAAY;AAAA,gBAC5B,aAAa,MAAM;AAAA,gBACnB,aAAa,MAAM;AAAA;AAAA,cATd;AAAA,YAUP;AAAA,UAEJ,OAAO;AACL,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,MAAM,SAAS;AAAA,gBACtB;AAAA,gBACA,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,gBAE1C,UAAU,MAAM,YAAY;AAAA,gBAC5B,aAAa,MAAM;AAAA,gBACnB,aAAa,MAAM;AAAA;AAAA,cARd;AAAA,YASP;AAAA,UAEJ;AAAA,QAEF,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB,OAAO,OAAO,KAAK;AAAA,cACnB,eAAe,CAACA,WACd,UAAU,EAAE,CAAC,GAAG,GAAG,OAAOA,MAAK,EAAE,CAAe;AAAA,cAElD,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA,cACnB,aAAa,MAAM;AAAA;AAAA,YARd;AAAA,UASP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,MAAM,SAAS;AAAA,cACtB;AAAA,cACA,iBAAiB,CAACA,WAChB,UAAU,EAAE,CAAC,GAAG,GAAGA,OAAM,CAAe;AAAA,cAE1C,UAAU,MAAM,YAAY;AAAA,cAC5B,aAAa,MAAM;AAAA;AAAA,YAPd;AAAA,UAQP;AAAA,QAGJ;AACE,iBACE,qBAAC,SAAM;AAAA;AAAA,YACI,MAAM,SAAS;AAAA,YAAI;AAAA,YAAG;AAAA,YAC/B,oBAAC,sBAAmB,MAAK,QAAO;AAAA,aAClC;AAAA,MAEN;AAAA,IACF,OAAO;AACL,aAAO,oBAAC,cAAc,GAAK;AAAA,IAC7B;AAAA,EACF,CAAC,GACH;AAEJ;","names":["value"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/index.tsx"],"sourcesContent":["import { Fragment, ReactNode, SetStateAction, useMemo } from \"react\";\nimport { MonacoLanguage } from \"../monaco\";\nimport {\n Anchor,\n Box,\n Button,\n Flex,\n Group,\n ScrollArea,\n Select,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { ConfirmUpdate } from \"./confirm\";\nimport { Bookmark, History } from \"lucide-react\";\nimport { ConfigGroup } from \"./group\";\nimport { UnsavedChanges } from \"./unsaved-changes\";\nimport { ConfigLayout } from \"./layout\";\nimport { SectionProps } from \"../section\";\n\nexport * from \"./confirm\";\nexport * from \"./group\";\nexport * from \"./item\";\nexport * from \"./layout\";\nexport * from \"./unsaved-changes\";\n\nexport interface ConfigFieldArgs {\n label?: string;\n description?: ReactNode;\n /** Useful to set explicitly in cases where value is nullable from the API (so type cannot be inferred). */\n type?:\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n /** Use a selector instead of input */\n options?: { value: string; label?: string; icon?: ReactNode }[];\n placeholder?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport interface ConfigGroupArgs<T> {\n label: string;\n labelExtra?: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n hidden?: boolean;\n labelHidden?: boolean;\n contentHidden?: boolean;\n fields: {\n [K in keyof Partial<T>]:\n | boolean\n | ConfigFieldArgs\n | ((value: T[K], set: (value: Partial<T>) => void) => ReactNode);\n };\n}\n\nexport interface ConfigProps<T> extends SectionProps {\n original: T;\n update: Partial<T>;\n setUpdate: React.Dispatch<SetStateAction<Partial<T>>>;\n disabled: boolean;\n onSave: () => Promise<unknown>;\n disableSidebar?: boolean;\n fileContentsLanguage?: MonacoLanguage;\n enableFancyToml?: boolean;\n groups: Record<\n string, // Section key\n ConfigGroupArgs<T>[] | false | undefined\n >;\n}\n\nexport function Config<T>({\n original,\n update,\n setUpdate,\n disabled,\n onSave,\n disableSidebar,\n fileContentsLanguage,\n enableFancyToml,\n groups: _groups,\n ...sectionProps\n}: ConfigProps<T>) {\n const changesMade = Object.keys(update).length ? true : false;\n const onConfirm = async () => {\n await onSave();\n setUpdate({});\n };\n const onReset = () => setUpdate({});\n\n const groups = useMemo(\n () => Object.entries(_groups).filter(([_, groupArgs]) => !!groupArgs),\n [_groups],\n );\n\n const GroupsComponent = useMemo(\n () =>\n groups.map(([group, groupArgs]) => {\n return (\n <Fragment key={group}>\n {group && (\n <Text visibleFrom=\"lg\" fz=\"h2\" tt=\"uppercase\" mt=\"xl\">\n {group}\n </Text>\n )}\n\n <Stack>\n {(groupArgs as ConfigGroupArgs<T>[])\n .filter(({ hidden }) => !hidden)\n .map(\n ({\n label,\n labelHidden,\n icon,\n labelExtra,\n actions,\n description,\n contentHidden,\n fields,\n }) => (\n <Stack\n key={group + label}\n id={group + label}\n p=\"xl\"\n gap=\"md\"\n className=\"bordered-light\"\n bdrs=\"md\"\n style={{ scrollMarginTop: 94 }}\n >\n {!labelHidden && (\n <Group justify=\"space-between\">\n <Stack gap=\"0\">\n <Group>\n {icon}\n <Text fz=\"h3\">{label}</Text>\n {labelExtra}\n </Group>\n {description && (\n <Text c=\"dimmed\">{description}</Text>\n )}\n </Stack>\n {actions}\n </Group>\n )}\n {!contentHidden && (\n <ConfigGroup\n config={original}\n update={update}\n setUpdate={(u) => setUpdate((p) => ({ ...p, ...u }))}\n fields={fields}\n disabled={disabled}\n />\n )}\n </Stack>\n ),\n )}\n </Stack>\n </Fragment>\n );\n }),\n [groups],\n );\n\n const SaveOrReset = ({\n unsavedIndicator,\n fullWidth,\n }: {\n unsavedIndicator?: boolean;\n fullWidth?: boolean;\n }) =>\n changesMade && (\n <>\n {unsavedIndicator && <UnsavedChanges fullWidth={fullWidth} />}\n <Button\n variant=\"outline\"\n onClick={onReset}\n disabled={disabled || !changesMade}\n leftSection={<History size=\"1rem\" />}\n fullWidth={fullWidth}\n w={fullWidth ? undefined : 100}\n >\n Reset\n </Button>\n <ConfirmUpdate\n original={original}\n update={update}\n onConfirm={onConfirm}\n disabled={disabled}\n fileContentsLanguage={fileContentsLanguage}\n fullWidth={fullWidth}\n enableFancyToml={enableFancyToml}\n />\n </>\n );\n\n const SaveOrResetComponent = changesMade && (\n <>\n <Group visibleFrom=\"xs\" justify=\"flex-end\">\n <SaveOrReset unsavedIndicator />\n </Group>\n <Stack hiddenFrom=\"xs\">\n <SaveOrReset unsavedIndicator fullWidth />\n </Stack>\n </>\n );\n\n return (\n <ConfigLayout SaveOrReset={SaveOrResetComponent} {...sectionProps}>\n {disableSidebar && (\n <>\n {GroupsComponent}\n {SaveOrResetComponent}\n </>\n )}\n {!disableSidebar && (\n <Flex w=\"100%\" gap=\"md\" direction={{ base: \"column\", lg: \"row\" }}>\n {/** SIDEBAR (LG) */}\n <Box\n visibleFrom=\"lg\"\n pos=\"relative\"\n className=\"bordered-light\"\n style={{\n borderLeftWidth: 0,\n borderBottomWidth: 0,\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Stack pos=\"sticky\" w={175} top={88} pb={24} m=\"lg\">\n {/** ANCHORS */}\n <ScrollArea\n mah={\n changesMade ? \"calc(100vh - 220px)\" : \"calc(100vh - 130px)\"\n }\n >\n <Stack>\n {groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => (\n <Stack key={group} gap=\"xs\">\n <Group justify=\"flex-end\" mr=\"md\" c=\"dimmed\">\n <Bookmark size=\"1rem\" />\n <Text tt=\"uppercase\">{group || \"GENERAL\"}</Text>\n </Group>\n <Stack gap=\"0.1rem\">\n {groupArgs &&\n groupArgs\n .filter((groupArgs) => !groupArgs.hidden)\n .map((groupArgs) => (\n <Button\n key={group + groupArgs.label}\n variant=\"subtle\"\n justify=\"flex-end\"\n size=\"sm\"\n fullWidth\n renderRoot={(props) => (\n <Anchor\n href={\"#\" + group + groupArgs.label}\n {...props}\n />\n )}\n >\n {groupArgs.label}\n </Button>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n </ScrollArea>\n\n {/** SAVE */}\n <Stack gap=\"xs\">\n <SaveOrReset fullWidth />\n </Stack>\n </Stack>\n </Box>\n\n {/** SELECTOR (MOBILE) */}\n <Select\n hiddenFrom=\"lg\"\n className=\"select-nondimmed-placeholder\"\n placeholder=\"Go To\"\n leftSection={<Bookmark size=\"1rem\" />}\n value={null}\n data={groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => ({\n group,\n items: (groupArgs as ConfigGroupArgs<T>[]).map((arg) => ({\n label: arg.label,\n value: group + arg.label,\n })),\n }))}\n onChange={(group) => {\n if (!group) return;\n window.location.hash = group;\n }}\n />\n\n {/** CONTENT */}\n <Stack style={{ flexGrow: 1 }} gap=\"md\">\n {GroupsComponent}\n {SaveOrResetComponent}\n </Stack>\n </Flex>\n )}\n </ConfigLayout>\n );\n}\n"],"mappings":"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","names":["groupArgs"]}
1
+ {"version":3,"sources":["../../../src/components/config/index.tsx"],"sourcesContent":["import { Fragment, ReactNode, SetStateAction, useMemo } from \"react\";\nimport { MonacoLanguage } from \"../monaco\";\nimport {\n Anchor,\n Box,\n Button,\n Flex,\n Group,\n ScrollArea,\n Select,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { ConfirmUpdate } from \"./confirm\";\nimport { Bookmark, History } from \"lucide-react\";\nimport { ConfigGroup } from \"./group\";\nimport { UnsavedChanges } from \"./unsaved-changes\";\nimport { ConfigLayout } from \"./layout\";\nimport { SectionProps } from \"../section\";\n\nexport * from \"./confirm\";\nexport * from \"./group\";\nexport * from \"./item\";\nexport * from \"./layout\";\nexport * from \"./unsaved-changes\";\n\nexport interface ConfigFieldArgs {\n label?: string;\n description?: ReactNode;\n /** Useful to set explicitly in cases where value is nullable from the API (so type cannot be inferred). */\n type?:\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n /** Use a selector instead of input */\n options?: { value: string; label?: string }[];\n placeholder?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport interface ConfigGroupArgs<T> {\n label: string;\n labelExtra?: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n hidden?: boolean;\n labelHidden?: boolean;\n contentHidden?: boolean;\n fields: {\n [K in keyof Partial<T>]:\n | boolean\n | ConfigFieldArgs\n | ((value: T[K], set: (value: Partial<T>) => void) => ReactNode);\n };\n}\n\nexport interface ConfigProps<T> extends SectionProps {\n original: T;\n update: Partial<T>;\n setUpdate: React.Dispatch<SetStateAction<Partial<T>>>;\n disabled: boolean;\n onSave: () => Promise<unknown>;\n disableSidebar?: boolean;\n fileContentsLanguage?: MonacoLanguage;\n enableFancyToml?: boolean;\n groups: Record<\n string, // Section key\n ConfigGroupArgs<T>[] | false | undefined\n >;\n}\n\nexport function Config<T>({\n original,\n update,\n setUpdate,\n disabled,\n onSave,\n disableSidebar,\n fileContentsLanguage,\n enableFancyToml,\n groups: _groups,\n ...sectionProps\n}: ConfigProps<T>) {\n const changesMade = Object.keys(update).length ? true : false;\n const onConfirm = async () => {\n await onSave();\n setUpdate({});\n };\n const onReset = () => setUpdate({});\n\n const groups = useMemo(\n () => Object.entries(_groups).filter(([_, groupArgs]) => !!groupArgs),\n [_groups],\n );\n\n const GroupsComponent = useMemo(\n () =>\n groups.map(([group, groupArgs]) => {\n return (\n <Fragment key={group}>\n {group && (\n <Text visibleFrom=\"lg\" fz=\"h2\" tt=\"uppercase\" mt=\"xl\">\n {group}\n </Text>\n )}\n\n <Stack>\n {(groupArgs as ConfigGroupArgs<T>[])\n .filter(({ hidden }) => !hidden)\n .map(\n ({\n label,\n labelHidden,\n icon,\n labelExtra,\n actions,\n description,\n contentHidden,\n fields,\n }) => (\n <Stack\n key={group + label}\n id={group + label}\n p=\"xl\"\n gap=\"md\"\n className=\"bordered-light\"\n bdrs=\"md\"\n style={{ scrollMarginTop: 94 }}\n >\n {!labelHidden && (\n <Group justify=\"space-between\">\n <Stack gap=\"0\">\n <Group>\n {icon}\n <Text fz=\"h3\">{label}</Text>\n {labelExtra}\n </Group>\n {description && (\n <Text c=\"dimmed\">{description}</Text>\n )}\n </Stack>\n {actions}\n </Group>\n )}\n {!contentHidden && (\n <ConfigGroup\n config={original}\n update={update}\n setUpdate={(u) => setUpdate((p) => ({ ...p, ...u }))}\n fields={fields}\n disabled={disabled}\n />\n )}\n </Stack>\n ),\n )}\n </Stack>\n </Fragment>\n );\n }),\n [groups],\n );\n\n const SaveOrReset = ({\n unsavedIndicator,\n fullWidth,\n }: {\n unsavedIndicator?: boolean;\n fullWidth?: boolean;\n }) =>\n changesMade && (\n <>\n {unsavedIndicator && <UnsavedChanges fullWidth={fullWidth} />}\n <Button\n variant=\"outline\"\n onClick={onReset}\n disabled={disabled || !changesMade}\n leftSection={<History size=\"1rem\" />}\n fullWidth={fullWidth}\n w={fullWidth ? undefined : 100}\n >\n Reset\n </Button>\n <ConfirmUpdate\n original={original}\n update={update}\n onConfirm={onConfirm}\n disabled={disabled}\n fileContentsLanguage={fileContentsLanguage}\n fullWidth={fullWidth}\n enableFancyToml={enableFancyToml}\n />\n </>\n );\n\n const SaveOrResetComponent = changesMade && (\n <>\n <Group visibleFrom=\"xs\" justify=\"flex-end\">\n <SaveOrReset unsavedIndicator />\n </Group>\n <Stack hiddenFrom=\"xs\">\n <SaveOrReset unsavedIndicator fullWidth />\n </Stack>\n </>\n );\n\n return (\n <ConfigLayout SaveOrReset={SaveOrResetComponent} {...sectionProps}>\n {disableSidebar && (\n <>\n {GroupsComponent}\n {SaveOrResetComponent}\n </>\n )}\n {!disableSidebar && (\n <Flex w=\"100%\" gap=\"md\" direction={{ base: \"column\", lg: \"row\" }}>\n {/** SIDEBAR (LG) */}\n <Box\n visibleFrom=\"lg\"\n pos=\"relative\"\n className=\"bordered-light\"\n style={{\n borderLeftWidth: 0,\n borderBottomWidth: 0,\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Stack pos=\"sticky\" w={175} top={88} pb={24} m=\"lg\">\n {/** ANCHORS */}\n <ScrollArea\n mah={\n changesMade ? \"calc(100vh - 220px)\" : \"calc(100vh - 130px)\"\n }\n >\n <Stack>\n {groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => (\n <Stack key={group} gap=\"xs\">\n <Group justify=\"flex-end\" mr=\"md\" c=\"dimmed\">\n <Bookmark size=\"1rem\" />\n <Text tt=\"uppercase\">{group || \"GENERAL\"}</Text>\n </Group>\n <Stack gap=\"0.1rem\">\n {groupArgs &&\n groupArgs\n .filter((groupArgs) => !groupArgs.hidden)\n .map((groupArgs) => (\n <Button\n key={group + groupArgs.label}\n variant=\"subtle\"\n justify=\"flex-end\"\n size=\"sm\"\n fullWidth\n renderRoot={(props) => (\n <Anchor\n href={\"#\" + group + groupArgs.label}\n {...props}\n />\n )}\n >\n {groupArgs.label}\n </Button>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n </ScrollArea>\n\n {/** SAVE */}\n <Stack gap=\"xs\">\n <SaveOrReset fullWidth />\n </Stack>\n </Stack>\n </Box>\n\n {/** SELECTOR (MOBILE) */}\n <Select\n hiddenFrom=\"lg\"\n className=\"select-nondimmed-placeholder\"\n placeholder=\"Go To\"\n leftSection={<Bookmark size=\"1rem\" />}\n value={null}\n data={groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => ({\n group,\n items: (groupArgs as ConfigGroupArgs<T>[]).map((arg) => ({\n label: arg.label,\n value: group + arg.label,\n })),\n }))}\n onChange={(group) => {\n if (!group) return;\n window.location.hash = group;\n }}\n />\n\n {/** CONTENT */}\n <Stack style={{ flexGrow: 1 }} gap=\"md\">\n {GroupsComponent}\n {SaveOrResetComponent}\n </Stack>\n </Flex>\n )}\n </ConfigLayout>\n );\n}\n"],"mappings":"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","names":["groupArgs"]}
@@ -15,7 +15,6 @@ export interface ConfigFieldArgs {
15
15
  options?: {
16
16
  value: string;
17
17
  label?: string;
18
- icon?: ReactNode;
19
18
  }[];
20
19
  placeholder?: string;
21
20
  hidden?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/config/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,cAAc,EAAW,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAiB3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2GAA2G;IAC3G,IAAI,CAAC,EACD,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;IACf,sCAAsC;IACtC,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE;SACL,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,GACP,eAAe,GACf,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,SAAS,CAAC;KACnE,CAAC;CACH;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,YAAY;IAClD,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,cAAc,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CACZ,MAAM,EAAE,cAAc;IACtB,AADQ,cAAc;IACtB,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,SAAS,CACzC,CAAC;CACH;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,EACxB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,MAAM,EAAE,OAAO,EACf,GAAG,YAAY,EAChB,EAAE,WAAW,CAAC,CAAC,CAAC,+BAkOhB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/config/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,cAAc,EAAW,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAiB3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2GAA2G;IAC3G,IAAI,CAAC,EACD,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;IACf,sCAAsC;IACtC,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE;SACL,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,GACP,eAAe,GACf,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,SAAS,CAAC;KACnE,CAAC;CACH;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,YAAY;IAClD,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,cAAc,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CACZ,MAAM,EAAE,cAAc;IACtB,AADQ,cAAc;IACtB,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,SAAS,CACzC,CAAC;CACH;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,EACxB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,MAAM,EAAE,OAAO,EACf,GAAG,YAAY,EAChB,EAAE,WAAW,CAAC,CAAC,CAAC,+BAkOhB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/index.tsx"],"sourcesContent":["import { Fragment, ReactNode, SetStateAction, useMemo } from \"react\";\nimport { MonacoLanguage } from \"../monaco\";\nimport {\n Anchor,\n Box,\n Button,\n Flex,\n Group,\n ScrollArea,\n Select,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { ConfirmUpdate } from \"./confirm\";\nimport { Bookmark, History } from \"lucide-react\";\nimport { ConfigGroup } from \"./group\";\nimport { UnsavedChanges } from \"./unsaved-changes\";\nimport { ConfigLayout } from \"./layout\";\nimport { SectionProps } from \"../section\";\n\nexport * from \"./confirm\";\nexport * from \"./group\";\nexport * from \"./item\";\nexport * from \"./layout\";\nexport * from \"./unsaved-changes\";\n\nexport interface ConfigFieldArgs {\n label?: string;\n description?: ReactNode;\n /** Useful to set explicitly in cases where value is nullable from the API (so type cannot be inferred). */\n type?:\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n /** Use a selector instead of input */\n options?: { value: string; label?: string; icon?: ReactNode }[];\n placeholder?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport interface ConfigGroupArgs<T> {\n label: string;\n labelExtra?: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n hidden?: boolean;\n labelHidden?: boolean;\n contentHidden?: boolean;\n fields: {\n [K in keyof Partial<T>]:\n | boolean\n | ConfigFieldArgs\n | ((value: T[K], set: (value: Partial<T>) => void) => ReactNode);\n };\n}\n\nexport interface ConfigProps<T> extends SectionProps {\n original: T;\n update: Partial<T>;\n setUpdate: React.Dispatch<SetStateAction<Partial<T>>>;\n disabled: boolean;\n onSave: () => Promise<unknown>;\n disableSidebar?: boolean;\n fileContentsLanguage?: MonacoLanguage;\n enableFancyToml?: boolean;\n groups: Record<\n string, // Section key\n ConfigGroupArgs<T>[] | false | undefined\n >;\n}\n\nexport function Config<T>({\n original,\n update,\n setUpdate,\n disabled,\n onSave,\n disableSidebar,\n fileContentsLanguage,\n enableFancyToml,\n groups: _groups,\n ...sectionProps\n}: ConfigProps<T>) {\n const changesMade = Object.keys(update).length ? true : false;\n const onConfirm = async () => {\n await onSave();\n setUpdate({});\n };\n const onReset = () => setUpdate({});\n\n const groups = useMemo(\n () => Object.entries(_groups).filter(([_, groupArgs]) => !!groupArgs),\n [_groups],\n );\n\n const GroupsComponent = useMemo(\n () =>\n groups.map(([group, groupArgs]) => {\n return (\n <Fragment key={group}>\n {group && (\n <Text visibleFrom=\"lg\" fz=\"h2\" tt=\"uppercase\" mt=\"xl\">\n {group}\n </Text>\n )}\n\n <Stack>\n {(groupArgs as ConfigGroupArgs<T>[])\n .filter(({ hidden }) => !hidden)\n .map(\n ({\n label,\n labelHidden,\n icon,\n labelExtra,\n actions,\n description,\n contentHidden,\n fields,\n }) => (\n <Stack\n key={group + label}\n id={group + label}\n p=\"xl\"\n gap=\"md\"\n className=\"bordered-light\"\n bdrs=\"md\"\n style={{ scrollMarginTop: 94 }}\n >\n {!labelHidden && (\n <Group justify=\"space-between\">\n <Stack gap=\"0\">\n <Group>\n {icon}\n <Text fz=\"h3\">{label}</Text>\n {labelExtra}\n </Group>\n {description && (\n <Text c=\"dimmed\">{description}</Text>\n )}\n </Stack>\n {actions}\n </Group>\n )}\n {!contentHidden && (\n <ConfigGroup\n config={original}\n update={update}\n setUpdate={(u) => setUpdate((p) => ({ ...p, ...u }))}\n fields={fields}\n disabled={disabled}\n />\n )}\n </Stack>\n ),\n )}\n </Stack>\n </Fragment>\n );\n }),\n [groups],\n );\n\n const SaveOrReset = ({\n unsavedIndicator,\n fullWidth,\n }: {\n unsavedIndicator?: boolean;\n fullWidth?: boolean;\n }) =>\n changesMade && (\n <>\n {unsavedIndicator && <UnsavedChanges fullWidth={fullWidth} />}\n <Button\n variant=\"outline\"\n onClick={onReset}\n disabled={disabled || !changesMade}\n leftSection={<History size=\"1rem\" />}\n fullWidth={fullWidth}\n w={fullWidth ? undefined : 100}\n >\n Reset\n </Button>\n <ConfirmUpdate\n original={original}\n update={update}\n onConfirm={onConfirm}\n disabled={disabled}\n fileContentsLanguage={fileContentsLanguage}\n fullWidth={fullWidth}\n enableFancyToml={enableFancyToml}\n />\n </>\n );\n\n const SaveOrResetComponent = changesMade && (\n <>\n <Group visibleFrom=\"xs\" justify=\"flex-end\">\n <SaveOrReset unsavedIndicator />\n </Group>\n <Stack hiddenFrom=\"xs\">\n <SaveOrReset unsavedIndicator fullWidth />\n </Stack>\n </>\n );\n\n return (\n <ConfigLayout SaveOrReset={SaveOrResetComponent} {...sectionProps}>\n {disableSidebar && (\n <>\n {GroupsComponent}\n {SaveOrResetComponent}\n </>\n )}\n {!disableSidebar && (\n <Flex w=\"100%\" gap=\"md\" direction={{ base: \"column\", lg: \"row\" }}>\n {/** SIDEBAR (LG) */}\n <Box\n visibleFrom=\"lg\"\n pos=\"relative\"\n className=\"bordered-light\"\n style={{\n borderLeftWidth: 0,\n borderBottomWidth: 0,\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Stack pos=\"sticky\" w={175} top={88} pb={24} m=\"lg\">\n {/** ANCHORS */}\n <ScrollArea\n mah={\n changesMade ? \"calc(100vh - 220px)\" : \"calc(100vh - 130px)\"\n }\n >\n <Stack>\n {groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => (\n <Stack key={group} gap=\"xs\">\n <Group justify=\"flex-end\" mr=\"md\" c=\"dimmed\">\n <Bookmark size=\"1rem\" />\n <Text tt=\"uppercase\">{group || \"GENERAL\"}</Text>\n </Group>\n <Stack gap=\"0.1rem\">\n {groupArgs &&\n groupArgs\n .filter((groupArgs) => !groupArgs.hidden)\n .map((groupArgs) => (\n <Button\n key={group + groupArgs.label}\n variant=\"subtle\"\n justify=\"flex-end\"\n size=\"sm\"\n fullWidth\n renderRoot={(props) => (\n <Anchor\n href={\"#\" + group + groupArgs.label}\n {...props}\n />\n )}\n >\n {groupArgs.label}\n </Button>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n </ScrollArea>\n\n {/** SAVE */}\n <Stack gap=\"xs\">\n <SaveOrReset fullWidth />\n </Stack>\n </Stack>\n </Box>\n\n {/** SELECTOR (MOBILE) */}\n <Select\n hiddenFrom=\"lg\"\n className=\"select-nondimmed-placeholder\"\n placeholder=\"Go To\"\n leftSection={<Bookmark size=\"1rem\" />}\n value={null}\n data={groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => ({\n group,\n items: (groupArgs as ConfigGroupArgs<T>[]).map((arg) => ({\n label: arg.label,\n value: group + arg.label,\n })),\n }))}\n onChange={(group) => {\n if (!group) return;\n window.location.hash = group;\n }}\n />\n\n {/** CONTENT */}\n <Stack style={{ flexGrow: 1 }} gap=\"md\">\n {GroupsComponent}\n {SaveOrResetComponent}\n </Stack>\n </Flex>\n )}\n </ConfigLayout>\n );\n}\n"],"mappings":"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","names":["Fragment","groupArgs"]}
1
+ {"version":3,"sources":["../../../src/components/config/index.tsx"],"sourcesContent":["import { Fragment, ReactNode, SetStateAction, useMemo } from \"react\";\nimport { MonacoLanguage } from \"../monaco\";\nimport {\n Anchor,\n Box,\n Button,\n Flex,\n Group,\n ScrollArea,\n Select,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { ConfirmUpdate } from \"./confirm\";\nimport { Bookmark, History } from \"lucide-react\";\nimport { ConfigGroup } from \"./group\";\nimport { UnsavedChanges } from \"./unsaved-changes\";\nimport { ConfigLayout } from \"./layout\";\nimport { SectionProps } from \"../section\";\n\nexport * from \"./confirm\";\nexport * from \"./group\";\nexport * from \"./item\";\nexport * from \"./layout\";\nexport * from \"./unsaved-changes\";\n\nexport interface ConfigFieldArgs {\n label?: string;\n description?: ReactNode;\n /** Useful to set explicitly in cases where value is nullable from the API (so type cannot be inferred). */\n type?:\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n /** Use a selector instead of input */\n options?: { value: string; label?: string }[];\n placeholder?: string;\n hidden?: boolean;\n disabled?: boolean;\n}\n\nexport interface ConfigGroupArgs<T> {\n label: string;\n labelExtra?: ReactNode;\n icon?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n hidden?: boolean;\n labelHidden?: boolean;\n contentHidden?: boolean;\n fields: {\n [K in keyof Partial<T>]:\n | boolean\n | ConfigFieldArgs\n | ((value: T[K], set: (value: Partial<T>) => void) => ReactNode);\n };\n}\n\nexport interface ConfigProps<T> extends SectionProps {\n original: T;\n update: Partial<T>;\n setUpdate: React.Dispatch<SetStateAction<Partial<T>>>;\n disabled: boolean;\n onSave: () => Promise<unknown>;\n disableSidebar?: boolean;\n fileContentsLanguage?: MonacoLanguage;\n enableFancyToml?: boolean;\n groups: Record<\n string, // Section key\n ConfigGroupArgs<T>[] | false | undefined\n >;\n}\n\nexport function Config<T>({\n original,\n update,\n setUpdate,\n disabled,\n onSave,\n disableSidebar,\n fileContentsLanguage,\n enableFancyToml,\n groups: _groups,\n ...sectionProps\n}: ConfigProps<T>) {\n const changesMade = Object.keys(update).length ? true : false;\n const onConfirm = async () => {\n await onSave();\n setUpdate({});\n };\n const onReset = () => setUpdate({});\n\n const groups = useMemo(\n () => Object.entries(_groups).filter(([_, groupArgs]) => !!groupArgs),\n [_groups],\n );\n\n const GroupsComponent = useMemo(\n () =>\n groups.map(([group, groupArgs]) => {\n return (\n <Fragment key={group}>\n {group && (\n <Text visibleFrom=\"lg\" fz=\"h2\" tt=\"uppercase\" mt=\"xl\">\n {group}\n </Text>\n )}\n\n <Stack>\n {(groupArgs as ConfigGroupArgs<T>[])\n .filter(({ hidden }) => !hidden)\n .map(\n ({\n label,\n labelHidden,\n icon,\n labelExtra,\n actions,\n description,\n contentHidden,\n fields,\n }) => (\n <Stack\n key={group + label}\n id={group + label}\n p=\"xl\"\n gap=\"md\"\n className=\"bordered-light\"\n bdrs=\"md\"\n style={{ scrollMarginTop: 94 }}\n >\n {!labelHidden && (\n <Group justify=\"space-between\">\n <Stack gap=\"0\">\n <Group>\n {icon}\n <Text fz=\"h3\">{label}</Text>\n {labelExtra}\n </Group>\n {description && (\n <Text c=\"dimmed\">{description}</Text>\n )}\n </Stack>\n {actions}\n </Group>\n )}\n {!contentHidden && (\n <ConfigGroup\n config={original}\n update={update}\n setUpdate={(u) => setUpdate((p) => ({ ...p, ...u }))}\n fields={fields}\n disabled={disabled}\n />\n )}\n </Stack>\n ),\n )}\n </Stack>\n </Fragment>\n );\n }),\n [groups],\n );\n\n const SaveOrReset = ({\n unsavedIndicator,\n fullWidth,\n }: {\n unsavedIndicator?: boolean;\n fullWidth?: boolean;\n }) =>\n changesMade && (\n <>\n {unsavedIndicator && <UnsavedChanges fullWidth={fullWidth} />}\n <Button\n variant=\"outline\"\n onClick={onReset}\n disabled={disabled || !changesMade}\n leftSection={<History size=\"1rem\" />}\n fullWidth={fullWidth}\n w={fullWidth ? undefined : 100}\n >\n Reset\n </Button>\n <ConfirmUpdate\n original={original}\n update={update}\n onConfirm={onConfirm}\n disabled={disabled}\n fileContentsLanguage={fileContentsLanguage}\n fullWidth={fullWidth}\n enableFancyToml={enableFancyToml}\n />\n </>\n );\n\n const SaveOrResetComponent = changesMade && (\n <>\n <Group visibleFrom=\"xs\" justify=\"flex-end\">\n <SaveOrReset unsavedIndicator />\n </Group>\n <Stack hiddenFrom=\"xs\">\n <SaveOrReset unsavedIndicator fullWidth />\n </Stack>\n </>\n );\n\n return (\n <ConfigLayout SaveOrReset={SaveOrResetComponent} {...sectionProps}>\n {disableSidebar && (\n <>\n {GroupsComponent}\n {SaveOrResetComponent}\n </>\n )}\n {!disableSidebar && (\n <Flex w=\"100%\" gap=\"md\" direction={{ base: \"column\", lg: \"row\" }}>\n {/** SIDEBAR (LG) */}\n <Box\n visibleFrom=\"lg\"\n pos=\"relative\"\n className=\"bordered-light\"\n style={{\n borderLeftWidth: 0,\n borderBottomWidth: 0,\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Stack pos=\"sticky\" w={175} top={88} pb={24} m=\"lg\">\n {/** ANCHORS */}\n <ScrollArea\n mah={\n changesMade ? \"calc(100vh - 220px)\" : \"calc(100vh - 130px)\"\n }\n >\n <Stack>\n {groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => (\n <Stack key={group} gap=\"xs\">\n <Group justify=\"flex-end\" mr=\"md\" c=\"dimmed\">\n <Bookmark size=\"1rem\" />\n <Text tt=\"uppercase\">{group || \"GENERAL\"}</Text>\n </Group>\n <Stack gap=\"0.1rem\">\n {groupArgs &&\n groupArgs\n .filter((groupArgs) => !groupArgs.hidden)\n .map((groupArgs) => (\n <Button\n key={group + groupArgs.label}\n variant=\"subtle\"\n justify=\"flex-end\"\n size=\"sm\"\n fullWidth\n renderRoot={(props) => (\n <Anchor\n href={\"#\" + group + groupArgs.label}\n {...props}\n />\n )}\n >\n {groupArgs.label}\n </Button>\n ))}\n </Stack>\n </Stack>\n ))}\n </Stack>\n </ScrollArea>\n\n {/** SAVE */}\n <Stack gap=\"xs\">\n <SaveOrReset fullWidth />\n </Stack>\n </Stack>\n </Box>\n\n {/** SELECTOR (MOBILE) */}\n <Select\n hiddenFrom=\"lg\"\n className=\"select-nondimmed-placeholder\"\n placeholder=\"Go To\"\n leftSection={<Bookmark size=\"1rem\" />}\n value={null}\n data={groups\n .filter(([_, groupArgs]) => groupArgs)\n .map(([group, groupArgs]) => ({\n group,\n items: (groupArgs as ConfigGroupArgs<T>[]).map((arg) => ({\n label: arg.label,\n value: group + arg.label,\n })),\n }))}\n onChange={(group) => {\n if (!group) return;\n window.location.hash = group;\n }}\n />\n\n {/** CONTENT */}\n <Stack style={{ flexGrow: 1 }} gap=\"md\">\n {GroupsComponent}\n {SaveOrResetComponent}\n </Stack>\n </Flex>\n )}\n </ConfigLayout>\n );\n}\n"],"mappings":"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","names":["Fragment","groupArgs"]}
@@ -21,6 +21,7 @@ __export(item_exports, {
21
21
  ConfigInput: () => ConfigInput,
22
22
  ConfigItem: () => ConfigItem,
23
23
  ConfigList: () => ConfigList,
24
+ ConfigSelector: () => ConfigSelector,
24
25
  ConfigSwitch: () => ConfigSwitch
25
26
  });
26
27
  module.exports = __toCommonJS(item_exports);
@@ -86,6 +87,43 @@ function ConfigInput({
86
87
  inputRight
87
88
  ] }) : inputNode });
88
89
  }
90
+ function ConfigSelector({
91
+ value,
92
+ options,
93
+ disabled,
94
+ placeholder,
95
+ onValueChange,
96
+ onBlur,
97
+ inputLeft,
98
+ inputRight,
99
+ inputProps,
100
+ email,
101
+ ...itemProps
102
+ }) {
103
+ const inputNode = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ import_core.Select,
105
+ {
106
+ w: { base: "85%", lg: 400 },
107
+ value,
108
+ data: options?.map(({ value: value2, label }) => ({
109
+ value: value2,
110
+ label: label ?? value2
111
+ })),
112
+ placeholder,
113
+ disabled,
114
+ onChange: (value2) => {
115
+ value2 && onValueChange?.(value2);
116
+ },
117
+ onBlur: (e) => onBlur?.(e.target.value),
118
+ ...inputProps
119
+ }
120
+ );
121
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConfigItem, { ...itemProps, children: inputLeft || inputRight ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { children: [
122
+ inputLeft,
123
+ inputNode,
124
+ inputRight
125
+ ] }) : inputNode });
126
+ }
89
127
  function ConfigSwitch({
90
128
  value,
91
129
  disabled,
@@ -136,6 +174,7 @@ function ConfigList({
136
174
  ConfigInput,
137
175
  ConfigItem,
138
176
  ConfigList,
177
+ ConfigSelector,
139
178
  ConfigSwitch
140
179
  });
141
180
  //# sourceMappingURL=item.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/item.tsx"],"sourcesContent":["import {\n Button,\n createPolymorphicComponent,\n Group,\n Stack,\n StackProps,\n SwitchProps,\n Text,\n TextInput,\n TextInputProps,\n} from \"@mantine/core\";\nimport { forwardRef, ReactNode } from \"react\";\nimport { fmtSnakeCaseToUpperSpaceCase } from \"../../formatting\";\nimport { EnableSwitch } from \"../enable-switch\";\nimport { InputList, InputListProps } from \"../input-list\";\nimport { Plus } from \"lucide-react\";\n\n// https://mantine.dev/guides/polymorphic/#create-your-own-polymorphic-components\n\nexport interface ConfigItemProps extends StackProps {\n label?: ReactNode;\n labelExtra?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}\n\nexport const ConfigItem = createPolymorphicComponent<\"div\", ConfigItemProps>(\n forwardRef<HTMLDivElement, ConfigItemProps>(\n ({ label, labelExtra, description, children, ...props }, ref) => {\n const labelDescription = (label || description) && (\n <Stack gap=\"0\">\n {typeof label === \"string\" && (\n <Text fz=\"h3\">{fmtSnakeCaseToUpperSpaceCase(label)}</Text>\n )}\n {label && typeof label !== \"string\" && label}\n {description && (\n // component=\"div\" so ReactNode descriptions (Groups, nested Text)\n // don't produce invalid markup inside the default <p>.\n <Text c=\"dimmed\" component=\"div\">\n {description}\n </Text>\n )}\n </Stack>\n );\n return (\n <Stack {...props} ref={ref}>\n {labelExtra ? (\n <Group>\n {labelDescription}\n {labelExtra}\n </Group>\n ) : (\n labelDescription\n )}\n {children}\n </Stack>\n );\n },\n ),\n);\n\nexport function ConfigInput({\n value,\n disabled,\n placeholder,\n onChange,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | number | undefined;\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: TextInputProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <TextInput\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n type={typeof value === \"number\" ? \"number\" : email ? \"email\" : undefined}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSwitch({\n value,\n disabled,\n onCheckedChange,\n switchProps,\n ...itemProps\n}: {\n value: boolean | undefined;\n disabled: boolean;\n onCheckedChange: (value: boolean) => void;\n switchProps?: SwitchProps;\n} & Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem {...itemProps}>\n <EnableSwitch\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n {...switchProps}\n />\n </ConfigItem>\n );\n}\n\nexport function ConfigList<T>({\n addLabel,\n label,\n description,\n ...inputListProps\n}: { label?: string; addLabel?: string } & InputListProps<T> &\n Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem label={label} description={description}>\n <InputList\n inputProps={{ w: { base: \"85%\", lg: 400 } }}\n {...inputListProps}\n />\n {!inputListProps.disabled && (\n <Button\n leftSection={<Plus size=\"1rem\" />}\n onClick={() =>\n inputListProps.set({\n [inputListProps.field]: [...inputListProps.values, \"\"],\n } as Partial<T>)\n }\n w={{ base: \"85%\", lg: 400 }}\n disabled={inputListProps.disabled}\n >\n {addLabel ??\n (\"Add \" + label?.endsWith(\"s\") ? label?.slice(0, -1) : label)}\n </Button>\n )}\n </ConfigItem>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BQ;AA9BR,kBAUO;AACP,mBAAsC;AACtC,wBAA6C;AAC7C,2BAA6B;AAC7B,wBAA0C;AAC1C,0BAAqB;AAWd,MAAM,iBAAa;AAAA,MACxB;AAAA,IACE,CAAC,EAAE,OAAO,YAAY,aAAa,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC/D,YAAM,oBAAoB,SAAS,gBACjC,6CAAC,qBAAM,KAAI,KACR;AAAA,eAAO,UAAU,YAChB,4CAAC,oBAAK,IAAG,MAAM,8DAA6B,KAAK,GAAE;AAAA,QAEpD,SAAS,OAAO,UAAU,YAAY;AAAA,QACtC;AAAA;AAAA,QAGC,4CAAC,oBAAK,GAAE,UAAS,WAAU,OACxB,uBACH;AAAA,SAEJ;AAEF,aACE,6CAAC,qBAAO,GAAG,OAAO,KACf;AAAA,qBACC,6CAAC,qBACE;AAAA;AAAA,UACA;AAAA,WACH,IAEA;AAAA,QAED;AAAA,SACH;AAAA,IAEJ;AAAA,EACF;AACF;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAUuC;AACrC,QAAM,YACJ;AAAA,IAAC;AAAA;AAAA,MACC,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,OAAO,UAAU,WAAW,WAAW,QAAQ,UAAU;AAAA,MAC/D,UAAU,CAAC,MAAM;AACf,mBAAW,CAAC;AACZ,wBAAgB,EAAE,OAAO,KAAK;AAAA,MAChC;AAAA,MACA,QAAQ,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACrC,GAAG;AAAA;AAAA,EACN;AAEF,SACE,4CAAC,cAAY,GAAG,WACb,uBAAa,aACZ,6CAAC,qBACE;AAAA;AAAA,IACA;AAAA,IACA;AAAA,KACH,IAEA,WAEJ;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAKuC;AACrC,SACE,4CAAC,cAAY,GAAG,WACd;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;AAEO,SAAS,WAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACqC;AACnC,SACE,6CAAC,cAAW,OAAc,aACxB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI,EAAE;AAAA,QACzC,GAAG;AAAA;AAAA,IACN;AAAA,IACC,CAAC,eAAe,YACf;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,4CAAC,4BAAK,MAAK,QAAO;AAAA,QAC/B,SAAS,MACP,eAAe,IAAI;AAAA,UACjB,CAAC,eAAe,KAAK,GAAG,CAAC,GAAG,eAAe,QAAQ,EAAE;AAAA,QACvD,CAAe;AAAA,QAEjB,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI;AAAA,QAC1B,UAAU,eAAe;AAAA,QAExB,uBACE,SAAS,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI;AAAA;AAAA,IAC3D;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/config/item.tsx"],"sourcesContent":["import {\n Button,\n createPolymorphicComponent,\n Group,\n Select,\n SelectProps,\n Stack,\n StackProps,\n SwitchProps,\n Text,\n TextInput,\n TextInputProps,\n} from \"@mantine/core\";\nimport { forwardRef, ReactNode } from \"react\";\nimport { fmtSnakeCaseToUpperSpaceCase } from \"../../formatting\";\nimport { EnableSwitch } from \"../enable-switch\";\nimport { InputList, InputListProps } from \"../input-list\";\nimport { Plus } from \"lucide-react\";\n\n// https://mantine.dev/guides/polymorphic/#create-your-own-polymorphic-components\n\nexport interface ConfigItemProps extends StackProps {\n label?: ReactNode;\n labelExtra?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}\n\nexport const ConfigItem = createPolymorphicComponent<\"div\", ConfigItemProps>(\n forwardRef<HTMLDivElement, ConfigItemProps>(\n ({ label, labelExtra, description, children, ...props }, ref) => {\n const labelDescription = (label || description) && (\n <Stack gap=\"0\">\n {typeof label === \"string\" && (\n <Text fz=\"h3\">{fmtSnakeCaseToUpperSpaceCase(label)}</Text>\n )}\n {label && typeof label !== \"string\" && label}\n {description && (\n // component=\"div\" so ReactNode descriptions (Groups, nested Text)\n // don't produce invalid markup inside the default <p>.\n <Text c=\"dimmed\" component=\"div\">\n {description}\n </Text>\n )}\n </Stack>\n );\n return (\n <Stack {...props} ref={ref}>\n {labelExtra ? (\n <Group>\n {labelDescription}\n {labelExtra}\n </Group>\n ) : (\n labelDescription\n )}\n {children}\n </Stack>\n );\n },\n ),\n);\n\nexport function ConfigInput({\n value,\n disabled,\n placeholder,\n onChange,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | number | undefined;\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: TextInputProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <TextInput\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n type={typeof value === \"number\" ? \"number\" : email ? \"email\" : undefined}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSelector({\n value,\n options,\n disabled,\n placeholder,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | undefined;\n options?: { value: string; label?: string }[];\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: SelectProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <Select\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n data={options?.map(({ value, label }) => ({\n value,\n label: label ?? value,\n }))}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(value) => {\n value && onValueChange?.(value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSwitch({\n value,\n disabled,\n onCheckedChange,\n switchProps,\n ...itemProps\n}: {\n value: boolean | undefined;\n disabled: boolean;\n onCheckedChange: (value: boolean) => void;\n switchProps?: SwitchProps;\n} & Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem {...itemProps}>\n <EnableSwitch\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n {...switchProps}\n />\n </ConfigItem>\n );\n}\n\nexport function ConfigList<T>({\n addLabel,\n label,\n description,\n ...inputListProps\n}: { label?: string; addLabel?: string } & InputListProps<T> &\n Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem label={label} description={description}>\n <InputList\n inputProps={{ w: { base: \"85%\", lg: 400 } }}\n {...inputListProps}\n />\n {!inputListProps.disabled && (\n <Button\n leftSection={<Plus size=\"1rem\" />}\n onClick={() =>\n inputListProps.set({\n [inputListProps.field]: [...inputListProps.values, \"\"],\n } as Partial<T>)\n }\n w={{ base: \"85%\", lg: 400 }}\n disabled={inputListProps.disabled}\n >\n {addLabel ??\n (\"Add \" + label?.endsWith(\"s\") ? label?.slice(0, -1) : label)}\n </Button>\n )}\n </ConfigItem>\n );\n}\n"],"mappings":"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","names":["value"]}
@@ -1,4 +1,4 @@
1
- import { StackProps, SwitchProps, TextInputProps } from "@mantine/core";
1
+ import { SelectProps, StackProps, SwitchProps, TextInputProps } from "@mantine/core";
2
2
  import { ReactNode } from "react";
3
3
  import { InputListProps } from "../input-list";
4
4
  export interface ConfigItemProps extends StackProps {
@@ -27,6 +27,21 @@ export declare function ConfigInput({ value, disabled, placeholder, onChange, on
27
27
  inputProps?: TextInputProps;
28
28
  email?: boolean;
29
29
  } & Omit<ConfigItemProps, "children">): import("react").JSX.Element;
30
+ export declare function ConfigSelector({ value, options, disabled, placeholder, onValueChange, onBlur, inputLeft, inputRight, inputProps, email, ...itemProps }: {
31
+ value: string | undefined;
32
+ options?: {
33
+ value: string;
34
+ label?: string;
35
+ }[];
36
+ disabled?: boolean;
37
+ placeholder?: string;
38
+ onValueChange?: (value: string) => void;
39
+ onBlur?: (value: string) => void;
40
+ inputLeft?: ReactNode;
41
+ inputRight?: ReactNode;
42
+ inputProps?: SelectProps;
43
+ email?: boolean;
44
+ } & Omit<ConfigItemProps, "children">): import("react").JSX.Element;
30
45
  export declare function ConfigSwitch({ value, disabled, onCheckedChange, switchProps, ...itemProps }: {
31
46
  value: boolean | undefined;
32
47
  disabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../src/components/config/item.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,UAAU,EACV,WAAW,EAGX,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAc,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAa,cAAc,EAAE,MAAM,eAAe,CAAC;AAK1D,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,UAAU;;;;;;;;mCAiCtB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,MAAM,EACN,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,EACL,GAAG,SAAS,EACb,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,+BA6BpC;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,eAAe,EACf,WAAW,EACX,GAAG,SAAS,EACb,EAAE;IACD,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,+BAWpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAC5B,QAAQ,EACR,KAAK,EACL,WAAW,EACX,GAAG,cAAc,EAClB,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAAC,CAAC,CAAC,GAC1D,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,+BAwBlC"}
1
+ {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../src/components/config/item.tsx"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import {
3
3
  Button,
4
4
  createPolymorphicComponent,
5
5
  Group,
6
+ Select,
6
7
  Stack,
7
8
  Text,
8
9
  TextInput
@@ -67,6 +68,43 @@ function ConfigInput({
67
68
  inputRight
68
69
  ] }) : inputNode });
69
70
  }
71
+ function ConfigSelector({
72
+ value,
73
+ options,
74
+ disabled,
75
+ placeholder,
76
+ onValueChange,
77
+ onBlur,
78
+ inputLeft,
79
+ inputRight,
80
+ inputProps,
81
+ email,
82
+ ...itemProps
83
+ }) {
84
+ const inputNode = /* @__PURE__ */ jsx(
85
+ Select,
86
+ {
87
+ w: { base: "85%", lg: 400 },
88
+ value,
89
+ data: options?.map(({ value: value2, label }) => ({
90
+ value: value2,
91
+ label: label ?? value2
92
+ })),
93
+ placeholder,
94
+ disabled,
95
+ onChange: (value2) => {
96
+ value2 && onValueChange?.(value2);
97
+ },
98
+ onBlur: (e) => onBlur?.(e.target.value),
99
+ ...inputProps
100
+ }
101
+ );
102
+ return /* @__PURE__ */ jsx(ConfigItem, { ...itemProps, children: inputLeft || inputRight ? /* @__PURE__ */ jsxs(Group, { children: [
103
+ inputLeft,
104
+ inputNode,
105
+ inputRight
106
+ ] }) : inputNode });
107
+ }
70
108
  function ConfigSwitch({
71
109
  value,
72
110
  disabled,
@@ -116,6 +154,7 @@ export {
116
154
  ConfigInput,
117
155
  ConfigItem,
118
156
  ConfigList,
157
+ ConfigSelector,
119
158
  ConfigSwitch
120
159
  };
121
160
  //# sourceMappingURL=item.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/config/item.tsx"],"sourcesContent":["import {\n Button,\n createPolymorphicComponent,\n Group,\n Stack,\n StackProps,\n SwitchProps,\n Text,\n TextInput,\n TextInputProps,\n} from \"@mantine/core\";\nimport { forwardRef, ReactNode } from \"react\";\nimport { fmtSnakeCaseToUpperSpaceCase } from \"../../formatting\";\nimport { EnableSwitch } from \"../enable-switch\";\nimport { InputList, InputListProps } from \"../input-list\";\nimport { Plus } from \"lucide-react\";\n\n// https://mantine.dev/guides/polymorphic/#create-your-own-polymorphic-components\n\nexport interface ConfigItemProps extends StackProps {\n label?: ReactNode;\n labelExtra?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}\n\nexport const ConfigItem = createPolymorphicComponent<\"div\", ConfigItemProps>(\n forwardRef<HTMLDivElement, ConfigItemProps>(\n ({ label, labelExtra, description, children, ...props }, ref) => {\n const labelDescription = (label || description) && (\n <Stack gap=\"0\">\n {typeof label === \"string\" && (\n <Text fz=\"h3\">{fmtSnakeCaseToUpperSpaceCase(label)}</Text>\n )}\n {label && typeof label !== \"string\" && label}\n {description && (\n // component=\"div\" so ReactNode descriptions (Groups, nested Text)\n // don't produce invalid markup inside the default <p>.\n <Text c=\"dimmed\" component=\"div\">\n {description}\n </Text>\n )}\n </Stack>\n );\n return (\n <Stack {...props} ref={ref}>\n {labelExtra ? (\n <Group>\n {labelDescription}\n {labelExtra}\n </Group>\n ) : (\n labelDescription\n )}\n {children}\n </Stack>\n );\n },\n ),\n);\n\nexport function ConfigInput({\n value,\n disabled,\n placeholder,\n onChange,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | number | undefined;\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: TextInputProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <TextInput\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n type={typeof value === \"number\" ? \"number\" : email ? \"email\" : undefined}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSwitch({\n value,\n disabled,\n onCheckedChange,\n switchProps,\n ...itemProps\n}: {\n value: boolean | undefined;\n disabled: boolean;\n onCheckedChange: (value: boolean) => void;\n switchProps?: SwitchProps;\n} & Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem {...itemProps}>\n <EnableSwitch\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n {...switchProps}\n />\n </ConfigItem>\n );\n}\n\nexport function ConfigList<T>({\n addLabel,\n label,\n description,\n ...inputListProps\n}: { label?: string; addLabel?: string } & InputListProps<T> &\n Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem label={label} description={description}>\n <InputList\n inputProps={{ w: { base: \"85%\", lg: 400 } }}\n {...inputListProps}\n />\n {!inputListProps.disabled && (\n <Button\n leftSection={<Plus size=\"1rem\" />}\n onClick={() =>\n inputListProps.set({\n [inputListProps.field]: [...inputListProps.values, \"\"],\n } as Partial<T>)\n }\n w={{ base: \"85%\", lg: 400 }}\n disabled={inputListProps.disabled}\n >\n {addLabel ??\n (\"Add \" + label?.endsWith(\"s\") ? label?.slice(0, -1) : label)}\n </Button>\n )}\n </ConfigItem>\n );\n}\n"],"mappings":"AA8BQ,SAEI,KAFJ;AA9BR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,kBAA6B;AACtC,SAAS,oCAAoC;AAC7C,SAAS,oBAAoB;AAC7B,SAAS,iBAAiC;AAC1C,SAAS,YAAY;AAWd,MAAM,aAAa;AAAA,EACxB;AAAA,IACE,CAAC,EAAE,OAAO,YAAY,aAAa,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC/D,YAAM,oBAAoB,SAAS,gBACjC,qBAAC,SAAM,KAAI,KACR;AAAA,eAAO,UAAU,YAChB,oBAAC,QAAK,IAAG,MAAM,uCAA6B,KAAK,GAAE;AAAA,QAEpD,SAAS,OAAO,UAAU,YAAY;AAAA,QACtC;AAAA;AAAA,QAGC,oBAAC,QAAK,GAAE,UAAS,WAAU,OACxB,uBACH;AAAA,SAEJ;AAEF,aACE,qBAAC,SAAO,GAAG,OAAO,KACf;AAAA,qBACC,qBAAC,SACE;AAAA;AAAA,UACA;AAAA,WACH,IAEA;AAAA,QAED;AAAA,SACH;AAAA,IAEJ;AAAA,EACF;AACF;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAUuC;AACrC,QAAM,YACJ;AAAA,IAAC;AAAA;AAAA,MACC,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,OAAO,UAAU,WAAW,WAAW,QAAQ,UAAU;AAAA,MAC/D,UAAU,CAAC,MAAM;AACf,mBAAW,CAAC;AACZ,wBAAgB,EAAE,OAAO,KAAK;AAAA,MAChC;AAAA,MACA,QAAQ,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACrC,GAAG;AAAA;AAAA,EACN;AAEF,SACE,oBAAC,cAAY,GAAG,WACb,uBAAa,aACZ,qBAAC,SACE;AAAA;AAAA,IACA;AAAA,IACA;AAAA,KACH,IAEA,WAEJ;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAKuC;AACrC,SACE,oBAAC,cAAY,GAAG,WACd;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;AAEO,SAAS,WAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACqC;AACnC,SACE,qBAAC,cAAW,OAAc,aACxB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI,EAAE;AAAA,QACzC,GAAG;AAAA;AAAA,IACN;AAAA,IACC,CAAC,eAAe,YACf;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,oBAAC,QAAK,MAAK,QAAO;AAAA,QAC/B,SAAS,MACP,eAAe,IAAI;AAAA,UACjB,CAAC,eAAe,KAAK,GAAG,CAAC,GAAG,eAAe,QAAQ,EAAE;AAAA,QACvD,CAAe;AAAA,QAEjB,GAAG,EAAE,MAAM,OAAO,IAAI,IAAI;AAAA,QAC1B,UAAU,eAAe;AAAA,QAExB,uBACE,SAAS,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI;AAAA;AAAA,IAC3D;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/config/item.tsx"],"sourcesContent":["import {\n Button,\n createPolymorphicComponent,\n Group,\n Select,\n SelectProps,\n Stack,\n StackProps,\n SwitchProps,\n Text,\n TextInput,\n TextInputProps,\n} from \"@mantine/core\";\nimport { forwardRef, ReactNode } from \"react\";\nimport { fmtSnakeCaseToUpperSpaceCase } from \"../../formatting\";\nimport { EnableSwitch } from \"../enable-switch\";\nimport { InputList, InputListProps } from \"../input-list\";\nimport { Plus } from \"lucide-react\";\n\n// https://mantine.dev/guides/polymorphic/#create-your-own-polymorphic-components\n\nexport interface ConfigItemProps extends StackProps {\n label?: ReactNode;\n labelExtra?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}\n\nexport const ConfigItem = createPolymorphicComponent<\"div\", ConfigItemProps>(\n forwardRef<HTMLDivElement, ConfigItemProps>(\n ({ label, labelExtra, description, children, ...props }, ref) => {\n const labelDescription = (label || description) && (\n <Stack gap=\"0\">\n {typeof label === \"string\" && (\n <Text fz=\"h3\">{fmtSnakeCaseToUpperSpaceCase(label)}</Text>\n )}\n {label && typeof label !== \"string\" && label}\n {description && (\n // component=\"div\" so ReactNode descriptions (Groups, nested Text)\n // don't produce invalid markup inside the default <p>.\n <Text c=\"dimmed\" component=\"div\">\n {description}\n </Text>\n )}\n </Stack>\n );\n return (\n <Stack {...props} ref={ref}>\n {labelExtra ? (\n <Group>\n {labelDescription}\n {labelExtra}\n </Group>\n ) : (\n labelDescription\n )}\n {children}\n </Stack>\n );\n },\n ),\n);\n\nexport function ConfigInput({\n value,\n disabled,\n placeholder,\n onChange,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | number | undefined;\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: TextInputProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <TextInput\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n type={typeof value === \"number\" ? \"number\" : email ? \"email\" : undefined}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSelector({\n value,\n options,\n disabled,\n placeholder,\n onValueChange,\n onBlur,\n inputLeft,\n inputRight,\n inputProps,\n email,\n ...itemProps\n}: {\n value: string | undefined;\n options?: { value: string; label?: string }[];\n disabled?: boolean;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n inputLeft?: ReactNode;\n inputRight?: ReactNode;\n inputProps?: SelectProps;\n email?: boolean;\n} & Omit<ConfigItemProps, \"children\">) {\n const inputNode = (\n <Select\n w={{ base: \"85%\", lg: 400 }}\n value={value}\n data={options?.map(({ value, label }) => ({\n value,\n label: label ?? value,\n }))}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(value) => {\n value && onValueChange?.(value);\n }}\n onBlur={(e) => onBlur?.(e.target.value)}\n {...inputProps}\n />\n );\n return (\n <ConfigItem {...itemProps}>\n {inputLeft || inputRight ? (\n <Group>\n {inputLeft}\n {inputNode}\n {inputRight}\n </Group>\n ) : (\n inputNode\n )}\n </ConfigItem>\n );\n}\n\nexport function ConfigSwitch({\n value,\n disabled,\n onCheckedChange,\n switchProps,\n ...itemProps\n}: {\n value: boolean | undefined;\n disabled: boolean;\n onCheckedChange: (value: boolean) => void;\n switchProps?: SwitchProps;\n} & Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem {...itemProps}>\n <EnableSwitch\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n {...switchProps}\n />\n </ConfigItem>\n );\n}\n\nexport function ConfigList<T>({\n addLabel,\n label,\n description,\n ...inputListProps\n}: { label?: string; addLabel?: string } & InputListProps<T> &\n Omit<ConfigItemProps, \"children\">) {\n return (\n <ConfigItem label={label} description={description}>\n <InputList\n inputProps={{ w: { base: \"85%\", lg: 400 } }}\n {...inputListProps}\n />\n {!inputListProps.disabled && (\n <Button\n leftSection={<Plus size=\"1rem\" />}\n onClick={() =>\n inputListProps.set({\n [inputListProps.field]: [...inputListProps.values, \"\"],\n } as Partial<T>)\n }\n w={{ base: \"85%\", lg: 400 }}\n disabled={inputListProps.disabled}\n >\n {addLabel ??\n (\"Add \" + label?.endsWith(\"s\") ? label?.slice(0, -1) : label)}\n </Button>\n )}\n </ConfigItem>\n );\n}\n"],"mappings":"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","names":["value"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mogh_ui",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "Common UI components and styling used across Mogh apps.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -29,38 +29,38 @@
29
29
  "typecheck": "tsc --noEmit"
30
30
  },
31
31
  "peerDependencies": {
32
- "@mantine/core": "^9.5.2",
33
- "@mantine/form": "^9.5.2",
34
- "@mantine/hooks": "^9.5.2",
35
- "@mantine/notifications": "^9.5.2",
32
+ "@mantine/core": "^9.6.1",
33
+ "@mantine/form": "^9.6.1",
34
+ "@mantine/hooks": "^9.6.1",
35
+ "@mantine/notifications": "^9.6.1",
36
36
  "@monaco-editor/react": "^4.7.0",
37
- "@tanstack/react-table": "^9.1.2",
38
- "@tanstack/react-query": "^5.102.4",
39
- "lucide-react": "^1.41.0",
37
+ "@tanstack/react-table": "^9.2.4",
38
+ "@tanstack/react-query": "^5.102.8",
39
+ "lucide-react": "^1.43.0",
40
40
  "mogh_auth_client": "^2.1.0",
41
41
  "monaco-editor": "^0.56.0",
42
42
  "monaco-yaml": "^5.5.1",
43
- "react": "^19.2.8",
44
- "react-dom": "^19.2.8",
43
+ "react": "^19.3.0",
44
+ "react-dom": "^19.3.0",
45
45
  "react-router-dom": "^7.18.2"
46
46
  },
47
47
  "devDependencies": {
48
- "@mantine/core": "^9.5.2",
49
- "@mantine/form": "^9.5.2",
50
- "@mantine/hooks": "^9.5.2",
51
- "@mantine/notifications": "^9.5.2",
48
+ "@mantine/core": "^9.6.1",
49
+ "@mantine/form": "^9.6.1",
50
+ "@mantine/hooks": "^9.6.1",
51
+ "@mantine/notifications": "^9.6.1",
52
52
  "@monaco-editor/react": "^4.7.0",
53
- "@tanstack/react-table": "^9.1.2",
54
- "@tanstack/react-query": "^5.102.4",
55
- "@types/react": "^19.2.18",
56
- "@types/react-dom": "^19.2.7",
57
- "lucide-react": "^1.34.0",
58
- "mogh_auth_client": "^2.0.0",
53
+ "@tanstack/react-table": "^9.2.4",
54
+ "@tanstack/react-query": "^5.102.8",
55
+ "@types/react": "^19.3.0",
56
+ "@types/react-dom": "^19.3.0",
57
+ "lucide-react": "^1.43.0",
58
+ "mogh_auth_client": "^2.1.0",
59
59
  "monaco-editor": "^0.56.0",
60
60
  "monaco-yaml": "^5.5.1",
61
- "react": "^19.2.8",
62
- "react-dom": "^19.2.8",
63
- "react-router-dom": "^7.18.2",
61
+ "react": "^19.3.0",
62
+ "react-dom": "^19.3.0",
63
+ "react-router-dom": "^7.18.3",
64
64
  "tsup": "^8.5.1",
65
65
  "typescript": "^7.0.2"
66
66
  }