@valbuild/ui 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50831,7 +50831,7 @@ var Schema = /* @__PURE__ */ function() {
50831
50831
  return Schema2;
50832
50832
  }();
50833
50833
  var GetSchema = Symbol("GetSchema");
50834
- var Path = Symbol("Path");
50834
+ var Path$1 = Symbol("Path");
50835
50835
  var GetSource = Symbol("GetSource");
50836
50836
  function getSchema(selector) {
50837
50837
  return selector[GetSchema];
@@ -50862,82 +50862,7 @@ var Sym = /* @__PURE__ */ function(_Expr2) {
50862
50862
  new Sym("()");
50863
50863
  var VAL_EXTENSION = "_type";
50864
50864
  var FILE_REF_PROP = "_ref";
50865
- var ImageSchema = /* @__PURE__ */ function(_Schema) {
50866
- _inherits(ImageSchema2, _Schema);
50867
- var _super = _createSuper(ImageSchema2);
50868
- function ImageSchema2(options) {
50869
- var _this;
50870
- var opt = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
50871
- _classCallCheck(this, ImageSchema2);
50872
- _this = _super.call(this);
50873
- _this.options = options;
50874
- _this.opt = opt;
50875
- return _this;
50876
- }
50877
- _createClass(ImageSchema2, [{
50878
- key: "validate",
50879
- value: function validate(path, src) {
50880
- if (this.opt && (src === null || src === void 0)) {
50881
- return false;
50882
- }
50883
- if (src === null || src === void 0) {
50884
- return _defineProperty$5({}, path, [{
50885
- message: "Non-optional image was null or undefined.",
50886
- value: src
50887
- }]);
50888
- }
50889
- if (typeof src[FILE_REF_PROP] !== "string") {
50890
- return _defineProperty$5({}, path, [{
50891
- message: "Image did not have a file reference string. Got: ".concat(_typeof(src[FILE_REF_PROP])),
50892
- value: src
50893
- }]);
50894
- }
50895
- if (src[VAL_EXTENSION] !== "file") {
50896
- return _defineProperty$5({}, path, [{
50897
- message: "Image did not have the valid file extension type. Got: ".concat(src[VAL_EXTENSION]),
50898
- value: src
50899
- }]);
50900
- }
50901
- if (src.metadata) {
50902
- return _defineProperty$5({}, path, [{
50903
- message: "Found metadata, but it could not be validated. Image metadata must be an object with the required props: width (positive number), height (positive number) and sha256 (string of length 64 of the base16 hash).",
50904
- // These validation errors will have to be picked up by logic outside of this package and revalidated. Reasons: 1) we have to read files to verify the metadata, which is handled differently in different runtimes (Browser, QuickJS, Node.js); 2) we want to keep this package dependency free.
50905
- value: src,
50906
- fixes: ["image:replace-metadata"]
50907
- }]);
50908
- }
50909
- return _defineProperty$5({}, path, [{
50910
- message: "Could not validate Image metadata.",
50911
- value: src,
50912
- fixes: ["image:add-metadata"]
50913
- }]);
50914
- }
50915
- }, {
50916
- key: "assert",
50917
- value: function assert(src) {
50918
- if (this.opt && (src === null || src === void 0)) {
50919
- return true;
50920
- }
50921
- return (src === null || src === void 0 ? void 0 : src[FILE_REF_PROP]) === "image" && (src === null || src === void 0 ? void 0 : src[VAL_EXTENSION]) === "file";
50922
- }
50923
- }, {
50924
- key: "optional",
50925
- value: function optional() {
50926
- return new ImageSchema2(this.options, true);
50927
- }
50928
- }, {
50929
- key: "serialize",
50930
- value: function serialize() {
50931
- return {
50932
- type: "image",
50933
- options: this.options,
50934
- opt: this.opt
50935
- };
50936
- }
50937
- }]);
50938
- return ImageSchema2;
50939
- }(Schema);
50940
- var convertFileSource = function convertFileSource2(src) {
50865
+ function convertFileSource(src) {
50941
50866
  var _src$metadata2;
50942
50867
  if (!src[FILE_REF_PROP].startsWith("/public")) {
50943
50868
  var _src$metadata;
@@ -50950,15 +50875,15 @@ var convertFileSource = function convertFileSource2(src) {
50950
50875
  url: src[FILE_REF_PROP].slice("/public".length) + "?sha256=".concat((_src$metadata2 = src.metadata) === null || _src$metadata2 === void 0 ? void 0 : _src$metadata2.sha256),
50951
50876
  metadata: src.metadata
50952
50877
  };
50953
- };
50878
+ }
50954
50879
  function isSerializedVal(val) {
50955
50880
  return _typeof(val) === "object" && val !== null && val !== void 0 && ("val" in val || "valPath" in val);
50956
50881
  }
50957
50882
  function isVal(val) {
50958
- return _typeof(val) === "object" && val !== null && val !== void 0 && Path in val && "val" in val;
50883
+ return _typeof(val) === "object" && val !== null && val !== void 0 && Path$1 in val && "val" in val;
50959
50884
  }
50960
50885
  function getValPath(valOrSelector) {
50961
- return valOrSelector[Path];
50886
+ return valOrSelector[Path$1];
50962
50887
  }
50963
50888
  function hasOwn$1(obj, prop) {
50964
50889
  return Object.prototype.hasOwnProperty.call(obj, prop);
@@ -50970,7 +50895,7 @@ function _andThen(f, source, path) {
50970
50895
  return newSelectorProxy(source, path);
50971
50896
  }
50972
50897
  function isSelector(source) {
50973
- return _typeof(source) === "object" && source !== null && (GetSource in source || Path in source);
50898
+ return _typeof(source) === "object" && source !== null && (GetSource in source || Path$1 in source);
50974
50899
  }
50975
50900
  function newSelectorProxy(source, path, moduleSchema) {
50976
50901
  if (_typeof(source) === "object") {
@@ -50999,7 +50924,7 @@ function newSelectorProxy(source, path, moduleSchema) {
50999
50924
  if (prop === GetSource) {
51000
50925
  return true;
51001
50926
  }
51002
- if (prop === Path) {
50927
+ if (prop === Path$1) {
51003
50928
  return true;
51004
50929
  }
51005
50930
  if (prop === "andThen") {
@@ -51014,7 +50939,7 @@ function newSelectorProxy(source, path, moduleSchema) {
51014
50939
  if (prop === GetSource) {
51015
50940
  return source;
51016
50941
  }
51017
- if (prop === Path) {
50942
+ if (prop === Path$1) {
51018
50943
  return path;
51019
50944
  }
51020
50945
  if (prop === GetSchema) {
@@ -51081,7 +51006,7 @@ function newSelectorProxy(source, path, moduleSchema) {
51081
51006
  andThen: function andThen(f) {
51082
51007
  return _andThen(f, source === void 0 ? null : source, path);
51083
51008
  }
51084
- }, GetSource, source === void 0 ? null : source), Path, path), GetSchema, moduleSchema);
51009
+ }, GetSource, source === void 0 ? null : source), Path$1, path), GetSchema, moduleSchema);
51085
51010
  }
51086
51011
  }
51087
51012
  function createValPathOfItem$1(arrayPath, prop) {
@@ -51091,7 +51016,7 @@ function createValPathOfItem$1(arrayPath, prop) {
51091
51016
  return arrayPath && "".concat(arrayPath, ".").concat(JSON.stringify(prop));
51092
51017
  }
51093
51018
  function unValify(valueOrSelector) {
51094
- if (_typeof(valueOrSelector) === "object" && (GetSource in valueOrSelector || Path in valueOrSelector)) {
51019
+ if (_typeof(valueOrSelector) === "object" && (GetSource in valueOrSelector || Path$1 in valueOrSelector)) {
51095
51020
  var selectorValue = valueOrSelector[GetSource];
51096
51021
  return selectorValue;
51097
51022
  }
@@ -51551,6 +51476,81 @@ var RichTextSchema = /* @__PURE__ */ function(_Schema) {
51551
51476
  }]);
51552
51477
  return RichTextSchema2;
51553
51478
  }(Schema);
51479
+ var ImageSchema = /* @__PURE__ */ function(_Schema) {
51480
+ _inherits(ImageSchema2, _Schema);
51481
+ var _super = _createSuper(ImageSchema2);
51482
+ function ImageSchema2(options) {
51483
+ var _this;
51484
+ var opt = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
51485
+ _classCallCheck(this, ImageSchema2);
51486
+ _this = _super.call(this);
51487
+ _this.options = options;
51488
+ _this.opt = opt;
51489
+ return _this;
51490
+ }
51491
+ _createClass(ImageSchema2, [{
51492
+ key: "validate",
51493
+ value: function validate(path, src) {
51494
+ if (this.opt && (src === null || src === void 0)) {
51495
+ return false;
51496
+ }
51497
+ if (src === null || src === void 0) {
51498
+ return _defineProperty$5({}, path, [{
51499
+ message: "Non-optional image was null or undefined.",
51500
+ value: src
51501
+ }]);
51502
+ }
51503
+ if (typeof src[FILE_REF_PROP] !== "string") {
51504
+ return _defineProperty$5({}, path, [{
51505
+ message: "Image did not have a file reference string. Got: ".concat(_typeof(src[FILE_REF_PROP])),
51506
+ value: src
51507
+ }]);
51508
+ }
51509
+ if (src[VAL_EXTENSION] !== "file") {
51510
+ return _defineProperty$5({}, path, [{
51511
+ message: "Image did not have the valid file extension type. Got: ".concat(src[VAL_EXTENSION]),
51512
+ value: src
51513
+ }]);
51514
+ }
51515
+ if (src.metadata) {
51516
+ return _defineProperty$5({}, path, [{
51517
+ message: "Found metadata, but it could not be validated. Image metadata must be an object with the required props: width (positive number), height (positive number) and sha256 (string of length 64 of the base16 hash).",
51518
+ // These validation errors will have to be picked up by logic outside of this package and revalidated. Reasons: 1) we have to read files to verify the metadata, which is handled differently in different runtimes (Browser, QuickJS, Node.js); 2) we want to keep this package dependency free.
51519
+ value: src,
51520
+ fixes: ["image:replace-metadata"]
51521
+ }]);
51522
+ }
51523
+ return _defineProperty$5({}, path, [{
51524
+ message: "Could not validate Image metadata.",
51525
+ value: src,
51526
+ fixes: ["image:add-metadata"]
51527
+ }]);
51528
+ }
51529
+ }, {
51530
+ key: "assert",
51531
+ value: function assert(src) {
51532
+ if (this.opt && (src === null || src === void 0)) {
51533
+ return true;
51534
+ }
51535
+ return (src === null || src === void 0 ? void 0 : src[FILE_REF_PROP]) === "image" && (src === null || src === void 0 ? void 0 : src[VAL_EXTENSION]) === "file";
51536
+ }
51537
+ }, {
51538
+ key: "optional",
51539
+ value: function optional() {
51540
+ return new ImageSchema2(this.options, true);
51541
+ }
51542
+ }, {
51543
+ key: "serialize",
51544
+ value: function serialize() {
51545
+ return {
51546
+ type: "image",
51547
+ options: this.options,
51548
+ opt: this.opt
51549
+ };
51550
+ }
51551
+ }]);
51552
+ return ImageSchema2;
51553
+ }(Schema);
51554
51554
  var RecordSchema = /* @__PURE__ */ function(_Schema) {
51555
51555
  _inherits(RecordSchema2, _Schema);
51556
51556
  var _super = _createSuper(RecordSchema2);
@@ -51827,6 +51827,96 @@ function parsePath$1(input) {
51827
51827
  }
51828
51828
  return result2;
51829
51829
  }
51830
+ var StringSchema = /* @__PURE__ */ function(_Schema) {
51831
+ _inherits(StringSchema2, _Schema);
51832
+ var _super = _createSuper(StringSchema2);
51833
+ function StringSchema2(options) {
51834
+ var _this;
51835
+ var opt = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
51836
+ var isRaw = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
51837
+ _classCallCheck(this, StringSchema2);
51838
+ _this = _super.call(this);
51839
+ _this.options = options;
51840
+ _this.opt = opt;
51841
+ _this.isRaw = isRaw;
51842
+ return _this;
51843
+ }
51844
+ _createClass(StringSchema2, [{
51845
+ key: "validate",
51846
+ value: function validate(path, src) {
51847
+ var _this$options, _this$options2, _this$options3;
51848
+ if (this.opt && (src === null || src === void 0)) {
51849
+ return false;
51850
+ }
51851
+ if (typeof src !== "string") {
51852
+ return _defineProperty$5({}, path, [{
51853
+ message: "Expected 'string', got '".concat(_typeof(src), "'"),
51854
+ value: src
51855
+ }]);
51856
+ }
51857
+ var errors = [];
51858
+ if ((_this$options = this.options) !== null && _this$options !== void 0 && _this$options.maxLength && src.length > this.options.maxLength) {
51859
+ errors.push({
51860
+ message: "Expected string to be at most ".concat(this.options.maxLength, " characters long, got ").concat(src.length),
51861
+ value: src
51862
+ });
51863
+ }
51864
+ if ((_this$options2 = this.options) !== null && _this$options2 !== void 0 && _this$options2.minLength && src.length < this.options.minLength) {
51865
+ errors.push({
51866
+ message: "Expected string to be at least ".concat(this.options.minLength, " characters long, got ").concat(src.length),
51867
+ value: src
51868
+ });
51869
+ }
51870
+ if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.regexp && !this.options.regexp.test(src)) {
51871
+ errors.push({
51872
+ message: "Expected string to match reg exp: ".concat(this.options.regexp.toString(), ", got '").concat(src, "'"),
51873
+ value: src
51874
+ });
51875
+ }
51876
+ if (errors.length > 0) {
51877
+ return _defineProperty$5({}, path, errors);
51878
+ }
51879
+ return false;
51880
+ }
51881
+ }, {
51882
+ key: "assert",
51883
+ value: function assert(src) {
51884
+ if (this.opt && (src === null || src === void 0)) {
51885
+ return true;
51886
+ }
51887
+ return typeof src === "string";
51888
+ }
51889
+ }, {
51890
+ key: "optional",
51891
+ value: function optional() {
51892
+ return new StringSchema2(this.options, true, this.isRaw);
51893
+ }
51894
+ }, {
51895
+ key: "raw",
51896
+ value: function raw() {
51897
+ return new StringSchema2(this.options, this.opt, true);
51898
+ }
51899
+ }, {
51900
+ key: "serialize",
51901
+ value: function serialize() {
51902
+ var _this$options4, _this$options5, _this$options6;
51903
+ return {
51904
+ type: "string",
51905
+ options: {
51906
+ maxLength: (_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.maxLength,
51907
+ minLength: (_this$options5 = this.options) === null || _this$options5 === void 0 ? void 0 : _this$options5.minLength,
51908
+ regexp: ((_this$options6 = this.options) === null || _this$options6 === void 0 ? void 0 : _this$options6.regexp) && {
51909
+ source: this.options.regexp.source,
51910
+ flags: this.options.regexp.flags
51911
+ }
51912
+ },
51913
+ opt: this.opt,
51914
+ raw: this.isRaw
51915
+ };
51916
+ }
51917
+ }]);
51918
+ return StringSchema2;
51919
+ }(Schema);
51830
51920
  function getVal(selector) {
51831
51921
  return newValProxy(serializedValOfSelectorSource(selector));
51832
51922
  }
@@ -51849,7 +51939,7 @@ function serializedValOfSelectorSource(selector) {
51849
51939
  var isObject = isObjectOrObjectSelector(child);
51850
51940
  if (isArray) {
51851
51941
  var array = GetSource in child ? child[GetSource] : child;
51852
- var valPath = Path in child ? child[Path] : void 0;
51942
+ var valPath = Path$1 in child ? child[Path$1] : void 0;
51853
51943
  return {
51854
51944
  val: array.map(function(item, i) {
51855
51945
  return rec(isSelector(item) ? item : newSelectorProxy(item, createValPathOfItem$1(valPath, i)));
@@ -51858,7 +51948,7 @@ function serializedValOfSelectorSource(selector) {
51858
51948
  };
51859
51949
  } else if (isObject) {
51860
51950
  var obj = GetSource in child ? child[GetSource] : child;
51861
- var _valPath = Path in child ? child[Path] : void 0;
51951
+ var _valPath = Path$1 in child ? child[Path$1] : void 0;
51862
51952
  return {
51863
51953
  val: obj !== null && Object.fromEntries(Object.entries(obj).map(function(_ref) {
51864
51954
  var _ref2 = _slicedToArray$1(_ref, 2), key = _ref2[0], value = _ref2[1];
@@ -51869,7 +51959,7 @@ function serializedValOfSelectorSource(selector) {
51869
51959
  } else if (isSelector(child)) {
51870
51960
  return {
51871
51961
  val: rec(child[GetSource]),
51872
- valPath: child[Path]
51962
+ valPath: child[Path$1]
51873
51963
  };
51874
51964
  } else {
51875
51965
  return child;
@@ -51911,13 +52001,13 @@ function newValProxy(val) {
51911
52001
  if (prop === "val") {
51912
52002
  return true;
51913
52003
  }
51914
- if (prop === Path) {
52004
+ if (prop === Path$1) {
51915
52005
  return true;
51916
52006
  }
51917
52007
  return hasOwn(target, prop);
51918
52008
  },
51919
52009
  get: function get(target, prop) {
51920
- if (prop === Path) {
52010
+ if (prop === Path$1) {
51921
52011
  return val.valPath;
51922
52012
  }
51923
52013
  if (prop === "val") {
@@ -51938,7 +52028,7 @@ function newValProxy(val) {
51938
52028
  });
51939
52029
  }
51940
52030
  default:
51941
- return _defineProperty$5(_defineProperty$5({}, Path, val.valPath), "val", val.val);
52031
+ return _defineProperty$5(_defineProperty$5({}, Path$1, val.valPath), "val", val.val);
51942
52032
  }
51943
52033
  }
51944
52034
  function hasOwn(obj, prop) {
@@ -54563,14 +54653,16 @@ function fromLexicalImageNode(node, files) {
54563
54653
  return _defineProperty$4(_defineProperty$4(_defineProperty$4({}, VAL_EXTENSION, "file"), FILE_REF_PROP, filePath), "metadata", {
54564
54654
  width: node.width || 0,
54565
54655
  height: node.height || 0,
54566
- sha256: sha256 || ""
54656
+ sha256: sha256 || "",
54657
+ mimeType
54567
54658
  });
54568
54659
  } else {
54569
54660
  var _sha = getParam("sha256", node.src);
54570
54661
  return _defineProperty$4(_defineProperty$4(_defineProperty$4({}, VAL_EXTENSION, "file"), FILE_REF_PROP, "/public".concat(node.src.split("?")[0])), "metadata", {
54571
54662
  width: node.width || 0,
54572
54663
  height: node.height || 0,
54573
- sha256: _sha || ""
54664
+ sha256: _sha || "",
54665
+ mimeType: node.mimeType || ""
54574
54666
  });
54575
54667
  }
54576
54668
  }
@@ -54673,7 +54765,8 @@ function toLexicalImageNode(node) {
54673
54765
  type: "image",
54674
54766
  src: url,
54675
54767
  width: node.width,
54676
- height: node.height
54768
+ height: node.height,
54769
+ mimeType: node.mimeType
54677
54770
  // TODO: altText
54678
54771
  });
54679
54772
  }
@@ -54868,12 +54961,13 @@ function parseTokens(tokens, sourceNodes, cursor) {
54868
54961
  children: subChildren
54869
54962
  });
54870
54963
  } else if (sourceNode._type === "file") {
54871
- var _sourceNode$metadata, _sourceNode$metadata2;
54964
+ var _sourceNode$metadata, _sourceNode$metadata2, _sourceNode$metadata3;
54872
54965
  children.push({
54873
54966
  tag: "img",
54874
54967
  src: Internal.convertFileSource(sourceNode).url,
54875
54968
  width: (_sourceNode$metadata = sourceNode.metadata) === null || _sourceNode$metadata === void 0 ? void 0 : _sourceNode$metadata.width,
54876
54969
  height: (_sourceNode$metadata2 = sourceNode.metadata) === null || _sourceNode$metadata2 === void 0 ? void 0 : _sourceNode$metadata2.height,
54970
+ mimeType: (_sourceNode$metadata3 = sourceNode.metadata) === null || _sourceNode$metadata3 === void 0 ? void 0 : _sourceNode$metadata3.mimeType,
54877
54971
  children: []
54878
54972
  });
54879
54973
  }
@@ -56359,7 +56453,7 @@ const Toolbar = ({
56359
56453
  }
56360
56454
  });
56361
56455
  }, [activeEditor]);
56362
- return /* @__PURE__ */ jsxs("div", { className: "sticky top-0 flex flex-col px-4 py-2 border-b backdrop-blur-3xl bg-background/10 border-highlight", children: [
56456
+ return /* @__PURE__ */ jsxs("div", { className: "sticky top-0 flex flex-col px-4 py-2 border rounded-md rounded-b-none border-input bg-background", children: [
56363
56457
  /* @__PURE__ */ jsxs("div", { className: "flex flex-row gap-1", children: [
56364
56458
  /* @__PURE__ */ jsx(
56365
56459
  Dropdown$1,
@@ -56451,7 +56545,7 @@ const Toolbar = ({
56451
56545
  {
56452
56546
  type: "text",
56453
56547
  placeholder: "Enter URL",
56454
- className: "w-1/3 px-2 text-primary",
56548
+ className: "w-1/3 px-2 bg-background text-primary",
56455
56549
  value: url,
56456
56550
  onChange: (ev) => {
56457
56551
  ev.preventDefault();
@@ -56488,12 +56582,10 @@ const Toolbar$1 = Toolbar;
56488
56582
  function onError(error) {
56489
56583
  console.error(error);
56490
56584
  }
56491
- const TOOLBAR_HEIGHT = 28;
56492
56585
  const RichTextEditor = ({
56493
56586
  richtext,
56494
56587
  onEditor
56495
56588
  }) => {
56496
- const { windowSize } = useValOverlayContext();
56497
56589
  const prePopulatedState = (editor) => {
56498
56590
  editor.setEditorState(
56499
56591
  editor.parseEditorState({
@@ -56536,17 +56628,8 @@ const RichTextEditor = ({
56536
56628
  /* @__PURE__ */ jsx(
56537
56629
  LexicalRichTextPlugin_1.RichTextPlugin,
56538
56630
  {
56539
- contentEditable: /* @__PURE__ */ jsx(
56540
- "div",
56541
- {
56542
- className: "font-sans border-b text-primary border-highlight",
56543
- style: {
56544
- minHeight: (windowSize == null ? void 0 : windowSize.innerHeight) ? (windowSize == null ? void 0 : windowSize.innerHeight) - TOOLBAR_HEIGHT : void 0
56545
- },
56546
- children: /* @__PURE__ */ jsx(LexicalContentEditable, { className: "p-4 outline-none bg-fill" })
56547
- }
56548
- ),
56549
- placeholder: /* @__PURE__ */ jsx("div", { className: "", children: "Enter some text..." }),
56631
+ contentEditable: /* @__PURE__ */ jsx("div", { className: "px-3 py-2 text-sm border-b rounded-md rounded-t-none border-x border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", children: /* @__PURE__ */ jsx(LexicalContentEditable, { className: "p-4 outline-none bg-fill" }) }),
56632
+ placeholder: /* @__PURE__ */ jsx("p", { className: "" }),
56550
56633
  ErrorBoundary: LexicalErrorBoundary$1
56551
56634
  }
56552
56635
  ),
@@ -56611,17 +56694,22 @@ const LogIn = createLucideIcon("LogIn", [
56611
56694
  ["polyline", { points: "10 17 15 12 10 7", key: "1ail0h" }],
56612
56695
  ["line", { x1: "15", x2: "3", y1: "12", y2: "12", key: "v6grx8" }]
56613
56696
  ]);
56614
- const Maximize = createLucideIcon("Maximize", [
56615
- ["path", { d: "M8 3H5a2 2 0 0 0-2 2v3", key: "1dcmit" }],
56616
- ["path", { d: "M21 8V5a2 2 0 0 0-2-2h-3", key: "1e4gt3" }],
56617
- ["path", { d: "M3 16v3a2 2 0 0 0 2 2h3", key: "wsl5sc" }],
56618
- ["path", { d: "M16 21h3a2 2 0 0 0 2-2v-3", key: "18trek" }]
56697
+ const Maximize2 = createLucideIcon("Maximize2", [
56698
+ ["polyline", { points: "15 3 21 3 21 9", key: "mznyad" }],
56699
+ ["polyline", { points: "9 21 3 21 3 15", key: "1avn1i" }],
56700
+ ["line", { x1: "21", x2: "14", y1: "3", y2: "10", key: "ota7mn" }],
56701
+ ["line", { x1: "3", x2: "10", y1: "21", y2: "14", key: "1atl0r" }]
56619
56702
  ]);
56620
- const Minimize = createLucideIcon("Minimize", [
56621
- ["path", { d: "M8 3v3a2 2 0 0 1-2 2H3", key: "hohbtr" }],
56622
- ["path", { d: "M21 8h-3a2 2 0 0 1-2-2V3", key: "5jw1f3" }],
56623
- ["path", { d: "M3 16h3a2 2 0 0 1 2 2v3", key: "198tvr" }],
56624
- ["path", { d: "M16 21v-3a2 2 0 0 1 2-2h3", key: "ph8mxp" }]
56703
+ const Menu = createLucideIcon("Menu", [
56704
+ ["line", { x1: "4", x2: "20", y1: "12", y2: "12", key: "1e0a9i" }],
56705
+ ["line", { x1: "4", x2: "20", y1: "6", y2: "6", key: "1owob3" }],
56706
+ ["line", { x1: "4", x2: "20", y1: "18", y2: "18", key: "yk5zj1" }]
56707
+ ]);
56708
+ const Minimize2 = createLucideIcon("Minimize2", [
56709
+ ["polyline", { points: "4 14 10 14 10 20", key: "11kfnr" }],
56710
+ ["polyline", { points: "20 10 14 10 14 4", key: "rlmsce" }],
56711
+ ["line", { x1: "14", x2: "21", y1: "10", y2: "3", key: "o5lafz" }],
56712
+ ["line", { x1: "3", x2: "10", y1: "21", y2: "14", key: "1atl0r" }]
56625
56713
  ]);
56626
56714
  const Moon = createLucideIcon("Moon", [
56627
56715
  ["path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z", key: "a7tn18" }]
@@ -56661,20 +56749,35 @@ const PREV_URL_KEY = "valbuild:urlBeforeNavigation";
56661
56749
  function ValMenu({
56662
56750
  api,
56663
56751
  patches,
56752
+ direction,
56664
56753
  onCommit
56665
56754
  }) {
56666
56755
  const { theme: theme2, setTheme, editMode, setEditMode, session } = useValOverlayContext();
56667
56756
  if (session.status === "success" && session.data.mode === "unauthorized") {
56668
- return /* @__PURE__ */ jsxs(SingleItemMenu, { href: api.getLoginUrl(window.location.href), children: [
56669
- /* @__PURE__ */ jsx("span", { children: "Login" }),
56670
- /* @__PURE__ */ jsx(LogIn, { size: 18 })
56671
- ] });
56757
+ return /* @__PURE__ */ jsxs(
56758
+ SingleItemMenu,
56759
+ {
56760
+ direction,
56761
+ href: api.getLoginUrl(window.location.href),
56762
+ children: [
56763
+ /* @__PURE__ */ jsx("span", { children: "Login" }),
56764
+ /* @__PURE__ */ jsx(LogIn, { size: 18 })
56765
+ ]
56766
+ }
56767
+ );
56672
56768
  }
56673
56769
  if (session.status === "success" && !session.data.enabled) {
56674
- return /* @__PURE__ */ jsxs(SingleItemMenu, { href: api.getEnableUrl(window.location.href), children: [
56675
- /* @__PURE__ */ jsx("span", { children: "Enable" }),
56676
- /* @__PURE__ */ jsx(LogIn, { size: 18 })
56677
- ] });
56770
+ return /* @__PURE__ */ jsxs(
56771
+ SingleItemMenu,
56772
+ {
56773
+ direction,
56774
+ href: api.getEnableUrl(window.location.href),
56775
+ children: [
56776
+ /* @__PURE__ */ jsx("span", { children: "Enable" }),
56777
+ /* @__PURE__ */ jsx(LogIn, { size: 18 })
56778
+ ]
56779
+ }
56780
+ );
56678
56781
  }
56679
56782
  const [patchCount, setPatchCount] = useState();
56680
56783
  useEffect(() => {
@@ -56684,9 +56787,9 @@ function ValMenu({
56684
56787
  }
56685
56788
  setPatchCount(patchCount2);
56686
56789
  }, [patches]);
56687
- return /* @__PURE__ */ jsxs(MenuContainer, { children: [
56790
+ return /* @__PURE__ */ jsxs(MenuContainer, { direction, children: [
56688
56791
  /* @__PURE__ */ jsx(
56689
- MenuButton,
56792
+ MenuButton$1,
56690
56793
  {
56691
56794
  active: editMode === "hover",
56692
56795
  onClick: () => {
@@ -56696,7 +56799,7 @@ function ValMenu({
56696
56799
  }
56697
56800
  ),
56698
56801
  /* @__PURE__ */ jsx(
56699
- MenuButton,
56802
+ MenuButton$1,
56700
56803
  {
56701
56804
  onClick: () => {
56702
56805
  setTheme(theme2 === "dark" ? "light" : "dark");
@@ -56708,7 +56811,7 @@ function ValMenu({
56708
56811
  }
56709
56812
  ),
56710
56813
  /* @__PURE__ */ jsx(
56711
- MenuButton,
56814
+ MenuButton$1,
56712
56815
  {
56713
56816
  active: editMode === "full",
56714
56817
  onClick: () => {
@@ -56720,11 +56823,11 @@ function ValMenu({
56720
56823
  window.location.href = prevUrl || "/";
56721
56824
  }
56722
56825
  },
56723
- children: /* @__PURE__ */ jsx("div", { className: "h-[24px] w-[24px] flex justify-center items-center", children: editMode === "full" ? /* @__PURE__ */ jsx(Minimize, { size: 15 }) : /* @__PURE__ */ jsx(Maximize, { size: 15 }) })
56826
+ children: /* @__PURE__ */ jsx("div", { className: "h-[24px] w-[24px] flex justify-center items-center", children: editMode === "full" ? /* @__PURE__ */ jsx(Minimize2, { size: 15 }) : /* @__PURE__ */ jsx(Maximize2, { size: 15 }) })
56724
56827
  }
56725
56828
  ),
56726
56829
  patchCount !== void 0 && session.status === "success" && session.data.mode === "proxy" && /* @__PURE__ */ jsx(
56727
- MenuButton,
56830
+ MenuButton$1,
56728
56831
  {
56729
56832
  onClick: () => {
56730
56833
  if (patchCount > 0) {
@@ -56752,16 +56855,42 @@ function ValMenu({
56752
56855
  }
56753
56856
  function SingleItemMenu({
56754
56857
  href,
56858
+ direction,
56755
56859
  children
56756
56860
  }) {
56757
- return /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center justify-center w-full h-full font-sans border-2 rounded-full gap-x-3 text-primary bg-background border-fill", children: /* @__PURE__ */ jsx("a", { className, href, children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center px-2 gap-x-2", children }) }) });
56861
+ return /* @__PURE__ */ jsx(
56862
+ "div",
56863
+ {
56864
+ className: classNames(
56865
+ "flex items-start justify-center w-full h-full font-sans border rounded-full gap-3 text-primary border-fill bg-gradient-to-br from-background/90 from-40% to-background backdrop-blur-lg drop-shadow-2xl",
56866
+ {
56867
+ "flex-col items-start": direction === "vertical",
56868
+ "flex-row items-center": direction === "horizontal"
56869
+ }
56870
+ ),
56871
+ children: /* @__PURE__ */ jsx("a", { className, href, children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center px-2 gap-y-2", children }) })
56872
+ }
56873
+ );
56758
56874
  }
56759
56875
  function MenuContainer({
56760
- children
56876
+ children,
56877
+ direction
56761
56878
  }) {
56762
- return /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center justify-center w-full h-full px-2 py-2 font-sans border-2 rounded-full gap-x-3 text-primary bg-background border-fill", children });
56879
+ return /* @__PURE__ */ jsx(
56880
+ "div",
56881
+ {
56882
+ className: classNames(
56883
+ "flex justify-center w-full h-full px-2 py-2 font-sans border rounded-full gap-3 text-primary border-fill bg-gradient-to-br from-background/90 from-40% to-background backdrop-blur-lg drop-shadow-2xl",
56884
+ {
56885
+ "flex-col items-start": direction === "vertical",
56886
+ "flex-row items-center": direction === "horizontal"
56887
+ }
56888
+ ),
56889
+ children
56890
+ }
56891
+ );
56763
56892
  }
56764
- function MenuButton({
56893
+ function MenuButton$1({
56765
56894
  active,
56766
56895
  onClick,
56767
56896
  children
@@ -56770,7 +56899,7 @@ function MenuButton({
56770
56899
  "button",
56771
56900
  {
56772
56901
  className: classNames(className, {
56773
- "bg-accent drop-shadow-[0px_0px_12px_rgba(56,205,152,0.60)]": active
56902
+ "bg-accent text-accent-foreground drop-shadow-[0px_0px_12px_hsl(var(--accent))]": active
56774
56903
  }),
56775
56904
  onClick,
56776
56905
  children
@@ -62358,14 +62487,21 @@ const twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
62358
62487
  function cn(...inputs) {
62359
62488
  return twMerge(clsx(inputs));
62360
62489
  }
62361
- const ScrollArea = React$3.forwardRef(({ className: className2, children, ...props }, ref) => /* @__PURE__ */ jsxs(
62490
+ const ScrollArea = React$3.forwardRef(({ className: className2, children, innerRef, ...props }, ref) => /* @__PURE__ */ jsxs(
62362
62491
  $57acba87d6e25586$export$be92b6f5f03c0fe9,
62363
62492
  {
62364
62493
  ref,
62365
62494
  className: cn("relative overflow-hidden", className2),
62366
62495
  ...props,
62367
62496
  children: [
62368
- /* @__PURE__ */ jsx($57acba87d6e25586$export$d5c6c08dc2d3ca7, { className: "h-full w-full rounded-[inherit]", children }),
62497
+ /* @__PURE__ */ jsx(
62498
+ $57acba87d6e25586$export$d5c6c08dc2d3ca7,
62499
+ {
62500
+ className: "h-full w-full rounded-[inherit]",
62501
+ ref: innerRef,
62502
+ children
62503
+ }
62504
+ ),
62369
62505
  /* @__PURE__ */ jsx(ScrollBar, {}),
62370
62506
  /* @__PURE__ */ jsx($57acba87d6e25586$export$ac61190d9fc311a9, {})
62371
62507
  ]
@@ -62396,8 +62532,8 @@ const ScrollBar = React$3.forwardRef(({ className: className2, orientation = "ve
62396
62532
  }
62397
62533
  ));
62398
62534
  ScrollBar.displayName = $57acba87d6e25586$export$2fabd85d0eba3c57.displayName;
62399
- const MIN_WIDTH = 320;
62400
- const MIN_HEIGHT = 320;
62535
+ const MIN_WIDTH = 400;
62536
+ const MIN_HEIGHT = 250;
62401
62537
  function ValWindow({
62402
62538
  position,
62403
62539
  onClose,
@@ -62420,15 +62556,13 @@ function ValWindow({
62420
62556
  const { windowSize, setWindowSize } = useValOverlayContext();
62421
62557
  useEffect(() => {
62422
62558
  var _a, _b;
62423
- if (!windowSize) {
62424
- setWindowSize({
62425
- height: MIN_HEIGHT,
62426
- width: MIN_WIDTH,
62427
- innerHeight: MIN_HEIGHT - (64 + (((_b = (_a = bottomRef.current) == null ? void 0 : _a.getBoundingClientRect()) == null ? void 0 : _b.height) || 0))
62428
- });
62429
- }
62430
- }, [windowSize]);
62431
- const bottomRef = useRef(null);
62559
+ setWindowSize({
62560
+ height: window.innerHeight - 30,
62561
+ width: MIN_WIDTH,
62562
+ innerHeight: window.innerHeight - 30 - (64 + (((_b = (_a = bottomRef.current) == null ? void 0 : _a.getBoundingClientRect()) == null ? void 0 : _b.height) || 0))
62563
+ });
62564
+ }, []);
62565
+ const bottomRef = useRef(null);
62432
62566
  return /* @__PURE__ */ jsx(
62433
62567
  Resizable,
62434
62568
  {
@@ -62439,7 +62573,7 @@ function ValWindow({
62439
62573
  var _a, _b;
62440
62574
  return setWindowSize({
62441
62575
  ...size2,
62442
- innerHeight: ((windowSize == null ? void 0 : windowSize.height) || MIN_HEIGHT) - (64 + (((_b = (_a = bottomRef.current) == null ? void 0 : _a.getBoundingClientRect()) == null ? void 0 : _b.height) || 0))
62576
+ innerHeight: size2.height - (64 + (((_b = (_a = bottomRef.current) == null ? void 0 : _a.getBoundingClientRect()) == null ? void 0 : _b.height) || 0))
62443
62577
  });
62444
62578
  },
62445
62579
  handle: /* @__PURE__ */ jsx("div", { className: "fixed bottom-0 right-0 cursor-se-resize", children: /* @__PURE__ */ jsx(
@@ -62473,14 +62607,16 @@ function ValWindow({
62473
62607
  width: (windowSize == null ? void 0 : windowSize.width) || MIN_WIDTH,
62474
62608
  height: (windowSize == null ? void 0 : windowSize.height) || MIN_HEIGHT,
62475
62609
  left: draggedPosition.left,
62476
- top: draggedPosition.top
62610
+ top: draggedPosition.top,
62611
+ right: draggedPosition.right,
62612
+ bottom: draggedPosition.bottom
62477
62613
  },
62478
62614
  children: [
62479
62615
  /* @__PURE__ */ jsxs(
62480
62616
  "div",
62481
62617
  {
62482
62618
  ref: dragRef,
62483
- className: "relative flex items-center justify-center px-2 pt-2 text-primary",
62619
+ className: "relative flex items-center justify-center px-2 py-2 text-primary",
62484
62620
  children: [
62485
62621
  /* @__PURE__ */ jsx(
62486
62622
  AlignJustify,
@@ -62505,56 +62641,32 @@ function ValWindow({
62505
62641
  ]
62506
62642
  }
62507
62643
  ),
62508
- /* @__PURE__ */ jsxs(
62509
- "form",
62510
- {
62511
- className: "h-full",
62512
- onSubmit: (ev) => {
62513
- ev.preventDefault();
62514
- },
62515
- children: [
62516
- Array.isArray(children) && children.slice(0, 1),
62517
- /* @__PURE__ */ jsx(
62518
- ScrollArea,
62519
- {
62520
- className: "relative",
62521
- style: {
62522
- height: windowSize == null ? void 0 : windowSize.innerHeight
62523
- },
62524
- children: Array.isArray(children) ? children.slice(1, -1) : children
62525
- }
62526
- ),
62527
- /* @__PURE__ */ jsx("div", { ref: bottomRef, className: "w-full px-4 pb-0", children: Array.isArray(children) && children.slice(-1) })
62528
- ]
62529
- }
62530
- )
62644
+ /* @__PURE__ */ jsxs("div", { children: [
62645
+ Array.isArray(children) && children.slice(0, 1),
62646
+ /* @__PURE__ */ jsx(
62647
+ ScrollArea,
62648
+ {
62649
+ className: "relative",
62650
+ style: {
62651
+ height: windowSize == null ? void 0 : windowSize.innerHeight
62652
+ },
62653
+ children: Array.isArray(children) ? children.slice(1, -1) : children
62654
+ }
62655
+ ),
62656
+ /* @__PURE__ */ jsx("div", { ref: bottomRef, className: "w-full px-4 pb-0", children: Array.isArray(children) && children.slice(-1) })
62657
+ ] })
62531
62658
  ]
62532
62659
  }
62533
62660
  )
62534
62661
  }
62535
62662
  );
62536
62663
  }
62537
- function useDrag({
62538
- position: initPosition
62539
- }) {
62664
+ function useDrag({ position: initPosition }) {
62540
62665
  var _a, _b;
62541
- const [position, setPosition] = useState({ left: 0, top: 0 });
62666
+ const [position, setPosition] = useState({ left: window.innerWidth - MIN_WIDTH - (24 + 50), top: 16 });
62542
62667
  useEffect(() => {
62543
- var _a2, _b2;
62544
62668
  if (initPosition) {
62545
- const left = initPosition.left - (((_b2 = (_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.getBoundingClientRect()) == null ? void 0 : _b2.width) || 0) / 2;
62546
- const top = initPosition.top - 16;
62547
- setPosition({
62548
- left: left < 0 ? 0 : left,
62549
- top: top < 0 ? 0 : top
62550
- });
62551
- } else {
62552
- const left = window.innerWidth / 2 - MIN_WIDTH / 2 - window.scrollX;
62553
- const top = window.innerHeight / 2 - MIN_HEIGHT / 2 + window.scrollY;
62554
- setPosition({
62555
- left,
62556
- top
62557
- });
62669
+ setPosition(initPosition);
62558
62670
  }
62559
62671
  }, [initPosition]);
62560
62672
  const [mouseDown, setMouseDown] = useState(false);
@@ -62568,8 +62680,8 @@ function useDrag({
62568
62680
  if (mouseDown) {
62569
62681
  e.preventDefault();
62570
62682
  e.stopPropagation();
62571
- const left = -((((_b2 = (_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.getBoundingClientRect()) == null ? void 0 : _b2.width) || 0) / 2) + e.pageX;
62572
- const top = -((((_d = (_c = ref == null ? void 0 : ref.current) == null ? void 0 : _c.getBoundingClientRect()) == null ? void 0 : _d.height) || 0) / 2) + +e.pageY;
62683
+ const left = -((((_b2 = (_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.getBoundingClientRect()) == null ? void 0 : _b2.width) || 0) / 2) + e.clientX;
62684
+ const top = -((((_d = (_c = ref == null ? void 0 : ref.current) == null ? void 0 : _c.getBoundingClientRect()) == null ? void 0 : _d.height) || 0) / 2) + +e.clientY;
62573
62685
  setPosition({
62574
62686
  left: left < 0 ? 0 : left,
62575
62687
  top: top < 0 ? 0 : top
@@ -62747,6 +62859,7 @@ function Grid({ children }) {
62747
62859
  const x = useRef(0);
62748
62860
  const dragRef = useRef(null);
62749
62861
  const originalWidth = useRef(0);
62862
+ const [showMobileLeftMenu, setShowMobileLeftMenu] = useState(true);
62750
62863
  const handleMouseUp = () => {
62751
62864
  isResizing.current = false;
62752
62865
  dragRef.current = null;
@@ -62787,17 +62900,40 @@ function Grid({ children }) {
62787
62900
  document.removeEventListener("mousemove", handleMouseMove);
62788
62901
  };
62789
62902
  }, []);
62790
- return /* @__PURE__ */ jsxs("div", { className: "flex h-screen", children: [
62903
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex h-screen", children: [
62791
62904
  /* @__PURE__ */ jsxs(
62792
62905
  "div",
62793
62906
  {
62794
62907
  ref: leftColRef,
62795
- className: "relative border-r border-border",
62796
- style: { width: 300 },
62908
+ className: classNames(
62909
+ "absolute top-0 left-0 border-r border-border md:relative z-[1] bg-gradient-to-br from-card from-50% to-background",
62910
+ {
62911
+ "w-[300px]": showMobileLeftMenu,
62912
+ "w-0 md:w-[300px]": !showMobileLeftMenu
62913
+ }
62914
+ ),
62797
62915
  children: [
62798
62916
  /* @__PURE__ */ jsxs(Grid.Column, { children: [
62799
- header1,
62800
- /* @__PURE__ */ jsx(ScrollArea, { style: { height: "calc(100vh - 50px)" }, children: body1 })
62917
+ /* @__PURE__ */ jsx(
62918
+ MenuButton,
62919
+ {
62920
+ showOnMobile: !showMobileLeftMenu,
62921
+ onClick: () => {
62922
+ setShowMobileLeftMenu(!showMobileLeftMenu);
62923
+ },
62924
+ children: header1
62925
+ }
62926
+ ),
62927
+ /* @__PURE__ */ jsx(
62928
+ ScrollArea,
62929
+ {
62930
+ style: { height: "calc(100vh - 50px)" },
62931
+ onClick: () => {
62932
+ setShowMobileLeftMenu(false);
62933
+ },
62934
+ children: body1
62935
+ }
62936
+ )
62801
62937
  ] }),
62802
62938
  /* @__PURE__ */ jsx(
62803
62939
  "div",
@@ -62816,7 +62952,28 @@ function Grid({ children }) {
62816
62952
  "w-full": !header3 && !body3
62817
62953
  }),
62818
62954
  children: /* @__PURE__ */ jsxs(Grid.Column, { children: [
62819
- header2,
62955
+ /* @__PURE__ */ jsxs("span", { className: "flex w-full border-b border-border", children: [
62956
+ /* @__PURE__ */ jsx(
62957
+ MenuButton,
62958
+ {
62959
+ className: "md:hidden",
62960
+ showOnMobile: showMobileLeftMenu,
62961
+ onClick: () => {
62962
+ setShowMobileLeftMenu(!showMobileLeftMenu);
62963
+ },
62964
+ children: header1
62965
+ }
62966
+ ),
62967
+ /* @__PURE__ */ jsx(
62968
+ "span",
62969
+ {
62970
+ className: classNames({
62971
+ "pl-[300px] md:pl-0": showMobileLeftMenu
62972
+ }),
62973
+ children: header2
62974
+ }
62975
+ )
62976
+ ] }),
62820
62977
  /* @__PURE__ */ jsx(ScrollArea, { style: { height: "calc(100vh - 50px)" }, children: body2 })
62821
62978
  ] })
62822
62979
  }
@@ -62844,111 +63001,30 @@ function Grid({ children }) {
62844
63001
  )
62845
63002
  ] });
62846
63003
  }
62847
- Grid.Column = ({ children }) => {
62848
- const [header, body] = Children.toArray(children);
62849
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
62850
- /* @__PURE__ */ jsx("div", { className: "flex items-center border-b border-border", children: header }),
62851
- body
62852
- ] });
62853
- };
62854
- const Section = ({ className: className2 }) => {
63004
+ function MenuButton({
63005
+ className: className2,
63006
+ showOnMobile,
63007
+ onClick,
63008
+ children
63009
+ }) {
62855
63010
  return /* @__PURE__ */ jsxs(
62856
- "svg",
63011
+ "div",
62857
63012
  {
62858
- width: "9",
62859
- height: "10",
62860
- viewBox: "0 0 9 10",
62861
- className: className2,
62862
- fill: "currentColor",
62863
- xmlns: "http://www.w3.org/2000/svg",
63013
+ className: classNames("flex items-center px-4 md:px-4", className2, {
63014
+ "hidden md:flex": showOnMobile
63015
+ }),
62864
63016
  children: [
62865
- /* @__PURE__ */ jsxs("g", { clipPath: "url(#clip0_1222_1618)", children: [
62866
- /* @__PURE__ */ jsx(
62867
- "path",
62868
- {
62869
- fillRule: "evenodd",
62870
- clipRule: "evenodd",
62871
- d: "M9 1.5H0V0.5H9V1.5Z",
62872
- fill: "currentColor"
62873
- }
62874
- ),
62875
- /* @__PURE__ */ jsx(
62876
- "path",
62877
- {
62878
- fillRule: "evenodd",
62879
- clipRule: "evenodd",
62880
- d: "M9 9.5H0V8.5H9V9.5Z",
62881
- fill: "currentColor"
62882
- }
62883
- )
62884
- ] }),
62885
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_1222_1618", children: /* @__PURE__ */ jsx(
62886
- "rect",
62887
- {
62888
- width: "9",
62889
- height: "9",
62890
- fill: "white",
62891
- transform: "translate(0 0.5)"
62892
- }
62893
- ) }) })
63017
+ /* @__PURE__ */ jsx("button", { className: "md:hidden", onClick, children: /* @__PURE__ */ jsx(Menu, {}) }),
63018
+ /* @__PURE__ */ jsx("span", { className: "flex items-center justify-between w-full", children })
62894
63019
  ]
62895
63020
  }
62896
63021
  );
62897
- };
62898
- const Section$1 = Section;
62899
- const TextIcon = ({ className: className2 }) => {
62900
- return /* @__PURE__ */ jsx(
62901
- "svg",
62902
- {
62903
- width: "9",
62904
- height: "10",
62905
- viewBox: "0 0 9 10",
62906
- fill: "currentColor",
62907
- xmlns: "http://www.w3.org/2000/svg",
62908
- className: className2,
62909
- children: /* @__PURE__ */ jsx("g", { clipPath: "url(#clip0_1229_1625)", children: /* @__PURE__ */ jsx("path", { d: "M0.0145513 0.5H8.98545L9 3.18569H8.57074C8.43007 2.2276 8.02749 1.57948 7.36298 1.24133C6.98949 1.05491 6.43169 0.953035 5.68957 0.935694V7.94581C5.68957 8.43569 5.78416 8.76084 5.97332 8.92124C6.16734 9.08165 6.5675 9.16185 7.17381 9.16185V9.5H1.86257V9.16185C2.44462 9.16185 2.83023 9.08165 3.0194 8.92124C3.21342 8.7565 3.31043 8.43136 3.31043 7.94581V0.935694C2.58286 0.953035 2.02506 1.05491 1.63703 1.24133C0.92401 1.58815 0.521423 2.23627 0.429264 3.18569H0L0.0145513 0.5Z" }) })
62910
- }
62911
- );
62912
- };
62913
- const TextIcon$1 = TextIcon;
62914
- function Tree({ children, rootPath }) {
62915
- return /* @__PURE__ */ jsx("div", { className: "flex flex-col w-full py-2 text-xs", children: Children.map(children, (child) => {
62916
- return cloneElement$1(child, {
62917
- paths: [rootPath]
62918
- });
62919
- }) });
62920
63022
  }
62921
- Tree.Node = ({
62922
- children,
62923
- paths = [],
62924
- path,
62925
- level = 1,
62926
- type,
62927
- setActivePath
62928
- }) => {
62929
- const paddingLeft = level * 30;
62930
- const logo = type === "string" ? /* @__PURE__ */ jsx(TextIcon$1, {}) : type === "image" ? /* @__PURE__ */ jsx(ImageIcon$1, { className: "h-[9px] w-[9px]" }) : /* @__PURE__ */ jsx(Section$1, {});
62931
- return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
62932
- /* @__PURE__ */ jsx(
62933
- "button",
62934
- {
62935
- className: "flex justify-between w-full group py-2 text-xs font-[400] shrink-0",
62936
- onClick: () => {
62937
- setActivePath && setActivePath(path);
62938
- },
62939
- style: { paddingLeft },
62940
- children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2", children: [
62941
- logo,
62942
- /* @__PURE__ */ jsx("p", { children: path })
62943
- ] })
62944
- }
62945
- ),
62946
- children && /* @__PURE__ */ jsx(Fragment$1, { children: Children.map(children, (child) => {
62947
- return cloneElement$1(child, {
62948
- level: level + 1,
62949
- paths: [...paths, path]
62950
- });
62951
- }) })
63023
+ Grid.Column = ({ children, className: className2 }) => {
63024
+ const [header, body] = Children.toArray(children);
63025
+ return /* @__PURE__ */ jsxs("div", { className: classNames("flex flex-col", className2), children: [
63026
+ /* @__PURE__ */ jsx("div", { className: "flex items-center border-b border-border", children: header }),
63027
+ body
62952
63028
  ] });
62953
63029
  };
62954
63030
  const falsyToString = (value) => typeof value === "boolean" ? "".concat(value) : value === 0 ? "0" : value;
@@ -67452,8 +67528,10 @@ function ValFormField({
67452
67528
  return /* @__PURE__ */ jsx(
67453
67529
  StringField,
67454
67530
  {
67531
+ path,
67455
67532
  defaultValue: source,
67456
67533
  disabled,
67534
+ schema,
67457
67535
  registerPatchCallback,
67458
67536
  onSubmit
67459
67537
  }
@@ -67528,7 +67606,13 @@ function ValFormField({
67528
67606
  }
67529
67607
  return /* @__PURE__ */ jsxs("div", { children: [
67530
67608
  "Unsupported schema: ",
67531
- schema.type
67609
+ schema.type,
67610
+ " (source type: ",
67611
+ typeof source,
67612
+ " source:",
67613
+ " ",
67614
+ JSON.stringify(source),
67615
+ ")"
67532
67616
  ] });
67533
67617
  }
67534
67618
  function createImagePatch(path, data, filename, metadata) {
@@ -67571,17 +67655,29 @@ function createImagePatch(path, data, filename, metadata) {
67571
67655
  }
67572
67656
  ];
67573
67657
  }
67658
+ function createImageMetadataPatch(path, metadata) {
67659
+ const metadataPath = path + "/metadata";
67660
+ return [
67661
+ {
67662
+ value: metadata,
67663
+ op: "replace",
67664
+ path: metadataPath
67665
+ }
67666
+ ];
67667
+ }
67574
67668
  function ImageField({
67575
67669
  path,
67576
67670
  defaultValue,
67577
67671
  onSubmit,
67578
67672
  registerPatchCallback
67579
67673
  }) {
67674
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
67580
67675
  const [data, setData] = useState(
67581
67676
  null
67582
67677
  );
67583
67678
  const [loading, setLoading] = useState(false);
67584
67679
  const [metadata, setMetadata] = useState();
67680
+ const [hotspot, setHotspot] = useState();
67585
67681
  const [url, setUrl] = useState();
67586
67682
  useEffect(() => {
67587
67683
  setUrl(defaultValue && Internal.convertFileSource(defaultValue).url);
@@ -67598,56 +67694,143 @@ function ImageField({
67598
67694
  });
67599
67695
  }
67600
67696
  }, [data, defaultValue]);
67697
+ useEffect(() => {
67698
+ var _a2;
67699
+ if (hotspot) {
67700
+ if (metadata) {
67701
+ const newMetadata = {
67702
+ ...metadata,
67703
+ hotspot
67704
+ };
67705
+ setMetadata(newMetadata);
67706
+ } else if (defaultValue == null ? void 0 : defaultValue.metadata) {
67707
+ setMetadata({
67708
+ ...defaultValue.metadata,
67709
+ hotspot
67710
+ });
67711
+ } else {
67712
+ console.error("Neither image metadata nor value is set");
67713
+ }
67714
+ } else {
67715
+ if ((_a2 = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _a2.hotspot) {
67716
+ setHotspot(defaultValue.metadata.hotspot);
67717
+ }
67718
+ }
67719
+ }, [hotspot, defaultValue]);
67601
67720
  return /* @__PURE__ */ jsxs(FieldContainer, { children: [
67602
- /* @__PURE__ */ jsx("div", { className: "max-w-4xl p-4", children: /* @__PURE__ */ jsxs("label", { htmlFor: `img_input:${path}`, className: "", children: [
67603
- data || url ? /* @__PURE__ */ jsx("img", { src: (data == null ? void 0 : data.src) || url }) : /* @__PURE__ */ jsx("div", { children: "Empty" }),
67721
+ /* @__PURE__ */ jsx(
67722
+ "div",
67723
+ {
67724
+ className: "flex flex-col max-w-4xl p-2 border border-b-0 rounded-sm rounded-b-none gap-y-4 bg-background text-foreground border-input",
67725
+ children: data || url ? /* @__PURE__ */ jsxs("div", { className: "relative", children: [
67726
+ hotspot && /* @__PURE__ */ jsx(
67727
+ "div",
67728
+ {
67729
+ className: "rounded-full h-[12px] w-[12px] bg-background mix-blend-difference border-accent border-2 absolute pointer-events-none",
67730
+ style: {
67731
+ top: `${hotspot.y * 100}%`,
67732
+ left: `${hotspot.x * 100}%`
67733
+ }
67734
+ }
67735
+ ),
67736
+ /* @__PURE__ */ jsx(
67737
+ "img",
67738
+ {
67739
+ src: (data == null ? void 0 : data.src) || url,
67740
+ draggable: false,
67741
+ className: "w-full",
67742
+ style: {
67743
+ cursor: "crosshair"
67744
+ },
67745
+ onClick: (ev) => {
67746
+ const { width: width2, height: height2, left, top } = ev.currentTarget.getBoundingClientRect();
67747
+ const hotspotX = (ev.clientX - 6 - left) / width2;
67748
+ const hotspotY = (ev.clientY - 6 - top) / height2;
67749
+ setHotspot({
67750
+ x: hotspotX,
67751
+ y: hotspotY,
67752
+ width: 1,
67753
+ height: 1
67754
+ });
67755
+ }
67756
+ }
67757
+ )
67758
+ ] }) : /* @__PURE__ */ jsx("div", { children: "Select image below" })
67759
+ },
67760
+ path
67761
+ ),
67762
+ /* @__PURE__ */ jsxs("div", { className: "w-full p-4 border border-t-0 rounded-b-sm bg-background border-input", children: [
67763
+ /* @__PURE__ */ jsx(
67764
+ "label",
67765
+ {
67766
+ htmlFor: `img_input:${path}`,
67767
+ className: "block w-full px-1 py-2 text-sm text-center rounded-md cursor-pointer bg-primary text-background",
67768
+ children: "Update"
67769
+ }
67770
+ ),
67604
67771
  /* @__PURE__ */ jsx(
67605
67772
  "input",
67606
67773
  {
67774
+ hidden: true,
67607
67775
  id: `img_input:${path}`,
67608
67776
  type: "file",
67609
- hidden: true,
67610
67777
  onChange: (ev) => {
67611
67778
  readImage(ev).then((res) => {
67612
67779
  setData({ src: res.src, filename: res.filename });
67613
- if (res.width && res.height) {
67780
+ if (res.width && res.height && res.mimeType) {
67614
67781
  setMetadata({
67615
67782
  sha256: res.sha256,
67616
67783
  width: res.width,
67617
- height: res.height
67784
+ height: res.height,
67785
+ mimeType: res.mimeType,
67786
+ hotspot
67618
67787
  });
67619
67788
  } else {
67620
67789
  setMetadata(void 0);
67790
+ setHotspot(void 0);
67621
67791
  }
67622
67792
  }).catch((err2) => {
67623
67793
  console.error(err2.message);
67624
67794
  setData(null);
67795
+ setHotspot(void 0);
67625
67796
  setMetadata(void 0);
67626
67797
  });
67627
67798
  }
67628
67799
  }
67629
67800
  )
67630
- ] }) }, path),
67631
- onSubmit && data && /* @__PURE__ */ jsx(
67801
+ ] }),
67802
+ onSubmit && /* @__PURE__ */ jsx(
67632
67803
  SubmitButton,
67633
67804
  {
67634
67805
  loading,
67806
+ enabled: !!data || ((_b = (_a = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _a.hotspot) == null ? void 0 : _b.height) !== (hotspot == null ? void 0 : hotspot.height) || ((_d = (_c = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _c.hotspot) == null ? void 0 : _d.width) !== (hotspot == null ? void 0 : hotspot.width) || ((_f = (_e = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _e.hotspot) == null ? void 0 : _f.x) !== (hotspot == null ? void 0 : hotspot.x) || ((_h = (_g = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _g.hotspot) == null ? void 0 : _h.y) !== (hotspot == null ? void 0 : hotspot.y) || ((_i = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _i.width) !== (metadata == null ? void 0 : metadata.width) || ((_j = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _j.height) !== (metadata == null ? void 0 : metadata.height) || ((_k = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _k.mimeType) !== (metadata == null ? void 0 : metadata.mimeType) || ((_l = defaultValue == null ? void 0 : defaultValue.metadata) == null ? void 0 : _l.sha256) !== (metadata == null ? void 0 : metadata.sha256),
67635
67807
  onClick: () => {
67636
- setLoading(true);
67637
- onSubmit(
67638
- (path2) => Promise.resolve(
67639
- createImagePatch(
67640
- path2,
67641
- data.src,
67642
- data.filename ?? null,
67643
- metadata
67808
+ if (data) {
67809
+ setLoading(true);
67810
+ onSubmit(
67811
+ (path2) => Promise.resolve(
67812
+ createImagePatch(
67813
+ path2,
67814
+ data.src,
67815
+ data.filename ?? null,
67816
+ metadata
67817
+ )
67644
67818
  )
67645
- )
67646
- ).finally(() => {
67647
- setLoading(false);
67648
- setData(null);
67649
- setMetadata(void 0);
67650
- });
67819
+ ).finally(() => {
67820
+ setLoading(false);
67821
+ setData(null);
67822
+ setMetadata(void 0);
67823
+ });
67824
+ } else if (metadata) {
67825
+ setLoading(true);
67826
+ onSubmit(
67827
+ (path2) => Promise.resolve(createImageMetadataPatch(path2, metadata))
67828
+ ).finally(() => {
67829
+ setLoading(false);
67830
+ setData(null);
67831
+ setMetadata(void 0);
67832
+ });
67833
+ }
67651
67834
  }
67652
67835
  }
67653
67836
  )
@@ -67699,6 +67882,15 @@ function RichTextField({
67699
67882
  editor.registerDecoratorListener(() => {
67700
67883
  setDidChange(true);
67701
67884
  });
67885
+ editor.registerMutationListener(LexicalLink_1.LinkNode, () => {
67886
+ setDidChange(true);
67887
+ });
67888
+ editor.registerMutationListener(ImageNode, () => {
67889
+ setDidChange(true);
67890
+ });
67891
+ editor.registerMutationListener(LexicalExports.TextNode, () => {
67892
+ setDidChange(true);
67893
+ });
67702
67894
  }
67703
67895
  }, [editor]);
67704
67896
  useEffect(() => {
@@ -67719,10 +67911,11 @@ function RichTextField({
67719
67911
  }
67720
67912
  }
67721
67913
  ),
67722
- onSubmit && didChange && /* @__PURE__ */ jsx(
67914
+ onSubmit && /* @__PURE__ */ jsx(
67723
67915
  SubmitButton,
67724
67916
  {
67725
67917
  loading: loading || !editor,
67918
+ enabled: didChange,
67726
67919
  onClick: () => {
67727
67920
  if (editor) {
67728
67921
  setLoading(true);
@@ -67804,10 +67997,11 @@ function KeyOfField({
67804
67997
  ]
67805
67998
  }
67806
67999
  ),
67807
- onSubmit && defaultValue !== value && /* @__PURE__ */ jsx(
68000
+ onSubmit && /* @__PURE__ */ jsx(
67808
68001
  SubmitButton,
67809
68002
  {
67810
68003
  loading,
68004
+ enabled: defaultValue !== value,
67811
68005
  onClick: () => {
67812
68006
  setLoading(true);
67813
68007
  onSubmit(async (path) => [
@@ -67861,10 +68055,11 @@ function NumberField({
67861
68055
  type: "number"
67862
68056
  }
67863
68057
  ),
67864
- onSubmit && defaultValue !== value && /* @__PURE__ */ jsx(
68058
+ onSubmit && /* @__PURE__ */ jsx(
67865
68059
  SubmitButton,
67866
68060
  {
67867
68061
  loading,
68062
+ enabled: defaultValue !== value,
67868
68063
  onClick: () => {
67869
68064
  setLoading(true);
67870
68065
  onSubmit(async (path) => {
@@ -67887,6 +68082,8 @@ function NumberField({
67887
68082
  function StringField({
67888
68083
  disabled,
67889
68084
  defaultValue,
68085
+ path,
68086
+ schema,
67890
68087
  registerPatchCallback,
67891
68088
  onSubmit
67892
68089
  }) {
@@ -67898,18 +68095,28 @@ function StringField({
67898
68095
  const ref = useRef(null);
67899
68096
  useEffect(() => {
67900
68097
  if (registerPatchCallback) {
67901
- registerPatchCallback(async (path) => {
68098
+ registerPatchCallback(async (path2) => {
67902
68099
  var _a;
67903
68100
  return [
67904
68101
  {
67905
68102
  op: "replace",
67906
- path,
68103
+ path: path2,
67907
68104
  value: ((_a = ref.current) == null ? void 0 : _a.value) || ""
67908
68105
  }
67909
68106
  ];
67910
68107
  });
67911
68108
  }
67912
68109
  }, []);
68110
+ const actualSchema = new StringSchema(
68111
+ schema.options ? {
68112
+ ...schema.options,
68113
+ regexp: schema.options.regexp ? new RegExp(
68114
+ schema.options.regexp.source,
68115
+ schema.options.regexp.flags
68116
+ ) : void 0
68117
+ } : void 0
68118
+ );
68119
+ const validationErrors = actualSchema.validate(path, value);
67913
68120
  return /* @__PURE__ */ jsxs(FieldContainer, { children: [
67914
68121
  /* @__PURE__ */ jsx(
67915
68122
  Input,
@@ -67920,18 +68127,20 @@ function StringField({
67920
68127
  onChange: (e) => setValue(e.target.value)
67921
68128
  }
67922
68129
  ),
67923
- onSubmit && defaultValue !== value && /* @__PURE__ */ jsx(
68130
+ onSubmit && /* @__PURE__ */ jsx(
67924
68131
  SubmitButton,
67925
68132
  {
68133
+ validationErrors: validationErrors && validationErrors[path],
67926
68134
  loading,
68135
+ enabled: defaultValue !== value && !validationErrors,
67927
68136
  onClick: () => {
67928
68137
  setLoading(true);
67929
- onSubmit(async (path) => {
68138
+ onSubmit(async (path2) => {
67930
68139
  var _a;
67931
68140
  return [
67932
68141
  {
67933
68142
  op: "replace",
67934
- path,
68143
+ path: path2,
67935
68144
  value: ((_a = ref.current) == null ? void 0 : _a.value) || ""
67936
68145
  }
67937
68146
  ];
@@ -67943,14 +68152,24 @@ function StringField({
67943
68152
  )
67944
68153
  ] });
67945
68154
  }
68155
+ function InlineValidationErrors({ errors }) {
68156
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-y-1 p-2 rounded-md text-sm text-destructive-foreground bg-destructive", children: errors.map((error, i) => /* @__PURE__ */ jsx("div", { children: error.message }, i)) });
68157
+ }
67946
68158
  function FieldContainer({ children }) {
67947
- return /* @__PURE__ */ jsx("div", { className: "relative p-4 border rounded border-card", children });
68159
+ return /* @__PURE__ */ jsx("div", { className: "relative p-4", children });
67948
68160
  }
67949
68161
  function SubmitButton({
67950
68162
  loading,
68163
+ enabled,
68164
+ validationErrors,
67951
68165
  onClick
67952
68166
  }) {
67953
- return /* @__PURE__ */ jsx("div", { className: "sticky bottom-0", children: /* @__PURE__ */ jsx("div", { className: "flex justify-end w-full py-2", children: /* @__PURE__ */ jsx(Button, { disabled: loading, onClick, children: loading ? "Saving..." : "Save" }) }) });
68167
+ const { session } = useValOverlayContext();
68168
+ const isProxy = session.status === "success" && session.data.mode === "proxy";
68169
+ return /* @__PURE__ */ jsx("div", { className: "sticky bottom-0 m-4 ml-0", children: /* @__PURE__ */ jsxs("div", { className: "flex justify-between w-full gap-2 py-2 text-sm", children: [
68170
+ validationErrors ? /* @__PURE__ */ jsx(InlineValidationErrors, { errors: validationErrors || [] }) : /* @__PURE__ */ jsx("span", {}),
68171
+ /* @__PURE__ */ jsx(Button, { disabled: loading || !enabled, onClick, children: loading ? isProxy ? "Staging..." : "Saving..." : isProxy ? "Stage" : "Save" })
68172
+ ] }) });
67954
68173
  }
67955
68174
  const Logo = ({ className: className2 }) => {
67956
68175
  return /* @__PURE__ */ jsxs(
@@ -67967,7 +68186,7 @@ const Logo = ({ className: className2 }) => {
67967
68186
  "path",
67968
68187
  {
67969
68188
  d: "M5 5.36426C5 5.16309 5.16309 5 5.36426 5H17.6581C17.8593 5 18.0223 5.16309 18.0223 5.36426V28.4949C18.0223 28.696 17.8593 28.8591 17.6581 28.8591H5.36426C5.16309 28.8591 5 28.696 5 28.4949V5.36426Z",
67970
- fill: "#38CD98"
68189
+ fill: "hsl(var(--accent))"
67971
68190
  }
67972
68191
  ) }),
67973
68192
  /* @__PURE__ */ jsx("g", { filter: "url(#filter1_i_21_1677)", children: /* @__PURE__ */ jsx("circle", { cx: "11.4656", cy: "23.7595", r: "2.18557", fill: "currentColor" }) }),
@@ -72421,6 +72640,33 @@ function useSession(api) {
72421
72640
  }, [sessionResetId]);
72422
72641
  return session;
72423
72642
  }
72643
+ function Path({ children }) {
72644
+ const segs = children.split("/").filter((seg) => seg);
72645
+ return segs.map((seg, i) => {
72646
+ if (i !== segs.length - 1) {
72647
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
72648
+ /* @__PURE__ */ jsx("span", { children: seg }),
72649
+ /* @__PURE__ */ jsx("span", { className: "px-[2px] text-muted", children: "/" })
72650
+ ] }, `${children}/${seg}`);
72651
+ }
72652
+ return /* @__PURE__ */ jsx(Seg, { children: seg }, children);
72653
+ });
72654
+ }
72655
+ function Seg({ children }) {
72656
+ if (children.includes(".")) {
72657
+ const segs = children.split(".");
72658
+ return segs.map((seg, i) => {
72659
+ if (i !== segs.length - 1) {
72660
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
72661
+ /* @__PURE__ */ jsx("span", { children: i === 0 ? seg : JSON.parse(seg) }),
72662
+ /* @__PURE__ */ jsx("span", { className: "px-[2px] text-muted", children: "." })
72663
+ ] }, `${children}.${seg}`);
72664
+ }
72665
+ return /* @__PURE__ */ jsx("span", { children: i === 0 ? seg : JSON.parse(seg) }, children);
72666
+ });
72667
+ }
72668
+ return /* @__PURE__ */ jsx("span", { children });
72669
+ }
72424
72670
  const ValModulesContext = React__default.createContext(null);
72425
72671
  const useValModuleFromPath = (sourcePath) => {
72426
72672
  var _a, _b;
@@ -72571,12 +72817,13 @@ Showing stack trace of: 1. ${fatalErrors[0].message}`;
72571
72817
  "div",
72572
72818
  {
72573
72819
  id: "val-fullscreen-container",
72574
- className: "relative font-serif antialiased",
72820
+ className: "relative w-full h-[100] overflow-hidden font-serif antialiased bg-background text-primary",
72575
72821
  "data-mode": theme2,
72576
72822
  children: [
72577
- /* @__PURE__ */ jsx("div", { className: "fixed -translate-x-1/2 z-overlay left-1/2 bottom-4", children: /* @__PURE__ */ jsx(
72823
+ /* @__PURE__ */ jsx("div", { className: "fixed -translate-y-1/2 right-4 top-1/2 z-overlay", children: /* @__PURE__ */ jsx(
72578
72824
  ValMenu,
72579
72825
  {
72826
+ direction: "vertical",
72580
72827
  api,
72581
72828
  patches,
72582
72829
  onCommit: () => setPatchResetId((prev) => prev + 1)
@@ -72589,18 +72836,19 @@ Showing stack trace of: 1. ${fatalErrors[0].message}`;
72589
72836
  value: {
72590
72837
  hoverElem: hoverElemRef == null ? void 0 : hoverElemRef.current
72591
72838
  },
72592
- children: /* @__PURE__ */ jsx("div", { className: "text-primary bg-background", children: /* @__PURE__ */ jsxs(Grid, { children: [
72839
+ children: /* @__PURE__ */ jsx("div", { className: "text-primary", children: /* @__PURE__ */ jsxs(Grid, { children: [
72593
72840
  /* @__PURE__ */ jsx("div", { className: "px-4 h-[50px] flex items-center justify-center", children: /* @__PURE__ */ jsx(Logo$1, {}) }),
72594
72841
  /* @__PURE__ */ jsx(ScrollArea, { className: "px-4", children: modules ? /* @__PURE__ */ jsx(
72595
72842
  PathTree,
72596
72843
  {
72844
+ selectedPath,
72597
72845
  paths: Object.keys(modules),
72598
72846
  setSelectedModuleId: (path) => {
72599
72847
  navigate(path);
72600
72848
  }
72601
72849
  }
72602
72850
  ) : !error && /* @__PURE__ */ jsx("div", { className: "py-4", children: "Loading..." }) }),
72603
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start w-full h-[50px] gap-2 font-serif text-xs", children: [
72851
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start h-[50px] gap-2 font-serif text-xs", children: [
72604
72852
  /* @__PURE__ */ jsx(
72605
72853
  "button",
72606
72854
  {
@@ -72610,10 +72858,10 @@ Showing stack trace of: 1. ${fatalErrors[0].message}`;
72610
72858
  children: /* @__PURE__ */ jsx(ChevronLeft, {})
72611
72859
  }
72612
72860
  ),
72613
- /* @__PURE__ */ jsx("p", { children: selectedPath || "/" })
72861
+ /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(Path, { children: selectedPath || "/" }) })
72614
72862
  ] }),
72615
72863
  /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
72616
- error && /* @__PURE__ */ jsxs("div", { className: "text-lg text-destructive-foreground", children: [
72864
+ error && /* @__PURE__ */ jsxs("div", { className: "p-4 text-lg bg-destructive text-destructive-foreground max-w-xl", children: [
72617
72865
  "ERROR: ",
72618
72866
  error
72619
72867
  ] }),
@@ -72682,7 +72930,7 @@ function AnyVal({
72682
72930
  initOnSubmit,
72683
72931
  top
72684
72932
  }) {
72685
- if (source === null || schema.opt) {
72933
+ if (schema.opt) {
72686
72934
  return /* @__PURE__ */ jsx(
72687
72935
  ValOptional,
72688
72936
  {
@@ -72695,6 +72943,18 @@ function AnyVal({
72695
72943
  }
72696
72944
  );
72697
72945
  }
72946
+ if (source === null) {
72947
+ return /* @__PURE__ */ jsx(
72948
+ ValDefaultOf,
72949
+ {
72950
+ source,
72951
+ schema,
72952
+ path,
72953
+ setSelectedPath,
72954
+ initOnSubmit
72955
+ }
72956
+ );
72957
+ }
72698
72958
  if (schema.type === "object") {
72699
72959
  if (typeof source !== "object" || isJsonArray(source)) {
72700
72960
  return /* @__PURE__ */ jsxs("div", { children: [
@@ -72720,15 +72980,18 @@ function AnyVal({
72720
72980
  typeof source
72721
72981
  ] });
72722
72982
  }
72723
- return /* @__PURE__ */ jsx(
72724
- ValList,
72725
- {
72726
- source,
72727
- path,
72728
- schema,
72729
- setSelectedPath
72730
- }
72731
- );
72983
+ return /* @__PURE__ */ jsxs("div", { children: [
72984
+ field ? /* @__PURE__ */ jsx("div", { className: "text-left", children: field }) : /* @__PURE__ */ jsx(Path, { children: path }),
72985
+ /* @__PURE__ */ jsx(
72986
+ ValList,
72987
+ {
72988
+ source,
72989
+ path,
72990
+ schema,
72991
+ setSelectedPath
72992
+ }
72993
+ )
72994
+ ] });
72732
72995
  } else if (schema.type === "record") {
72733
72996
  if (typeof source !== "object") {
72734
72997
  return /* @__PURE__ */ jsxs("div", { children: [
@@ -72744,18 +73007,38 @@ function AnyVal({
72744
73007
  schema.type
72745
73008
  ] });
72746
73009
  }
72747
- return /* @__PURE__ */ jsx(
72748
- ValRecord,
72749
- {
72750
- source,
72751
- path,
72752
- schema,
72753
- setSelectedPath
72754
- }
72755
- );
73010
+ return /* @__PURE__ */ jsxs("div", { children: [
73011
+ field ? /* @__PURE__ */ jsx("div", { className: "text-left", children: field }) : /* @__PURE__ */ jsx(Path, { children: path }),
73012
+ /* @__PURE__ */ jsx(
73013
+ ValRecord,
73014
+ {
73015
+ source,
73016
+ path,
73017
+ schema,
73018
+ setSelectedPath
73019
+ }
73020
+ )
73021
+ ] });
73022
+ } else if ((schema == null ? void 0 : schema.type) === "union") {
73023
+ if (schema.key && typeof source === "object" && !isJsonArray(source)) {
73024
+ return /* @__PURE__ */ jsx(
73025
+ ValTaggedUnion,
73026
+ {
73027
+ tag: schema.key,
73028
+ source,
73029
+ path,
73030
+ schema,
73031
+ initOnSubmit,
73032
+ setSelectedPath,
73033
+ top
73034
+ }
73035
+ );
73036
+ }
73037
+ } else if ((schema == null ? void 0 : schema.type) === "literal") {
73038
+ return /* @__PURE__ */ jsx(Fragment$1, {});
72756
73039
  }
72757
73040
  return /* @__PURE__ */ jsxs("div", { className: "py-2 gap-y-4", children: [
72758
- /* @__PURE__ */ jsx("div", { className: "text-left", children: field || path }),
73041
+ field ? /* @__PURE__ */ jsx("div", { className: "text-left", children: field }) : /* @__PURE__ */ jsx(Path, { children: path }),
72759
73042
  /* @__PURE__ */ jsx(
72760
73043
  ValFormField,
72761
73044
  {
@@ -72768,6 +73051,97 @@ function AnyVal({
72768
73051
  )
72769
73052
  ] });
72770
73053
  }
73054
+ function ValTaggedUnion({
73055
+ tag,
73056
+ path,
73057
+ source,
73058
+ schema,
73059
+ setSelectedPath,
73060
+ initOnSubmit,
73061
+ top
73062
+ }) {
73063
+ const [currentKey, setCurrentKey] = useState(null);
73064
+ const [current, setCurrent] = useState(null);
73065
+ const keys = schema.items.flatMap((item) => {
73066
+ if (item.type === "object" && item.items[tag]) {
73067
+ const maybeLiteral = item.items[tag];
73068
+ if (maybeLiteral.type === "literal") {
73069
+ return [maybeLiteral.value];
73070
+ }
73071
+ }
73072
+ return [];
73073
+ });
73074
+ useEffect(() => {
73075
+ if (!currentKey) {
73076
+ const maybeCurrentKey = source == null ? void 0 : source[tag];
73077
+ if (maybeCurrentKey && typeof maybeCurrentKey === "string") {
73078
+ setCurrentKey(maybeCurrentKey);
73079
+ }
73080
+ } else {
73081
+ const sourceKey = source[tag];
73082
+ const unionSchema = schema.items.find((item) => {
73083
+ if (item.type === "object" && item.items[tag]) {
73084
+ const maybeLiteral = item.items[tag];
73085
+ if (maybeLiteral.type === "literal") {
73086
+ return maybeLiteral.value === currentKey;
73087
+ }
73088
+ return false;
73089
+ }
73090
+ });
73091
+ if (sourceKey && typeof sourceKey === "string" && unionSchema) {
73092
+ setCurrent({ source, schema: unionSchema });
73093
+ } else {
73094
+ console.error(
73095
+ "Could not find source or schema of key",
73096
+ currentKey,
73097
+ source,
73098
+ schema
73099
+ );
73100
+ setCurrent(null);
73101
+ }
73102
+ }
73103
+ }, [currentKey, source, schema, keys]);
73104
+ if (keys.length !== schema.items.length) {
73105
+ console.warn("Not all items have tag:", tag);
73106
+ }
73107
+ const loading = false;
73108
+ return /* @__PURE__ */ jsxs(
73109
+ "div",
73110
+ {
73111
+ className: classNames("flex flex-col gap-y-8", {
73112
+ "border-l-2 border-border pl-6": !top
73113
+ }),
73114
+ children: [
73115
+ /* @__PURE__ */ jsxs(
73116
+ Select,
73117
+ {
73118
+ defaultValue: currentKey ?? void 0,
73119
+ disabled: loading,
73120
+ onValueChange: (key) => {
73121
+ setCurrentKey(key);
73122
+ },
73123
+ children: [
73124
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select type" }) }),
73125
+ /* @__PURE__ */ jsx(SelectContent, { children: keys.map((tag2) => /* @__PURE__ */ jsx(SelectItem, { value: tag2.toString(), children: tag2.toString() }, tag2)) })
73126
+ ]
73127
+ }
73128
+ ),
73129
+ current && /* @__PURE__ */ jsx(
73130
+ AnyVal,
73131
+ {
73132
+ path,
73133
+ source: current.source,
73134
+ schema: current.schema,
73135
+ setSelectedPath,
73136
+ initOnSubmit,
73137
+ top
73138
+ }
73139
+ )
73140
+ ]
73141
+ },
73142
+ path
73143
+ );
73144
+ }
72771
73145
  function ValObject({
72772
73146
  path,
72773
73147
  source,
@@ -72788,7 +73162,7 @@ function ValObject({
72788
73162
  AnyVal,
72789
73163
  {
72790
73164
  path: subPath,
72791
- source: source[key],
73165
+ source: (source == null ? void 0 : source[key]) ?? null,
72792
73166
  schema: property,
72793
73167
  setSelectedPath,
72794
73168
  field: key,
@@ -73111,8 +73485,8 @@ function ValOptional({
73111
73485
  field
73112
73486
  }) {
73113
73487
  const [enable, setEnable] = useState(source !== null);
73114
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-6", children: [
73115
- field ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-4", children: [
73488
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-2", children: [
73489
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-4", children: [
73116
73490
  /* @__PURE__ */ jsx(
73117
73491
  Switch,
73118
73492
  {
@@ -73122,16 +73496,8 @@ function ValOptional({
73122
73496
  }
73123
73497
  }
73124
73498
  ),
73125
- /* @__PURE__ */ jsx("span", { children: field })
73126
- ] }) : /* @__PURE__ */ jsx(
73127
- Switch,
73128
- {
73129
- checked: enable,
73130
- onClick: () => {
73131
- setEnable((prev) => !prev);
73132
- }
73133
- }
73134
- ),
73499
+ /* @__PURE__ */ jsx("span", { children: field ? field : /* @__PURE__ */ jsx(Path, { children: path }) })
73500
+ ] }),
73135
73501
  enable && /* @__PURE__ */ jsx(
73136
73502
  ValDefaultOf,
73137
73503
  {
@@ -73200,61 +73566,62 @@ function ValDefaultOf({
73200
73566
  function isJsonArray(source) {
73201
73567
  return Array.isArray(source);
73202
73568
  }
73203
- function pathsToTree(paths) {
73204
- const tree = {};
73569
+ function dirPaths(paths) {
73570
+ const res = {};
73205
73571
  paths.forEach((path) => {
73206
- const parts = path.split("/").filter((part) => part !== "");
73207
- let current = tree;
73208
- parts.forEach((part) => {
73209
- if (!current[part]) {
73210
- current[part] = {};
73572
+ const allParts = path.split("/").filter((part) => part !== "");
73573
+ if (allParts.length === 1) {
73574
+ if (!res[""]) {
73575
+ res[""] = [];
73211
73576
  }
73212
- current = current[part];
73213
- });
73577
+ res[""].push(allParts[0]);
73578
+ } else if (allParts.length > 1) {
73579
+ const dir = allParts.slice(0, allParts.length - 1).join("/");
73580
+ const file = allParts.slice(-1)[0];
73581
+ if (!res[dir]) {
73582
+ res[dir] = [];
73583
+ }
73584
+ res[dir].push(file);
73585
+ }
73214
73586
  });
73215
- return tree;
73587
+ return res;
73216
73588
  }
73217
73589
  function PathTree({
73590
+ selectedPath,
73218
73591
  paths,
73219
73592
  setSelectedModuleId
73220
73593
  }) {
73221
- const tree = pathsToTree(paths);
73222
- return /* @__PURE__ */ jsx(Tree, { children: Object.entries(tree).map(([name, subTree]) => /* @__PURE__ */ jsx("div", { className: "px-4 py-2", children: /* @__PURE__ */ jsx(
73223
- PathNode,
73224
- {
73225
- name,
73226
- tree: subTree,
73227
- moduleId: `/${name}`,
73228
- setSelectedModuleId
73229
- }
73230
- ) }, `/${name}`)) });
73231
- }
73232
- function PathNode({
73233
- name,
73234
- tree,
73235
- moduleId,
73236
- setSelectedModuleId
73237
- }) {
73238
- return /* @__PURE__ */ jsxs("div", { children: [
73239
- /* @__PURE__ */ jsx(
73240
- "button",
73241
- {
73242
- onClick: () => {
73243
- setSelectedModuleId(moduleId);
73244
- },
73245
- children: name
73246
- }
73247
- ),
73248
- Object.entries(tree).map(([childName, childTree]) => /* @__PURE__ */ jsx("div", { className: "px-4 py-1", children: /* @__PURE__ */ jsx(
73249
- PathNode,
73250
- {
73251
- name: childName,
73252
- tree: childTree,
73253
- moduleId: `${moduleId}/${childName}`,
73254
- setSelectedModuleId
73255
- }
73256
- ) }, `${moduleId}/${childName}`))
73257
- ] });
73594
+ const tree = dirPaths(paths);
73595
+ const selectedModuleId = selectedPath && Internal.splitModuleIdAndModulePath(selectedPath)[0];
73596
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col w-full py-2 text-xs", children: Object.entries(tree).map(([dir, files]) => {
73597
+ return /* @__PURE__ */ jsxs("div", { className: "px-4 py-2", children: [
73598
+ dir && /* @__PURE__ */ jsx("div", { className: "font-bold", children: /* @__PURE__ */ jsx(Path, { children: dir }) }),
73599
+ /* @__PURE__ */ jsx(
73600
+ "div",
73601
+ {
73602
+ className: classNames({
73603
+ "flex flex-col py-2 justify-start items-start": !!dir
73604
+ }),
73605
+ children: files.map((file) => {
73606
+ const moduleId = `/${dir}/${file}`;
73607
+ return /* @__PURE__ */ jsx(
73608
+ "button",
73609
+ {
73610
+ className: classNames("block px-2 py-1 rounded-full", {
73611
+ "bg-accent text-accent-foreground": selectedModuleId === moduleId
73612
+ }),
73613
+ onClick: () => {
73614
+ setSelectedModuleId(moduleId);
73615
+ },
73616
+ children: file
73617
+ },
73618
+ moduleId
73619
+ );
73620
+ })
73621
+ }
73622
+ )
73623
+ ] }, `/${dir}`);
73624
+ }) });
73258
73625
  }
73259
73626
  const theme = {
73260
73627
  tags: {
@@ -73446,76 +73813,90 @@ function ValOverlay({
73446
73813
  windowSize,
73447
73814
  setWindowSize
73448
73815
  },
73449
- children: /* @__PURE__ */ jsxs("div", { "data-mode": theme2, className: "antialiased", children: [
73450
- /* @__PURE__ */ jsx("div", { className: "fixed -translate-x-1/2 z-overlay left-1/2 bottom-4", children: /* @__PURE__ */ jsx(
73451
- ValMenu,
73452
- {
73453
- api,
73454
- patches,
73455
- onCommit: () => {
73456
- setPatchResetId((patchResetId) => patchResetId + 1);
73457
- }
73458
- }
73459
- ) }),
73460
- session.status === "success" && session.data.enabled && editMode === "hover" && hoverTarget.path && /* @__PURE__ */ jsx(
73461
- ValHover,
73462
- {
73463
- hoverTarget,
73464
- setHoverTarget,
73465
- setEditMode,
73466
- setWindowTarget
73467
- }
73468
- ),
73469
- editMode === "window" && windowTarget && /* @__PURE__ */ jsx(
73470
- ValWindow,
73471
- {
73472
- onClose: () => {
73473
- setWindowTarget(null);
73474
- setEditMode("hover");
73475
- },
73476
- children: /* @__PURE__ */ jsx(
73477
- "div",
73816
+ children: /* @__PURE__ */ jsxs(
73817
+ "div",
73818
+ {
73819
+ "data-mode": theme2,
73820
+ className: "font-serif antialiased",
73821
+ style: {
73822
+ position: "fixed",
73823
+ top: 0,
73824
+ left: 0,
73825
+ zIndex: 8999
73826
+ // 1 less than the NextJS error z-index: 9000
73827
+ },
73828
+ children: [
73829
+ /* @__PURE__ */ jsx("div", { className: "fixed -translate-y-1/2 right-4 top-1/2 z-overlay", children: /* @__PURE__ */ jsx(
73830
+ ValMenu,
73478
73831
  {
73479
- className: "p-4",
73480
- style: {
73481
- maxHeight: windowSize == null ? void 0 : windowSize.innerHeight
73832
+ direction: "vertical",
73833
+ api,
73834
+ patches,
73835
+ onCommit: () => {
73836
+ setPatchResetId((patchResetId) => patchResetId + 1);
73837
+ }
73838
+ }
73839
+ ) }),
73840
+ session.status === "success" && session.data.enabled && editMode === "hover" && hoverTarget.path && /* @__PURE__ */ jsx(
73841
+ ValHover,
73842
+ {
73843
+ hoverTarget,
73844
+ setHoverTarget,
73845
+ setEditMode,
73846
+ setWindowTarget
73847
+ }
73848
+ ),
73849
+ editMode === "window" && windowTarget && /* @__PURE__ */ jsx(
73850
+ ValWindow,
73851
+ {
73852
+ onClose: () => {
73853
+ setWindowTarget(null);
73854
+ setEditMode("hover");
73482
73855
  },
73483
- children: Object.entries(formData).map(([path, data]) => {
73484
- if (data.status !== "success") {
73485
- return /* @__PURE__ */ jsxs("div", { children: [
73486
- path,
73487
- ": ",
73488
- data.status
73489
- ] }, path);
73490
- }
73491
- const { source, schema } = data.data;
73492
- if (!source || !schema) {
73493
- return /* @__PURE__ */ jsxs("div", { children: [
73494
- "Module: ",
73495
- path,
73496
- " is missing source or schema"
73497
- ] });
73498
- }
73499
- return /* @__PURE__ */ jsx(
73500
- AnyVal,
73501
- {
73502
- initOnSubmit,
73503
- path,
73504
- schema,
73505
- source,
73506
- setSelectedPath: () => {
73507
- },
73508
- field: path,
73509
- top: true
73856
+ children: /* @__PURE__ */ jsx(
73857
+ "div",
73858
+ {
73859
+ className: "p-4",
73860
+ style: {
73861
+ maxHeight: windowSize == null ? void 0 : windowSize.innerHeight
73510
73862
  },
73511
- path
73512
- );
73513
- })
73863
+ children: Object.entries(formData).map(([path, data]) => {
73864
+ if (data.status !== "success") {
73865
+ return /* @__PURE__ */ jsxs("div", { children: [
73866
+ path,
73867
+ ": ",
73868
+ data.status
73869
+ ] }, path);
73870
+ }
73871
+ const { source, schema } = data.data;
73872
+ if (!source || !schema) {
73873
+ return /* @__PURE__ */ jsxs("div", { children: [
73874
+ "Module: ",
73875
+ path,
73876
+ " is missing source or schema"
73877
+ ] });
73878
+ }
73879
+ return /* @__PURE__ */ jsx(
73880
+ AnyVal,
73881
+ {
73882
+ initOnSubmit,
73883
+ path,
73884
+ schema,
73885
+ source,
73886
+ setSelectedPath: () => {
73887
+ },
73888
+ top: true
73889
+ },
73890
+ path
73891
+ );
73892
+ })
73893
+ }
73894
+ )
73514
73895
  }
73515
73896
  )
73516
- }
73517
- )
73518
- ] })
73897
+ ]
73898
+ }
73899
+ )
73519
73900
  }
73520
73901
  );
73521
73902
  }
@@ -73582,7 +73963,7 @@ function ValHover({
73582
73963
  "div",
73583
73964
  {
73584
73965
  id: "val-hover",
73585
- className: "fixed border-2 cursor-pointer z-overlay-hover border-highlight drop-shadow-[0px_0px_12px_rgba(56,205,152,0.60)]",
73966
+ className: "fixed border-2 cursor-pointer z-overlay-hover border-accent",
73586
73967
  style: {
73587
73968
  top: rect == null ? void 0 : rect.top,
73588
73969
  left: rect == null ? void 0 : rect.left,
@@ -73603,7 +73984,7 @@ function ValHover({
73603
73984
  children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-end w-full text-xs", children: /* @__PURE__ */ jsx(
73604
73985
  "div",
73605
73986
  {
73606
- className: "flex items-center justify-center px-3 py-1 text-primary bg-highlight",
73987
+ className: "flex items-center justify-center px-3 py-1 text-accent-foreground bg-accent border-l-2 border-b-2 border-accent",
73607
73988
  style: {
73608
73989
  maxHeight: (rect == null ? void 0 : rect.height) && rect.height - 4,
73609
73990
  fontSize: (rect == null ? void 0 : rect.height) && rect.height <= 16 ? rect.height - 4 : void 0
@@ -73647,9 +74028,19 @@ function useHoverTarget(editMode) {
73647
74028
  setTargetRect(targetElement.getBoundingClientRect());
73648
74029
  }
73649
74030
  };
74031
+ const observer = new ResizeObserver(() => {
74032
+ if (targetElement) {
74033
+ setTargetRect(targetElement.getBoundingClientRect());
74034
+ }
74035
+ });
74036
+ const valUIElement = document.getElementById("val-ui");
74037
+ if (targetElement && valUIElement) {
74038
+ observer.observe(valUIElement);
74039
+ }
73650
74040
  document.addEventListener("scroll", scrollListener, { passive: true });
73651
74041
  return () => {
73652
74042
  document.removeEventListener("scroll", scrollListener);
74043
+ observer.disconnect();
73653
74044
  };
73654
74045
  }, [targetElement]);
73655
74046
  return [
@@ -73696,7 +74087,7 @@ function useInitEditMode() {
73696
74087
  }, []);
73697
74088
  return [editMode, setEditMode];
73698
74089
  }
73699
- const styleCss = "/*\n Need to explicitly set config path, otherwise it may fail to resolve when\n built from outside packages/ui.\n*/\n\n/*\n ! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: 'Roboto', sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden] {\n display: none;\n}\n\n/* :host for use with Shadow DOM, copied from the TailwindCSS prelude */\n\n:host {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n\n --muted: 0 0% 57.3%;\n --muted-foreground: 215.4 16.3% 46.9%;\n\n --accent: 159, 60%, 51%, 1;\n --accent-foreground: 222.2 47.4% 11.2%;\n\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n\n --radius: 0.5rem;\n }\n\n:root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n\n --muted: 0 0% 57.3%;\n --muted-foreground: 215.4 16.3% 46.9%;\n\n --accent: 159, 60%, 51%, 1;\n --accent-foreground: 222.2 47.4% 11.2%;\n\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n\n --radius: 0.5rem;\n }\n\n/* dark theme */\n\n*[data-mode=\"dark\"] {\n --background: 0 0% 4%;\n --foreground: 210 40% 98%;\n\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n\n --muted: 178, 23%, 76%, 1;\n --muted-foreground: 215 20.2% 65.1%;\n\n --accent: 159, 60%, 51%, 1;\n --accent-foreground: 210 40% 98%;\n\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n }\n\n* {\n border-color: hsl(var(--border));\n}\n\nbody {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.invisible {\n visibility: hidden;\n}\n.static {\n position: static;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.sticky {\n position: sticky;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.-left-2 {\n left: -0.5rem;\n}\n.-right-\\[10px\\] {\n right: -10px;\n}\n.-top-\\[10px\\] {\n top: -10px;\n}\n.-top-\\[4px\\] {\n top: -4px;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.bottom-4 {\n bottom: 1rem;\n}\n.left-0 {\n left: 0px;\n}\n.left-1 {\n left: 0.25rem;\n}\n.left-1\\/2 {\n left: 50%;\n}\n.left-2 {\n left: 0.5rem;\n}\n.left-\\[50\\%\\] {\n left: 50%;\n}\n.right-0 {\n right: 0px;\n}\n.right-1 {\n right: 0.25rem;\n}\n.right-4 {\n right: 1rem;\n}\n.right-\\[16px\\] {\n right: 16px;\n}\n.top-0 {\n top: 0px;\n}\n.top-4 {\n top: 1rem;\n}\n.top-\\[50\\%\\] {\n top: 50%;\n}\n.z-50 {\n z-index: 50;\n}\n.z-\\[5\\] {\n z-index: 5;\n}\n.z-overlay {\n z-index: 4;\n}\n.-mx-1 {\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n}\n.-my-2 {\n margin-top: -0.5rem;\n margin-bottom: -0.5rem;\n}\n.-my-\\[100px\\] {\n margin-top: -100px;\n margin-bottom: -100px;\n}\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-4 {\n margin-left: 1rem;\n}\n.ml-\\[20px\\] {\n margin-left: 20px;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.block {\n display: block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.table {\n display: table;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-2\\.5 {\n height: 0.625rem;\n}\n.h-3 {\n height: 0.75rem;\n}\n.h-3\\.5 {\n height: 0.875rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-\\[14px\\] {\n height: 14px;\n}\n.h-\\[18px\\] {\n height: 18px;\n}\n.h-\\[1px\\] {\n height: 1px;\n}\n.h-\\[20px\\] {\n height: 20px;\n}\n.h-\\[22px\\] {\n height: 22px;\n}\n.h-\\[24px\\] {\n height: 24px;\n}\n.h-\\[32px\\] {\n height: 32px;\n}\n.h-\\[50px\\] {\n height: 50px;\n}\n.h-\\[75px\\] {\n height: 75px;\n}\n.h-\\[9px\\] {\n height: 9px;\n}\n.h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\[300px\\] {\n max-height: 300px;\n}\n.min-h-\\[200px\\] {\n min-height: 200px;\n}\n.min-h-\\[300px\\] {\n min-height: 300px;\n}\n.min-h-screen {\n min-height: 100vh;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-2\\.5 {\n width: 0.625rem;\n}\n.w-3 {\n width: 0.75rem;\n}\n.w-3\\.5 {\n width: 0.875rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-7 {\n width: 1.75rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-9 {\n width: 2.25rem;\n}\n.w-\\[14px\\] {\n width: 14px;\n}\n.w-\\[1px\\] {\n width: 1px;\n}\n.w-\\[20px\\] {\n width: 20px;\n}\n.w-\\[24px\\] {\n width: 24px;\n}\n.w-\\[32px\\] {\n width: 32px;\n}\n.w-\\[44px\\] {\n width: 44px;\n}\n.w-\\[9px\\] {\n width: 9px;\n}\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.w-full {\n width: 100%;\n}\n.w-screen {\n width: 100vw;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-\\[320px\\] {\n min-width: 320px;\n}\n.min-w-\\[500px\\] {\n min-width: 500px;\n}\n.min-w-\\[8rem\\] {\n min-width: 8rem;\n}\n.min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-\\[1000px\\] {\n max-width: 1000px;\n}\n.max-w-\\[10vw\\] {\n max-width: 10vw;\n}\n.max-w-\\[300px\\] {\n max-width: 300px;\n}\n.max-w-\\[90vw\\] {\n max-width: 90vw;\n}\n.max-w-lg {\n max-width: 32rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-auto {\n flex: 1 1 auto;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.border-collapse {\n border-collapse: collapse;\n}\n.-translate-x-1\\/2 {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-rotate-90 {\n --tw-rotate: -90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-90 {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[-90deg\\] {\n --tw-rotate: -90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[90deg\\] {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.cursor-col-resize {\n cursor: col-resize;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-grab {\n cursor: grab;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-se-resize {\n cursor: se-resize;\n}\n.touch-none {\n touch-action: none;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.resize-none {\n resize: none;\n}\n.resize {\n resize: both;\n}\n.list-decimal {\n list-style-type: decimal;\n}\n.list-disc {\n list-style-type: disc;\n}\n.grid-cols-\\[min-content_1fr\\] {\n grid-template-columns: min-content 1fr;\n}\n.grid-rows-\\[1fr\\2c _min-content\\] {\n grid-template-rows: 1fr min-content;\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-col-reverse {\n flex-direction: column-reverse;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.gap-5 {\n gap: 1.25rem;\n}\n.gap-\\[0\\.5em\\] {\n gap: 0.5em;\n}\n.gap-\\[36px\\] {\n gap: 36px;\n}\n.gap-x-2 {\n -moz-column-gap: 0.5rem;\n column-gap: 0.5rem;\n}\n.gap-x-3 {\n -moz-column-gap: 0.75rem;\n column-gap: 0.75rem;\n}\n.gap-x-4 {\n -moz-column-gap: 1rem;\n column-gap: 1rem;\n}\n.gap-y-2 {\n row-gap: 0.5rem;\n}\n.gap-y-4 {\n row-gap: 1rem;\n}\n.gap-y-6 {\n row-gap: 1.5rem;\n}\n.gap-y-8 {\n row-gap: 2rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-auto {\n overflow: auto;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-clip {\n overflow: clip;\n}\n.overflow-scroll {\n overflow: scroll;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.overflow-x-hidden {\n overflow-x: hidden;\n}\n.overflow-y-scroll {\n overflow-y: scroll;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-\\[inherit\\] {\n border-radius: inherit;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: var(--radius);\n}\n.rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n}\n.border {\n border-width: 1px;\n}\n.border-2 {\n border-width: 2px;\n}\n.border-\\[2px\\] {\n border-width: 2px;\n}\n.border-y {\n border-top-width: 1px;\n border-bottom-width: 1px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-r {\n border-right-width: 1px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-accent {\n border-color: hsl(var(--accent));\n}\n.border-border {\n border-color: hsl(var(--border));\n}\n.border-card {\n border-color: hsl(var(--card));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity));\n}\n.border-input {\n border-color: hsl(var(--input));\n}\n.border-primary {\n border-color: hsl(var(--primary));\n}\n.border-transparent {\n border-color: transparent;\n}\n.border-l-transparent {\n border-left-color: transparent;\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-accent {\n background-color: hsl(var(--accent));\n}\n.bg-background {\n background-color: hsl(var(--background));\n}\n.bg-background\\/10 {\n background-color: hsl(var(--background) / 0.1);\n}\n.bg-background\\/80 {\n background-color: hsl(var(--background) / 0.8);\n}\n.bg-border {\n background-color: hsl(var(--border));\n}\n.bg-card {\n background-color: hsl(var(--card));\n}\n.bg-card-foreground {\n background-color: hsl(var(--card-foreground));\n}\n.bg-destructive {\n background-color: hsl(var(--destructive));\n}\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity));\n}\n.bg-muted {\n background-color: hsl(var(--muted));\n}\n.bg-popover {\n background-color: hsl(var(--popover));\n}\n.bg-primary {\n background-color: hsl(var(--primary));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n.bg-secondary {\n background-color: hsl(var(--secondary));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n.bg-gradient-to-br {\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\n}\n.from-background\\/90 {\n --tw-gradient-from: hsl(var(--background) / 0.9) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--background) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-40\\% {\n --tw-gradient-from-position: 40%;\n}\n.to-background {\n --tw-gradient-to: hsl(var(--background)) var(--tw-gradient-to-position);\n}\n.fill-current {\n fill: currentColor;\n}\n.fill-white {\n fill: #fff;\n}\n.stroke-\\[2px\\] {\n stroke-width: 2px;\n}\n.stroke-\\[3px\\] {\n stroke-width: 3px;\n}\n.object-contain {\n -o-object-fit: contain;\n object-fit: contain;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-10 {\n padding: 2.5rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-\\[1px\\] {\n padding: 1px;\n}\n.px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.px-\\[24px\\] {\n padding-left: 24px;\n padding-right: 24px;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n.py-7 {\n padding-top: 1.75rem;\n padding-bottom: 1.75rem;\n}\n.py-\\[2px\\] {\n padding-top: 2px;\n padding-bottom: 2px;\n}\n.pb-0 {\n padding-bottom: 0px;\n}\n.pb-20 {\n padding-bottom: 5rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pl-8 {\n padding-left: 2rem;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.pt-1 {\n padding-top: 0.25rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.pt-4 {\n padding-top: 1rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.text-start {\n text-align: start;\n}\n.font-sans {\n font-family: 'Roboto', sans-serif;\n}\n.font-serif {\n font-family: 'Space Mono', monospace;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-3xl {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.text-4xl {\n font-size: 2.25rem;\n line-height: 2.5rem;\n}\n.text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n}\n.text-\\[12px\\] {\n font-size: 12px;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-\\[12px\\] {\n font-weight: 12px;\n}\n.font-\\[400\\] {\n font-weight: 400;\n}\n.font-\\[500\\] {\n font-weight: 500;\n}\n.font-\\[550\\] {\n font-weight: 550;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-extrabold {\n font-weight: 800;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.uppercase {\n text-transform: uppercase;\n}\n.italic {\n font-style: italic;\n}\n.leading-4 {\n line-height: 1rem;\n}\n.leading-none {\n line-height: 1;\n}\n.tracking-\\[0\\.04em\\] {\n letter-spacing: 0.04em;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.tracking-wider {\n letter-spacing: 0.05em;\n}\n.tracking-widest {\n letter-spacing: 0.1em;\n}\n.text-accent {\n color: hsl(var(--accent));\n}\n.text-accent-foreground {\n color: hsl(var(--accent-foreground));\n}\n.text-background {\n color: hsl(var(--background));\n}\n.text-card-foreground {\n color: hsl(var(--card-foreground));\n}\n.text-current {\n color: currentColor;\n}\n.text-destructive {\n color: hsl(var(--destructive));\n}\n.text-destructive-foreground {\n color: hsl(var(--destructive-foreground));\n}\n.text-foreground {\n color: hsl(var(--foreground));\n}\n.text-muted {\n color: hsl(var(--muted));\n}\n.text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.text-popover-foreground {\n color: hsl(var(--popover-foreground));\n}\n.text-primary {\n color: hsl(var(--primary));\n}\n.text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.text-secondary-foreground {\n color: hsl(var(--secondary-foreground));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.underline {\n text-decoration-line: underline;\n}\n.line-through {\n text-decoration-line: line-through;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.outline {\n outline-style: solid;\n}\n.ring-0 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.drop-shadow-2xl {\n --tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.drop-shadow-\\[0px_0px_12px_rgba\\(56\\2c 205\\2c 152\\2c 0\\.60\\)\\] {\n --tw-drop-shadow: drop-shadow(0px 0px 12px rgba(56,205,152,0.60));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.backdrop-blur-3xl {\n --tw-backdrop-blur: blur(64px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.backdrop-blur-lg {\n --tw-backdrop-blur: blur(16px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.fade-in-0 {\n --tw-enter-opacity: 0;\n}\n.zoom-in-95 {\n --tw-enter-scale: .95;\n}\n.duration-150 {\n animation-duration: 150ms;\n}\n.duration-200 {\n animation-duration: 200ms;\n}\n.ease-in-out {\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.file\\:border-0::file-selector-button {\n border-width: 0px;\n}\n.file\\:bg-transparent::file-selector-button {\n background-color: transparent;\n}\n.file\\:text-sm::file-selector-button {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.file\\:font-medium::file-selector-button {\n font-weight: 500;\n}\n.placeholder\\:text-muted-foreground::-moz-placeholder {\n color: hsl(var(--muted-foreground));\n}\n.placeholder\\:text-muted-foreground::placeholder {\n color: hsl(var(--muted-foreground));\n}\n.focus-within\\:relative:focus-within {\n position: relative;\n}\n.hover\\:w-\\[2px\\]:hover {\n width: 2px;\n}\n.hover\\:w-\\[3px\\]:hover {\n width: 3px;\n}\n.hover\\:cursor-pointer:hover {\n cursor: pointer;\n}\n.hover\\:rounded-lg:hover {\n border-radius: var(--radius);\n}\n.hover\\:bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n.hover\\:bg-border:hover {\n background-color: hsl(var(--border));\n}\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n.hover\\:bg-muted:hover {\n background-color: hsl(var(--muted));\n}\n.hover\\:bg-primary:hover {\n background-color: hsl(var(--primary));\n}\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n.hover\\:bg-red-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n.hover\\:bg-secondary\\/80:hover {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.hover\\:text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n.hover\\:text-muted-foreground:hover {\n color: hsl(var(--muted-foreground));\n}\n.hover\\:text-primary-foreground:hover {\n color: hsl(var(--primary-foreground));\n}\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n.hover\\:opacity-100:hover {\n opacity: 1;\n}\n.focus\\:bg-accent:focus {\n background-color: hsl(var(--accent));\n}\n.focus\\:bg-primary:focus {\n background-color: hsl(var(--primary));\n}\n.focus\\:text-accent-foreground:focus {\n color: hsl(var(--accent-foreground));\n}\n.focus\\:text-primary-foreground:focus {\n color: hsl(var(--primary-foreground));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-ring:focus {\n --tw-ring-color: hsl(var(--ring));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus-visible\\:outline-accent:focus-visible {\n outline-color: hsl(var(--accent));\n}\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-color: hsl(var(--ring));\n}\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:ring-offset-background:focus-visible {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n}\n.disabled\\:text-background:disabled {\n color: hsl(var(--background));\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n.peer:disabled ~ .peer-disabled\\:cursor-not-allowed {\n cursor: not-allowed;\n}\n.peer:disabled ~ .peer-disabled\\:opacity-70 {\n opacity: 0.7;\n}\n.aria-selected\\:bg-accent[aria-selected=\"true\"] {\n background-color: hsl(var(--accent));\n}\n.aria-selected\\:text-accent-foreground[aria-selected=\"true\"] {\n color: hsl(var(--accent-foreground));\n}\n.aria-selected\\:opacity-100[aria-selected=\"true\"] {\n opacity: 1;\n}\n.data-\\[disabled\\]\\:pointer-events-none[data-disabled] {\n pointer-events: none;\n}\n.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom] {\n --tw-translate-y: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left] {\n --tw-translate-x: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=right\\]\\:translate-x-1[data-side=right] {\n --tw-translate-x: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top] {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-5[data-state=checked] {\n --tw-translate-x: 1.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes accordion-up {\n\n from {\n height: var(--radix-accordion-content-height);\n }\n\n to {\n height: 0;\n }\n}\n.data-\\[state\\=closed\\]\\:animate-accordion-up[data-state=closed] {\n animation: accordion-up 0.2s ease-out;\n}\n@keyframes accordion-down {\n\n from {\n height: 0;\n }\n\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n.data-\\[state\\=open\\]\\:animate-accordion-down[data-state=open] {\n animation: accordion-down 0.2s ease-out;\n}\n.data-\\[state\\=active\\]\\:bg-background[data-state=active] {\n background-color: hsl(var(--background));\n}\n.data-\\[state\\=checked\\]\\:bg-accent[data-state=checked] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=checked\\]\\:bg-primary[data-state=checked] {\n background-color: hsl(var(--primary));\n}\n.data-\\[state\\=on\\]\\:bg-accent[data-state=on] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=open\\]\\:bg-accent[data-state=open] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=unchecked\\]\\:bg-primary[data-state=unchecked] {\n background-color: hsl(var(--primary));\n}\n.data-\\[state\\=active\\]\\:text-foreground[data-state=active] {\n color: hsl(var(--foreground));\n}\n.data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked] {\n color: hsl(var(--primary-foreground));\n}\n.data-\\[state\\=on\\]\\:text-accent-foreground[data-state=on] {\n color: hsl(var(--accent-foreground));\n}\n.data-\\[state\\=open\\]\\:text-muted-foreground[data-state=open] {\n color: hsl(var(--muted-foreground));\n}\n.data-\\[disabled\\]\\:opacity-50[data-disabled] {\n opacity: 0.5;\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.data-\\[state\\=open\\]\\:animate-in[data-state=open] {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.data-\\[state\\=closed\\]\\:animate-out[data-state=closed] {\n animation-name: exit;\n animation-duration: 150ms;\n --tw-exit-opacity: initial;\n --tw-exit-scale: initial;\n --tw-exit-rotate: initial;\n --tw-exit-translate-x: initial;\n --tw-exit-translate-y: initial;\n}\n.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed] {\n --tw-exit-opacity: 0;\n}\n.data-\\[state\\=open\\]\\:fade-in-0[data-state=open] {\n --tw-enter-opacity: 0;\n}\n.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed] {\n --tw-exit-scale: .95;\n}\n.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open] {\n --tw-enter-scale: .95;\n}\n.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom] {\n --tw-enter-translate-y: -0.5rem;\n}\n.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left] {\n --tw-enter-translate-x: 0.5rem;\n}\n.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right] {\n --tw-enter-translate-x: -0.5rem;\n}\n.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top] {\n --tw-enter-translate-y: 0.5rem;\n}\n.data-\\[state\\=closed\\]\\:slide-out-to-left-1\\/2[data-state=closed] {\n --tw-exit-translate-x: -50%;\n}\n.data-\\[state\\=closed\\]\\:slide-out-to-top-\\[48\\%\\][data-state=closed] {\n --tw-exit-translate-y: -48%;\n}\n.data-\\[state\\=open\\]\\:slide-in-from-left-1\\/2[data-state=open] {\n --tw-enter-translate-x: -50%;\n}\n.data-\\[state\\=open\\]\\:slide-in-from-top-\\[48\\%\\][data-state=open] {\n --tw-enter-translate-y: -48%;\n}\n:is([data-mode=\"dark\"] .dark\\:border-white) {\n --tw-border-opacity: 1;\n border-color: rgb(255 255 255 / var(--tw-border-opacity));\n}\n@media (min-width: 640px) {\n\n .sm\\:mt-0 {\n margin-top: 0px;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:flex-row {\n flex-direction: row;\n }\n\n .sm\\:justify-end {\n justify-content: flex-end;\n }\n\n .sm\\:space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n }\n\n .sm\\:space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n }\n\n .sm\\:space-y-0 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0px * var(--tw-space-y-reverse));\n }\n\n .sm\\:rounded-lg {\n border-radius: var(--radius);\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:text-left {\n text-align: left;\n }\n}\n@media (min-width: 768px) {\n\n .md\\:w-full {\n width: 100%;\n }\n}\n.\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:bg-accent:has([aria-selected]) {\n background-color: hsl(var(--accent));\n}\n.first\\:\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:rounded-l-md:has([aria-selected]):first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n}\n.last\\:\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:rounded-r-md:has([aria-selected]):last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n}\n.\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180[data-state=open]>svg {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 [cmdk-group-heading] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 [cmdk-group-heading] {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs [cmdk-group-heading] {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium [cmdk-group-heading] {\n font-weight: 500;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground [cmdk-group-heading] {\n color: hsl(var(--muted-foreground));\n}\n.\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: 0px;\n}\n.\\[\\&_\\[cmdk-group\\]\\]\\:px-2 [cmdk-group] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 [cmdk-input-wrapper] svg {\n height: 1.25rem;\n}\n.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 [cmdk-input-wrapper] svg {\n width: 1.25rem;\n}\n.\\[\\&_\\[cmdk-input\\]\\]\\:h-12 [cmdk-input] {\n height: 3rem;\n}\n.\\[\\&_\\[cmdk-item\\]\\]\\:px-2 [cmdk-item] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-item\\]\\]\\:py-3 [cmdk-item] {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 [cmdk-item] svg {\n height: 1.25rem;\n}\n.\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 [cmdk-item] svg {\n width: 1.25rem;\n}\n";
74090
+ const styleCss = "/*\n Need to explicitly set config path, otherwise it may fail to resolve when\n built from outside packages/ui.\n*/\n\n/*\n ! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n*/\n\nhtml {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: 'Roboto', sans-serif; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden] {\n display: none;\n}\n\n/* :host for use with Shadow DOM, copied from the TailwindCSS prelude */\n\n:host {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n\n --muted: 0 0% 57.3%;\n --muted-foreground: 215.4 16.3% 46.9%;\n\n --accent: 273 60% 51%;\n --accent-foreground: 110 10% 94%;\n\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n\n --radius: 0.5rem;\n }\n\n:root {\n --background: 110 10% 94%;\n --foreground: 222.2 84% 4.9%;\n\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n\n --muted: 0 0% 57.3%;\n --muted-foreground: 215.4 16.3% 46.9%;\n\n --accent: 273 60% 51%;\n --accent-foreground: 110 10% 94%;\n\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 214.3 31.8% 91.4%;\n --input: 212.7 9.1% 76.3%;\n --ring: 222.2 84% 4.9%;\n\n --radius: 0.5rem;\n }\n\n/* dark theme */\n\n*[data-mode=\"dark\"] {\n --background: 0 0% 4%;\n --foreground: 210 40% 98%;\n\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n\n --muted: 178 23% 76%;\n --muted-foreground: 215 20.2% 65.1%;\n\n --accent: 159 60% 51%;\n --accent-foreground: 210 40% 98%;\n\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n }\n\n* {\n border-color: hsl(var(--border));\n}\n\nbody {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n}\n\n*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n.pointer-events-none {\n pointer-events: none;\n}\n.invisible {\n visibility: hidden;\n}\n.static {\n position: static;\n}\n.fixed {\n position: fixed;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.sticky {\n position: sticky;\n}\n.inset-0 {\n inset: 0px;\n}\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n.-left-2 {\n left: -0.5rem;\n}\n.-right-\\[10px\\] {\n right: -10px;\n}\n.-top-\\[10px\\] {\n top: -10px;\n}\n.-top-\\[4px\\] {\n top: -4px;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.left-0 {\n left: 0px;\n}\n.left-1 {\n left: 0.25rem;\n}\n.left-2 {\n left: 0.5rem;\n}\n.left-\\[50\\%\\] {\n left: 50%;\n}\n.right-0 {\n right: 0px;\n}\n.right-1 {\n right: 0.25rem;\n}\n.right-4 {\n right: 1rem;\n}\n.right-\\[16px\\] {\n right: 16px;\n}\n.top-0 {\n top: 0px;\n}\n.top-1\\/2 {\n top: 50%;\n}\n.top-4 {\n top: 1rem;\n}\n.top-\\[50\\%\\] {\n top: 50%;\n}\n.z-50 {\n z-index: 50;\n}\n.z-\\[1\\] {\n z-index: 1;\n}\n.z-\\[5\\] {\n z-index: 5;\n}\n.z-overlay {\n z-index: 4;\n}\n.m-4 {\n margin: 1rem;\n}\n.-mx-1 {\n margin-left: -0.25rem;\n margin-right: -0.25rem;\n}\n.-my-2 {\n margin-top: -0.5rem;\n margin-bottom: -0.5rem;\n}\n.-my-\\[100px\\] {\n margin-top: -100px;\n margin-bottom: -100px;\n}\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n.mb-4 {\n margin-bottom: 1rem;\n}\n.ml-0 {\n margin-left: 0px;\n}\n.ml-2 {\n margin-left: 0.5rem;\n}\n.ml-4 {\n margin-left: 1rem;\n}\n.ml-\\[20px\\] {\n margin-left: 20px;\n}\n.ml-auto {\n margin-left: auto;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.block {\n display: block;\n}\n.inline {\n display: inline;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.table {\n display: table;\n}\n.grid {\n display: grid;\n}\n.hidden {\n display: none;\n}\n.aspect-square {\n aspect-ratio: 1 / 1;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-11 {\n height: 2.75rem;\n}\n.h-2 {\n height: 0.5rem;\n}\n.h-2\\.5 {\n height: 0.625rem;\n}\n.h-3 {\n height: 0.75rem;\n}\n.h-3\\.5 {\n height: 0.875rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-7 {\n height: 1.75rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-\\[100\\] {\n height: 100;\n}\n.h-\\[12px\\] {\n height: 12px;\n}\n.h-\\[14px\\] {\n height: 14px;\n}\n.h-\\[18px\\] {\n height: 18px;\n}\n.h-\\[1px\\] {\n height: 1px;\n}\n.h-\\[20px\\] {\n height: 20px;\n}\n.h-\\[22px\\] {\n height: 22px;\n}\n.h-\\[24px\\] {\n height: 24px;\n}\n.h-\\[32px\\] {\n height: 32px;\n}\n.h-\\[50px\\] {\n height: 50px;\n}\n.h-\\[75px\\] {\n height: 75px;\n}\n.h-\\[9px\\] {\n height: 9px;\n}\n.h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n}\n.h-full {\n height: 100%;\n}\n.h-px {\n height: 1px;\n}\n.h-screen {\n height: 100vh;\n}\n.max-h-\\[300px\\] {\n max-height: 300px;\n}\n.min-h-\\[200px\\] {\n min-height: 200px;\n}\n.min-h-\\[300px\\] {\n min-height: 300px;\n}\n.min-h-screen {\n min-height: 100vh;\n}\n.w-0 {\n width: 0px;\n}\n.w-1\\/3 {\n width: 33.333333%;\n}\n.w-10 {\n width: 2.5rem;\n}\n.w-2 {\n width: 0.5rem;\n}\n.w-2\\.5 {\n width: 0.625rem;\n}\n.w-3 {\n width: 0.75rem;\n}\n.w-3\\.5 {\n width: 0.875rem;\n}\n.w-4 {\n width: 1rem;\n}\n.w-5 {\n width: 1.25rem;\n}\n.w-7 {\n width: 1.75rem;\n}\n.w-72 {\n width: 18rem;\n}\n.w-9 {\n width: 2.25rem;\n}\n.w-\\[12px\\] {\n width: 12px;\n}\n.w-\\[14px\\] {\n width: 14px;\n}\n.w-\\[1px\\] {\n width: 1px;\n}\n.w-\\[20px\\] {\n width: 20px;\n}\n.w-\\[24px\\] {\n width: 24px;\n}\n.w-\\[300px\\] {\n width: 300px;\n}\n.w-\\[32px\\] {\n width: 32px;\n}\n.w-\\[44px\\] {\n width: 44px;\n}\n.w-\\[9px\\] {\n width: 9px;\n}\n.w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.w-full {\n width: 100%;\n}\n.w-screen {\n width: 100vw;\n}\n.min-w-0 {\n min-width: 0px;\n}\n.min-w-\\[320px\\] {\n min-width: 320px;\n}\n.min-w-\\[500px\\] {\n min-width: 500px;\n}\n.min-w-\\[8rem\\] {\n min-width: 8rem;\n}\n.min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n}\n.max-w-4xl {\n max-width: 56rem;\n}\n.max-w-\\[1000px\\] {\n max-width: 1000px;\n}\n.max-w-\\[10vw\\] {\n max-width: 10vw;\n}\n.max-w-\\[300px\\] {\n max-width: 300px;\n}\n.max-w-\\[90vw\\] {\n max-width: 90vw;\n}\n.max-w-lg {\n max-width: 32rem;\n}\n.max-w-xl {\n max-width: 36rem;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.flex-auto {\n flex: 1 1 auto;\n}\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n.shrink-0 {\n flex-shrink: 0;\n}\n.flex-grow {\n flex-grow: 1;\n}\n.border-collapse {\n border-collapse: collapse;\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.-rotate-90 {\n --tw-rotate: -90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-90 {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[-90deg\\] {\n --tw-rotate: -90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.rotate-\\[90deg\\] {\n --tw-rotate: 90deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.cursor-col-resize {\n cursor: col-resize;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-grab {\n cursor: grab;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.cursor-se-resize {\n cursor: se-resize;\n}\n.touch-none {\n touch-action: none;\n}\n.select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.resize-none {\n resize: none;\n}\n.resize {\n resize: both;\n}\n.list-decimal {\n list-style-type: decimal;\n}\n.list-disc {\n list-style-type: disc;\n}\n.grid-cols-\\[min-content_1fr\\] {\n grid-template-columns: min-content 1fr;\n}\n.grid-rows-\\[1fr\\2c _min-content\\] {\n grid-template-rows: 1fr min-content;\n}\n.flex-row {\n flex-direction: row;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-col-reverse {\n flex-direction: column-reverse;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-start {\n justify-content: flex-start;\n}\n.justify-end {\n justify-content: flex-end;\n}\n.justify-center {\n justify-content: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.gap-5 {\n gap: 1.25rem;\n}\n.gap-\\[0\\.5em\\] {\n gap: 0.5em;\n}\n.gap-\\[36px\\] {\n gap: 36px;\n}\n.gap-x-4 {\n -moz-column-gap: 1rem;\n column-gap: 1rem;\n}\n.gap-y-1 {\n row-gap: 0.25rem;\n}\n.gap-y-2 {\n row-gap: 0.5rem;\n}\n.gap-y-4 {\n row-gap: 1rem;\n}\n.gap-y-8 {\n row-gap: 2rem;\n}\n.space-x-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.25rem * var(--tw-space-x-reverse));\n margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));\n}\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-auto {\n overflow: auto;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.overflow-clip {\n overflow: clip;\n}\n.overflow-scroll {\n overflow: scroll;\n}\n.overflow-y-auto {\n overflow-y: auto;\n}\n.overflow-x-hidden {\n overflow-x: hidden;\n}\n.overflow-y-scroll {\n overflow-y: scroll;\n}\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-\\[inherit\\] {\n border-radius: inherit;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: var(--radius);\n}\n.rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n}\n.rounded-b-none {\n border-bottom-right-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n.rounded-b-sm {\n border-bottom-right-radius: calc(var(--radius) - 4px);\n border-bottom-left-radius: calc(var(--radius) - 4px);\n}\n.rounded-t-none {\n border-top-left-radius: 0px;\n border-top-right-radius: 0px;\n}\n.border {\n border-width: 1px;\n}\n.border-2 {\n border-width: 2px;\n}\n.border-\\[2px\\] {\n border-width: 2px;\n}\n.border-x {\n border-left-width: 1px;\n border-right-width: 1px;\n}\n.border-y {\n border-top-width: 1px;\n border-bottom-width: 1px;\n}\n.border-b {\n border-bottom-width: 1px;\n}\n.border-b-0 {\n border-bottom-width: 0px;\n}\n.border-b-2 {\n border-bottom-width: 2px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-l-2 {\n border-left-width: 2px;\n}\n.border-r {\n border-right-width: 1px;\n}\n.border-t {\n border-top-width: 1px;\n}\n.border-t-0 {\n border-top-width: 0px;\n}\n.border-accent {\n border-color: hsl(var(--accent));\n}\n.border-border {\n border-color: hsl(var(--border));\n}\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity));\n}\n.border-input {\n border-color: hsl(var(--input));\n}\n.border-primary {\n border-color: hsl(var(--primary));\n}\n.border-transparent {\n border-color: transparent;\n}\n.border-l-transparent {\n border-left-color: transparent;\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-accent {\n background-color: hsl(var(--accent));\n}\n.bg-background {\n background-color: hsl(var(--background));\n}\n.bg-background\\/80 {\n background-color: hsl(var(--background) / 0.8);\n}\n.bg-border {\n background-color: hsl(var(--border));\n}\n.bg-card {\n background-color: hsl(var(--card));\n}\n.bg-card-foreground {\n background-color: hsl(var(--card-foreground));\n}\n.bg-destructive {\n background-color: hsl(var(--destructive));\n}\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity));\n}\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity));\n}\n.bg-muted {\n background-color: hsl(var(--muted));\n}\n.bg-popover {\n background-color: hsl(var(--popover));\n}\n.bg-primary {\n background-color: hsl(var(--primary));\n}\n.bg-red-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity));\n}\n.bg-secondary {\n background-color: hsl(var(--secondary));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n.bg-gradient-to-b {\n background-image: linear-gradient(to bottom, var(--tw-gradient-stops));\n}\n.bg-gradient-to-br {\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\n}\n.from-background\\/90 {\n --tw-gradient-from: hsl(var(--background) / 0.9) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--background) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-card {\n --tw-gradient-from: hsl(var(--card)) var(--tw-gradient-from-position);\n --tw-gradient-to: hsl(var(--card) / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-transparent {\n --tw-gradient-from: transparent var(--tw-gradient-from-position);\n --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\n}\n.from-40\\% {\n --tw-gradient-from-position: 40%;\n}\n.from-50\\% {\n --tw-gradient-from-position: 50%;\n}\n.to-background {\n --tw-gradient-to: hsl(var(--background)) var(--tw-gradient-to-position);\n}\n.fill-current {\n fill: currentColor;\n}\n.fill-white {\n fill: #fff;\n}\n.stroke-\\[2px\\] {\n stroke-width: 2px;\n}\n.stroke-\\[3px\\] {\n stroke-width: 3px;\n}\n.object-contain {\n -o-object-fit: contain;\n object-fit: contain;\n}\n.p-0 {\n padding: 0px;\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-10 {\n padding: 2.5rem;\n}\n.p-2 {\n padding: 0.5rem;\n}\n.p-3 {\n padding: 0.75rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.p-\\[1px\\] {\n padding: 1px;\n}\n.px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.px-\\[24px\\] {\n padding-left: 24px;\n padding-right: 24px;\n}\n.px-\\[2px\\] {\n padding-left: 2px;\n padding-right: 2px;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n.py-7 {\n padding-top: 1.75rem;\n padding-bottom: 1.75rem;\n}\n.py-\\[2px\\] {\n padding-top: 2px;\n padding-bottom: 2px;\n}\n.pb-0 {\n padding-bottom: 0px;\n}\n.pb-20 {\n padding-bottom: 5rem;\n}\n.pb-4 {\n padding-bottom: 1rem;\n}\n.pl-0 {\n padding-left: 0px;\n}\n.pl-6 {\n padding-left: 1.5rem;\n}\n.pl-8 {\n padding-left: 2rem;\n}\n.pl-\\[300px\\] {\n padding-left: 300px;\n}\n.pr-2 {\n padding-right: 0.5rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.pt-1 {\n padding-top: 0.25rem;\n}\n.pt-2 {\n padding-top: 0.5rem;\n}\n.pt-4 {\n padding-top: 1rem;\n}\n.text-left {\n text-align: left;\n}\n.text-center {\n text-align: center;\n}\n.text-start {\n text-align: start;\n}\n.font-sans {\n font-family: 'Roboto', sans-serif;\n}\n.font-serif {\n font-family: 'Space Mono', monospace;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-3xl {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.text-4xl {\n font-size: 2.25rem;\n line-height: 2.5rem;\n}\n.text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n}\n.text-\\[12px\\] {\n font-size: 12px;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-\\[12px\\] {\n font-weight: 12px;\n}\n.font-\\[400\\] {\n font-weight: 400;\n}\n.font-\\[500\\] {\n font-weight: 500;\n}\n.font-\\[550\\] {\n font-weight: 550;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-extrabold {\n font-weight: 800;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-normal {\n font-weight: 400;\n}\n.font-semibold {\n font-weight: 600;\n}\n.uppercase {\n text-transform: uppercase;\n}\n.italic {\n font-style: italic;\n}\n.leading-4 {\n line-height: 1rem;\n}\n.leading-none {\n line-height: 1;\n}\n.tracking-\\[0\\.04em\\] {\n letter-spacing: 0.04em;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.tracking-wider {\n letter-spacing: 0.05em;\n}\n.tracking-widest {\n letter-spacing: 0.1em;\n}\n.text-accent {\n color: hsl(var(--accent));\n}\n.text-accent-foreground {\n color: hsl(var(--accent-foreground));\n}\n.text-background {\n color: hsl(var(--background));\n}\n.text-card-foreground {\n color: hsl(var(--card-foreground));\n}\n.text-current {\n color: currentColor;\n}\n.text-destructive {\n color: hsl(var(--destructive));\n}\n.text-destructive-foreground {\n color: hsl(var(--destructive-foreground));\n}\n.text-foreground {\n color: hsl(var(--foreground));\n}\n.text-muted {\n color: hsl(var(--muted));\n}\n.text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.text-popover-foreground {\n color: hsl(var(--popover-foreground));\n}\n.text-primary {\n color: hsl(var(--primary));\n}\n.text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.text-secondary-foreground {\n color: hsl(var(--secondary-foreground));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.underline {\n text-decoration-line: underline;\n}\n.line-through {\n text-decoration-line: line-through;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.opacity-60 {\n opacity: 0.6;\n}\n.opacity-70 {\n opacity: 0.7;\n}\n.opacity-75 {\n opacity: 0.75;\n}\n.mix-blend-difference {\n mix-blend-mode: difference;\n}\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.outline {\n outline-style: solid;\n}\n.ring-0 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.drop-shadow-2xl {\n --tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.drop-shadow-\\[0px_0px_12px_hsl\\(var\\(--accent\\)\\)\\] {\n --tw-drop-shadow: drop-shadow(0px 0px 12px hsl(var(--accent)));\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.backdrop-blur-lg {\n --tw-backdrop-blur: blur(16px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.fade-in-0 {\n --tw-enter-opacity: 0;\n}\n.zoom-in-95 {\n --tw-enter-scale: .95;\n}\n.duration-150 {\n animation-duration: 150ms;\n}\n.duration-200 {\n animation-duration: 200ms;\n}\n.ease-in-out {\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.file\\:border-0::file-selector-button {\n border-width: 0px;\n}\n.file\\:bg-transparent::file-selector-button {\n background-color: transparent;\n}\n.file\\:text-sm::file-selector-button {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.file\\:font-medium::file-selector-button {\n font-weight: 500;\n}\n.placeholder\\:text-muted-foreground::-moz-placeholder {\n color: hsl(var(--muted-foreground));\n}\n.placeholder\\:text-muted-foreground::placeholder {\n color: hsl(var(--muted-foreground));\n}\n.focus-within\\:relative:focus-within {\n position: relative;\n}\n.hover\\:w-\\[2px\\]:hover {\n width: 2px;\n}\n.hover\\:w-\\[3px\\]:hover {\n width: 3px;\n}\n.hover\\:cursor-pointer:hover {\n cursor: pointer;\n}\n.hover\\:rounded-lg:hover {\n border-radius: var(--radius);\n}\n.hover\\:bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n.hover\\:bg-border:hover {\n background-color: hsl(var(--border));\n}\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n.hover\\:bg-muted:hover {\n background-color: hsl(var(--muted));\n}\n.hover\\:bg-primary:hover {\n background-color: hsl(var(--primary));\n}\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n.hover\\:bg-red-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(185 28 28 / var(--tw-bg-opacity));\n}\n.hover\\:bg-secondary\\/80:hover {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.hover\\:text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n.hover\\:text-muted-foreground:hover {\n color: hsl(var(--muted-foreground));\n}\n.hover\\:text-primary-foreground:hover {\n color: hsl(var(--primary-foreground));\n}\n.hover\\:text-white:hover {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n.hover\\:opacity-100:hover {\n opacity: 1;\n}\n.focus\\:bg-accent:focus {\n background-color: hsl(var(--accent));\n}\n.focus\\:bg-primary:focus {\n background-color: hsl(var(--primary));\n}\n.focus\\:text-accent-foreground:focus {\n color: hsl(var(--accent-foreground));\n}\n.focus\\:text-primary-foreground:focus {\n color: hsl(var(--primary-foreground));\n}\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ring-ring:focus {\n --tw-ring-color: hsl(var(--ring));\n}\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.focus-visible\\:outline-accent:focus-visible {\n outline-color: hsl(var(--accent));\n}\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-color: hsl(var(--ring));\n}\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n.focus-visible\\:ring-offset-background:focus-visible {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:cursor-not-allowed:disabled {\n cursor: not-allowed;\n}\n.disabled\\:text-background:disabled {\n color: hsl(var(--background));\n}\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n.peer:disabled ~ .peer-disabled\\:cursor-not-allowed {\n cursor: not-allowed;\n}\n.peer:disabled ~ .peer-disabled\\:opacity-70 {\n opacity: 0.7;\n}\n.aria-selected\\:bg-accent[aria-selected=\"true\"] {\n background-color: hsl(var(--accent));\n}\n.aria-selected\\:text-accent-foreground[aria-selected=\"true\"] {\n color: hsl(var(--accent-foreground));\n}\n.aria-selected\\:opacity-100[aria-selected=\"true\"] {\n opacity: 1;\n}\n.data-\\[disabled\\]\\:pointer-events-none[data-disabled] {\n pointer-events: none;\n}\n.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom] {\n --tw-translate-y: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left] {\n --tw-translate-x: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=right\\]\\:translate-x-1[data-side=right] {\n --tw-translate-x: 0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top] {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=checked\\]\\:translate-x-5[data-state=checked] {\n --tw-translate-x: 1.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked] {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes accordion-up {\n\n from {\n height: var(--radix-accordion-content-height);\n }\n\n to {\n height: 0;\n }\n}\n.data-\\[state\\=closed\\]\\:animate-accordion-up[data-state=closed] {\n animation: accordion-up 0.2s ease-out;\n}\n@keyframes accordion-down {\n\n from {\n height: 0;\n }\n\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n.data-\\[state\\=open\\]\\:animate-accordion-down[data-state=open] {\n animation: accordion-down 0.2s ease-out;\n}\n.data-\\[state\\=active\\]\\:bg-background[data-state=active] {\n background-color: hsl(var(--background));\n}\n.data-\\[state\\=checked\\]\\:bg-accent[data-state=checked] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=checked\\]\\:bg-primary[data-state=checked] {\n background-color: hsl(var(--primary));\n}\n.data-\\[state\\=on\\]\\:bg-accent[data-state=on] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=open\\]\\:bg-accent[data-state=open] {\n background-color: hsl(var(--accent));\n}\n.data-\\[state\\=unchecked\\]\\:bg-primary[data-state=unchecked] {\n background-color: hsl(var(--primary));\n}\n.data-\\[state\\=active\\]\\:text-foreground[data-state=active] {\n color: hsl(var(--foreground));\n}\n.data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked] {\n color: hsl(var(--primary-foreground));\n}\n.data-\\[state\\=on\\]\\:text-accent-foreground[data-state=on] {\n color: hsl(var(--accent-foreground));\n}\n.data-\\[state\\=open\\]\\:text-muted-foreground[data-state=open] {\n color: hsl(var(--muted-foreground));\n}\n.data-\\[disabled\\]\\:opacity-50[data-disabled] {\n opacity: 0.5;\n}\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=active] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.data-\\[state\\=open\\]\\:animate-in[data-state=open] {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.data-\\[state\\=closed\\]\\:animate-out[data-state=closed] {\n animation-name: exit;\n animation-duration: 150ms;\n --tw-exit-opacity: initial;\n --tw-exit-scale: initial;\n --tw-exit-rotate: initial;\n --tw-exit-translate-x: initial;\n --tw-exit-translate-y: initial;\n}\n.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed] {\n --tw-exit-opacity: 0;\n}\n.data-\\[state\\=open\\]\\:fade-in-0[data-state=open] {\n --tw-enter-opacity: 0;\n}\n.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed] {\n --tw-exit-scale: .95;\n}\n.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open] {\n --tw-enter-scale: .95;\n}\n.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom] {\n --tw-enter-translate-y: -0.5rem;\n}\n.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left] {\n --tw-enter-translate-x: 0.5rem;\n}\n.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right] {\n --tw-enter-translate-x: -0.5rem;\n}\n.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top] {\n --tw-enter-translate-y: 0.5rem;\n}\n.data-\\[state\\=closed\\]\\:slide-out-to-left-1\\/2[data-state=closed] {\n --tw-exit-translate-x: -50%;\n}\n.data-\\[state\\=closed\\]\\:slide-out-to-top-\\[48\\%\\][data-state=closed] {\n --tw-exit-translate-y: -48%;\n}\n.data-\\[state\\=open\\]\\:slide-in-from-left-1\\/2[data-state=open] {\n --tw-enter-translate-x: -50%;\n}\n.data-\\[state\\=open\\]\\:slide-in-from-top-\\[48\\%\\][data-state=open] {\n --tw-enter-translate-y: -48%;\n}\n:is([data-mode=\"dark\"] .dark\\:border-white) {\n --tw-border-opacity: 1;\n border-color: rgb(255 255 255 / var(--tw-border-opacity));\n}\n@media (min-width: 640px) {\n\n .sm\\:mt-0 {\n margin-top: 0px;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:flex-row {\n flex-direction: row;\n }\n\n .sm\\:justify-end {\n justify-content: flex-end;\n }\n\n .sm\\:space-x-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\n }\n\n .sm\\:space-x-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-x-reverse: 0;\n margin-right: calc(1rem * var(--tw-space-x-reverse));\n margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));\n }\n\n .sm\\:space-y-0 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0px * var(--tw-space-y-reverse));\n }\n\n .sm\\:rounded-lg {\n border-radius: var(--radius);\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:text-left {\n text-align: left;\n }\n}\n@media (min-width: 768px) {\n\n .md\\:relative {\n position: relative;\n }\n\n .md\\:flex {\n display: flex;\n }\n\n .md\\:hidden {\n display: none;\n }\n\n .md\\:w-\\[300px\\] {\n width: 300px;\n }\n\n .md\\:w-full {\n width: 100%;\n }\n\n .md\\:px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n\n .md\\:pl-0 {\n padding-left: 0px;\n }\n}\n.\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:bg-accent:has([aria-selected]) {\n background-color: hsl(var(--accent));\n}\n.first\\:\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:rounded-l-md:has([aria-selected]):first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n}\n.last\\:\\[\\&\\:has\\(\\[aria-selected\\]\\)\\]\\:rounded-r-md:has([aria-selected]):last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n}\n.\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180[data-state=open]>svg {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 [cmdk-group-heading] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 [cmdk-group-heading] {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs [cmdk-group-heading] {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium [cmdk-group-heading] {\n font-weight: 500;\n}\n.\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground [cmdk-group-heading] {\n color: hsl(var(--muted-foreground));\n}\n.\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: 0px;\n}\n.\\[\\&_\\[cmdk-group\\]\\]\\:px-2 [cmdk-group] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 [cmdk-input-wrapper] svg {\n height: 1.25rem;\n}\n.\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 [cmdk-input-wrapper] svg {\n width: 1.25rem;\n}\n.\\[\\&_\\[cmdk-input\\]\\]\\:h-12 [cmdk-input] {\n height: 3rem;\n}\n.\\[\\&_\\[cmdk-item\\]\\]\\:px-2 [cmdk-item] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.\\[\\&_\\[cmdk-item\\]\\]\\:py-3 [cmdk-item] {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 [cmdk-item] svg {\n height: 1.25rem;\n}\n.\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 [cmdk-item] svg {\n width: 1.25rem;\n}\n";
73700
74091
  function Style() {
73701
74092
  return /* @__PURE__ */ jsx("style", { children: styleCss });
73702
74093
  }