@session-services/web-elements 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +4 -2
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/session-services-elements.cjs.js +1 -1
  4. package/dist/cjs/session-services-formatted-text.cjs.entry.js +1759 -0
  5. package/dist/cjs/session-services-ticketing.cjs.entry.js +2071 -834
  6. package/dist/collection/collection-manifest.json +1 -0
  7. package/dist/collection/components/session-services-formatted-text/session-services-formatted-text.css +135 -0
  8. package/dist/collection/components/session-services-formatted-text/session-services-formatted-text.js +162 -0
  9. package/dist/collection/components/session-services-ticketing/session-services-ticketing.css +175 -3
  10. package/dist/collection/components/session-services-ticketing/session-services-ticketing.js +50 -9
  11. package/dist/collection/index.js +1 -11
  12. package/dist/components/session-services-formatted-text.d.ts +11 -0
  13. package/dist/components/session-services-formatted-text.js +1786 -0
  14. package/dist/components/session-services-ticketing.js +2073 -835
  15. package/dist/esm/loader.js +1 -1
  16. package/dist/esm/session-services-elements.js +1 -1
  17. package/dist/esm/session-services-formatted-text.entry.js +1757 -0
  18. package/dist/esm/session-services-ticketing.entry.js +2071 -834
  19. package/dist/session-services-elements/p-62a8e2cc.entry.js +1 -0
  20. package/dist/session-services-elements/p-a2404c46.entry.js +1 -0
  21. package/dist/session-services-elements/session-services-elements.esm.js +1 -1
  22. package/dist/types/components/session-services-formatted-text/session-services-formatted-text.d.ts +19 -0
  23. package/dist/types/components/session-services-ticketing/session-services-ticketing.d.ts +6 -0
  24. package/dist/types/components.d.ts +29 -0
  25. package/dist/types/index.d.ts +1 -0
  26. package/package.json +10 -5
  27. package/dist/session-services-elements/p-448028d4.entry.js +0 -1
@@ -3906,7 +3906,7 @@ function toArray(value) {
3906
3906
 
3907
3907
  const ORPC_NAME = "orpc";
3908
3908
  const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
3909
- const ORPC_SHARED_PACKAGE_VERSION = "1.12.2";
3909
+ const ORPC_SHARED_PACKAGE_VERSION = "1.13.2";
3910
3910
 
3911
3911
  class AbortError extends Error {
3912
3912
  constructor(...rest) {
@@ -4204,7 +4204,7 @@ function tryDecodeURIComponent(value) {
4204
4204
  }
4205
4205
 
4206
4206
  const ORPC_CLIENT_PACKAGE_NAME = "@orpc/client";
4207
- const ORPC_CLIENT_PACKAGE_VERSION = "1.12.2";
4207
+ const ORPC_CLIENT_PACKAGE_VERSION = "1.13.2";
4208
4208
 
4209
4209
  const COMMON_ORPC_ERROR_DEFS = {
4210
4210
  BAD_REQUEST: {
@@ -4674,61 +4674,417 @@ function isContractProcedure(item) {
4674
4674
  return (typeof item === "object" || typeof item === "function") && item !== null && "~orpc" in item && typeof item["~orpc"] === "object" && item["~orpc"] !== null && "errorMap" in item["~orpc"] && "route" in item["~orpc"] && "meta" in item["~orpc"];
4675
4675
  }
4676
4676
 
4677
- function mergeMeta(meta1, meta2) {
4678
- return { ...meta1, ...meta2 };
4677
+ function toEventIterator(stream, options = {}) {
4678
+ const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());
4679
+ const reader = eventStream?.getReader();
4680
+ let span;
4681
+ let isCancelled = false;
4682
+ return new AsyncIteratorClass(async () => {
4683
+ span ??= startSpan("consume_event_iterator_stream");
4684
+ try {
4685
+ while (true) {
4686
+ if (reader === void 0) {
4687
+ return { done: true, value: void 0 };
4688
+ }
4689
+ const { done, value } = await runInSpanContext(span, () => reader.read());
4690
+ if (done) {
4691
+ if (isCancelled) {
4692
+ throw new AbortError("Stream was cancelled");
4693
+ }
4694
+ return { done: true, value: void 0 };
4695
+ }
4696
+ switch (value.event) {
4697
+ case "message": {
4698
+ let message = parseEmptyableJSON(value.data);
4699
+ if (isTypescriptObject(message)) {
4700
+ message = withEventMeta(message, value);
4701
+ }
4702
+ span?.addEvent("message");
4703
+ return { done: false, value: message };
4704
+ }
4705
+ case "error": {
4706
+ let error = new ErrorEvent({
4707
+ data: parseEmptyableJSON(value.data)
4708
+ });
4709
+ error = withEventMeta(error, value);
4710
+ span?.addEvent("error");
4711
+ throw error;
4712
+ }
4713
+ case "done": {
4714
+ let done2 = parseEmptyableJSON(value.data);
4715
+ if (isTypescriptObject(done2)) {
4716
+ done2 = withEventMeta(done2, value);
4717
+ }
4718
+ span?.addEvent("done");
4719
+ return { done: true, value: done2 };
4720
+ }
4721
+ default: {
4722
+ span?.addEvent("maybe_keepalive");
4723
+ }
4724
+ }
4725
+ }
4726
+ } catch (e) {
4727
+ if (!(e instanceof ErrorEvent)) {
4728
+ setSpanError(span, e, options);
4729
+ }
4730
+ throw e;
4731
+ }
4732
+ }, async (reason) => {
4733
+ try {
4734
+ if (reason !== "next") {
4735
+ isCancelled = true;
4736
+ span?.addEvent("cancelled");
4737
+ }
4738
+ await runInSpanContext(span, () => reader?.cancel());
4739
+ } catch (e) {
4740
+ setSpanError(span, e, options);
4741
+ throw e;
4742
+ } finally {
4743
+ span?.end();
4744
+ }
4745
+ });
4746
+ }
4747
+ function toEventStream(iterator, options = {}) {
4748
+ const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;
4749
+ const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;
4750
+ const keepAliveComment = options.eventIteratorKeepAliveComment ?? "";
4751
+ const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;
4752
+ const initialComment = options.eventIteratorInitialComment ?? "";
4753
+ let cancelled = false;
4754
+ let timeout;
4755
+ let span;
4756
+ const stream = new ReadableStream({
4757
+ start(controller) {
4758
+ span = startSpan("stream_event_iterator");
4759
+ if (initialCommentEnabled) {
4760
+ controller.enqueue(encodeEventMessage({
4761
+ comments: [initialComment]
4762
+ }));
4763
+ }
4764
+ },
4765
+ async pull(controller) {
4766
+ try {
4767
+ if (keepAliveEnabled) {
4768
+ timeout = setInterval(() => {
4769
+ controller.enqueue(encodeEventMessage({
4770
+ comments: [keepAliveComment]
4771
+ }));
4772
+ span?.addEvent("keepalive");
4773
+ }, keepAliveInterval);
4774
+ }
4775
+ const value = await runInSpanContext(span, () => iterator.next());
4776
+ clearInterval(timeout);
4777
+ if (cancelled) {
4778
+ return;
4779
+ }
4780
+ const meta = getEventMeta(value.value);
4781
+ if (!value.done || value.value !== void 0 || meta !== void 0) {
4782
+ const event = value.done ? "done" : "message";
4783
+ controller.enqueue(encodeEventMessage({
4784
+ ...meta,
4785
+ event,
4786
+ data: stringifyJSON(value.value)
4787
+ }));
4788
+ span?.addEvent(event);
4789
+ }
4790
+ if (value.done) {
4791
+ controller.close();
4792
+ span?.end();
4793
+ }
4794
+ } catch (err) {
4795
+ clearInterval(timeout);
4796
+ if (cancelled) {
4797
+ return;
4798
+ }
4799
+ if (err instanceof ErrorEvent) {
4800
+ controller.enqueue(encodeEventMessage({
4801
+ ...getEventMeta(err),
4802
+ event: "error",
4803
+ data: stringifyJSON(err.data)
4804
+ }));
4805
+ span?.addEvent("error");
4806
+ controller.close();
4807
+ } else {
4808
+ setSpanError(span, err);
4809
+ controller.error(err);
4810
+ }
4811
+ span?.end();
4812
+ }
4813
+ },
4814
+ async cancel() {
4815
+ try {
4816
+ cancelled = true;
4817
+ clearInterval(timeout);
4818
+ span?.addEvent("cancelled");
4819
+ await runInSpanContext(span, () => iterator.return?.());
4820
+ } catch (e) {
4821
+ setSpanError(span, e);
4822
+ throw e;
4823
+ } finally {
4824
+ span?.end();
4825
+ }
4826
+ }
4827
+ }).pipeThrough(new TextEncoderStream());
4828
+ return stream;
4679
4829
  }
4680
4830
 
4681
- function mergeRoute(a, b) {
4682
- return { ...a, ...b };
4831
+ function toStandardBody(re, options = {}) {
4832
+ return runWithSpan(
4833
+ { name: "parse_standard_body", signal: options.signal },
4834
+ async () => {
4835
+ const contentDisposition = re.headers.get("content-disposition");
4836
+ if (typeof contentDisposition === "string") {
4837
+ const fileName = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
4838
+ const blob2 = await re.blob();
4839
+ return new File([blob2], fileName, {
4840
+ type: blob2.type
4841
+ });
4842
+ }
4843
+ const contentType = re.headers.get("content-type");
4844
+ if (!contentType || contentType.startsWith("application/json")) {
4845
+ const text = await re.text();
4846
+ return parseEmptyableJSON(text);
4847
+ }
4848
+ if (contentType.startsWith("multipart/form-data")) {
4849
+ return await re.formData();
4850
+ }
4851
+ if (contentType.startsWith("application/x-www-form-urlencoded")) {
4852
+ const text = await re.text();
4853
+ return new URLSearchParams(text);
4854
+ }
4855
+ if (contentType.startsWith("text/event-stream")) {
4856
+ return toEventIterator(re.body, options);
4857
+ }
4858
+ if (contentType.startsWith("text/plain")) {
4859
+ return await re.text();
4860
+ }
4861
+ const blob = await re.blob();
4862
+ return new File([blob], "blob", {
4863
+ type: blob.type
4864
+ });
4865
+ }
4866
+ );
4683
4867
  }
4684
- function prefixRoute(route, prefix) {
4685
- if (!route.path) {
4686
- return route;
4868
+ function toFetchBody(body, headers, options = {}) {
4869
+ const currentContentDisposition = headers.get("content-disposition");
4870
+ headers.delete("content-type");
4871
+ headers.delete("content-disposition");
4872
+ if (body === void 0) {
4873
+ return void 0;
4687
4874
  }
4688
- return {
4689
- ...route,
4690
- path: `${prefix}${route.path}`
4691
- };
4692
- }
4693
- function unshiftTagRoute(route, tags) {
4694
- return {
4695
- ...route,
4696
- tags: [...tags, ...route.tags ?? []]
4697
- };
4698
- }
4699
- function mergePrefix(a, b) {
4700
- return a ? `${a}${b}` : b;
4701
- }
4702
- function mergeTags(a, b) {
4703
- return a ? [...a, ...b] : b;
4704
- }
4705
- function enhanceRoute(route, options) {
4706
- let router = route;
4707
- if (options.prefix) {
4708
- router = prefixRoute(router, options.prefix);
4875
+ if (body instanceof Blob) {
4876
+ headers.set("content-type", body.type);
4877
+ headers.set("content-length", body.size.toString());
4878
+ headers.set(
4879
+ "content-disposition",
4880
+ currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : "blob")
4881
+ );
4882
+ return body;
4709
4883
  }
4710
- if (options.tags?.length) {
4711
- router = unshiftTagRoute(router, options.tags);
4884
+ if (body instanceof FormData) {
4885
+ return body;
4712
4886
  }
4713
- return router;
4714
- }
4715
- function enhanceContractRouter(router, options) {
4716
- if (isContractProcedure(router)) {
4717
- const enhanced2 = new ContractProcedure({
4718
- ...router["~orpc"],
4719
- errorMap: mergeErrorMap(options.errorMap, router["~orpc"].errorMap),
4720
- route: enhanceRoute(router["~orpc"].route, options)
4721
- });
4722
- return enhanced2;
4887
+ if (body instanceof URLSearchParams) {
4888
+ return body;
4723
4889
  }
4724
- const enhanced = {};
4725
- for (const key in router) {
4726
- enhanced[key] = enhanceContractRouter(router[key], options);
4890
+ if (isAsyncIteratorObject(body)) {
4891
+ headers.set("content-type", "text/event-stream");
4892
+ return toEventStream(body, options);
4727
4893
  }
4728
- return enhanced;
4894
+ headers.set("content-type", "application/json");
4895
+ return stringifyJSON(body);
4729
4896
  }
4730
4897
 
4731
- class ContractBuilder extends ContractProcedure {
4898
+ function toStandardHeaders$1(headers, standardHeaders = {}) {
4899
+ headers.forEach((value, key) => {
4900
+ if (Array.isArray(standardHeaders[key])) {
4901
+ standardHeaders[key].push(value);
4902
+ } else if (standardHeaders[key] !== void 0) {
4903
+ standardHeaders[key] = [standardHeaders[key], value];
4904
+ } else {
4905
+ standardHeaders[key] = value;
4906
+ }
4907
+ });
4908
+ return standardHeaders;
4909
+ }
4910
+ function toFetchHeaders(headers, fetchHeaders = new Headers()) {
4911
+ for (const [key, value] of Object.entries(headers)) {
4912
+ if (Array.isArray(value)) {
4913
+ for (const v of value) {
4914
+ fetchHeaders.append(key, v);
4915
+ }
4916
+ } else if (value !== void 0) {
4917
+ fetchHeaders.append(key, value);
4918
+ }
4919
+ }
4920
+ return fetchHeaders;
4921
+ }
4922
+ function toFetchRequest(request, options = {}) {
4923
+ const headers = toFetchHeaders(request.headers);
4924
+ const body = toFetchBody(request.body, headers, options);
4925
+ return new Request(request.url, {
4926
+ signal: request.signal,
4927
+ method: request.method,
4928
+ headers,
4929
+ body
4930
+ });
4931
+ }
4932
+ function toStandardLazyResponse(response, options = {}) {
4933
+ return {
4934
+ body: once(() => toStandardBody(response, options)),
4935
+ status: response.status,
4936
+ get headers() {
4937
+ const headers = toStandardHeaders$1(response.headers);
4938
+ Object.defineProperty(this, "headers", { value: headers, writable: true });
4939
+ return headers;
4940
+ },
4941
+ set headers(value) {
4942
+ Object.defineProperty(this, "headers", { value, writable: true });
4943
+ }
4944
+ };
4945
+ }
4946
+
4947
+ class CompositeStandardLinkPlugin {
4948
+ plugins;
4949
+ constructor(plugins = []) {
4950
+ this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
4951
+ }
4952
+ init(options) {
4953
+ for (const plugin of this.plugins) {
4954
+ plugin.init?.(options);
4955
+ }
4956
+ }
4957
+ }
4958
+
4959
+ class StandardLink {
4960
+ constructor(codec, sender, options = {}) {
4961
+ this.codec = codec;
4962
+ this.sender = sender;
4963
+ const plugin = new CompositeStandardLinkPlugin(options.plugins);
4964
+ plugin.init(options);
4965
+ this.interceptors = toArray(options.interceptors);
4966
+ this.clientInterceptors = toArray(options.clientInterceptors);
4967
+ }
4968
+ interceptors;
4969
+ clientInterceptors;
4970
+ call(path, input, options) {
4971
+ return runWithSpan(
4972
+ { name: `${ORPC_NAME}.${path.join("/")}`, signal: options.signal },
4973
+ (span) => {
4974
+ span?.setAttribute("rpc.system", ORPC_NAME);
4975
+ span?.setAttribute("rpc.method", path.join("."));
4976
+ if (isAsyncIteratorObject(input)) {
4977
+ input = asyncIteratorWithSpan(
4978
+ { name: "consume_event_iterator_input", signal: options.signal },
4979
+ input
4980
+ );
4981
+ }
4982
+ return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {
4983
+ const otelConfig = getGlobalOtelConfig();
4984
+ let otelContext;
4985
+ const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;
4986
+ if (currentSpan && otelConfig) {
4987
+ otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);
4988
+ }
4989
+ const request = await runWithSpan(
4990
+ { name: "encode_request", context: otelContext },
4991
+ () => this.codec.encode(path2, input2, options2)
4992
+ );
4993
+ const response = await intercept(
4994
+ this.clientInterceptors,
4995
+ { ...options2, input: input2, path: path2, request },
4996
+ ({ input: input3, path: path3, request: request2, ...options3 }) => {
4997
+ return runWithSpan(
4998
+ { name: "send_request", signal: options3.signal, context: otelContext },
4999
+ () => this.sender.call(request2, options3, path3, input3)
5000
+ );
5001
+ }
5002
+ );
5003
+ const output = await runWithSpan(
5004
+ { name: "decode_response", context: otelContext },
5005
+ () => this.codec.decode(response, options2, path2, input2)
5006
+ );
5007
+ if (isAsyncIteratorObject(output)) {
5008
+ return asyncIteratorWithSpan(
5009
+ { name: "consume_event_iterator_output", signal: options2.signal },
5010
+ output
5011
+ );
5012
+ }
5013
+ return output;
5014
+ });
5015
+ }
5016
+ );
5017
+ }
5018
+ }
5019
+
5020
+ function toHttpPath(path) {
5021
+ return `/${path.map(encodeURIComponent).join("/")}`;
5022
+ }
5023
+ function toStandardHeaders(headers) {
5024
+ if (typeof headers.forEach === "function") {
5025
+ return toStandardHeaders$1(headers);
5026
+ }
5027
+ return headers;
5028
+ }
5029
+ function getMalformedResponseErrorCode(status) {
5030
+ return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? "MALFORMED_ORPC_ERROR_RESPONSE";
5031
+ }
5032
+
5033
+ function mergeMeta(meta1, meta2) {
5034
+ return { ...meta1, ...meta2 };
5035
+ }
5036
+
5037
+ function mergeRoute(a, b) {
5038
+ return { ...a, ...b };
5039
+ }
5040
+ function prefixRoute(route, prefix) {
5041
+ if (!route.path) {
5042
+ return route;
5043
+ }
5044
+ return {
5045
+ ...route,
5046
+ path: `${prefix}${route.path}`
5047
+ };
5048
+ }
5049
+ function unshiftTagRoute(route, tags) {
5050
+ return {
5051
+ ...route,
5052
+ tags: [...tags, ...route.tags ?? []]
5053
+ };
5054
+ }
5055
+ function mergePrefix(a, b) {
5056
+ return a ? `${a}${b}` : b;
5057
+ }
5058
+ function mergeTags(a, b) {
5059
+ return a ? [...a, ...b] : b;
5060
+ }
5061
+ function enhanceRoute(route, options) {
5062
+ let router = route;
5063
+ if (options.prefix) {
5064
+ router = prefixRoute(router, options.prefix);
5065
+ }
5066
+ if (options.tags?.length) {
5067
+ router = unshiftTagRoute(router, options.tags);
5068
+ }
5069
+ return router;
5070
+ }
5071
+ function enhanceContractRouter(router, options) {
5072
+ if (isContractProcedure(router)) {
5073
+ const enhanced2 = new ContractProcedure({
5074
+ ...router["~orpc"],
5075
+ errorMap: mergeErrorMap(options.errorMap, router["~orpc"].errorMap),
5076
+ route: enhanceRoute(router["~orpc"].route, options)
5077
+ });
5078
+ return enhanced2;
5079
+ }
5080
+ const enhanced = {};
5081
+ for (const key in router) {
5082
+ enhanced[key] = enhanceContractRouter(router[key], options);
5083
+ }
5084
+ return enhanced;
5085
+ }
5086
+
5087
+ class ContractBuilder extends ContractProcedure {
4732
5088
  constructor(def) {
4733
5089
  super(def);
4734
5090
  this["~orpc"].prefix = def.prefix;
@@ -4758,6 +5114,17 @@ class ContractBuilder extends ContractProcedure {
4758
5114
  route: initialRoute
4759
5115
  });
4760
5116
  }
5117
+ /**
5118
+ * Sets or overrides the initial input schema.
5119
+ *
5120
+ * @see {@link https://orpc.dev/docs/procedure#initial-configuration Initial Procedure Configuration Docs}
5121
+ */
5122
+ $input(initialInputSchema) {
5123
+ return new ContractBuilder({
5124
+ ...this["~orpc"],
5125
+ inputSchema: initialInputSchema
5126
+ });
5127
+ }
4761
5128
  /**
4762
5129
  * Adds type-safe custom errors to the contract.
4763
5130
  * The provided errors are spared-merged with any existing errors in the contract.
@@ -5601,6 +5968,7 @@ let Examples;
5601
5968
  reserved: 100,
5602
5969
  order: 0,
5603
5970
  location: Location,
5971
+ passcode: void 0,
5604
5972
  tenantId: Tenant.id,
5605
5973
  deleted: false,
5606
5974
  orderPadded: "0000000000"
@@ -5615,6 +5983,8 @@ let Examples;
5615
5983
  eventId: Event.id,
5616
5984
  eventSlug: Event.slug,
5617
5985
  name: "Final Release",
5986
+ subtitle: "Entry before 10pm",
5987
+ description: "Early bird pricing with priority entry. Must present valid ID at gate.",
5618
5988
  capacity: 1e5,
5619
5989
  limit: -1,
5620
5990
  available: 7e4,
@@ -5630,6 +6000,8 @@ let Examples;
5630
6000
  booking: 200,
5631
6001
  currency: "AUD"
5632
6002
  },
6003
+ visibility: "ALWAYS",
6004
+ passcode: void 0,
5633
6005
  tenantId: Tenant.id,
5634
6006
  deleted: false,
5635
6007
  orderPadded: "0000000000"
@@ -5648,7 +6020,7 @@ let Examples;
5648
6020
  gatewayId: "7489cb17-24c5-4acf-a0cf-d93ed38081fe",
5649
6021
  gateway: "AIRWALLEX",
5650
6022
  teamId: Team.id,
5651
- promoterIds: [Promoter.id],
6023
+ teamIds: [Team.id],
5652
6024
  venueIds: [],
5653
6025
  tenantId: Tenant.id
5654
6026
  };
@@ -5886,6 +6258,7 @@ let Examples;
5886
6258
  source: "CARD"
5887
6259
  },
5888
6260
  payoutIds: [Payout.id],
6261
+ refunds: [],
5889
6262
  tenantId: Examples.Tenant.id,
5890
6263
  checkoutUrl: `${Tenant.baseUrl.dev}/checkout/ord_01jps5cgsfgve5b5g2666kyryh`
5891
6264
  };
@@ -5902,6 +6275,29 @@ let Examples;
5902
6275
  deviceId: "dev_01jq4rjvrgar43zwvyakbje22m",
5903
6276
  kind: "CHECK_IN"
5904
6277
  };
6278
+ _Examples.OrderRefund = {
6279
+ id: "rfd_01jps5cgsfgve5b5g2666kyryh",
6280
+ idempotencyKey: "refund_12345_customer_request",
6281
+ status: "SUCCEEDED",
6282
+ processedAt: (/* @__PURE__ */ new Date()).toISOString(),
6283
+ amount: 1200,
6284
+ shippingRefunded: 0,
6285
+ reason: "CUSTOMER_REQUEST",
6286
+ note: "Customer requested refund due to schedule conflict",
6287
+ ticketsCancelled: true,
6288
+ ticketsCancelledCount: 2,
6289
+ gateway: "STRIPE",
6290
+ gatewayRefundId: "re_1234567890abcdef",
6291
+ initiatedBy: "USER",
6292
+ userId: User.id,
6293
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
6294
+ };
6295
+ _Examples.OrderRefundItem = {
6296
+ orderItemId: OrderItem.id,
6297
+ quantity: 2,
6298
+ amount: 1200,
6299
+ ticketIds: ["tkt_01jps5cgsg0s32w2pr73vbccde"]
6300
+ };
5905
6301
  _Examples.Ticket = {
5906
6302
  id: "tkt_01jps5cgsg0s32w2pr73vbccde",
5907
6303
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -5999,6 +6395,153 @@ const CurrencySchema = _enum([
5999
6395
  description: "Three-letter ISO 4217 currency code for transactions and payouts"
6000
6396
  });
6001
6397
 
6398
+ //#endregion
6399
+ //#region ../contract/src/common/event-category.schema.ts
6400
+ /**
6401
+ * Event categories describing characteristics beyond music genre
6402
+ * Groups: Event Type, Venue Type, Entry, Music, Vibe, Amenities, Other
6403
+ */
6404
+ const EventCategoryEnum = _enum([
6405
+ "Day Party",
6406
+ "Festival",
6407
+ "Afterparty",
6408
+ "Boat Party",
6409
+ "Pool Party",
6410
+ "Live Performance",
6411
+ "Warehouse",
6412
+ "Open Air",
6413
+ "Rooftop",
6414
+ "Beach Party",
6415
+ "Secret Location",
6416
+ "Doof",
6417
+ "Basement",
6418
+ "Free Entry",
6419
+ "Donation",
6420
+ "Vinyl Only",
6421
+ "Silent Disco",
6422
+ "Underground",
6423
+ "Intimate",
6424
+ "Queer Friendly",
6425
+ "Safe Space",
6426
+ "No Photos",
6427
+ "Rave",
6428
+ "BYO",
6429
+ "Cash Only",
6430
+ "Card Only",
6431
+ "Food Available",
6432
+ "Dress Code"
6433
+ ]);
6434
+ const EventCategoriesSchema = array(EventCategoryEnum).max(10).optional().meta({
6435
+ description: "Event characteristics like vibe, venue type, and amenities (up to 10 categories)",
6436
+ examples: [[
6437
+ "Day Party",
6438
+ "Open Air",
6439
+ "Free Entry"
6440
+ ]]
6441
+ });
6442
+
6443
+ //#endregion
6444
+ //#region ../contract/src/common/event-genre.schema.ts
6445
+ /**
6446
+ * Music genres organized by category
6447
+ * Categories: House, Techno, Bass, Trance, Disco, Hard Dance, Global, Downtempo, Electronic, Non-Electronic
6448
+ */
6449
+ const EventGenreEnum = _enum([
6450
+ "House",
6451
+ "Deep House",
6452
+ "Tech House",
6453
+ "Progressive House",
6454
+ "Minimal House",
6455
+ "Afro House",
6456
+ "Afro Tech",
6457
+ "Acid House",
6458
+ "Funky House",
6459
+ "Jackin House",
6460
+ "Soulful House",
6461
+ "Tribal House",
6462
+ "Organic House",
6463
+ "Melodic House",
6464
+ "Latin House",
6465
+ "Techno",
6466
+ "Melodic Techno",
6467
+ "Hard Techno",
6468
+ "Industrial Techno",
6469
+ "Minimal Techno",
6470
+ "Detroit Techno",
6471
+ "Dub Techno",
6472
+ "Acid Techno",
6473
+ "Hypnotic Techno",
6474
+ "Bass",
6475
+ "Drum & Bass",
6476
+ "Jungle",
6477
+ "Dubstep",
6478
+ "Bass House",
6479
+ "Breakbeat",
6480
+ "UK Garage",
6481
+ "Bassline",
6482
+ "Grime",
6483
+ "Liquid DnB",
6484
+ "Neurofunk",
6485
+ "Footwork",
6486
+ "Jersey Club",
6487
+ "Trance",
6488
+ "Psytrance",
6489
+ "Progressive Trance",
6490
+ "Uplifting Trance",
6491
+ "Vocal Trance",
6492
+ "Goa Trance",
6493
+ "Disco",
6494
+ "Nu Disco",
6495
+ "Italo Disco",
6496
+ "Funk",
6497
+ "Soul",
6498
+ "Balearic",
6499
+ "Boogie",
6500
+ "Hard Dance",
6501
+ "Hardcore",
6502
+ "Hardstyle",
6503
+ "Gabber",
6504
+ "Happy Hardcore",
6505
+ "Global",
6506
+ "Amapiano",
6507
+ "Gqom",
6508
+ "Afrobeats",
6509
+ "Kuduro",
6510
+ "Singeli",
6511
+ "Baile Funk",
6512
+ "Reggaeton",
6513
+ "Dancehall",
6514
+ "Dembow",
6515
+ "Ambient",
6516
+ "Downtempo",
6517
+ "Electronica",
6518
+ "Trip Hop",
6519
+ "Lo-Fi",
6520
+ "Electronic",
6521
+ "Electro",
6522
+ "Synth Pop",
6523
+ "Industrial",
6524
+ "EBM",
6525
+ "Indie Dance",
6526
+ "Experimental",
6527
+ "Non-Electronic",
6528
+ "Hip-Hop",
6529
+ "R&B",
6530
+ "Jazz",
6531
+ "Pop",
6532
+ "Rock",
6533
+ "Reggae",
6534
+ "Live"
6535
+ ]);
6536
+ const EventGenresSchema = array(EventGenreEnum).min(1).max(5).meta({
6537
+ description: "Music genres for the event (1-5 genres)",
6538
+ examples: [["Tech House", "Melodic Techno"]]
6539
+ });
6540
+ array(EventGenreEnum).max(5).optional().meta({
6541
+ description: "Music genres for the event (up to 5 genres)",
6542
+ examples: [["Tech House", "Melodic Techno"]]
6543
+ });
6544
+
6002
6545
  //#endregion
6003
6546
  //#region ../contract/src/common/id.schema.ts
6004
6547
  /**
@@ -6126,6 +6669,14 @@ const AdmissionSchema = object({
6126
6669
  description: "The display name of the admission type shown to customers",
6127
6670
  examples: [Examples.Admission.name]
6128
6671
  }),
6672
+ subtitle: string$1().max(100).optional().meta({
6673
+ description: "Short supporting text shown below the admission name",
6674
+ examples: [Examples.Admission.subtitle]
6675
+ }),
6676
+ description: string$1().max(500).optional().meta({
6677
+ description: "Detailed information shown when customers expand 'More info'",
6678
+ examples: [Examples.Admission.description]
6679
+ }),
6129
6680
  capacity: number$1().min(-1).prefault(-1).meta({
6130
6681
  examples: [Examples.Admission.capacity],
6131
6682
  description: "Maximum number of tickets that can be sold for this admission type. A value of -1 indicates unlimited"
@@ -6191,6 +6742,18 @@ const AdmissionSchema = object({
6191
6742
  examples: [Examples.Admission.price],
6192
6743
  description: "Pricing details for this admission type, including base cost and fees in cents, and currency"
6193
6744
  }),
6745
+ visibility: _enum([
6746
+ "ALWAYS",
6747
+ "STACKED",
6748
+ "HIDDEN"
6749
+ ]).prefault("ALWAYS").meta({
6750
+ examples: ["ALWAYS"],
6751
+ description: "Controls how this admission type is displayed: 'ALWAYS' shows it at all times, 'STACKED' reveals it when higher-priority tiers sell out, 'HIDDEN' requires a passcode to view"
6752
+ }),
6753
+ passcode: string$1().optional().meta({
6754
+ examples: ["VIPACCESS"],
6755
+ description: "Code required to reveal this admission type when visibility is 'HIDDEN'. Case-insensitive comparison"
6756
+ }),
6194
6757
  sectionId: SectionIdSchema.nullable().optional().meta({
6195
6758
  examples: [Examples.Admission.sectionId],
6196
6759
  description: "Identifier of the section this admission type belongs to, if any"
@@ -6415,8 +6978,8 @@ const EventPerformanceSummaryResponseSchema = object({
6415
6978
  */
6416
6979
  const EventPerformanceTicketsGetSchema = object({
6417
6980
  eventId: string$1().describe("Event identifier"),
6418
- startDate: string$1().describe("Start date"),
6419
- endDate: string$1().describe("End date"),
6981
+ startDate: string$1().describe("Start date (YYYY-MM-DD)"),
6982
+ endDate: string$1().describe("End date (YYYY-MM-DD)"),
6420
6983
  granularity: _enum([
6421
6984
  "HOUR",
6422
6985
  "DAY",
@@ -6907,8 +7470,8 @@ const IndividualPromoterPerformanceSummaryResponseSchema = object({
6907
7470
  */
6908
7471
  const IndividualPromoterPerformanceRevenueGetSchema = object({
6909
7472
  promoterId: string$1().describe("Promoter identifier"),
6910
- startDate: string$1().describe("Start date"),
6911
- endDate: string$1().describe("End date"),
7473
+ startDate: string$1().describe("Start date (YYYY-MM-DD)"),
7474
+ endDate: string$1().describe("End date (YYYY-MM-DD)"),
6912
7475
  granularity: _enum([
6913
7476
  "HOUR",
6914
7477
  "DAY",
@@ -6952,8 +7515,8 @@ const IndividualPromoterPerformanceRevenueResponseSchema = object({
6952
7515
  */
6953
7516
  const IndividualPromoterPerformanceEventsGetSchema = object({
6954
7517
  promoterId: string$1().describe("Promoter identifier"),
6955
- startDate: string$1().describe("Start date (ISO format)"),
6956
- endDate: string$1().describe("End date (ISO format)"),
7518
+ startDate: string$1().describe("Start date (YYYY-MM-DD)"),
7519
+ endDate: string$1().describe("End date (YYYY-MM-DD)"),
6957
7520
  limit: number$1().optional().default(5).describe("Maximum number of events to return")
6958
7521
  });
6959
7522
  /**
@@ -7291,6 +7854,8 @@ const TeamPerformanceTrackingResponseSchema = object({
7291
7854
  * https://segment.com/docs/connections/spec/ecommerce/v2/
7292
7855
  */
7293
7856
  const TrackingEventTypeEnum = _enum([
7857
+ "Page Viewed",
7858
+ "Screen Viewed",
7294
7859
  "Products Searched",
7295
7860
  "Product List Viewed",
7296
7861
  "Product List Filtered",
@@ -7320,6 +7885,7 @@ const TrackingEventTypeEnum = _enum([
7320
7885
  "Cart Shared",
7321
7886
  "Product Reviewed"
7322
7887
  ]);
7888
+ const TrackingEventType = TrackingEventTypeEnum.enum;
7323
7889
 
7324
7890
  //#endregion
7325
7891
  //#region ../contract/src/analytics/tracking-event.schema.ts
@@ -7479,7 +8045,7 @@ const TrackingEventPropertiesSchema = object({
7479
8045
  const TrackingEventContextSchema = object({
7480
8046
  session_id: string$1(),
7481
8047
  user_id: string$1().optional(),
7482
- anonymous_id: string$1(),
8048
+ anonymous_id: string$1().optional(),
7483
8049
  utm_source: string$1().optional(),
7484
8050
  utm_medium: string$1().optional(),
7485
8051
  utm_campaign: string$1().optional(),
@@ -7508,9 +8074,9 @@ const TrackingEventContextSchema = object({
7508
8074
  });
7509
8075
  const TrackingEventSchema = object({
7510
8076
  id: string$1(),
7511
- eventId: string$1().describe("Event being tracked (evt_123)"),
7512
- teamId: string$1().describe("Team ID (team_123)"),
7513
- promoterId: string$1().describe("Promoter ID (pmt_123)"),
8077
+ eventId: string$1().min(1).describe("Event being tracked (evt_123)"),
8078
+ teamId: string$1().min(1).describe("Team ID (team_123)"),
8079
+ promoterId: string$1().min(1).describe("Promoter ID (pmt_123)"),
7514
8080
  eventType: TrackingEventTypeEnum,
7515
8081
  timestamp: string$1(),
7516
8082
  date: string$1().describe("YYYY-MM-DD"),
@@ -7575,9 +8141,9 @@ const BeneficiarySchema = object({
7575
8141
  description: "The identifier assigned by the payment gateway to this account."
7576
8142
  }),
7577
8143
  teamId: string$1().meta({ description: "Team that owns this beneficiary account." }),
7578
- promoterIds: array(string$1()).meta({
8144
+ teamIds: array(string$1()).meta({
7579
8145
  examples: [[]],
7580
- description: "List of promoter IDs this beneficiary is assigned to. Empty array means team-level only (available to all promoters)."
8146
+ description: "List of team IDs this beneficiary is assigned to. Empty array means available to all teams."
7581
8147
  }),
7582
8148
  venueIds: array(string$1()).meta({
7583
8149
  examples: [[]],
@@ -7642,9 +8208,9 @@ const BeneficiaryCreateSchema = BeneficiarySchema.omit({
7642
8208
  examples: [Examples.AirwallexBeneficiary],
7643
8209
  description: "Airwallex-specific beneficiary details including bank account information and address (required when gateway is AIRWALLEX)"
7644
8210
  }),
7645
- promoterIds: array(string$1()).optional().default([]).meta({
8211
+ teamIds: array(string$1()).optional().default([]).meta({
7646
8212
  examples: [[]],
7647
- description: "List of promoter IDs to assign this beneficiary to. Empty array or omitted means team-level only."
8213
+ description: "List of team IDs to assign this beneficiary to. Empty array or omitted means available to all teams."
7648
8214
  }),
7649
8215
  venueIds: array(string$1()).optional().default([]).meta({
7650
8216
  examples: [[]],
@@ -8070,6 +8636,10 @@ const SectionSchema = object({
8070
8636
  description: "Display order of the section. Lower numbers appear first in listings"
8071
8637
  }),
8072
8638
  location: LocationSchema.meta({ description: "Physical location details for the section" }),
8639
+ passcode: string$1().optional().meta({
8640
+ examples: ["VIPACCESS"],
8641
+ description: "Code required to reveal all admissions within this section. Case-insensitive comparison"
8642
+ }),
8073
8643
  teamId: string$1().meta({ description: "Team that owns this section. Denormalized for efficient queries." }),
8074
8644
  promoterId: string$1().meta({
8075
8645
  examples: [Examples.Section.promoterId],
@@ -8104,7 +8674,7 @@ const EventVisibilityEnum = _enum([
8104
8674
  "PUBLIC",
8105
8675
  "PRIVATE",
8106
8676
  "SCHEDULED",
8107
- "PASSWORD",
8677
+ "PASSCODE",
8108
8678
  "CANCELLED"
8109
8679
  ]);
8110
8680
  const EventSchema = object({
@@ -8178,14 +8748,38 @@ const EventSchema = object({
8178
8748
  examples: [Examples.Promoter.id],
8179
8749
  description: "Promoter organizing the event. Must belong to the team."
8180
8750
  }),
8181
- metadata: MetadataSchema
8751
+ metadata: MetadataSchema,
8752
+ genres: array(string$1()).optional().meta({
8753
+ description: "Music genres for the event (1-5 genres)",
8754
+ examples: [["Tech House", "Melodic Techno"]]
8755
+ }),
8756
+ categories: array(string$1()).optional().meta({
8757
+ description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
8758
+ examples: [[
8759
+ "Day Party",
8760
+ "Open Air",
8761
+ "Free Entry"
8762
+ ]]
8763
+ }),
8764
+ featured: boolean$1().optional().meta({
8765
+ description: "Whether this event is an editorial pick",
8766
+ examples: [true]
8767
+ }),
8768
+ likes: number$1().int().min(0).optional().meta({
8769
+ description: "Number of users who liked this event",
8770
+ examples: [42]
8771
+ })
8182
8772
  }).meta({ description: "event" });
8183
8773
 
8184
8774
  //#endregion
8185
8775
  //#region ../contract/src/event/detailed-event.schema.ts
8186
8776
  const DetailedEventSchema = EventSchema.extend({
8187
8777
  sections: array(SectionSchema),
8188
- admissions: array(AdmissionSchema)
8778
+ admissions: array(AdmissionSchema),
8779
+ liked: boolean$1().optional().meta({
8780
+ description: "Whether the current user has liked this event",
8781
+ examples: [true, false]
8782
+ })
8189
8783
  });
8190
8784
 
8191
8785
  //#endregion
@@ -8202,13 +8796,15 @@ const EventCreateSchema = EventSchema.omit({
8202
8796
  status: true,
8203
8797
  approval: true,
8204
8798
  geohash: true,
8205
- location: true
8799
+ location: true,
8800
+ featured: true,
8801
+ likes: true
8206
8802
  }).extend({
8207
8803
  slug: string$1().min(3).max(100).optional().meta({
8208
8804
  examples: [Examples.Event.slug],
8209
8805
  description: "URL-friendly slug for the event. If not provided, will be automatically generated from the name. Must be unique and between 3 and 100 characters"
8210
8806
  }),
8211
- password: string$1().optional().meta({ description: "Password for protected access to the event" }),
8807
+ passcode: string$1().optional().meta({ description: "Passcode for protected access to the event" }),
8212
8808
  locationId: LocationIdSchema.optional().meta({
8213
8809
  examples: ["loc_01jqpjksnsen9vprw95et60t2m"],
8214
8810
  description: "ID of an existing location. Either locationId or googlePlaceId must be provided."
@@ -8216,6 +8812,18 @@ const EventCreateSchema = EventSchema.omit({
8216
8812
  googlePlaceId: string$1().optional().meta({
8217
8813
  examples: ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
8218
8814
  description: "Google Place ID to create a new location from. Either locationId or googlePlaceId must be provided."
8815
+ }),
8816
+ genres: EventGenresSchema.optional().meta({
8817
+ description: "Music genres for the event (1-5 genres)",
8818
+ examples: [["Tech House", "Melodic Techno"]]
8819
+ }),
8820
+ categories: EventCategoriesSchema.meta({
8821
+ description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
8822
+ examples: [[
8823
+ "Day Party",
8824
+ "Open Air",
8825
+ "Free Entry"
8826
+ ]]
8219
8827
  })
8220
8828
  }).refine((data) => data.locationId || data.googlePlaceId, { message: "Either locationId or googlePlaceId must be provided" });
8221
8829
 
@@ -8226,6 +8834,19 @@ const EventDeleteSchema = object({ key: string$1().min(1).meta({
8226
8834
  examples: [Examples.Event.id, Examples.Event.slug]
8227
8835
  }) });
8228
8836
 
8837
+ //#endregion
8838
+ //#region ../contract/src/event/event-feature.schema.ts
8839
+ const EventFeatureSchema = object({
8840
+ key: string$1().min(1).meta({
8841
+ description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug",
8842
+ examples: [Examples.Event.id, Examples.Event.slug]
8843
+ }),
8844
+ featured: boolean$1().meta({
8845
+ description: "Whether the event should be featured (editorial pick)",
8846
+ examples: [true, false]
8847
+ })
8848
+ });
8849
+
8229
8850
  //#endregion
8230
8851
  //#region ../contract/src/event/event-get.schema.ts
8231
8852
  const EventGetSchema = object({
@@ -8233,7 +8854,7 @@ const EventGetSchema = object({
8233
8854
  description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug",
8234
8855
  examples: [Examples.Event.id, Examples.Event.slug]
8235
8856
  }),
8236
- password: string$1().optional().meta({ description: "Password for accessing password-protected events" })
8857
+ passcode: string$1().optional().meta({ description: "Passcode for accessing protected events" })
8237
8858
  });
8238
8859
 
8239
8860
  //#endregion
@@ -8247,6 +8868,11 @@ const EventInventorySchema = object({
8247
8868
 
8248
8869
  //#endregion
8249
8870
  //#region ../contract/src/event/event-list.schema.ts
8871
+ const EventOrderEnum = _enum([
8872
+ "date",
8873
+ "popularity",
8874
+ "recent"
8875
+ ]);
8250
8876
  const EventListBaseSchema = object({
8251
8877
  status: _enum(["UPCOMING", "ENDED"]).optional().meta({
8252
8878
  examples: ["UPCOMING"],
@@ -8260,7 +8886,7 @@ const EventListBaseSchema = object({
8260
8886
  "PUBLIC",
8261
8887
  "PRIVATE",
8262
8888
  "SCHEDULED",
8263
- "PASSWORD"
8889
+ "PASSCODE"
8264
8890
  ]).optional().meta({
8265
8891
  examples: ["PUBLIC"],
8266
8892
  description: "Filter events by their visibility setting"
@@ -8295,6 +8921,18 @@ const EventListBaseSchema = object({
8295
8921
  examples: [20],
8296
8922
  description: "Search radius in kilometers from the provided coordinates. Defaults to 20km"
8297
8923
  }),
8924
+ country: string$1().optional().meta({
8925
+ examples: ["australia"],
8926
+ description: "Filter by country region slug. Matches events where location.country equals the region name"
8927
+ }),
8928
+ state: string$1().optional().meta({
8929
+ examples: ["nsw"],
8930
+ description: "Filter by state/province region slug. Matches events where location.state equals the region name"
8931
+ }),
8932
+ city: string$1().optional().meta({
8933
+ examples: ["sydney"],
8934
+ description: "Filter by city region slug. Matches events where location.city equals the region name"
8935
+ }),
8298
8936
  from: string$1().date().optional().meta({
8299
8937
  examples: ["2024-01-01"],
8300
8938
  description: "Filter events that start on or after this date (YYYY-MM-DD format). Events with entryStartsAt >= from"
@@ -8302,13 +8940,35 @@ const EventListBaseSchema = object({
8302
8940
  to: string$1().date().optional().meta({
8303
8941
  examples: ["2024-12-31"],
8304
8942
  description: "Filter events that start on or before this date (YYYY-MM-DD format). Events with entryStartsAt <= to"
8943
+ }),
8944
+ genres: array(EventGenreEnum).max(20, "Cannot filter by more than 20 genres").optional().meta({
8945
+ examples: [["Tech House", "Melodic Techno"]],
8946
+ description: "Filter events by music genre(s). Returns events matching ANY of the provided genres (OR logic). Maximum 20 genres"
8947
+ }),
8948
+ categories: array(EventCategoryEnum).max(10, "Cannot filter by more than 10 categories").optional().meta({
8949
+ examples: [["Day Party", "Open Air"]],
8950
+ description: "Filter events by category(s). Returns events matching ANY of the provided categories (OR logic). Maximum 10 categories"
8951
+ }),
8952
+ featured: boolean$1().optional().meta({
8953
+ examples: [true],
8954
+ description: "Filter to only featured (editorial pick) events"
8955
+ }),
8956
+ order: EventOrderEnum.optional().meta({
8957
+ examples: ["date"],
8958
+ description: "Sort order for results. date=by event start date (default), popularity=by interest count, recent=by creation date"
8305
8959
  })
8306
- }).meta({ description: "List events with filtering, full‑text search, geo queries, date range filtering, and cursor-based pagination" });
8960
+ }).meta({ description: "List events with filtering, full‑text search, geo queries, date range filtering, genre/category filtering, and cursor-based pagination" });
8307
8961
  const EventListSchema = EventListBaseSchema;
8308
8962
 
8309
8963
  //#endregion
8310
8964
  //#region ../contract/src/event/event-page.schema.ts
8311
- const EventWithInventorySchema = EventSchema.extend({ inventory: EventInventorySchema.optional() });
8965
+ const EventWithInventorySchema = EventSchema.extend({
8966
+ inventory: EventInventorySchema.optional(),
8967
+ liked: boolean$1().optional().meta({
8968
+ description: "Whether the current user has liked this event",
8969
+ examples: [true, false]
8970
+ })
8971
+ });
8312
8972
  const EventPageSchema = createPaginatedSchema(EventWithInventorySchema, "events");
8313
8973
 
8314
8974
  //#endregion
@@ -8323,13 +8983,15 @@ const EventUpdateSchema = EventSchema.omit({
8323
8983
  promoterId: true,
8324
8984
  geohash: true,
8325
8985
  status: true,
8326
- location: true
8986
+ location: true,
8987
+ featured: true,
8988
+ likes: true
8327
8989
  }).partial().extend({
8328
8990
  key: string$1().meta({
8329
8991
  examples: [Examples.Event.id, Examples.Event.slug],
8330
8992
  description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug"
8331
8993
  }),
8332
- password: string$1().nullable().optional().meta({ description: "Password for protected access. Pass null to clear; omit to leave unchanged." }),
8994
+ passcode: string$1().nullable().optional().meta({ description: "Passcode for protected access. Pass null to clear; omit to leave unchanged." }),
8333
8995
  url: url().nullable().optional().meta({
8334
8996
  examples: ["https://example.com/events/summer-festival-2025"],
8335
8997
  description: "External event URL. Pass null to clear; omit to leave unchanged."
@@ -8341,6 +9003,18 @@ const EventUpdateSchema = EventSchema.omit({
8341
9003
  googlePlaceId: string$1().optional().meta({
8342
9004
  examples: ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
8343
9005
  description: "Google Place ID to update location from. Either locationId or googlePlaceId can be provided."
9006
+ }),
9007
+ genres: EventGenresSchema.optional().meta({
9008
+ description: "Music genres for the event (1-5 genres)",
9009
+ examples: [["Tech House", "Melodic Techno"]]
9010
+ }),
9011
+ categories: EventCategoriesSchema.meta({
9012
+ description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
9013
+ examples: [[
9014
+ "Day Party",
9015
+ "Open Air",
9016
+ "Free Entry"
9017
+ ]]
8344
9018
  })
8345
9019
  }).meta({ description: "Schema for updating an existing event." });
8346
9020
 
@@ -8433,64 +9107,6 @@ const EventCollaboratorListSchema = object({
8433
9107
  //#region ../contract/src/event-collaborator/event-collaborator-page.schema.ts
8434
9108
  const EventCollaboratorPageSchema = createPaginatedSchema(EventCollaboratorSchema, "grants");
8435
9109
 
8436
- //#endregion
8437
- //#region ../contract/src/internal/place-query-autocomplete-prediction.schema.ts
8438
- const PlaceQueryAutocompletePredictionSchema = object({
8439
- description: string$1(),
8440
- terms: array(object({
8441
- value: string$1(),
8442
- offset: number$1()
8443
- })),
8444
- matchedSubstrings: array(object({
8445
- offset: number$1(),
8446
- length: number$1()
8447
- })),
8448
- structuredFormatting: object({
8449
- mainText: string$1(),
8450
- mainTextMatchedSubstrings: array(object({
8451
- offset: number$1(),
8452
- length: number$1()
8453
- })).optional(),
8454
- secondaryText: string$1().optional(),
8455
- secondaryTextMatchedSubstrings: array(object({
8456
- offset: number$1(),
8457
- length: number$1()
8458
- })).optional()
8459
- }).optional(),
8460
- placeId: string$1().optional(),
8461
- types: array(string$1()).optional()
8462
- });
8463
-
8464
- //#endregion
8465
- //#region ../contract/src/internal/internal.schema.ts
8466
- /**
8467
- * Internal DTOs
8468
- * Data transfer objects for internal service operations
8469
- */
8470
- /**
8471
- * Place autocomplete response schema
8472
- */
8473
- const PlaceAutocompleteResponseSchema = object({ predictions: array(PlaceQueryAutocompletePredictionSchema) });
8474
- /**
8475
- * Place details response schema
8476
- * Using z.any() as the response structure varies
8477
- */
8478
- const PlaceDetailsResponseSchema = any();
8479
-
8480
- //#endregion
8481
- //#region ../contract/src/internal/place-autocomplete.schema.ts
8482
- const PlaceAutocompleteSchema = object({
8483
- query: string$1().meta({ description: "Search text to autocomplete" }),
8484
- country: string$1().optional().meta({ description: "Optional country code for restricting results" })
8485
- });
8486
-
8487
- //#endregion
8488
- //#region ../contract/src/internal/place-details.schema.ts
8489
- const PlaceDetailsSchema = object({ placeId: string$1().meta({
8490
- examples: ["ChIJP3Sa8ziYEmsRUKgyFmh9AQM"],
8491
- description: "Unique identifier for a place from Google Places API. Used to retrieve detailed information including timezone data. This ID is obtained from the autocomplete endpoint and is required to fetch comprehensive place details."
8492
- }) });
8493
-
8494
9110
  //#endregion
8495
9111
  //#region ../contract/src/internal/upload-image.schema.ts
8496
9112
  const ALLOWED_FOLDERS = [
@@ -8529,6 +9145,10 @@ const LocationListSchema = object({
8529
9145
  longitude: number().min(-180).max(180).optional().meta({
8530
9146
  examples: [Examples.Location.longitude],
8531
9147
  description: "User's longitude for proximity-based results (optional for better relevance)"
9148
+ }),
9149
+ types: array(string$1()).optional().meta({
9150
+ examples: [["establishment"]],
9151
+ description: "Filter results by Google Place types (e.g., 'establishment', 'night_club', 'bar')"
8532
9152
  })
8533
9153
  }).meta({ description: "Parameters for searching locations" });
8534
9154
 
@@ -8601,6 +9221,10 @@ const OrderCustomerSchema = object({
8601
9221
  phone: string$1().meta({
8602
9222
  examples: [Examples.Customer.phone],
8603
9223
  description: "Phone number of the customer"
9224
+ }).optional(),
9225
+ airwallexId: string$1().meta({
9226
+ examples: ["cus_hkdmrhkh8he4j3kvela"],
9227
+ description: "Airwallex customer identifier for saved payment methods functionality"
8604
9228
  }).optional()
8605
9229
  });
8606
9230
 
@@ -10277,9 +10901,29 @@ const OrderPaymentSchema = object({
10277
10901
  examples: ["pi_1234567890abcdef"],
10278
10902
  description: "Stripe payment intent identifier when using Stripe gateway"
10279
10903
  }),
10904
+ stripeClientSecret: string$1().optional().meta({
10905
+ examples: ["pi_1234567890abcdef_secret_xyz"],
10906
+ description: "Stripe PaymentIntent client secret associated with the order, used to complete the payment flow"
10907
+ }),
10908
+ stripeAccountId: string$1().optional().meta({
10909
+ examples: ["acct_1234567890abcdef"],
10910
+ description: "Connected Stripe account ID for direct charges. When present, payment is processed directly on the connected account rather than the platform account."
10911
+ }),
10280
10912
  airwallexId: string$1().optional().meta({
10281
10913
  examples: ["int_hkdmr7v9rg1j8donpkmv96"],
10282
10914
  description: "Airwallex payment intent identifier when using Airwallex gateway"
10915
+ }),
10916
+ airwallexClientSecret: string$1().optional().meta({
10917
+ examples: ["eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDAwMzYwMCwiaW50ZW50X2lkIjoiaW50X2hrZG1yN3Y5cmcxajhkb25wa212OTYifQ.K8vLx2nPzQHdR5mT1wYcBfJkLmNpS3xG7aE9dH4qZvM"],
10918
+ description: "Airwallex client secret used to authenticate requests for payment initialization"
10919
+ }),
10920
+ airwallexCustomerId: string$1().optional().meta({
10921
+ examples: ["cus_hkdmrhkh8he4j3kvela"],
10922
+ description: "Airwallex customer ID attached to the PaymentIntent for saved cards functionality"
10923
+ }),
10924
+ airwallexCustomerClientSecret: string$1().optional().meta({
10925
+ examples: ["eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDAwMzYwMCwiY3VzdG9tZXJfaWQiOiJjdXNfaGtkbXJoa2g4aGU0ajNrdmVsYSJ9.abc123"],
10926
+ description: "Airwallex customer client secret for accessing saved payment methods in the Drop-in Element"
10283
10927
  })
10284
10928
  });
10285
10929
 
@@ -10332,6 +10976,115 @@ const OrderPriceSchema = object({
10332
10976
  })
10333
10977
  });
10334
10978
 
10979
+ //#endregion
10980
+ //#region ../contract/src/order/order-refund.schema.ts
10981
+ const OrderRefundStatusEnum = _enum([
10982
+ "PENDING",
10983
+ "PROCESSING",
10984
+ "SUCCEEDED",
10985
+ "FAILED"
10986
+ ]);
10987
+ const OrderRefundReasonEnum = _enum([
10988
+ "CUSTOMER_REQUEST",
10989
+ "DUPLICATE",
10990
+ "EVENT_CANCELLED",
10991
+ "OTHER"
10992
+ ]);
10993
+ const OrderRefundInitiatedByEnum = _enum(["USER", "GATEWAY"]);
10994
+ const OrderRefundItemSchema = object({
10995
+ orderItemId: string$1().meta({
10996
+ examples: [Examples.OrderRefundItem.orderItemId],
10997
+ description: "Identifier of the order item being refunded"
10998
+ }),
10999
+ quantity: int().min(1).meta({
11000
+ examples: [Examples.OrderRefundItem.quantity],
11001
+ description: "Number of units refunded for this item"
11002
+ }),
11003
+ amount: int().min(0).meta({
11004
+ examples: [Examples.OrderRefundItem.amount],
11005
+ description: "Refund amount for this item in cents (base price only, excludes booking fee)"
11006
+ }),
11007
+ ticketIds: array(string$1()).meta({
11008
+ examples: [Examples.OrderRefundItem.ticketIds],
11009
+ description: "Specific ticket identifiers that were refunded (selected via FIFO)"
11010
+ })
11011
+ });
11012
+ const OrderRefundSchema = object({
11013
+ id: string$1().meta({
11014
+ examples: [Examples.OrderRefund.id],
11015
+ description: "Unique identifier for this refund"
11016
+ }),
11017
+ idempotencyKey: string$1().optional().meta({
11018
+ examples: [Examples.OrderRefund.idempotencyKey],
11019
+ description: "Client-provided key to prevent duplicate refund processing"
11020
+ }),
11021
+ status: OrderRefundStatusEnum.meta({
11022
+ examples: ["PENDING", "SUCCEEDED"],
11023
+ description: "Current processing status. PENDING: awaiting gateway confirmation or async processing (e.g., bank transfers). PROCESSING: gateway confirmed, ticket cancellation in progress. SUCCEEDED/FAILED: terminal states."
11024
+ }),
11025
+ processedAt: datetime().optional().meta({
11026
+ examples: [Examples.OrderRefund.processedAt],
11027
+ description: "Timestamp when the payment gateway confirmed the refund"
11028
+ }),
11029
+ failureReason: string$1().optional().meta({
11030
+ examples: ["Insufficient funds for refund"],
11031
+ description: "Error message from payment gateway if refund failed"
11032
+ }),
11033
+ amount: int().min(1).meta({
11034
+ examples: [Examples.OrderRefund.amount],
11035
+ description: "Total refund amount in cents (excludes booking fee, includes shipping if applicable)"
11036
+ }),
11037
+ shippingRefunded: int().min(0).meta({
11038
+ examples: [Examples.OrderRefund.shippingRefunded],
11039
+ description: "Shipping portion of the refund in cents"
11040
+ }),
11041
+ reason: OrderRefundReasonEnum.meta({
11042
+ examples: [
11043
+ "CUSTOMER_REQUEST",
11044
+ "DUPLICATE",
11045
+ "EVENT_CANCELLED"
11046
+ ],
11047
+ description: "Categorized reason for the refund used for analytics"
11048
+ }),
11049
+ note: string$1().optional().meta({
11050
+ examples: [Examples.OrderRefund.note],
11051
+ description: "Free-form notes explaining the refund"
11052
+ }),
11053
+ items: array(OrderRefundItemSchema).meta({ description: "Line items included in this refund with quantities and amounts" }),
11054
+ ticketsCancelled: boolean$1().meta({
11055
+ examples: [Examples.OrderRefund.ticketsCancelled],
11056
+ description: "Whether tickets were cancelled as part of this refund"
11057
+ }),
11058
+ ticketsCancelledCount: int().optional().meta({
11059
+ examples: [Examples.OrderRefund.ticketsCancelledCount],
11060
+ description: "Number of tickets that were cancelled"
11061
+ }),
11062
+ gateway: PaymentMethodEnum.meta({
11063
+ examples: ["STRIPE", "AIRWALLEX"],
11064
+ description: "Payment gateway used to process the refund"
11065
+ }),
11066
+ gatewayRefundId: string$1().optional().meta({
11067
+ examples: [Examples.OrderRefund.gatewayRefundId],
11068
+ description: "Refund identifier from the payment gateway"
11069
+ }),
11070
+ initiatedBy: OrderRefundInitiatedByEnum.meta({
11071
+ examples: ["USER", "GATEWAY"],
11072
+ description: "Whether refund was initiated by a user or directly through the payment gateway"
11073
+ }),
11074
+ userId: string$1().optional().meta({
11075
+ examples: [Examples.OrderRefund.userId],
11076
+ description: "Identifier of the user who initiated the refund (when initiatedBy is USER)"
11077
+ }),
11078
+ metadata: record(string$1(), string$1()).optional().meta({
11079
+ examples: [{ supportTicket: "#12345" }],
11080
+ description: "Custom key-value pairs passed through to the payment gateway"
11081
+ }),
11082
+ createdAt: datetime().meta({
11083
+ examples: [Examples.OrderRefund.createdAt],
11084
+ description: "Timestamp when the refund was created"
11085
+ })
11086
+ });
11087
+
10335
11088
  //#endregion
10336
11089
  //#region ../contract/src/order/order-timeline.schema.ts
10337
11090
  const OrderTimelineKindEnum = _enum([
@@ -10413,7 +11166,6 @@ const OrderStatusEnum = _enum([
10413
11166
  "PENDING",
10414
11167
  "PROCESSING",
10415
11168
  "SUCCESSFUL",
10416
- "REFUNDED",
10417
11169
  "DISPUTED",
10418
11170
  "ABANDONED"
10419
11171
  ]);
@@ -10445,6 +11197,7 @@ const OrderSchema = object({
10445
11197
  couponCode: OrderCouponCodeSchema.optional().meta({ description: "Details of the coupon code applied to this order for discount calculation" }),
10446
11198
  customer: OrderCustomerSchema.optional().meta({ description: "Details of the customer who placed this order, if available." }),
10447
11199
  timeline: array(OrderTimelineSchema).optional().meta({ description: "Chronological audit trail entries associated with this order." }),
11200
+ refunds: array(OrderRefundSchema).default([]).meta({ description: "Refunds processed for this order. Includes pending, succeeded, and failed refunds." }),
10448
11201
  customerId: CustomerIdSchema.optional().meta({
10449
11202
  examples: [Examples.Customer.id],
10450
11203
  description: "Identifier of the customer who placed this order."
@@ -10519,7 +11272,6 @@ const OrderListSchema = object({
10519
11272
  "PENDING",
10520
11273
  "PROCESSING",
10521
11274
  "SUCCESSFUL",
10522
- "REFUNDED",
10523
11275
  "DISPUTED",
10524
11276
  "ABANDONED"
10525
11277
  ]).optional().meta({
@@ -10766,6 +11518,63 @@ const OrderQuoteCreateSchema = object({
10766
11518
  //#region ../contract/src/order/order-quote-response.schema.ts
10767
11519
  const OrderQuoteResponseSchema = object({ quote: OrderQuoteSchema });
10768
11520
 
11521
+ //#endregion
11522
+ //#region ../contract/src/order/order-refund-create.schema.ts
11523
+ const OrderRefundCreateItemSchema = object({
11524
+ orderItemId: string$1().meta({
11525
+ examples: [Examples.OrderRefundItem.orderItemId],
11526
+ description: "Identifier of the order item to refund"
11527
+ }),
11528
+ quantity: int().min(1).meta({
11529
+ examples: [Examples.OrderRefundItem.quantity],
11530
+ description: "Number of units to refund for this item"
11531
+ })
11532
+ });
11533
+ const OrderRefundCreateSchema = object({
11534
+ id: OrderIdSchema.meta({
11535
+ examples: [Examples.Order.id],
11536
+ description: "Identifier of the order to refund"
11537
+ }),
11538
+ fullRefund: boolean$1().default(false).meta({
11539
+ examples: [false],
11540
+ description: "When true, refunds all remaining refundable items. Mutually exclusive with items."
11541
+ }),
11542
+ items: array(OrderRefundCreateItemSchema).optional().meta({ description: "Specific items and quantities to refund. Required if fullRefund is false." }),
11543
+ shippingAmount: int().min(0).optional().meta({
11544
+ examples: [500],
11545
+ description: "Amount of shipping to refund in cents. Cannot exceed remaining refundable shipping."
11546
+ }),
11547
+ cancelTickets: boolean$1().default(true).meta({
11548
+ examples: [true],
11549
+ description: "Whether to cancel tickets associated with refunded items. Defaults to true."
11550
+ }),
11551
+ notify: boolean$1().default(true).meta({
11552
+ examples: [true],
11553
+ description: "Whether to send a refund confirmation email to the customer. Defaults to true."
11554
+ }),
11555
+ reason: OrderRefundReasonEnum.meta({
11556
+ examples: [
11557
+ "CUSTOMER_REQUEST",
11558
+ "DUPLICATE",
11559
+ "EVENT_CANCELLED"
11560
+ ],
11561
+ description: "Categorized reason for the refund"
11562
+ }),
11563
+ note: string$1().optional().meta({
11564
+ examples: ["Customer requested refund due to schedule conflict"],
11565
+ description: "Free-form notes explaining the refund"
11566
+ }),
11567
+ idempotencyKey: string$1().optional().meta({
11568
+ examples: ["refund_12345_customer_request"],
11569
+ description: "Client-provided key to prevent duplicate refund processing. Recommended for programmatic refunds."
11570
+ }),
11571
+ metadata: record(string$1(), string$1()).optional().meta({
11572
+ examples: [{ supportTicket: "#12345" }],
11573
+ description: "Custom key-value pairs passed through to the payment gateway"
11574
+ })
11575
+ }).refine((data) => data.fullRefund || data.items && data.items.length > 0, { message: "Either fullRefund must be true or items must be provided" });
11576
+ const OrderRefundResponseSchema = object({ refund: OrderRefundSchema });
11577
+
10769
11578
  //#endregion
10770
11579
  //#region ../contract/src/order/order-resend.schema.ts
10771
11580
  const OrderResendSchema = object({
@@ -10857,7 +11666,7 @@ const OrderUpdateNoteSchema = object({
10857
11666
 
10858
11667
  //#endregion
10859
11668
  //#region ../contract/src/payout/approval-result.schema.ts
10860
- const ApprovalResultSchema = object({
11669
+ object({
10861
11670
  success: boolean$1().meta({ description: "Whether the payout approval was successful" }),
10862
11671
  message: string$1().optional().meta({ description: "Optional message about the approval result" }),
10863
11672
  payoutId: string$1().meta({ description: "ID of the payout that was approved" })
@@ -10991,6 +11800,61 @@ const PayoutPriceSchema = object({
10991
11800
  })
10992
11801
  });
10993
11802
 
11803
+ //#endregion
11804
+ //#region ../contract/src/payout/payout-timeline.schema.ts
11805
+ const PayoutTimelineKindEnum = _enum([
11806
+ "CREATED",
11807
+ "APPROVED",
11808
+ "REJECTED",
11809
+ "PROCESSING",
11810
+ "PAID",
11811
+ "FAILED",
11812
+ "CANCELLED",
11813
+ "NOTE"
11814
+ ]);
11815
+ const PayoutTimelineSchema = object({
11816
+ id: string$1().meta({
11817
+ examples: ["tl_01jgxyz123abc"],
11818
+ description: "Unique identifier for this timeline entry"
11819
+ }),
11820
+ createdAt: datetime().readonly().meta({
11821
+ examples: [Examples.Payout.createdAt],
11822
+ description: "Timestamp in ISO 8601 format when this timeline entry was created"
11823
+ }),
11824
+ kind: PayoutTimelineKindEnum.meta({
11825
+ examples: [
11826
+ "CREATED",
11827
+ "APPROVED",
11828
+ "PAID"
11829
+ ],
11830
+ description: "Type of timeline event (CREATED, APPROVED, PROCESSING, PAID, NOTE, etc.)"
11831
+ }),
11832
+ editable: boolean$1().meta({
11833
+ examples: [false],
11834
+ description: "Whether this timeline entry can be edited by users"
11835
+ }),
11836
+ pinned: boolean$1().meta({
11837
+ examples: [false],
11838
+ description: "Whether this timeline entry is pinned to the top of the timeline"
11839
+ }),
11840
+ description: string$1().meta({
11841
+ examples: ["Payout was created after event settlement"],
11842
+ description: "Human-readable description of what happened in this timeline event"
11843
+ }),
11844
+ author: string$1().meta({
11845
+ examples: ["System"],
11846
+ description: "Name of the user or system that created this timeline entry"
11847
+ }),
11848
+ userId: string$1().optional().meta({
11849
+ examples: [Examples.User.id],
11850
+ description: "Identifier of the user who created this timeline entry, when available"
11851
+ }),
11852
+ externalId: string$1().optional().meta({
11853
+ examples: ["airwallex:transfer_abc123:completed"],
11854
+ description: "External idempotency key for deduplication (e.g., Airwallex transfer events)"
11855
+ })
11856
+ });
11857
+
10994
11858
  //#endregion
10995
11859
  //#region ../contract/src/payout/payout-transfer.schema.ts
10996
11860
  const PayoutTransferSchema = object({
@@ -11006,12 +11870,12 @@ const PayoutTransferSchema = object({
11006
11870
  "TICKETS",
11007
11871
  "TENANT",
11008
11872
  "VENUE",
11009
- "PROMOTER",
11873
+ "TEAM",
11010
11874
  "SESSIONS",
11011
11875
  "UNKNOWN"
11012
11876
  ]).meta({
11013
11877
  examples: ["TICKETS"],
11014
- description: "Type of transfer. TICKETS: revenue from ticket sales, TENANT: platform fees, VENUE: venue split, PROMOTER: promoter split, SESSIONS: platform commission, UNKNOWN: unclassified transfer."
11878
+ description: "Type of transfer. TICKETS: revenue from ticket sales, TENANT: platform fees, VENUE: venue split, TEAM: team split, SESSIONS: platform commission, UNKNOWN: unclassified transfer."
11015
11879
  }),
11016
11880
  amount: int().min(0).meta({
11017
11881
  examples: [Examples.PayoutTransfer.amount],
@@ -11057,7 +11921,7 @@ const PayoutTransferSchema = object({
11057
11921
  //#region ../contract/src/payout/payout.schema.ts
11058
11922
  const PayoutStatusEnum = _enum([
11059
11923
  "UPCOMING",
11060
- "PENDING",
11924
+ "FAILED",
11061
11925
  "PROCESSING",
11062
11926
  "PAID",
11063
11927
  "CANCELLED"
@@ -11113,6 +11977,7 @@ const PayoutSchema = object({
11113
11977
  deductions: array(PayoutDeductionSchema).meta({ description: "List of deductions applied before calculating the payout total." }),
11114
11978
  price: PayoutPriceSchema.meta({ description: "Summary of amounts for transfers and deductions in this payout." }),
11115
11979
  event: PayoutEventSchema.meta({ description: "Information about the event associated with this payout." }),
11980
+ timeline: array(PayoutTimelineSchema).optional().meta({ description: "Chronological list of status changes and notes for this payout." }),
11116
11981
  eventId: string$1().meta({
11117
11982
  examples: [Examples.Payout.eventId],
11118
11983
  description: "Identifier of the event for which this payout was generated."
@@ -11122,7 +11987,7 @@ const PayoutSchema = object({
11122
11987
 
11123
11988
  //#endregion
11124
11989
  //#region ../contract/src/payout/payout-actions.schema.ts
11125
- const PayoutApproveSchema = object({ id: string$1().meta({
11990
+ object({ id: string$1().meta({
11126
11991
  examples: [Examples.Payout.id],
11127
11992
  description: "Unique identifier of the payout to approve for processing."
11128
11993
  }) });
@@ -11145,6 +12010,19 @@ object({ id: string$1().meta({
11145
12010
  description: "Unique identifier of the payout to retry transfer processing for."
11146
12011
  }) });
11147
12012
 
12013
+ //#endregion
12014
+ //#region ../contract/src/payout/payout-add-note.schema.ts
12015
+ const PayoutAddNoteSchema = object({
12016
+ id: string$1().meta({
12017
+ examples: [Examples.Payout.id],
12018
+ description: "Unique identifier of the payout to add a note to"
12019
+ }),
12020
+ note: string$1().trim().min(1).max(1e3).meta({
12021
+ examples: ["Transfer confirmed via bank statement"],
12022
+ description: "Note text content (1-1000 characters)"
12023
+ })
12024
+ });
12025
+
11148
12026
  //#endregion
11149
12027
  //#region ../utils/src/fees.ts
11150
12028
  const FeeStructureModel = object({
@@ -11163,7 +12041,7 @@ const FeeStructureModel = object({
11163
12041
  percent: number$1().optional(),
11164
12042
  split: object({
11165
12043
  tenant: number$1(),
11166
- promoter: number$1(),
12044
+ team: number$1(),
11167
12045
  venue: number$1(),
11168
12046
  sessions: number$1()
11169
12047
  })
@@ -11180,9 +12058,9 @@ const PayoutSplitSchema = object({
11180
12058
  examples: [25e3],
11181
12059
  description: "Amount allocated to the venue in cents. This represents the venue's share of the revenue from events held at their location."
11182
12060
  }),
11183
- promoter: number$1().meta({
12061
+ team: number$1().meta({
11184
12062
  examples: [2e4],
11185
- description: "Amount allocated to the promoter in cents. This represents the promoter's share of the revenue after fees and other deductions."
12063
+ description: "Amount allocated to the team in cents. This represents the team's share of the revenue after fees and other deductions."
11186
12064
  }),
11187
12065
  sessions: number$1().meta({
11188
12066
  examples: [3e3],
@@ -11262,13 +12140,13 @@ const PayoutListSchema = object({
11262
12140
  }),
11263
12141
  status: _enum([
11264
12142
  "UPCOMING",
11265
- "PENDING",
12143
+ "FAILED",
11266
12144
  "PROCESSING",
11267
12145
  "PAID",
11268
12146
  "CANCELLED"
11269
12147
  ]).optional().meta({
11270
12148
  examples: ["PAID"],
11271
- description: "Filter payouts by payment status. UPCOMING: scheduled but not yet processed, PENDING: awaiting processing, PROCESSING: currently being processed, PAID: successfully completed, CANCELLED: cancelled before completion."
12149
+ description: "Filter payouts by payment status. UPCOMING: scheduled but not yet processed, FAILED: failed processing and will retry, PROCESSING: currently being processed, PAID: successfully completed, CANCELLED: cancelled before completion."
11272
12150
  }),
11273
12151
  approval: ApprovalStatusEnum.optional().meta({
11274
12152
  examples: ["APPROVED"],
@@ -11335,6 +12213,19 @@ PayoutSchema.pick({
11335
12213
  })
11336
12214
  });
11337
12215
 
12216
+ //#endregion
12217
+ //#region ../contract/src/payout/payout-delete-note.schema.ts
12218
+ const PayoutDeleteNoteSchema = object({
12219
+ id: string$1().meta({
12220
+ examples: [Examples.Payout.id],
12221
+ description: "Unique identifier of the payout"
12222
+ }),
12223
+ noteId: string$1().meta({
12224
+ examples: ["tl_1234567890_abc123"],
12225
+ description: "Unique identifier of the timeline note to delete"
12226
+ })
12227
+ });
12228
+
11338
12229
  //#endregion
11339
12230
  //#region ../contract/src/payout/payout-get.schema.ts
11340
12231
  const PayoutGetSchema = PayoutSchema.pick({ id: true }).extend({ id: string$1().meta({
@@ -11410,32 +12301,38 @@ const PayoutStatsGetSchema = object({
11410
12301
 
11411
12302
  //#endregion
11412
12303
  //#region ../contract/src/payout/payout-update.schema.ts
11413
- PayoutSchema.pick({ id: true }).merge(PayoutSchema.pick({
12304
+ const PayoutUpdateSchema = PayoutSchema.pick({ id: true }).merge(PayoutSchema.pick({
11414
12305
  status: true,
11415
- approval: true,
11416
- paidAt: true
12306
+ approval: true
11417
12307
  }).partial()).extend({
11418
12308
  id: string$1().meta({
11419
12309
  examples: [Examples.Payout.id],
11420
12310
  description: "Unique identifier of the payout to update."
11421
12311
  }),
11422
- status: _enum([
11423
- "UPCOMING",
11424
- "PENDING",
11425
- "PROCESSING",
11426
- "PAID",
11427
- "CANCELLED"
11428
- ]).optional().meta({
11429
- examples: ["PAID"],
11430
- description: "Optional new payment status for the payout. UPCOMING: scheduled but not processed, PENDING: awaiting processing, PROCESSING: currently being processed, PAID: successfully completed, CANCELLED: cancelled."
12312
+ status: _enum(["CANCELLED"]).optional().meta({
12313
+ examples: ["CANCELLED"],
12314
+ description: "Optional new payment status for the payout. Only CANCELLED is allowed for manual updates."
11431
12315
  }),
11432
12316
  approval: ApprovalStatusEnum.optional().meta({
11433
12317
  examples: ["APPROVED"],
11434
12318
  description: "Optional new approval status for the payout. PENDING: awaiting approval, APPROVED: approved for processing, REJECTED: rejected."
12319
+ })
12320
+ });
12321
+
12322
+ //#endregion
12323
+ //#region ../contract/src/payout/payout-update-note.schema.ts
12324
+ const PayoutUpdateNoteSchema = object({
12325
+ id: string$1().meta({
12326
+ examples: [Examples.Payout.id],
12327
+ description: "Unique identifier of the payout"
11435
12328
  }),
11436
- paidAt: datetime().optional().meta({
11437
- examples: [Examples.Payout.paidAt],
11438
- description: "Optional timestamp in ISO 8601 format when the payout was completed. Set when status changes to PAID."
12329
+ noteId: string$1().meta({
12330
+ examples: ["tl_1234567890_abc123"],
12331
+ description: "Unique identifier of the timeline note to update"
12332
+ }),
12333
+ note: string$1().trim().min(1).max(1e3).meta({
12334
+ examples: ["Updated: Transfer confirmed - reference #12345"],
12335
+ description: "Updated note text content (1-1000 characters)"
11439
12336
  })
11440
12337
  });
11441
12338
 
@@ -11512,7 +12409,6 @@ const PromoterPayoutFrequencyEnum = _enum([
11512
12409
  "WEEKLY",
11513
12410
  "AFTER_EVENT"
11514
12411
  ]);
11515
- const PromoterGatewayEnum = _enum(["AIRWALLEX", "STRIPE"]);
11516
12412
  const PromoterSchema = object({
11517
12413
  id: PromoterIdSchema.readonly().meta({
11518
12414
  examples: [Examples.Promoter.id],
@@ -11570,16 +12466,8 @@ const PromoterSchema = object({
11570
12466
  description: "TikTok pixel ID for advertising and conversion tracking"
11571
12467
  })
11572
12468
  }).optional().meta({ description: "Optional tracking configuration for analytics and advertising platforms" }),
11573
- gateway: PromoterGatewayEnum.meta({
11574
- examples: ["AIRWALLEX"],
11575
- description: "Payment gateway provider used for processing transactions. AIRWALLEX or STRIPE"
11576
- }).optional(),
11577
- gatewayId: string$1().meta({
11578
- examples: ["ben_12345abcde67890"],
11579
- description: "External identifier in the payment gateway system"
11580
- }).optional(),
11581
12469
  metadata: MetadataSchema
11582
- }).meta({ description: "Promoter organization with location, approval status, and payment configuration" });
12470
+ }).meta({ description: "Promoter organization with location and approval status" });
11583
12471
 
11584
12472
  //#endregion
11585
12473
  //#region ../contract/src/promoter/promoter-by-identifier-get.schema.ts
@@ -11718,9 +12606,7 @@ const PromoterUpdateSchema = PromoterSchema.omit({
11718
12606
  fbId: string$1().optional(),
11719
12607
  gtmId: string$1().optional(),
11720
12608
  tikTokId: string$1().optional()
11721
- }).nullable().optional().meta({ description: "Analytics tracking config. Pass null to clear all tracking; omit to leave unchanged." }),
11722
- gateway: PromoterGatewayEnum.nullable().optional().meta({ description: "Payment gateway. Pass null to clear; omit to leave unchanged." }),
11723
- gatewayId: string$1().nullable().optional().meta({ description: "Payment gateway ID. Pass null to clear; omit to leave unchanged." })
12609
+ }).nullable().optional().meta({ description: "Analytics tracking config. Pass null to clear all tracking; omit to leave unchanged." })
11724
12610
  }).meta({ description: "Schema for updating an existing promoter." });
11725
12611
 
11726
12612
  //#endregion
@@ -11733,6 +12619,12 @@ const AcceptTeamInviteSchema = object({
11733
12619
 
11734
12620
  //#endregion
11735
12621
  //#region ../contract/src/team/team.schema.ts
12622
+ const PaymentGatewaySchema = object({
12623
+ provider: _enum(["STRIPE", "AIRWALLEX"]).meta({ description: "Payment gateway provider type" }),
12624
+ connectedAt: datetime().meta({ description: "Timestamp when the payment gateway was connected to this team" }),
12625
+ connectedBy: string$1().meta({ description: "User ID of the team member who connected the payment gateway" }),
12626
+ accountId: string$1().meta({ description: "Connected account ID. For Stripe: acct_xxxxx. For Airwallex: business account open ID." })
12627
+ }).meta({ description: "Payment gateway configuration for direct payouts to the team's connected account" });
11736
12628
  const TeamSchema = object({
11737
12629
  id: TeamIdSchema.readonly().meta({ description: "Unique identifier for the team organization" }),
11738
12630
  createdAt: datetime().readonly().meta({ description: "Timestamp in ISO 8601 format when the team was created" }),
@@ -11745,7 +12637,8 @@ const TeamSchema = object({
11745
12637
  approval: ApprovalStatusEnum.meta({ description: "Approval status of the team. PENDING: awaiting review, APPROVED: can create promoters/venues/events, REJECTED: cannot operate" }),
11746
12638
  deletedAt: datetime().optional().readonly().meta({ description: "Timestamp in ISO 8601 format when the team was soft deleted. Only present for deleted teams." }),
11747
12639
  tenantId: string$1().readonly().meta({ description: "Tenant ID for multi-tenant isolation" }),
11748
- isAdmin: boolean$1().optional().meta({ description: "Whether this team is the admin team for the tenant" })
12640
+ isAdmin: boolean$1().optional().meta({ description: "Whether this team is the admin team for the tenant" }),
12641
+ gateway: PaymentGatewaySchema.optional().meta({ description: "Connected payment gateway for direct payouts. When connected, funds from ticket sales go directly to the team's account with platform fees deducted." })
11749
12642
  }).meta({ description: "Team organization that owns promoters and venues. Multiple brands can exist under one team." });
11750
12643
  TeamSchema.extend({ promoter: PromoterSchema.meta({ description: "The primary promoter brand associated with this team" }) }).meta({ description: "Team organization with its primary promoter brand included for convenience" });
11751
12644
 
@@ -11950,6 +12843,46 @@ const TeamListSchema = object({
11950
12843
  //#region ../contract/src/team/team-page.schema.ts
11951
12844
  const TeamPageSchema = createPaginatedSchema(DetailedTeamSchema, "teams");
11952
12845
 
12846
+ //#endregion
12847
+ //#region ../contract/src/team/team-payment-connect-init.schema.ts
12848
+ const PaymentProviderEnum = _enum(["STRIPE", "AIRWALLEX"]);
12849
+ const TeamPaymentConnectInitSchema = object({
12850
+ key: string$1().meta({ description: "Team identifier (ID or slug)" }),
12851
+ provider: PaymentProviderEnum.meta({
12852
+ description: "Payment processor to connect",
12853
+ examples: ["STRIPE", "AIRWALLEX"]
12854
+ })
12855
+ });
12856
+ const TeamPaymentConnectInitResponseSchema = object({ authorizationUrl: string$1().url().meta({
12857
+ description: "URL to redirect the user to for OAuth authorization. Open in a new window or redirect the current page.",
12858
+ examples: ["https://connect.stripe.com/oauth/authorize?response_type=code&client_id=ca_xxx&scope=read_write&redirect_uri=..."]
12859
+ }) });
12860
+
12861
+ //#endregion
12862
+ //#region ../contract/src/team/team-payment-disconnect.schema.ts
12863
+ const TeamPaymentDisconnectSchema = object({ key: string$1().meta({ description: "Team identifier (ID or slug)" }) });
12864
+
12865
+ //#endregion
12866
+ //#region ../contract/src/team/team-payment.contract.ts
12867
+ const connect = oc.route({
12868
+ method: "POST",
12869
+ path: "/teams/{key}/payment/connect",
12870
+ summary: "Initiate payment processor connection",
12871
+ description: "Start the OAuth flow to connect a team's payment processor account. Returns an authorization URL to redirect the user to the payment provider's OAuth page. The OAuth callback is handled directly by the payment gateway.",
12872
+ tags: ["Team Payments"]
12873
+ }).input(TeamPaymentConnectInitSchema.strict()).output(TeamPaymentConnectInitResponseSchema);
12874
+ const disconnect = oc.route({
12875
+ method: "POST",
12876
+ path: "/teams/{key}/payment/disconnect",
12877
+ summary: "Disconnect payment processor",
12878
+ description: "Remove the payment processor connection from a team. Future ticket sales will use the platform account. Only the team owner can disconnect the payment processor.",
12879
+ tags: ["Team Payments"]
12880
+ }).input(TeamPaymentDisconnectSchema.strict()).output(TeamSchema);
12881
+ var team_payment_contract_default = {
12882
+ connect,
12883
+ disconnect
12884
+ };
12885
+
11953
12886
  //#endregion
11954
12887
  //#region ../contract/src/team/team-update.schema.ts
11955
12888
  const TeamUpdateSchema = TeamSchema.omit({
@@ -12090,6 +13023,11 @@ var features_default = {
12090
13023
  "key": "region-filtering",
12091
13024
  "description": "Enable region-based event filtering and location-aware features",
12092
13025
  "defaultValue": false
13026
+ },
13027
+ genres: {
13028
+ "key": "genres",
13029
+ "description": "Enable genre/category filtering for events",
13030
+ "defaultValue": false
12093
13031
  }
12094
13032
  };
12095
13033
 
@@ -12109,6 +13047,10 @@ var config_default$3 = {
12109
13047
  "clkwbixsi0000m9coi7i5b65z": "tem_01kach7nnvfvmbtfvgtgkb47kc"
12110
13048
  },
12111
13049
  defaultCurrency: "AUD",
13050
+ legal: {
13051
+ "entityName": "MIXMAG AUS/NZ PTY LTD",
13052
+ "taxId": "66 677 763 183"
13053
+ },
12112
13054
  baseUrl: {
12113
13055
  "dev": "http://mixmag-anz.localhost:3000",
12114
13056
  "production": "https://beta.mixmag.au",
@@ -12136,7 +13078,8 @@ var config_default$3 = {
12136
13078
  favicon: "https://assets.session.services/tenants/mixmag-anz/favicon.svg",
12137
13079
  features: {
12138
13080
  "promoter-signups": true,
12139
- "region-filtering": true
13081
+ "region-filtering": true,
13082
+ "genres": true
12140
13083
  },
12141
13084
  wallet: { "apple": {
12142
13085
  "logoUrl": "https://assets.session.services/tenant/mixmag-anz/wallet/logo.png",
@@ -12186,7 +13129,8 @@ var config_default$2 = {
12186
13129
  favicon: "https://assets.dev.session.services/tenants/mixmag-asia/favicon.svg",
12187
13130
  features: {
12188
13131
  "promoter-signups": true,
12189
- "region-filtering": true
13132
+ "region-filtering": true,
13133
+ "genres": true
12190
13134
  },
12191
13135
  wallet: { "apple": {
12192
13136
  "logoUrl": "https://assets.dev.session.services/wallet-assets/tenants/mixmag-anz/logo.png",
@@ -12245,11 +13189,20 @@ var config_default = {
12245
13189
  email: "hello@session.services",
12246
13190
  adminTeamId: "tem_01jqpjksnsen9vprw95et60t3m",
12247
13191
  defaultCurrency: "AUD",
13192
+ legal: {
13193
+ "entityName": "SESSION SERVICES PTY LTD",
13194
+ "taxIdLabel": "ABN",
13195
+ "taxId": "48 671 749 214"
13196
+ },
12248
13197
  baseUrl: {
12249
13198
  "dev": "http://localhost:3000",
12250
13199
  "production": "https://beta.session.services",
12251
13200
  "sandbox": "https://beta.sandbox.session.services"
12252
13201
  },
13202
+ payment: {
13203
+ "stripePublishableKey": "pk_test_51OIOr5EJoOEO0655Co9fG0PXdqv1vn7vrJotFhy5uaHOyiw3rof9qigSLsnO6Akvl90JHVawuLoyPR2GjGBZXTnn00Hq8BxbiP",
13204
+ "airwallexClientId": "VwnpPlKRSbGiUlNzVfECaw"
13205
+ },
12253
13206
  logo: {
12254
13207
  "icon": {
12255
13208
  "src": "https://assets.session.services/tenants/session-services/icon.png",
@@ -12351,6 +13304,7 @@ for (const tenant of tenantConfigs) {
12351
13304
  tenantsById.set(tenant.id, tenant);
12352
13305
  tenantsBySlug.set(tenant.slug, tenant);
12353
13306
  if (tenant.oldId) tenantsByOldId.set(tenant.oldId, tenant);
13307
+ if (tenant.legacyTenantsToTeams) for (const legacyOrgId of Object.keys(tenant.legacyTenantsToTeams)) tenantsByOldId.set(legacyOrgId, tenant);
12354
13308
  if (tenant.baseUrl.dev) {
12355
13309
  const devHost = extractHost(tenant.baseUrl.dev);
12356
13310
  tenantsByHost.set(devHost, tenant);
@@ -12370,25 +13324,6 @@ for (const tenant of tenantConfigs) {
12370
13324
 
12371
13325
  //#endregion
12372
13326
  //#region ../tenants/src/feature-flags.ts
12373
- /**
12374
- * @fileoverview Feature flags management for multi-tenant applications.
12375
- *
12376
- * This module provides functionality to manage feature flags with tenant-specific overrides
12377
- * and global defaults. It supports a hierarchical approach where tenants can override
12378
- * global feature flag settings, enabling fine-grained control over feature rollouts
12379
- * across different tenants.
12380
- *
12381
- * @module feature-flags
12382
- * @author Sessions Team
12383
- * @since 1.0.0
12384
- */
12385
- /**
12386
- * Internal map storing all available feature flags.
12387
- * Built from the features.json configuration file at module initialization.
12388
- *
12389
- * @private
12390
- * @type {Map<string, FeatureFlag>}
12391
- */
12392
13327
  const features = /* @__PURE__ */ new Map();
12393
13328
  for (const [key, feature] of Object.entries(features_default)) features.set(key, feature);
12394
13329
 
@@ -12507,8 +13442,10 @@ record(string$1(), FeatureFlagModel).meta({
12507
13442
  */
12508
13443
  /**
12509
13444
  * Region kind enum - defines the geographic classification levels
13445
+ * ALL is a special top-level region representing the entire tenant coverage area
12510
13446
  */
12511
13447
  const RegionKindEnum = _enum([
13448
+ "ALL",
12512
13449
  "COUNTRY",
12513
13450
  "STATE",
12514
13451
  "CITY",
@@ -12615,6 +13552,22 @@ const RegionModel = object({
12615
13552
  2,
12616
13553
  3
12617
13554
  ]
13555
+ }),
13556
+ zoom: number$1().min(0).max(22).optional().meta({
13557
+ description: "Optional zoom level override for map display (0-22)",
13558
+ examples: [
13559
+ 3,
13560
+ 6,
13561
+ 12
13562
+ ]
13563
+ }),
13564
+ heroImage: string$1().optional().meta({
13565
+ description: "Hero image base URL without extension. Component adds .webp/.jpg for browser fallback.",
13566
+ examples: ["https://assets.session.services/regions/hero/sydney"]
13567
+ }),
13568
+ description: string$1().optional().meta({
13569
+ description: "Description for events in this region, displayed in the hero banner below the title.",
13570
+ examples: ["Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round."]
12618
13571
  })
12619
13572
  }).meta({
12620
13573
  description: "Region schema for validating geographic regions with hierarchical support",
@@ -12727,6 +13680,20 @@ object({
12727
13680
  description: "Default currency code for the tenant (e.g., 'USD', 'EUR')",
12728
13681
  examples: ["AUD"]
12729
13682
  }),
13683
+ legal: object({
13684
+ entityName: string$1().meta({
13685
+ description: "Registered legal entity name",
13686
+ examples: ["Session Services Pty Ltd"]
13687
+ }),
13688
+ taxIdLabel: string$1().optional().meta({
13689
+ description: "Label for the tax identifier (e.g., ABN, GST, VAT)",
13690
+ examples: ["ABN", "GST"]
13691
+ }),
13692
+ taxId: string$1().meta({
13693
+ description: "Tax identifier or business registration number",
13694
+ examples: ["48 671 749 214"]
13695
+ })
13696
+ }).optional().meta({ description: "Legal/tax identity information for payout statements and invoices" }),
12730
13697
  baseUrl: object({
12731
13698
  dev: string$1().optional().meta({
12732
13699
  description: "Development environment URL",
@@ -12831,7 +13798,21 @@ object({
12831
13798
  description: "Google Play Store URL for the tenant's mobile app",
12832
13799
  examples: ["https://play.google.com/store/apps/details?id=com.sessions.app"]
12833
13800
  })
12834
- }).optional().meta({ description: "Mobile app store URLs for promoting app downloads to event organizers" })
13801
+ }).optional().meta({ description: "Mobile app store URLs for promoting app downloads to event organizers" }),
13802
+ payment: object({
13803
+ stripePublishableKey: string$1().regex(/^pk_(live|test)_[A-Za-z0-9]+$/, { message: "Invalid Stripe publishable key format. Must start with pk_live_ or pk_test_ followed by alphanumeric characters" }).optional().meta({
13804
+ description: "Stripe publishable key for client-side payment integration. Must match format pk_live_* or pk_test_*",
13805
+ examples: ["pk_test_51ABC123DEFxyzABCDEFghijKLMNopqrSTUVwxyz"]
13806
+ }),
13807
+ airwallexClientId: string$1().optional().meta({
13808
+ description: "Airwallex client ID for payment processing",
13809
+ examples: ["abc123-client-id"]
13810
+ }),
13811
+ stripeAccountId: string$1().regex(/^acct_[A-Za-z0-9]+$/, { message: "Invalid Stripe account ID format. Must start with acct_ followed by alphanumeric characters" }).optional().meta({
13812
+ description: "Connected Stripe account ID for receiving tenant fee transfers from Stripe Connect payments",
13813
+ examples: ["acct_1ABC123DEFxyz"]
13814
+ })
13815
+ }).optional().meta({ description: "Payment gateway public keys for checkout integration" })
12835
13816
  }).meta({
12836
13817
  description: "Tenant configuration schema for validating complete tenant settings including identity, branding, URLs, and feature flags",
12837
13818
  examples: [{
@@ -12875,13 +13856,31 @@ object({
12875
13856
  //#endregion
12876
13857
  //#region ../tenants/configs/mixmag-anz/regions.json
12877
13858
  var regions_default$3 = [
13859
+ {
13860
+ "id": "rgn_01jxk9m4a0000000000000all",
13861
+ "name": "All",
13862
+ "slug": "all",
13863
+ "enabled": true,
13864
+ "order": 0,
13865
+ "kind": "ALL",
13866
+ "latitude": -30,
13867
+ "longitude": 155,
13868
+ "zoom": 1,
13869
+ "heroImage": "https://assets.session.services/regions/hero/all",
13870
+ "description": "Discover live music, club nights, and unforgettable experiences across all locations."
13871
+ },
12878
13872
  {
12879
13873
  "id": "rgn_01k2sv1ddzesmrym079hzw06h8",
12880
13874
  "name": "Australia",
12881
13875
  "slug": "australia",
12882
13876
  "enabled": true,
12883
13877
  "order": 1,
12884
- "kind": "COUNTRY"
13878
+ "kind": "COUNTRY",
13879
+ "latitude": -25.2744,
13880
+ "longitude": 133.7751,
13881
+ "zoom": 2,
13882
+ "heroImage": "https://assets.session.services/regions/hero/australia",
13883
+ "description": "From underground warehouse parties to world-class festivals, Australia's music scene has something for every taste. Discover club nights, live performances, and unforgettable experiences across the country's most vibrant cities."
12885
13884
  },
12886
13885
  {
12887
13886
  "id": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
@@ -12890,7 +13889,10 @@ var regions_default$3 = [
12890
13889
  "enabled": true,
12891
13890
  "order": 1,
12892
13891
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
12893
- "kind": "STATE"
13892
+ "kind": "STATE",
13893
+ "latitude": -33.8688,
13894
+ "longitude": 151.2093,
13895
+ "zoom": 6
12894
13896
  },
12895
13897
  {
12896
13898
  "id": "rgn_01k2sv1ddzesmrym0hvj4ms6wh",
@@ -12901,7 +13903,24 @@ var regions_default$3 = [
12901
13903
  "parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
12902
13904
  "latitude": -33.8688,
12903
13905
  "longitude": 151.2093,
12904
- "kind": "CITY"
13906
+ "kind": "CITY",
13907
+ "zoom": 11,
13908
+ "heroImage": "https://assets.session.services/regions/hero/sydney",
13909
+ "description": "Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round. From harbour-side festivals to underground warehouse parties, discover what's on in Australia's biggest city."
13910
+ },
13911
+ {
13912
+ "id": "rgn_01jwtk8p6h0gqxm4n7r2s5v9by",
13913
+ "name": "Byron Bay",
13914
+ "slug": "byron-bay",
13915
+ "enabled": true,
13916
+ "order": 2,
13917
+ "parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
13918
+ "latitude": -28.6392,
13919
+ "longitude": 153.6091,
13920
+ "kind": "CITY",
13921
+ "zoom": 13,
13922
+ "heroImage": "https://assets.session.services/regions/hero/byron-bay",
13923
+ "description": "Where laid-back beach vibes meet world-class music, Byron Bay hosts some of Australia's most iconic festivals and intimate venue experiences. Discover live performances, DJ sets, and outdoor events in this legendary coastal destination."
12905
13924
  },
12906
13925
  {
12907
13926
  "id": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
@@ -12910,18 +13929,24 @@ var regions_default$3 = [
12910
13929
  "enabled": true,
12911
13930
  "order": 2,
12912
13931
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
12913
- "kind": "STATE"
13932
+ "kind": "STATE",
13933
+ "latitude": -37.8136,
13934
+ "longitude": 144.9631,
13935
+ "zoom": 7
12914
13936
  },
12915
13937
  {
12916
13938
  "id": "rgn_01k2sv1ddzesmrym11c64mmpxm",
12917
13939
  "name": "Melbourne",
12918
13940
  "slug": "melbourne",
12919
13941
  "enabled": true,
12920
- "order": 2,
13942
+ "order": 1,
12921
13943
  "parentId": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
12922
13944
  "latitude": -37.8136,
12923
13945
  "longitude": 144.9631,
12924
- "kind": "CITY"
13946
+ "kind": "CITY",
13947
+ "zoom": 11,
13948
+ "heroImage": "https://assets.session.services/regions/hero/melbourne",
13949
+ "description": "Australia's undisputed cultural capital boasts a legendary music scene, from intimate laneway bars to iconic venues that have launched countless artists. Discover club nights, live performances, and festivals in a city that lives and breathes music."
12925
13950
  },
12926
13951
  {
12927
13952
  "id": "rgn_01k2sv1ddzesmrym1e3pbk81es",
@@ -12930,37 +13955,223 @@ var regions_default$3 = [
12930
13955
  "enabled": true,
12931
13956
  "order": 3,
12932
13957
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
12933
- "kind": "STATE"
13958
+ "kind": "STATE",
13959
+ "latitude": -27.4698,
13960
+ "longitude": 153.0251,
13961
+ "zoom": 5
12934
13962
  },
12935
13963
  {
12936
13964
  "id": "rgn_01k2sv1ddzesmrym1mxb6te1px",
12937
13965
  "name": "Brisbane",
12938
13966
  "slug": "brisbane",
12939
13967
  "enabled": true,
12940
- "order": 3,
13968
+ "order": 1,
12941
13969
  "parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
12942
13970
  "latitude": -27.4698,
12943
13971
  "longitude": 153.0251,
12944
- "kind": "CITY"
13972
+ "kind": "CITY",
13973
+ "zoom": 11,
13974
+ "heroImage": "https://assets.session.services/regions/hero/brisbane",
13975
+ "description": "Brisbane's music scene is thriving with a mix of established venues and emerging spaces hosting everything from electronic nights to live performances. Discover events in Queensland's sunshine capital."
12945
13976
  },
12946
13977
  {
12947
- "id": "rgn_01k2sv1ddzesmrym1stdjswc9t",
12948
- "name": "New Zealand",
12949
- "slug": "new-zealand",
13978
+ "id": "rgn_01jwtk8p6h1hry2n5p8t3w6acz",
13979
+ "name": "Gold Coast",
13980
+ "slug": "gold-coast",
12950
13981
  "enabled": true,
12951
13982
  "order": 2,
12952
- "kind": "COUNTRY"
13983
+ "parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
13984
+ "latitude": -28.0003,
13985
+ "longitude": 153.4309,
13986
+ "kind": "CITY",
13987
+ "zoom": 12,
13988
+ "heroImage": "https://assets.session.services/regions/hero/gold-coast",
13989
+ "description": "Beyond the endless beaches lies a pumping nightlife scene with beachside clubs, rooftop bars, and venues hosting international and local talent. Discover parties, festivals, and live music on Australia's ultimate playground."
12953
13990
  },
12954
13991
  {
12955
- "id": "rgn_01k2sv1ddzesmrym211cw0cgv2",
12956
- "name": "Auckland",
12957
- "slug": "auckland",
13992
+ "id": "rgn_01jwtk8p6h2jsz3p6q9u4x7bdz",
13993
+ "name": "Western Australia",
13994
+ "slug": "wa",
12958
13995
  "enabled": true,
12959
13996
  "order": 4,
13997
+ "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
13998
+ "kind": "STATE",
13999
+ "latitude": -31.9535,
14000
+ "longitude": 115.857,
14001
+ "zoom": 5
14002
+ },
14003
+ {
14004
+ "id": "rgn_01jwtk8p6h3kta4q7r0v5y8cey",
14005
+ "name": "Perth",
14006
+ "slug": "perth",
14007
+ "enabled": true,
14008
+ "order": 1,
14009
+ "parentId": "rgn_01jwtk8p6h2jsz3p6q9u4x7bdz",
14010
+ "latitude": -31.9535,
14011
+ "longitude": 115.857,
14012
+ "kind": "CITY",
14013
+ "zoom": 11,
14014
+ "heroImage": "https://assets.session.services/regions/hero/perth",
14015
+ "description": "Australia's sunniest capital has cultivated a thriving underground scene alongside world-class festivals. From beachside parties to intimate club nights, discover events in this isolated yet vibrant music destination."
14016
+ },
14017
+ {
14018
+ "id": "rgn_01jwtk8p6h4ltb5r8s1w6z9dfz",
14019
+ "name": "South Australia",
14020
+ "slug": "sa",
14021
+ "enabled": true,
14022
+ "order": 5,
14023
+ "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
14024
+ "kind": "STATE",
14025
+ "latitude": -34.929,
14026
+ "longitude": 138.601,
14027
+ "zoom": 6
14028
+ },
14029
+ {
14030
+ "id": "rgn_01jwtk8p6h5muc6s9t2x70ega0",
14031
+ "name": "Adelaide",
14032
+ "slug": "adelaide",
14033
+ "enabled": true,
14034
+ "order": 1,
14035
+ "parentId": "rgn_01jwtk8p6h4ltb5r8s1w6z9dfz",
14036
+ "latitude": -34.929,
14037
+ "longitude": 138.601,
14038
+ "kind": "CITY",
14039
+ "zoom": 11,
14040
+ "heroImage": "https://assets.session.services/regions/hero/adelaide",
14041
+ "description": "One of Australia's best-kept secrets, Adelaide's intimate music scene features converted warehouses, historic venues, and a festival culture that rivals any city. Discover events in South Australia's creative heart."
14042
+ },
14043
+ {
14044
+ "id": "rgn_01jwtk8p6h6nvd7t0u3y81fhb1",
14045
+ "name": "Tasmania",
14046
+ "slug": "tasmania",
14047
+ "enabled": true,
14048
+ "order": 6,
14049
+ "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
14050
+ "kind": "STATE",
14051
+ "latitude": -42.8828,
14052
+ "longitude": 147.3258,
14053
+ "zoom": 7
14054
+ },
14055
+ {
14056
+ "id": "rgn_01jwtk8p6h7owe8u1v4z92gic2",
14057
+ "name": "Hobart",
14058
+ "slug": "hobart",
14059
+ "enabled": true,
14060
+ "order": 1,
14061
+ "parentId": "rgn_01jwtk8p6h6nvd7t0u3y81fhb1",
14062
+ "latitude": -42.8828,
14063
+ "longitude": 147.3258,
14064
+ "kind": "CITY",
14065
+ "zoom": 12,
14066
+ "heroImage": "https://assets.session.services/regions/hero/hobart",
14067
+ "description": "Compact yet culturally mighty, Hobart combines heritage venues with a thriving arts community and innovative event spaces. Discover intimate gigs, festivals, and unique experiences in Tasmania's creative capital."
14068
+ },
14069
+ {
14070
+ "id": "rgn_01jwtk8p6h8pxf9v2w50a3hjd3",
14071
+ "name": "Australian Capital Territory",
14072
+ "slug": "act",
14073
+ "enabled": true,
14074
+ "order": 7,
14075
+ "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
14076
+ "kind": "STATE",
14077
+ "latitude": -35.282,
14078
+ "longitude": 149.129,
14079
+ "zoom": 10
14080
+ },
14081
+ {
14082
+ "id": "rgn_01jwtk8p6h9qyg0w3x61b4ike4",
14083
+ "name": "Canberra",
14084
+ "slug": "canberra",
14085
+ "enabled": true,
14086
+ "order": 1,
14087
+ "parentId": "rgn_01jwtk8p6h8pxf9v2w50a3hjd3",
14088
+ "latitude": -35.282,
14089
+ "longitude": 149.129,
14090
+ "kind": "CITY",
14091
+ "zoom": 12,
14092
+ "heroImage": "https://assets.session.services/regions/hero/canberra",
14093
+ "description": "Beyond the politics lies a surprisingly vibrant music scene with intimate venues and a community that punches above its weight. Discover club nights, live performances, and events in Australia's capital."
14094
+ },
14095
+ {
14096
+ "id": "rgn_01jwtk8p6h0rzh1x4y72c5jlf5",
14097
+ "name": "Northern Territory",
14098
+ "slug": "nt",
14099
+ "enabled": true,
14100
+ "order": 8,
14101
+ "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
14102
+ "kind": "STATE",
14103
+ "latitude": -12.4628,
14104
+ "longitude": 130.8418,
14105
+ "zoom": 5
14106
+ },
14107
+ {
14108
+ "id": "rgn_01jwtk8p6h1s0i2y5z83d6kmg6",
14109
+ "name": "Darwin",
14110
+ "slug": "darwin",
14111
+ "enabled": true,
14112
+ "order": 1,
14113
+ "parentId": "rgn_01jwtk8p6h0rzh1x4y72c5jlf5",
14114
+ "latitude": -12.4628,
14115
+ "longitude": 130.8418,
14116
+ "kind": "CITY",
14117
+ "zoom": 12,
14118
+ "heroImage": "https://assets.session.services/regions/hero/darwin",
14119
+ "description": "Australia's tropical capital offers a unique events scene where outdoor festivals, sunset sessions, and intimate venues come alive under starlit skies. Discover what's on in the Top End."
14120
+ },
14121
+ {
14122
+ "id": "rgn_01k2sv1ddzesmrym1stdjswc9t",
14123
+ "name": "New Zealand",
14124
+ "slug": "new-zealand",
14125
+ "enabled": true,
14126
+ "order": 2,
14127
+ "kind": "COUNTRY",
14128
+ "latitude": -40.9006,
14129
+ "longitude": 174.886,
14130
+ "zoom": 5,
14131
+ "heroImage": "https://assets.session.services/regions/hero/new-zealand",
14132
+ "description": "From the soaring peaks of the Southern Alps to intimate club venues, New Zealand's music scene punches above its weight. Discover live performances, DJ nights, and festivals across Aotearoa's most vibrant cities."
14133
+ },
14134
+ {
14135
+ "id": "rgn_01k2sv1ddzesmrym211cw0cgv2",
14136
+ "name": "Auckland",
14137
+ "slug": "auckland",
14138
+ "enabled": true,
14139
+ "order": 1,
12960
14140
  "parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
12961
14141
  "latitude": -36.8485,
12962
14142
  "longitude": 174.7633,
12963
- "kind": "CITY"
14143
+ "kind": "CITY",
14144
+ "zoom": 11,
14145
+ "heroImage": "https://assets.session.services/regions/hero/auckland",
14146
+ "description": "New Zealand's largest city buzzes with a diverse music scene spanning intimate venues, waterfront festivals, and club nights that keep the city moving. Discover events across Auckland's vibrant neighbourhoods."
14147
+ },
14148
+ {
14149
+ "id": "rgn_01jwtk8p6h2t1j3z60a4e7lnh7",
14150
+ "name": "Wellington",
14151
+ "slug": "wellington",
14152
+ "enabled": true,
14153
+ "order": 2,
14154
+ "parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
14155
+ "latitude": -41.2866,
14156
+ "longitude": 174.7756,
14157
+ "kind": "CITY",
14158
+ "zoom": 12,
14159
+ "heroImage": "https://assets.session.services/regions/hero/wellington",
14160
+ "description": "New Zealand's creative capital delivers a music scene as bold as its coffee culture. From legendary venues to intimate bars tucked into historic laneways, discover club nights, live performances, and festivals in Welly."
14161
+ },
14162
+ {
14163
+ "id": "rgn_01jwtk8p6h3u2k4071b5f8moi8",
14164
+ "name": "Christchurch",
14165
+ "slug": "christchurch",
14166
+ "enabled": true,
14167
+ "order": 3,
14168
+ "parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
14169
+ "latitude": -43.531,
14170
+ "longitude": 172.6365,
14171
+ "kind": "CITY",
14172
+ "zoom": 12,
14173
+ "heroImage": "https://assets.session.services/regions/hero/christchurch",
14174
+ "description": "Rising from reinvention, Christchurch's music scene features innovative venues, intimate spaces, and a community spirit that makes every event special. Discover what's on in the Garden City."
12964
14175
  }
12965
14176
  ];
12966
14177
 
@@ -12975,7 +14186,10 @@ var regions_default$2 = [
12975
14186
  "order": 1,
12976
14187
  "latitude": 22.3193,
12977
14188
  "longitude": 114.1694,
12978
- "kind": "CITY"
14189
+ "kind": "CITY",
14190
+ "zoom": 11,
14191
+ "heroImage": "https://assets.session.services/regions/hero/hong-kong",
14192
+ "description": "Where East meets West on the dancefloor, Hong Kong's nightlife spans rooftop clubs with skyline views to underground venues pushing electronic music forward. Discover events in Asia's most dynamic city."
12979
14193
  },
12980
14194
  {
12981
14195
  "id": "rgn_01k2sv1de0esmrym2jyqmx3zqq",
@@ -12985,7 +14199,10 @@ var regions_default$2 = [
12985
14199
  "order": 2,
12986
14200
  "latitude": 1.3521,
12987
14201
  "longitude": 103.8198,
12988
- "kind": "CITY"
14202
+ "kind": "CITY",
14203
+ "zoom": 11,
14204
+ "heroImage": "https://assets.session.services/regions/hero/singapore",
14205
+ "description": "From the iconic clubs of Clarke Quay to intimate venues pushing boundaries, Singapore's tightly curated music scene delivers world-class experiences. Discover events in Southeast Asia's nightlife capital."
12989
14206
  },
12990
14207
  {
12991
14208
  "id": "rgn_01k2sv1de0esmrym2tv10tsqmd",
@@ -12995,7 +14212,10 @@ var regions_default$2 = [
12995
14212
  "order": 3,
12996
14213
  "latitude": 13.7563,
12997
14214
  "longitude": 100.5018,
12998
- "kind": "CITY"
14215
+ "kind": "CITY",
14216
+ "zoom": 11,
14217
+ "heroImage": "https://assets.session.services/regions/hero/bangkok",
14218
+ "description": "A city that never sleeps, Bangkok's nightlife ranges from legendary clubs to rooftop bars and underground warehouse parties. Discover events in Thailand's pulsing capital where anything goes."
12999
14219
  },
13000
14220
  {
13001
14221
  "id": "rgn_01k2sv1de0esmrym32fj7p92nx",
@@ -13005,7 +14225,10 @@ var regions_default$2 = [
13005
14225
  "order": 4,
13006
14226
  "latitude": 35.6762,
13007
14227
  "longitude": 139.6503,
13008
- "kind": "CITY"
14228
+ "kind": "CITY",
14229
+ "zoom": 10,
14230
+ "heroImage": "https://assets.session.services/regions/hero/tokyo",
14231
+ "description": "From the neon-lit clubs of Shibuya to intimate listening bars in Golden Gai, Tokyo's music scene is as diverse as the city itself. Discover events in a megacity where tradition and innovation collide on the dancefloor."
13009
14232
  },
13010
14233
  {
13011
14234
  "id": "rgn_01k2sv1de0esmrym38dsy67mfn",
@@ -13015,7 +14238,10 @@ var regions_default$2 = [
13015
14238
  "order": 5,
13016
14239
  "latitude": -6.2088,
13017
14240
  "longitude": 106.8456,
13018
- "kind": "CITY"
14241
+ "kind": "CITY",
14242
+ "zoom": 11,
14243
+ "heroImage": "https://assets.session.services/regions/hero/jakarta",
14244
+ "description": "Indonesia's sprawling capital hides a thriving club scene behind its urban facade. From glamorous venues to underground parties, discover events in Southeast Asia's most underrated nightlife destination."
13019
14245
  }
13020
14246
  ];
13021
14247
 
@@ -13035,7 +14261,8 @@ var regions_default$1 = [
13035
14261
  "latitude": -33.8893,
13036
14262
  "longitude": 151.2228,
13037
14263
  "radius": 1,
13038
- "kind": "VENUE"
14264
+ "kind": "VENUE",
14265
+ "zoom": 16
13039
14266
  },
13040
14267
  {
13041
14268
  "id": "rgn_01k4wrdsw0e4as5ezy5vtfmxak",
@@ -13050,7 +14277,8 @@ var regions_default$1 = [
13050
14277
  "latitude": -33.8916,
13051
14278
  "longitude": 151.2505,
13052
14279
  "radius": 1,
13053
- "kind": "VENUE"
14280
+ "kind": "VENUE",
14281
+ "zoom": 16
13054
14282
  },
13055
14283
  {
13056
14284
  "id": "rgn_01k4wrdsw0e4as5f03mtj7135x",
@@ -13065,20 +14293,36 @@ var regions_default$1 = [
13065
14293
  "latitude": -35.3289,
13066
14294
  "longitude": 149.174,
13067
14295
  "radius": 1,
13068
- "kind": "VENUE"
14296
+ "kind": "VENUE",
14297
+ "zoom": 16
13069
14298
  }
13070
14299
  ];
13071
14300
 
13072
14301
  //#endregion
13073
14302
  //#region ../tenants/configs/session-services/regions.json
13074
14303
  var regions_default = [
14304
+ {
14305
+ "id": "rgn_01k2sv1ddzesmrym0all000000",
14306
+ "name": "All Events",
14307
+ "slug": "all",
14308
+ "enabled": true,
14309
+ "order": 0,
14310
+ "kind": "ALL",
14311
+ "heroImage": "https://assets.session.services/regions/hero/all",
14312
+ "description": "Discover live music, club nights, and unforgettable experiences across all locations."
14313
+ },
13075
14314
  {
13076
14315
  "id": "rgn_01k2sv1ddzesmrym079hzw06h8",
13077
14316
  "name": "Australia",
13078
14317
  "slug": "australia",
13079
14318
  "enabled": true,
13080
14319
  "order": 1,
13081
- "kind": "COUNTRY"
14320
+ "kind": "COUNTRY",
14321
+ "latitude": -25.2744,
14322
+ "longitude": 133.7751,
14323
+ "zoom": 4,
14324
+ "heroImage": "https://assets.session.services/regions/hero/australia",
14325
+ "description": "From underground warehouse parties to world-class festivals, Australia's music scene has something for every taste. Discover club nights, live performances, and unforgettable experiences across the country's most vibrant cities."
13082
14326
  },
13083
14327
  {
13084
14328
  "id": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
@@ -13087,7 +14331,10 @@ var regions_default = [
13087
14331
  "enabled": true,
13088
14332
  "order": 1,
13089
14333
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
13090
- "kind": "STATE"
14334
+ "kind": "STATE",
14335
+ "latitude": -33.8688,
14336
+ "longitude": 151.2093,
14337
+ "zoom": 6
13091
14338
  },
13092
14339
  {
13093
14340
  "id": "rgn_01k2sv1ddzesmrym0hvj4ms6wh",
@@ -13098,7 +14345,10 @@ var regions_default = [
13098
14345
  "parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
13099
14346
  "latitude": -33.8688,
13100
14347
  "longitude": 151.2093,
13101
- "kind": "CITY"
14348
+ "kind": "CITY",
14349
+ "zoom": 11,
14350
+ "heroImage": "https://assets.session.services/regions/hero/sydney",
14351
+ "description": "Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round. From harbour-side festivals to underground warehouse parties, discover what's on in Australia's biggest city."
13102
14352
  },
13103
14353
  {
13104
14354
  "id": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
@@ -13107,7 +14357,10 @@ var regions_default = [
13107
14357
  "enabled": true,
13108
14358
  "order": 2,
13109
14359
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
13110
- "kind": "STATE"
14360
+ "kind": "STATE",
14361
+ "latitude": -37.8136,
14362
+ "longitude": 144.9631,
14363
+ "zoom": 7
13111
14364
  },
13112
14365
  {
13113
14366
  "id": "rgn_01k2sv1ddzesmrym11c64mmpxm",
@@ -13118,7 +14371,10 @@ var regions_default = [
13118
14371
  "parentId": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
13119
14372
  "latitude": -37.8136,
13120
14373
  "longitude": 144.9631,
13121
- "kind": "CITY"
14374
+ "kind": "CITY",
14375
+ "zoom": 11,
14376
+ "heroImage": "https://assets.session.services/regions/hero/melbourne",
14377
+ "description": "Australia's undisputed cultural capital boasts a legendary music scene, from intimate laneway bars to iconic venues that have launched countless artists. Discover club nights, live performances, and festivals in a city that lives and breathes music."
13122
14378
  },
13123
14379
  {
13124
14380
  "id": "rgn_01k2sv1ddzesmrym1e3pbk81es",
@@ -13127,7 +14383,10 @@ var regions_default = [
13127
14383
  "enabled": true,
13128
14384
  "order": 3,
13129
14385
  "parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
13130
- "kind": "STATE"
14386
+ "kind": "STATE",
14387
+ "latitude": -27.4698,
14388
+ "longitude": 153.0251,
14389
+ "zoom": 5
13131
14390
  },
13132
14391
  {
13133
14392
  "id": "rgn_01k2sv1ddzesmrym1mxb6te1px",
@@ -13138,7 +14397,10 @@ var regions_default = [
13138
14397
  "parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
13139
14398
  "latitude": -27.4698,
13140
14399
  "longitude": 153.0251,
13141
- "kind": "CITY"
14400
+ "kind": "CITY",
14401
+ "zoom": 11,
14402
+ "heroImage": "https://assets.session.services/regions/hero/brisbane",
14403
+ "description": "Brisbane's music scene is thriving with a mix of established venues and emerging spaces hosting everything from electronic nights to live performances. Discover events in Queensland's sunshine capital."
13142
14404
  }
13143
14405
  ];
13144
14406
 
@@ -13398,7 +14660,6 @@ const TicketSectionSchema = object({
13398
14660
  const TicketStatusEnum = _enum([
13399
14661
  "ACTIVE",
13400
14662
  "REDEEMED",
13401
- "REFUNDED",
13402
14663
  "CANCELLED"
13403
14664
  ]);
13404
14665
  const TicketSchema = object({
@@ -13421,7 +14682,7 @@ const TicketSchema = object({
13421
14682
  scans: array(TicketScanSchema).meta({ description: "Array of all scan records for this ticket (check-ins and check-outs)" }),
13422
14683
  status: TicketStatusEnum.meta({
13423
14684
  examples: ["ACTIVE"],
13424
- description: "Current status of the ticket: ACTIVE (can be used), REDEEMED (already used), REFUNDED (money returned), CANCELLED (invalidated)"
14685
+ description: "Current status of the ticket: ACTIVE (can be used), REDEEMED (already used), CANCELLED (invalidated or refunded)"
13425
14686
  }),
13426
14687
  attendee: TicketAttendeeSchema.meta({ description: "Attendee information for this ticket - editable by tenant admins" }),
13427
14688
  customerId: string$1().meta({
@@ -13508,11 +14769,10 @@ const TicketListSchema = object({
13508
14769
  status: _enum([
13509
14770
  "ACTIVE",
13510
14771
  "REDEEMED",
13511
- "REFUNDED",
13512
14772
  "CANCELLED"
13513
14773
  ]).optional().meta({
13514
14774
  examples: ["ACTIVE"],
13515
- description: "Filter tickets by status: ACTIVE (can be used), REDEEMED (already used), REFUNDED (money returned), CANCELLED (invalidated)"
14775
+ description: "Filter tickets by status: ACTIVE (can be used), REDEEMED (already used), CANCELLED (invalidated or refunded)"
13516
14776
  }),
13517
14777
  orderToken: string$1().optional().meta({
13518
14778
  examples: [Examples.Order.token],
@@ -13560,7 +14820,7 @@ const TicketScanCreateSchema = object({
13560
14820
 
13561
14821
  //#endregion
13562
14822
  //#region ../contract/src/ticket/ticket-update.schema.ts
13563
- const TicketUpdateStatusEnum = _enum(["ACTIVE", "CANCELLED"]).describe("Status updates allowed via PATCH: ACTIVE (reactivate), CANCELLED (void). REDEEMED is set via scan endpoint, REFUNDED via refund flow.");
14823
+ const TicketUpdateStatusEnum = _enum(["ACTIVE", "CANCELLED"]).describe("Status updates allowed via PATCH: ACTIVE (reactivate), CANCELLED (void). REDEEMED is set via scan endpoint.");
13564
14824
  const TicketUpdateSchema = object({
13565
14825
  id: string$1().meta({
13566
14826
  examples: [Examples.Ticket.id],
@@ -13740,14 +15000,15 @@ const VenueGetSchema = object({ key: string$1().meta({
13740
15000
 
13741
15001
  //#endregion
13742
15002
  //#region ../contract/src/venue/venue-list.schema.ts
13743
- const limitSchema = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of venues to return (1-100, defaults to 20)" });
15003
+ const limitSchema$a = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of venues to return (1-100, defaults to 20)" });
13744
15004
  const VenueListSchema = object({
13745
15005
  teamId: string$1().optional().meta({ description: "Filter venues by owner team ID" }),
15006
+ approval: ApprovalStatusEnum.optional().meta({ description: "Filter venues by approval status. PENDING: awaiting review, APPROVED: can be used for events, REJECTED: cannot be used" }),
13746
15007
  query: string$1().optional().meta({ description: "Optional search query for filtering venues by name or slug" }),
13747
15008
  latitude: number().min(-90).max(90).optional().meta({ description: "Latitude for location-based search. Must be used with longitude" }),
13748
15009
  longitude: number().min(-180).max(180).optional().meta({ description: "Longitude for location-based search. Must be used with latitude" }),
13749
15010
  radius: number().min(1).max(2e4).optional().meta({ description: "Search radius in kilometers (1-20000). Requires latitude and longitude" }),
13750
- limit: limitSchema(),
15011
+ limit: limitSchema$a(),
13751
15012
  cursor: string$1().optional().meta({ description: "Pagination cursor from previous response. Used to fetch next page of results" })
13752
15013
  }).meta({ description: "Query parameters for listing venues with pagination, filtering, and location-based search" });
13753
15014
 
@@ -13786,6 +15047,79 @@ const VenueUpdateSchema = VenueSchema.omit({
13786
15047
  googlePlaceId: string$1().nullable().optional().meta({ description: "Google Place ID. Pass null to unlink from Google Places, omit to leave unchanged." })
13787
15048
  }).meta({ description: "Schema for updating an existing venue. Cannot change teamId (owner). Pass null to clear optional fields." });
13788
15049
 
15050
+ //#region ../contract/src/ai/suggest-event-tags.schema.ts
15051
+ const SuggestEventTagsInputSchema = object({
15052
+ eventId: string$1().ulid().optional().meta({
15053
+ description: "Event ID for rate limiting and change detection. If provided, suggestions are limited to once per day per event and only if the description changed significantly.",
15054
+ examples: ["evt_01ker4r0rge2xshgd12tytezen"]
15055
+ }),
15056
+ description: string$1().min(100).max(1e4).meta({
15057
+ description: "Event description to analyze for genre and category suggestions. Minimum 100 characters required for meaningful AI analysis.",
15058
+ examples: ["Join us for an all-night warehouse party featuring the best in tech house and melodic techno. BYO drinks, intimate vibes, and a killer sound system."]
15059
+ }),
15060
+ eventName: string$1().optional().meta({
15061
+ description: "Optional event name for additional context",
15062
+ examples: ["Warehouse Sessions Vol. 5"]
15063
+ }),
15064
+ imageUrl: url().optional().meta({
15065
+ description: "Optional event artwork URL for visual analysis (multimodal)",
15066
+ examples: ["https://assets.session.services/events/poster.jpg"]
15067
+ })
15068
+ }).meta({ description: "Input for AI-powered event tag suggestions" });
15069
+ const SuggestEventTagsOutputSchema = object({
15070
+ genres: array(EventGenreEnum).max(5).meta({
15071
+ description: "Suggested music genres based on event description and artwork",
15072
+ examples: [["Tech House", "Melodic Techno"]]
15073
+ }),
15074
+ categories: array(EventCategoryEnum).max(5).meta({
15075
+ description: "Suggested event categories based on description and artwork",
15076
+ examples: [[
15077
+ "Warehouse",
15078
+ "Underground",
15079
+ "BYO"
15080
+ ]]
15081
+ }),
15082
+ confidence: number$1().min(0).max(1).meta({
15083
+ description: "AI confidence score for the suggestions (0-1)",
15084
+ examples: [.85]
15085
+ }),
15086
+ startDate: string$1().optional().meta({
15087
+ description: "Event start date/time. Either ISO 8601 format (if specific date found) or natural language hint for relative dates (e.g., 'next Saturday 9pm').",
15088
+ examples: ["2025-02-15T21:00:00", "next Saturday 9pm"]
15089
+ }),
15090
+ endDate: string$1().optional().meta({
15091
+ description: "Event end date/time. Either ISO 8601 format (if specific date found) or natural language hint.",
15092
+ examples: ["2025-02-16T04:00:00", "6am Sunday"]
15093
+ }),
15094
+ venueName: string$1().optional().meta({
15095
+ description: "Venue or location name extracted from the description or artwork. Used to search for and prefill the event location.",
15096
+ examples: ["Warehouse 21", "The Metro Theatre"]
15097
+ }),
15098
+ ticketUrl: url().optional().meta({
15099
+ description: "External ticket purchase URL if found in the description. Only extracted if different from the host platform.",
15100
+ examples: ["https://www.eventbrite.com/e/warehouse-sessions-tickets-123"]
15101
+ })
15102
+ }).meta({ description: "AI-generated genre and category suggestions for an event" });
15103
+ object({
15104
+ estimatedInputTokens: number$1().int().meta({
15105
+ description: "Estimated input tokens for the request",
15106
+ examples: [500]
15107
+ }),
15108
+ estimatedOutputTokens: number$1().int().meta({
15109
+ description: "Estimated output tokens for the response",
15110
+ examples: [100]
15111
+ }),
15112
+ estimatedCostUsd: number$1().meta({
15113
+ description: "Estimated cost in USD",
15114
+ examples: [.002]
15115
+ }),
15116
+ includesImage: boolean$1().meta({
15117
+ description: "Whether the estimate includes image analysis",
15118
+ examples: [true]
15119
+ })
15120
+ }).meta({ description: "Cost estimate for an AI tag suggestion request" });
15121
+
15122
+ //#endregion
13789
15123
  //#region ../contract/src/admission/admission.contract.ts
13790
15124
  const get$14 = oc.route({
13791
15125
  method: "GET",
@@ -13793,26 +15127,26 @@ const get$14 = oc.route({
13793
15127
  summary: "Get admission by ID",
13794
15128
  tags: ["Admissions"]
13795
15129
  }).input(AdmissionGetSchema.strict()).output(AdmissionResponseSchema);
13796
- const create$13 = oc.route({
15130
+ const create$14 = oc.route({
13797
15131
  method: "POST",
13798
15132
  path: "/events/{eventId}/admissions",
13799
15133
  summary: "Create a new admission",
13800
15134
  tags: ["Admissions"]
13801
15135
  }).input(AdmissionCreateSchema.strict()).output(AdmissionResponseSchema);
13802
- const update$12 = oc.route({
15136
+ const update$14 = oc.route({
13803
15137
  method: "PUT",
13804
15138
  path: "/events/{eventId}/admissions/{id}",
13805
15139
  summary: "Update an admission",
13806
15140
  tags: ["Admissions"]
13807
15141
  }).input(AdmissionUpdateSchema.strict()).output(AdmissionResponseSchema);
13808
- const list$14 = oc.route({
15142
+ const list$15 = oc.route({
13809
15143
  method: "GET",
13810
15144
  path: "/events/{eventId}/admissions",
13811
15145
  summary: "List admissions",
13812
15146
  description: "Returns admissions with cursor-based pagination. Automatically uses search-backed pagination when query parameter is provided for full-text search capabilities.",
13813
15147
  tags: ["Admissions"]
13814
15148
  }).input(AdmissionListSchema.strict()).output(AdmissionPageSchema);
13815
- const remove$11 = oc.route({
15149
+ const remove$13 = oc.route({
13816
15150
  method: "DELETE",
13817
15151
  path: "/events/{eventId}/admissions/{id}",
13818
15152
  summary: "Delete an admission",
@@ -13826,10 +15160,10 @@ const quote$1 = oc.route({
13826
15160
  }).input(AdmissionQuoteCreateSchema.strict()).output(AdmissionQuoteResponseSchema);
13827
15161
  var admission_contract_default = {
13828
15162
  get: get$14,
13829
- list: list$14,
13830
- create: create$13,
13831
- update: update$12,
13832
- remove: remove$11,
15163
+ list: list$15,
15164
+ create: create$14,
15165
+ update: update$14,
15166
+ remove: remove$13,
13833
15167
  quote: quote$1
13834
15168
  };
13835
15169
 
@@ -13888,20 +15222,20 @@ const get$13 = oc.route({
13888
15222
  summary: "Get beneficiary by ID",
13889
15223
  tags: ["Beneficiaries"]
13890
15224
  }).input(BeneficiaryGetSchema.strict()).output(BeneficiaryResponseSchema);
13891
- const create$12 = oc.route({
15225
+ const create$13 = oc.route({
13892
15226
  method: "POST",
13893
15227
  path: "/beneficiaries",
13894
15228
  summary: "Create a new beneficiary",
13895
15229
  tags: ["Beneficiaries"]
13896
15230
  }).input(BeneficiaryCreateSchema.strict()).output(BeneficiaryResponseSchema);
13897
- const list$13 = oc.route({
15231
+ const list$14 = oc.route({
13898
15232
  method: "GET",
13899
15233
  path: "/beneficiaries",
13900
15234
  summary: "List beneficiaries with cursor-based pagination",
13901
15235
  description: "Returns beneficiary data with cursor-based pagination and optional full-text search via the `query` parameter.",
13902
15236
  tags: ["Beneficiaries"]
13903
15237
  }).input(BeneficiaryListSchema.strict()).output(BeneficiaryPageSchema);
13904
- const remove$10 = oc.route({
15238
+ const remove$12 = oc.route({
13905
15239
  method: "DELETE",
13906
15240
  path: "/beneficiaries/{id}",
13907
15241
  summary: "Delete a beneficiary",
@@ -13909,9 +15243,9 @@ const remove$10 = oc.route({
13909
15243
  }).input(BeneficiaryDeleteSchema.strict()).output(BeneficiaryResponseSchema);
13910
15244
  var beneficiary_contract_default = {
13911
15245
  get: get$13,
13912
- list: list$13,
13913
- create: create$12,
13914
- remove: remove$10
15246
+ list: list$14,
15247
+ create: create$13,
15248
+ remove: remove$12
13915
15249
  };
13916
15250
 
13917
15251
  //#endregion
@@ -13922,26 +15256,26 @@ const get$12 = oc.route({
13922
15256
  summary: "Get coupon code by ID",
13923
15257
  tags: ["Coupon Codes"]
13924
15258
  }).input(CouponCodeGetSchema.strict()).output(CouponCodeResponseSchema);
13925
- const create$11 = oc.route({
15259
+ const create$12 = oc.route({
13926
15260
  method: "POST",
13927
15261
  path: "/coupon-codes",
13928
15262
  summary: "Create a new coupon code",
13929
15263
  tags: ["Coupon Codes"]
13930
15264
  }).input(CouponCodeCreateSchema.strict()).output(CouponCodeResponseSchema);
13931
- const update$11 = oc.route({
15265
+ const update$13 = oc.route({
13932
15266
  method: "PUT",
13933
15267
  path: "/coupon-codes/{id}",
13934
15268
  summary: "Update a coupon code",
13935
15269
  tags: ["Coupon Codes"]
13936
15270
  }).input(CouponCodeUpdateSchema.strict()).output(CouponCodeResponseSchema);
13937
- const list$12 = oc.route({
15271
+ const list$13 = oc.route({
13938
15272
  method: "GET",
13939
15273
  path: "/coupon-codes",
13940
15274
  summary: "List coupon codes with cursor-based pagination",
13941
15275
  description: "Returns coupon code data with cursor-based pagination and optional full-text search via the `query` parameter.",
13942
15276
  tags: ["Coupon Codes"]
13943
15277
  }).input(CouponCodeListSchema.strict()).output(CouponCodePageSchema);
13944
- const remove$9 = oc.route({
15278
+ const remove$11 = oc.route({
13945
15279
  method: "DELETE",
13946
15280
  path: "/coupon-codes/{id}",
13947
15281
  summary: "Delete a coupon code",
@@ -13949,10 +15283,10 @@ const remove$9 = oc.route({
13949
15283
  }).input(CouponCodeDeleteSchema.strict()).output(CouponCodeResponseSchema);
13950
15284
  var coupon_code_contract_default = {
13951
15285
  get: get$12,
13952
- list: list$12,
13953
- create: create$11,
13954
- update: update$11,
13955
- remove: remove$9
15286
+ list: list$13,
15287
+ create: create$12,
15288
+ update: update$13,
15289
+ remove: remove$11
13956
15290
  };
13957
15291
 
13958
15292
  //#endregion
@@ -13963,26 +15297,26 @@ const get$11 = oc.route({
13963
15297
  summary: "Get coupon by ID",
13964
15298
  tags: ["Coupons"]
13965
15299
  }).input(CouponGetSchema.strict()).output(CouponResponseSchema);
13966
- const create$10 = oc.route({
15300
+ const create$11 = oc.route({
13967
15301
  method: "POST",
13968
15302
  path: "/coupons",
13969
15303
  summary: "Create a new coupon",
13970
15304
  tags: ["Coupons"]
13971
15305
  }).input(CouponCreateSchema.strict()).output(CouponResponseSchema);
13972
- const update$10 = oc.route({
15306
+ const update$12 = oc.route({
13973
15307
  method: "PUT",
13974
15308
  path: "/coupons/{id}",
13975
15309
  summary: "Update a coupon",
13976
15310
  tags: ["Coupons"]
13977
15311
  }).input(CouponUpdateSchema.strict()).output(CouponResponseSchema);
13978
- const list$11 = oc.route({
15312
+ const list$12 = oc.route({
13979
15313
  method: "GET",
13980
15314
  path: "/coupons",
13981
15315
  summary: "List coupons with cursor-based pagination",
13982
15316
  description: "Returns coupon data with cursor-based pagination and optional full-text search via the `query` parameter.",
13983
15317
  tags: ["Coupons"]
13984
15318
  }).input(CouponListSchema.strict()).output(CouponPageSchema);
13985
- const remove$8 = oc.route({
15319
+ const remove$10 = oc.route({
13986
15320
  method: "DELETE",
13987
15321
  path: "/coupons/{id}",
13988
15322
  summary: "Delete a coupon",
@@ -13990,13 +15324,98 @@ const remove$8 = oc.route({
13990
15324
  }).input(CouponDeleteSchema.strict()).output(CouponResponseSchema);
13991
15325
  var coupon_contract_default = {
13992
15326
  get: get$11,
13993
- list: list$11,
13994
- create: create$10,
13995
- update: update$10,
13996
- remove: remove$8,
15327
+ list: list$12,
15328
+ create: create$11,
15329
+ update: update$12,
15330
+ remove: remove$10,
13997
15331
  code: coupon_code_contract_default
13998
15332
  };
13999
15333
 
15334
+ //#endregion
15335
+ //#region ../contract/src/ai/ai.contract.ts
15336
+ const suggestTags = oc.route({
15337
+ method: "POST",
15338
+ path: "/events/tags",
15339
+ summary: "Suggest event genres and categories",
15340
+ description: "Uses AI to analyze event description and optional artwork to suggest relevant music genres and event categories. Returns up to 5 genres and 5 categories with a confidence score.",
15341
+ tags: ["Events"]
15342
+ }).input(SuggestEventTagsInputSchema.strict()).output(SuggestEventTagsOutputSchema);
15343
+ var ai_contract_default = { suggestTags };
15344
+
15345
+ //#endregion
15346
+ //#region ../contract/src/event-like/event-like-add.schema.ts
15347
+ /**
15348
+ * Input schema for adding a like to an event.
15349
+ */
15350
+ const EventLikeAddSchema = object({ eventId: EventIdSchema.meta({ description: "Event to like" }) }).meta({ description: "Request to like an event" });
15351
+
15352
+ //#endregion
15353
+ //#region ../contract/src/event-like/event-like-list.schema.ts
15354
+ const limitSchema = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of likes to return (1-100, defaults to 20)" });
15355
+ /**
15356
+ * Input schema for listing the current user's liked events.
15357
+ */
15358
+ const EventLikeListSchema = object({
15359
+ limit: limitSchema(),
15360
+ cursor: string$1().optional().meta({ description: "Pagination cursor from previous response. Used to fetch next page of results" })
15361
+ }).meta({ description: "Query parameters for listing the current user's liked events with pagination. Returns events sorted by most recently liked first." });
15362
+
15363
+ //#endregion
15364
+ //#region ../contract/src/event-like/event-like.schema.ts
15365
+ /**
15366
+ * Schema for an event like record.
15367
+ * Represents a user's like on an event.
15368
+ */
15369
+ const EventLikeSchema = object({
15370
+ tenantId: string$1().readonly().meta({ description: "Tenant ID for multi-tenant isolation" }),
15371
+ userId: UserIdSchema.readonly().meta({ description: "User who liked the event" }),
15372
+ eventId: EventIdSchema.meta({ description: "Event the user liked" }),
15373
+ createdAt: datetime().readonly().meta({ description: "Timestamp when the user liked the event" })
15374
+ }).meta({ description: "Represents a user's like on an event. Used for tracking popular events and building personalized recommendations." });
15375
+
15376
+ //#endregion
15377
+ //#region ../contract/src/event-like/event-like-page.schema.ts
15378
+ /**
15379
+ * Paginated response schema for listing event likes.
15380
+ */
15381
+ const EventLikePageSchema = createPaginatedSchema(EventLikeSchema, "likes").meta({ description: "Paginated list of event likes. Use cursor-based pagination to navigate through results." });
15382
+
15383
+ //#endregion
15384
+ //#region ../contract/src/event-like/event-like-remove.schema.ts
15385
+ /**
15386
+ * Input schema for removing a like from an event.
15387
+ */
15388
+ const EventLikeRemoveSchema = object({ eventId: EventIdSchema.meta({ description: "Event to remove like from" }) }).meta({ description: "Request to remove the current user's like from an event" });
15389
+
15390
+ //#endregion
15391
+ //#region ../contract/src/event-like/event-like.contract.ts
15392
+ const add = oc.route({
15393
+ method: "POST",
15394
+ path: "/events/{eventId}/like",
15395
+ summary: "Like an event",
15396
+ description: "Like an event as the current user. Atomically increments the event's likes counter.",
15397
+ tags: ["Events"]
15398
+ }).input(EventLikeAddSchema).output(EventLikeSchema);
15399
+ const remove$9 = oc.route({
15400
+ method: "DELETE",
15401
+ path: "/events/{eventId}/like",
15402
+ summary: "Remove like from an event",
15403
+ description: "Remove the current user's like from an event. Atomically decrements the event's likes counter.",
15404
+ tags: ["Events"]
15405
+ }).input(EventLikeRemoveSchema).output(_void());
15406
+ const list$11 = oc.route({
15407
+ method: "GET",
15408
+ path: "/events/likes",
15409
+ summary: "List liked events",
15410
+ description: "List all events the current user has liked, with cursor-based pagination.",
15411
+ tags: ["Events"]
15412
+ }).input(EventLikeListSchema).output(EventLikePageSchema);
15413
+ var event_like_contract_default = {
15414
+ add,
15415
+ remove: remove$9,
15416
+ list: list$11
15417
+ };
15418
+
14000
15419
  //#endregion
14001
15420
  //#region ../contract/src/event/event-performance.contract.ts
14002
15421
  const EventPerformanceCampaignsGetSchema = EventPerformanceCampaignsGetSchema$1.extend({ limit: number().min(1).max(100).optional().default(10) });
@@ -14133,13 +15552,13 @@ const get$10 = oc.route({
14133
15552
  description: "Retrieve an event using either its unique ID or URL-friendly slug",
14134
15553
  tags: ["Events"]
14135
15554
  }).input(EventGetSchema).output(DetailedEventResponseSchema);
14136
- const create$9 = oc.route({
15555
+ const create$10 = oc.route({
14137
15556
  method: "POST",
14138
15557
  path: "/events",
14139
15558
  summary: "Create a new event",
14140
15559
  tags: ["Events"]
14141
15560
  }).input(EventCreateSchema.strict()).output(EventResponseSchema);
14142
- const update$9 = oc.route({
15561
+ const update$11 = oc.route({
14143
15562
  method: "PUT",
14144
15563
  path: "/events/{key}",
14145
15564
  summary: "Update an event",
@@ -14153,20 +15572,30 @@ const list$10 = oc.route({
14153
15572
  description: "List events with filters for status, approval, visibility, and promoter. Supports full‑text search (query), geo search (latitude/longitude/radius), and cursor-based pagination.",
14154
15573
  tags: ["Events"]
14155
15574
  }).input(EventListSchema).output(EventPageSchema);
14156
- const remove$7 = oc.route({
15575
+ const remove$8 = oc.route({
14157
15576
  method: "DELETE",
14158
15577
  path: "/events/{key}",
14159
15578
  summary: "Delete an event",
14160
15579
  description: "Delete an event using either its unique ID or URL-friendly slug",
14161
15580
  tags: ["Events"]
14162
15581
  }).input(EventDeleteSchema.strict()).output(EventResponseSchema);
15582
+ const feature = oc.route({
15583
+ method: "POST",
15584
+ path: "/events/{key}/feature",
15585
+ summary: "Toggle event featured status",
15586
+ description: "Set or remove featured status on an event. Tenant admin only.",
15587
+ tags: ["Events"]
15588
+ }).input(EventFeatureSchema.strict()).output(EventResponseSchema);
14163
15589
  var event_contract_default = {
14164
15590
  get: get$10,
14165
15591
  list: list$10,
14166
- create: create$9,
14167
- update: update$9,
14168
- remove: remove$7,
14169
- performance: event_performance_contract_default
15592
+ create: create$10,
15593
+ update: update$11,
15594
+ remove: remove$8,
15595
+ feature,
15596
+ like: event_like_contract_default,
15597
+ performance: event_performance_contract_default,
15598
+ tags: ai_contract_default.suggestTags
14170
15599
  };
14171
15600
 
14172
15601
  //#endregion
@@ -14185,7 +15614,7 @@ const list$9 = oc.route({
14185
15614
  description: "Returns active event collaborations for a specific event with cursor pagination. Only shows accepted collaborators. For pending invitations, use the invite endpoints.",
14186
15615
  tags: ["Event Collaborators"]
14187
15616
  }).input(EventCollaboratorListSchema.strict()).output(EventCollaboratorPageSchema);
14188
- const create$8 = oc.route({
15617
+ const create$9 = oc.route({
14189
15618
  method: "POST",
14190
15619
  path: "/events/{eventId}/collaborators",
14191
15620
  summary: "Invite a promoter to collaborate on an event",
@@ -14199,7 +15628,7 @@ const accept = oc.route({
14199
15628
  description: "Accept a pending event collaboration invitation. User must be a member of the invited promoter's team. Deletes the invitation and creates an active collaboration record.",
14200
15629
  tags: ["Event Collaborators"]
14201
15630
  }).input(AcceptEventCollaboratorSchema.strict()).output(EventCollaboratorSchema);
14202
- const remove$6 = oc.route({
15631
+ const remove$7 = oc.route({
14203
15632
  method: "DELETE",
14204
15633
  path: "/events/{eventId}/collaborators/{id}",
14205
15634
  summary: "Remove active event collaboration",
@@ -14209,25 +15638,13 @@ const remove$6 = oc.route({
14209
15638
  var event_collaborator_contract_default = {
14210
15639
  get: get$9,
14211
15640
  list: list$9,
14212
- create: create$8,
15641
+ create: create$9,
14213
15642
  accept,
14214
- remove: remove$6
15643
+ remove: remove$7
14215
15644
  };
14216
15645
 
14217
15646
  //#endregion
14218
15647
  //#region ../contract/src/internal/internal.contract.ts
14219
- const placeAutocomplete = oc.route({
14220
- method: "GET",
14221
- path: "/internal/places/autocomplete",
14222
- summary: "Get place autocomplete suggestions",
14223
- tags: ["Internal"]
14224
- }).input(PlaceAutocompleteSchema.strict()).output(PlaceAutocompleteResponseSchema);
14225
- const placeDetails = oc.route({
14226
- method: "GET",
14227
- path: "/internal/places/{placeId}",
14228
- summary: "Get place details including timezone",
14229
- tags: ["Internal"]
14230
- }).input(PlaceDetailsSchema.strict()).output(PlaceDetailsResponseSchema);
14231
15648
  const uploadImage = oc.route({
14232
15649
  method: "POST",
14233
15650
  path: "/internal/upload/image",
@@ -14235,11 +15652,7 @@ const uploadImage = oc.route({
14235
15652
  description: "Upload an image file (PNG, JPEG, or SVG), optionally resize it, and compress it for web. SVG files are uploaded as-is without compression. Returns the uploaded image URL and metadata.",
14236
15653
  tags: ["Internal"]
14237
15654
  }).input(UploadImageRequestSchema.strict()).output(UploadImageResponseSchema);
14238
- var internal_contract_default = {
14239
- placeAutocomplete,
14240
- placeDetails,
14241
- uploadImage
14242
- };
15655
+ var internal_contract_default = { uploadImage };
14243
15656
 
14244
15657
  //#endregion
14245
15658
  //#region ../contract/src/location/location.contract.ts
@@ -14264,21 +15677,21 @@ var location_contract_default = {
14264
15677
 
14265
15678
  //#endregion
14266
15679
  //#region ../contract/src/order/order-note.contract.ts
14267
- const create$7 = oc.route({
15680
+ const create$8 = oc.route({
14268
15681
  method: "POST",
14269
15682
  path: "/orders/{id}/notes",
14270
15683
  summary: "Add note to order timeline (promoter only)",
14271
15684
  description: "Add a user note to the order timeline. Note will be marked as editable by the author.",
14272
15685
  tags: ["Orders"]
14273
15686
  }).input(OrderAddNoteSchema.strict()).output(OrderResponseSchema);
14274
- const update$8 = oc.route({
15687
+ const update$10 = oc.route({
14275
15688
  method: "PATCH",
14276
15689
  path: "/orders/{id}/notes/{noteId}",
14277
15690
  summary: "Update timeline note (author only)",
14278
15691
  description: "Update a timeline note. Only the author can edit their own notes. System-generated entries cannot be edited.",
14279
15692
  tags: ["Orders"]
14280
15693
  }).input(OrderUpdateNoteSchema.strict()).output(OrderResponseSchema);
14281
- const remove$5 = oc.route({
15694
+ const remove$6 = oc.route({
14282
15695
  method: "DELETE",
14283
15696
  path: "/orders/{id}/notes/{noteId}",
14284
15697
  summary: "Delete timeline note (author only)",
@@ -14286,9 +15699,9 @@ const remove$5 = oc.route({
14286
15699
  tags: ["Orders"]
14287
15700
  }).input(OrderDeleteNoteSchema.strict()).output(_void());
14288
15701
  var order_note_contract_default = {
14289
- create: create$7,
14290
- update: update$8,
14291
- remove: remove$5
15702
+ create: create$8,
15703
+ update: update$10,
15704
+ remove: remove$6
14292
15705
  };
14293
15706
 
14294
15707
  //#endregion
@@ -14312,13 +15725,13 @@ const quote = oc.route({
14312
15725
  summary: "Create order quote",
14313
15726
  tags: ["Orders"]
14314
15727
  }).input(OrderQuoteCreateSchema.strict()).output(OrderQuoteResponseSchema);
14315
- const create$6 = oc.route({
15728
+ const create$7 = oc.route({
14316
15729
  method: "POST",
14317
15730
  path: "/orders",
14318
15731
  summary: "Create a new order",
14319
15732
  tags: ["Orders"]
14320
15733
  }).input(OrderCreateSchema.strict()).output(OrderResponseSchema);
14321
- const update$7 = oc.route({
15734
+ const update$9 = oc.route({
14322
15735
  method: "PUT",
14323
15736
  path: "/orders/{id}",
14324
15737
  summary: "Update an order",
@@ -14343,18 +15756,56 @@ const resend = oc.route({
14343
15756
  description: "Resend order tickets to the customer's email. Optionally provide a different email address.",
14344
15757
  tags: ["Orders"]
14345
15758
  }).input(OrderResendSchema.strict()).output(OrderResponseSchema);
15759
+ const refund = oc.route({
15760
+ method: "POST",
15761
+ path: "/orders/{id}/refund",
15762
+ summary: "Refund order items",
15763
+ description: "Process a refund for order items. Supports full or partial refunds with optional ticket cancellation.",
15764
+ tags: ["Orders"]
15765
+ }).input(OrderRefundCreateSchema.strict()).output(OrderRefundResponseSchema);
14346
15766
  var order_contract_default = {
14347
15767
  get: get$7,
14348
15768
  list: list$7,
14349
- create: create$6,
14350
- update: update$7,
15769
+ create: create$7,
15770
+ update: update$9,
14351
15771
  quote,
14352
15772
  count,
14353
15773
  stats: stats$1,
14354
15774
  resend,
15775
+ refund,
14355
15776
  note: order_note_contract_default
14356
15777
  };
14357
15778
 
15779
+ //#endregion
15780
+ //#region ../contract/src/payout/payout-note.contract.ts
15781
+ const PayoutOnlyResponseSchema = object({ payout: PayoutSchema });
15782
+ const create$6 = oc.route({
15783
+ method: "POST",
15784
+ path: "/payouts/{id}/notes",
15785
+ summary: "Add note to payout timeline (finance permission required)",
15786
+ description: "Add a user note to the payout timeline. Note will be marked as editable by the author.",
15787
+ tags: ["Payouts"]
15788
+ }).input(PayoutAddNoteSchema.strict()).output(PayoutOnlyResponseSchema);
15789
+ const update$8 = oc.route({
15790
+ method: "PATCH",
15791
+ path: "/payouts/{id}/notes/{noteId}",
15792
+ summary: "Update timeline note (author only)",
15793
+ description: "Update a timeline note. Only the author can edit their own notes. System-generated entries cannot be edited.",
15794
+ tags: ["Payouts"]
15795
+ }).input(PayoutUpdateNoteSchema.strict()).output(PayoutOnlyResponseSchema);
15796
+ const remove$5 = oc.route({
15797
+ method: "DELETE",
15798
+ path: "/payouts/{id}/notes/{noteId}",
15799
+ summary: "Delete timeline note (author only)",
15800
+ description: "Delete a timeline note. Only the author can delete their own notes. System-generated entries cannot be deleted.",
15801
+ tags: ["Payouts"]
15802
+ }).input(PayoutDeleteNoteSchema.strict()).output(PayoutOnlyResponseSchema);
15803
+ var payout_note_contract_default = {
15804
+ create: create$6,
15805
+ update: update$8,
15806
+ remove: remove$5
15807
+ };
15808
+
14358
15809
  //#endregion
14359
15810
  //#region ../contract/src/payout/payout.contract.ts
14360
15811
  const get$6 = oc.route({
@@ -14382,18 +15833,20 @@ const breakdown = oc.route({
14382
15833
  summary: "Get payout breakdown",
14383
15834
  tags: ["Payouts"]
14384
15835
  }).input(BreakdownPayoutSchema.strict()).output(PayoutBreakdownSchema);
14385
- const approve = oc.route({
14386
- method: "POST",
14387
- path: "/payouts/{id}/approve",
14388
- summary: "Approve a payout for processing",
15836
+ const update$7 = oc.route({
15837
+ method: "PATCH",
15838
+ path: "/payouts/{id}",
15839
+ summary: "Update a payout",
15840
+ description: "Update payout status or approval. Use approval field to approve or reject payouts.",
14389
15841
  tags: ["Payouts"]
14390
- }).input(PayoutApproveSchema.strict()).output(ApprovalResultSchema);
15842
+ }).input(PayoutUpdateSchema.strict()).output(PayoutSchema);
14391
15843
  var payout_contract_default = {
14392
15844
  get: get$6,
14393
15845
  list: list$6,
14394
15846
  stats,
14395
15847
  breakdown,
14396
- approve
15848
+ update: update$7,
15849
+ note: payout_note_contract_default
14397
15850
  };
14398
15851
 
14399
15852
  //#endregion
@@ -14791,493 +16244,138 @@ const scan = oc.route({
14791
16244
  path: "/tickets/{id}/scan",
14792
16245
  summary: "Scan a ticket",
14793
16246
  tags: ["Tickets"]
14794
- }).input(TicketScanCreateSchema.strict()).output(TicketResponseSchema);
14795
- var ticket_contract_default = {
14796
- get: get$1,
14797
- list: list$1,
14798
- create: create$1,
14799
- update: update$2,
14800
- scan
14801
- };
14802
-
14803
- //#endregion
14804
- //#region ../contract/src/user/user.contract.ts
14805
- const me = oc.route({
14806
- method: "GET",
14807
- path: "/users/me",
14808
- summary: "Get the current user and their team memberships",
14809
- tags: ["Users"]
14810
- }).output(UserResponseSchema);
14811
- const UpdateUserInputSchema = object({
14812
- firstName: string$1().min(1).optional(),
14813
- lastName: string$1().min(1).optional(),
14814
- imageUrl: url().optional(),
14815
- metadata: record(string$1(), JsonValueSchema).optional()
14816
- }).meta({
14817
- ref: "UpdateUserInput",
14818
- description: "Input for updating the current user's profile"
14819
- });
14820
- const update$1 = oc.route({
14821
- method: "PATCH",
14822
- path: "/users/me",
14823
- summary: "Update the current user's profile",
14824
- tags: ["Users"]
14825
- }).input(UpdateUserInputSchema).output(UserSchema);
14826
- var user_contract_default = {
14827
- me,
14828
- update: update$1
14829
- };
14830
-
14831
- //#endregion
14832
- //#region ../contract/src/venue/venue.contract.ts
14833
- const get = oc.route({
14834
- method: "GET",
14835
- path: "/venues/{key}",
14836
- summary: "Get venue by ID or slug",
14837
- description: "Retrieve a venue using its unique ID or slug",
14838
- tags: ["Venues"]
14839
- }).input(VenueGetSchema.strict()).output(VenueSchema);
14840
- const list = oc.route({
14841
- method: "GET",
14842
- path: "/venues",
14843
- summary: "List venues with cursor-based pagination",
14844
- description: "Returns venues with cursor pagination. Supports filtering by team, location-based search, and text query",
14845
- tags: ["Venues"]
14846
- }).input(VenueListSchema.strict()).output(VenuePageSchema);
14847
- const create = oc.route({
14848
- method: "POST",
14849
- path: "/venues",
14850
- summary: "Create a new venue",
14851
- description: "Create a new venue. Venue will be owned by the specified team but can be used by all teams for their events",
14852
- tags: ["Venues"]
14853
- }).input(VenueCreateSchema.strict()).output(VenueSchema);
14854
- const update = oc.route({
14855
- method: "PATCH",
14856
- path: "/venues/{key}",
14857
- summary: "Update a venue",
14858
- description: "Update an existing venue. Cannot change venue ownership (teamId)",
14859
- tags: ["Venues"]
14860
- }).input(VenueUpdateSchema.strict()).output(VenueSchema);
14861
- const remove = oc.route({
14862
- method: "DELETE",
14863
- path: "/venues/{key}",
14864
- summary: "Delete a venue",
14865
- description: "Soft delete a venue (sets deletedAt timestamp)",
14866
- tags: ["Venues"]
14867
- }).input(VenueDeleteSchema.strict()).output(VenueSchema);
14868
- const linkLocation = oc.route({
14869
- method: "POST",
14870
- path: "/venues/{key}/locations",
14871
- summary: "Link location to venue",
14872
- description: "Link a location to this venue. Allows the venue to be discovered when users search for this location. A venue can have multiple linked locations (e.g., different addresses, branded names). Requires VENUE permission on the owning team.",
14873
- tags: ["Venues"]
14874
- }).input(VenueGetSchema.extend({ locationKey: string$1().meta({
14875
- description: "Location ID (loc_xxx) or Google Place ID to link to this venue",
14876
- examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
14877
- }) }).strict()).output(VenueSchema);
14878
- const unlinkLocation = oc.route({
14879
- method: "DELETE",
14880
- path: "/venues/{key}/locations/{locationKey}",
14881
- summary: "Unlink location from venue",
14882
- description: "Remove a location link from this venue. The location will no longer show this venue's branding. Requires VENUE permission on the owning team.",
14883
- tags: ["Venues"]
14884
- }).input(VenueGetSchema.extend({ locationKey: string$1().meta({
14885
- description: "Location ID (loc_xxx) or Google Place ID to unlink from this venue",
14886
- examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
14887
- }) }).strict()).output(VenueSchema);
14888
- var venue_contract_default = {
14889
- get,
14890
- list,
14891
- create,
14892
- update,
14893
- remove,
14894
- linkLocation,
14895
- unlinkLocation
14896
- };
14897
-
14898
- //#endregion
14899
- //#region ../contract/src/contract.ts
14900
- const contract = {
14901
- beneficiary: beneficiary_contract_default,
14902
- section: section_contract_default,
14903
- event: event_contract_default,
14904
- eventCollaborator: event_collaborator_contract_default,
14905
- admission: admission_contract_default,
14906
- order: order_contract_default,
14907
- ticket: ticket_contract_default,
14908
- internal: internal_contract_default,
14909
- location: location_contract_default,
14910
- coupon: coupon_contract_default,
14911
- payout: payout_contract_default,
14912
- permissionScope: permission_scope_contract_default,
14913
- promoter: promoter_contract_default,
14914
- team: team_contract_default,
14915
- teamInvite: team_invite_contract_default,
14916
- teamMember: team_member_contract_default,
14917
- tenant: tenant_contract_default,
14918
- venue: venue_contract_default,
14919
- analytics: analytics_contract_default,
14920
- user: user_contract_default
14921
- };
14922
-
14923
- //#region ../contract/src/team-member/team-member-delete.schema.ts
14924
- object({ id: TeamMemberIdSchema.meta({ description: "Team member ID to delete" }) });
14925
-
14926
- function toEventIterator(stream, options = {}) {
14927
- const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());
14928
- const reader = eventStream?.getReader();
14929
- let span;
14930
- let isCancelled = false;
14931
- return new AsyncIteratorClass(async () => {
14932
- span ??= startSpan("consume_event_iterator_stream");
14933
- try {
14934
- while (true) {
14935
- if (reader === void 0) {
14936
- return { done: true, value: void 0 };
14937
- }
14938
- const { done, value } = await runInSpanContext(span, () => reader.read());
14939
- if (done) {
14940
- if (isCancelled) {
14941
- throw new AbortError("Stream was cancelled");
14942
- }
14943
- return { done: true, value: void 0 };
14944
- }
14945
- switch (value.event) {
14946
- case "message": {
14947
- let message = parseEmptyableJSON(value.data);
14948
- if (isTypescriptObject(message)) {
14949
- message = withEventMeta(message, value);
14950
- }
14951
- span?.addEvent("message");
14952
- return { done: false, value: message };
14953
- }
14954
- case "error": {
14955
- let error = new ErrorEvent({
14956
- data: parseEmptyableJSON(value.data)
14957
- });
14958
- error = withEventMeta(error, value);
14959
- span?.addEvent("error");
14960
- throw error;
14961
- }
14962
- case "done": {
14963
- let done2 = parseEmptyableJSON(value.data);
14964
- if (isTypescriptObject(done2)) {
14965
- done2 = withEventMeta(done2, value);
14966
- }
14967
- span?.addEvent("done");
14968
- return { done: true, value: done2 };
14969
- }
14970
- default: {
14971
- span?.addEvent("maybe_keepalive");
14972
- }
14973
- }
14974
- }
14975
- } catch (e) {
14976
- if (!(e instanceof ErrorEvent)) {
14977
- setSpanError(span, e, options);
14978
- }
14979
- throw e;
14980
- }
14981
- }, async (reason) => {
14982
- try {
14983
- if (reason !== "next") {
14984
- isCancelled = true;
14985
- span?.addEvent("cancelled");
14986
- }
14987
- await runInSpanContext(span, () => reader?.cancel());
14988
- } catch (e) {
14989
- setSpanError(span, e, options);
14990
- throw e;
14991
- } finally {
14992
- span?.end();
14993
- }
14994
- });
14995
- }
14996
- function toEventStream(iterator, options = {}) {
14997
- const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;
14998
- const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;
14999
- const keepAliveComment = options.eventIteratorKeepAliveComment ?? "";
15000
- const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;
15001
- const initialComment = options.eventIteratorInitialComment ?? "";
15002
- let cancelled = false;
15003
- let timeout;
15004
- let span;
15005
- const stream = new ReadableStream({
15006
- start(controller) {
15007
- span = startSpan("stream_event_iterator");
15008
- if (initialCommentEnabled) {
15009
- controller.enqueue(encodeEventMessage({
15010
- comments: [initialComment]
15011
- }));
15012
- }
15013
- },
15014
- async pull(controller) {
15015
- try {
15016
- if (keepAliveEnabled) {
15017
- timeout = setInterval(() => {
15018
- controller.enqueue(encodeEventMessage({
15019
- comments: [keepAliveComment]
15020
- }));
15021
- span?.addEvent("keepalive");
15022
- }, keepAliveInterval);
15023
- }
15024
- const value = await runInSpanContext(span, () => iterator.next());
15025
- clearInterval(timeout);
15026
- if (cancelled) {
15027
- return;
15028
- }
15029
- const meta = getEventMeta(value.value);
15030
- if (!value.done || value.value !== void 0 || meta !== void 0) {
15031
- const event = value.done ? "done" : "message";
15032
- controller.enqueue(encodeEventMessage({
15033
- ...meta,
15034
- event,
15035
- data: stringifyJSON(value.value)
15036
- }));
15037
- span?.addEvent(event);
15038
- }
15039
- if (value.done) {
15040
- controller.close();
15041
- span?.end();
15042
- }
15043
- } catch (err) {
15044
- clearInterval(timeout);
15045
- if (cancelled) {
15046
- return;
15047
- }
15048
- if (err instanceof ErrorEvent) {
15049
- controller.enqueue(encodeEventMessage({
15050
- ...getEventMeta(err),
15051
- event: "error",
15052
- data: stringifyJSON(err.data)
15053
- }));
15054
- span?.addEvent("error");
15055
- controller.close();
15056
- } else {
15057
- setSpanError(span, err);
15058
- controller.error(err);
15059
- }
15060
- span?.end();
15061
- }
15062
- },
15063
- async cancel() {
15064
- try {
15065
- cancelled = true;
15066
- clearInterval(timeout);
15067
- span?.addEvent("cancelled");
15068
- await runInSpanContext(span, () => iterator.return?.());
15069
- } catch (e) {
15070
- setSpanError(span, e);
15071
- throw e;
15072
- } finally {
15073
- span?.end();
15074
- }
15075
- }
15076
- }).pipeThrough(new TextEncoderStream());
15077
- return stream;
15078
- }
15079
-
15080
- function toStandardBody(re, options = {}) {
15081
- return runWithSpan(
15082
- { name: "parse_standard_body", signal: options.signal },
15083
- async () => {
15084
- const contentDisposition = re.headers.get("content-disposition");
15085
- if (typeof contentDisposition === "string") {
15086
- const fileName = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
15087
- const blob2 = await re.blob();
15088
- return new File([blob2], fileName, {
15089
- type: blob2.type
15090
- });
15091
- }
15092
- const contentType = re.headers.get("content-type");
15093
- if (!contentType || contentType.startsWith("application/json")) {
15094
- const text = await re.text();
15095
- return parseEmptyableJSON(text);
15096
- }
15097
- if (contentType.startsWith("multipart/form-data")) {
15098
- return await re.formData();
15099
- }
15100
- if (contentType.startsWith("application/x-www-form-urlencoded")) {
15101
- const text = await re.text();
15102
- return new URLSearchParams(text);
15103
- }
15104
- if (contentType.startsWith("text/event-stream")) {
15105
- return toEventIterator(re.body, options);
15106
- }
15107
- if (contentType.startsWith("text/plain")) {
15108
- return await re.text();
15109
- }
15110
- const blob = await re.blob();
15111
- return new File([blob], "blob", {
15112
- type: blob.type
15113
- });
15114
- }
15115
- );
15116
- }
15117
- function toFetchBody(body, headers, options = {}) {
15118
- const currentContentDisposition = headers.get("content-disposition");
15119
- headers.delete("content-type");
15120
- headers.delete("content-disposition");
15121
- if (body === void 0) {
15122
- return void 0;
15123
- }
15124
- if (body instanceof Blob) {
15125
- headers.set("content-type", body.type);
15126
- headers.set("content-length", body.size.toString());
15127
- headers.set(
15128
- "content-disposition",
15129
- currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : "blob")
15130
- );
15131
- return body;
15132
- }
15133
- if (body instanceof FormData) {
15134
- return body;
15135
- }
15136
- if (body instanceof URLSearchParams) {
15137
- return body;
15138
- }
15139
- if (isAsyncIteratorObject(body)) {
15140
- headers.set("content-type", "text/event-stream");
15141
- return toEventStream(body, options);
15142
- }
15143
- headers.set("content-type", "application/json");
15144
- return stringifyJSON(body);
15145
- }
15146
-
15147
- function toStandardHeaders$1(headers, standardHeaders = {}) {
15148
- headers.forEach((value, key) => {
15149
- if (Array.isArray(standardHeaders[key])) {
15150
- standardHeaders[key].push(value);
15151
- } else if (standardHeaders[key] !== void 0) {
15152
- standardHeaders[key] = [standardHeaders[key], value];
15153
- } else {
15154
- standardHeaders[key] = value;
15155
- }
15156
- });
15157
- return standardHeaders;
15158
- }
15159
- function toFetchHeaders(headers, fetchHeaders = new Headers()) {
15160
- for (const [key, value] of Object.entries(headers)) {
15161
- if (Array.isArray(value)) {
15162
- for (const v of value) {
15163
- fetchHeaders.append(key, v);
15164
- }
15165
- } else if (value !== void 0) {
15166
- fetchHeaders.append(key, value);
15167
- }
15168
- }
15169
- return fetchHeaders;
15170
- }
15171
- function toFetchRequest(request, options = {}) {
15172
- const headers = toFetchHeaders(request.headers);
15173
- const body = toFetchBody(request.body, headers, options);
15174
- return new Request(request.url, {
15175
- signal: request.signal,
15176
- method: request.method,
15177
- headers,
15178
- body
15179
- });
15180
- }
15181
- function toStandardLazyResponse(response, options = {}) {
15182
- return {
15183
- body: once(() => toStandardBody(response, options)),
15184
- status: response.status,
15185
- get headers() {
15186
- const headers = toStandardHeaders$1(response.headers);
15187
- Object.defineProperty(this, "headers", { value: headers, writable: true });
15188
- return headers;
15189
- },
15190
- set headers(value) {
15191
- Object.defineProperty(this, "headers", { value, writable: true });
15192
- }
15193
- };
15194
- }
16247
+ }).input(TicketScanCreateSchema.strict()).output(TicketResponseSchema);
16248
+ var ticket_contract_default = {
16249
+ get: get$1,
16250
+ list: list$1,
16251
+ create: create$1,
16252
+ update: update$2,
16253
+ scan
16254
+ };
15195
16255
 
15196
- class CompositeStandardLinkPlugin {
15197
- plugins;
15198
- constructor(plugins = []) {
15199
- this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
15200
- }
15201
- init(options) {
15202
- for (const plugin of this.plugins) {
15203
- plugin.init?.(options);
15204
- }
15205
- }
15206
- }
16256
+ //#endregion
16257
+ //#region ../contract/src/user/user.contract.ts
16258
+ const me = oc.route({
16259
+ method: "GET",
16260
+ path: "/users/me",
16261
+ summary: "Get the current user and their team memberships",
16262
+ tags: ["Users"]
16263
+ }).output(UserResponseSchema);
16264
+ const UpdateUserInputSchema = object({
16265
+ firstName: string$1().min(1).optional(),
16266
+ lastName: string$1().min(1).optional(),
16267
+ imageUrl: url().optional(),
16268
+ metadata: record(string$1(), JsonValueSchema).optional()
16269
+ }).meta({
16270
+ ref: "UpdateUserInput",
16271
+ description: "Input for updating the current user's profile"
16272
+ });
16273
+ const update$1 = oc.route({
16274
+ method: "PATCH",
16275
+ path: "/users/me",
16276
+ summary: "Update the current user's profile",
16277
+ tags: ["Users"]
16278
+ }).input(UpdateUserInputSchema).output(UserSchema);
16279
+ var user_contract_default = {
16280
+ me,
16281
+ update: update$1
16282
+ };
15207
16283
 
15208
- class StandardLink {
15209
- constructor(codec, sender, options = {}) {
15210
- this.codec = codec;
15211
- this.sender = sender;
15212
- const plugin = new CompositeStandardLinkPlugin(options.plugins);
15213
- plugin.init(options);
15214
- this.interceptors = toArray(options.interceptors);
15215
- this.clientInterceptors = toArray(options.clientInterceptors);
15216
- }
15217
- interceptors;
15218
- clientInterceptors;
15219
- call(path, input, options) {
15220
- return runWithSpan(
15221
- { name: `${ORPC_NAME}.${path.join("/")}`, signal: options.signal },
15222
- (span) => {
15223
- span?.setAttribute("rpc.system", ORPC_NAME);
15224
- span?.setAttribute("rpc.method", path.join("."));
15225
- if (isAsyncIteratorObject(input)) {
15226
- input = asyncIteratorWithSpan(
15227
- { name: "consume_event_iterator_input", signal: options.signal },
15228
- input
15229
- );
15230
- }
15231
- return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {
15232
- const otelConfig = getGlobalOtelConfig();
15233
- let otelContext;
15234
- const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;
15235
- if (currentSpan && otelConfig) {
15236
- otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);
15237
- }
15238
- const request = await runWithSpan(
15239
- { name: "encode_request", context: otelContext },
15240
- () => this.codec.encode(path2, input2, options2)
15241
- );
15242
- const response = await intercept(
15243
- this.clientInterceptors,
15244
- { ...options2, input: input2, path: path2, request },
15245
- ({ input: input3, path: path3, request: request2, ...options3 }) => {
15246
- return runWithSpan(
15247
- { name: "send_request", signal: options3.signal, context: otelContext },
15248
- () => this.sender.call(request2, options3, path3, input3)
15249
- );
15250
- }
15251
- );
15252
- const output = await runWithSpan(
15253
- { name: "decode_response", context: otelContext },
15254
- () => this.codec.decode(response, options2, path2, input2)
15255
- );
15256
- if (isAsyncIteratorObject(output)) {
15257
- return asyncIteratorWithSpan(
15258
- { name: "consume_event_iterator_output", signal: options2.signal },
15259
- output
15260
- );
15261
- }
15262
- return output;
15263
- });
15264
- }
15265
- );
15266
- }
15267
- }
16284
+ //#endregion
16285
+ //#region ../contract/src/venue/venue.contract.ts
16286
+ const get = oc.route({
16287
+ method: "GET",
16288
+ path: "/venues/{key}",
16289
+ summary: "Get venue by ID or slug",
16290
+ description: "Retrieve a venue using its unique ID or slug",
16291
+ tags: ["Venues"]
16292
+ }).input(VenueGetSchema.strict()).output(VenueSchema);
16293
+ const list = oc.route({
16294
+ method: "GET",
16295
+ path: "/venues",
16296
+ summary: "List venues with cursor-based pagination",
16297
+ description: "Returns venues with cursor pagination. Supports filtering by team, location-based search, and text query",
16298
+ tags: ["Venues"]
16299
+ }).input(VenueListSchema.strict()).output(VenuePageSchema);
16300
+ const create = oc.route({
16301
+ method: "POST",
16302
+ path: "/venues",
16303
+ summary: "Create a new venue",
16304
+ description: "Create a new venue. Venue will be owned by the specified team but can be used by all teams for their events",
16305
+ tags: ["Venues"]
16306
+ }).input(VenueCreateSchema.strict()).output(VenueSchema);
16307
+ const update = oc.route({
16308
+ method: "PATCH",
16309
+ path: "/venues/{key}",
16310
+ summary: "Update a venue",
16311
+ description: "Update an existing venue. Cannot change venue ownership (teamId)",
16312
+ tags: ["Venues"]
16313
+ }).input(VenueUpdateSchema.strict()).output(VenueSchema);
16314
+ const remove = oc.route({
16315
+ method: "DELETE",
16316
+ path: "/venues/{key}",
16317
+ summary: "Delete a venue",
16318
+ description: "Soft delete a venue (sets deletedAt timestamp)",
16319
+ tags: ["Venues"]
16320
+ }).input(VenueDeleteSchema.strict()).output(VenueSchema);
16321
+ const linkLocation = oc.route({
16322
+ method: "POST",
16323
+ path: "/venues/{key}/locations",
16324
+ summary: "Link location to venue",
16325
+ description: "Link a location to this venue. Allows the venue to be discovered when users search for this location. A venue can have multiple linked locations (e.g., different addresses, branded names). Requires VENUE permission on the owning team.",
16326
+ tags: ["Venues"]
16327
+ }).input(VenueGetSchema.extend({ locationKey: string$1().meta({
16328
+ description: "Location ID (loc_xxx) or Google Place ID to link to this venue",
16329
+ examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
16330
+ }) }).strict()).output(VenueSchema);
16331
+ const unlinkLocation = oc.route({
16332
+ method: "DELETE",
16333
+ path: "/venues/{key}/locations/{locationKey}",
16334
+ summary: "Unlink location from venue",
16335
+ description: "Remove a location link from this venue. The location will no longer show this venue's branding. Requires VENUE permission on the owning team.",
16336
+ tags: ["Venues"]
16337
+ }).input(VenueGetSchema.extend({ locationKey: string$1().meta({
16338
+ description: "Location ID (loc_xxx) or Google Place ID to unlink from this venue",
16339
+ examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
16340
+ }) }).strict()).output(VenueSchema);
16341
+ var venue_contract_default = {
16342
+ get,
16343
+ list,
16344
+ create,
16345
+ update,
16346
+ remove,
16347
+ linkLocation,
16348
+ unlinkLocation
16349
+ };
15268
16350
 
15269
- function toHttpPath(path) {
15270
- return `/${path.map(encodeURIComponent).join("/")}`;
15271
- }
15272
- function toStandardHeaders(headers) {
15273
- if (typeof headers.forEach === "function") {
15274
- return toStandardHeaders$1(headers);
15275
- }
15276
- return headers;
15277
- }
15278
- function getMalformedResponseErrorCode(status) {
15279
- return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? "MALFORMED_ORPC_ERROR_RESPONSE";
15280
- }
16351
+ //#endregion
16352
+ //#region ../contract/src/contract.ts
16353
+ const contract = {
16354
+ analytics: analytics_contract_default,
16355
+ beneficiary: beneficiary_contract_default,
16356
+ section: section_contract_default,
16357
+ event: event_contract_default,
16358
+ eventCollaborator: event_collaborator_contract_default,
16359
+ admission: admission_contract_default,
16360
+ order: order_contract_default,
16361
+ ticket: ticket_contract_default,
16362
+ internal: internal_contract_default,
16363
+ location: location_contract_default,
16364
+ coupon: coupon_contract_default,
16365
+ payout: payout_contract_default,
16366
+ permissionScope: permission_scope_contract_default,
16367
+ promoter: promoter_contract_default,
16368
+ team: team_contract_default,
16369
+ teamInvite: team_invite_contract_default,
16370
+ teamPayment: team_payment_contract_default,
16371
+ teamMember: team_member_contract_default,
16372
+ tenant: tenant_contract_default,
16373
+ venue: venue_contract_default,
16374
+ user: user_contract_default
16375
+ };
16376
+
16377
+ //#region ../contract/src/team-member/team-member-delete.schema.ts
16378
+ object({ id: TeamMemberIdSchema.meta({ description: "Team member ID to delete" }) });
15281
16379
 
15282
16380
  class CompositeLinkFetchPlugin extends CompositeStandardLinkPlugin {
15283
16381
  initRuntimeAdapter(options) {
@@ -17535,6 +18633,7 @@ function createGTMDestination(debug = false) {
17535
18633
 
17536
18634
  //#endregion
17537
18635
  //#region src/analytics/destinations/sessions.ts
18636
+ const VALID_EVENT_TYPES = new Set(Object.values(TrackingEventType));
17538
18637
  function buildTrackingContext(event) {
17539
18638
  return {
17540
18639
  session_id: event.sessionId,
@@ -17564,7 +18663,7 @@ function extractRequiredFields(properties) {
17564
18663
  };
17565
18664
  }
17566
18665
  function createSessionsDestination(client, debug = false) {
17567
- const sendTrackingEvent = async (method, event, defaultEventType) => {
18666
+ const sendTrackingEvent = async (method, event, fixedEventType) => {
17568
18667
  const { eventId, teamId, promoterId, rest } = extractRequiredFields(event.properties);
17569
18668
  if (!eventId || !teamId || !promoterId) {
17570
18669
  if (debug) console.warn(`[Sessions API] Missing required fields, skipping ${method}:`, {
@@ -17574,19 +18673,27 @@ function createSessionsDestination(client, debug = false) {
17574
18673
  });
17575
18674
  return;
17576
18675
  }
18676
+ const eventType = fixedEventType ?? event.name;
18677
+ if (!eventType || !VALID_EVENT_TYPES.has(eventType)) {
18678
+ if (debug) console.warn(`[Sessions API] Invalid or missing eventType "${eventType}", skipping ${method}`);
18679
+ return;
18680
+ }
17577
18681
  const payload = {
17578
18682
  eventId,
17579
18683
  teamId,
17580
18684
  promoterId,
17581
- eventType: event.name || defaultEventType,
17582
- properties: rest,
18685
+ eventType,
18686
+ properties: fixedEventType && event.name ? {
18687
+ ...rest,
18688
+ name: event.name
18689
+ } : rest,
17583
18690
  context: buildTrackingContext(event)
17584
18691
  };
17585
18692
  if (debug) console.log(`[Sessions API] Sending ${method}:`, payload);
17586
18693
  await client.analytics[method](payload);
17587
18694
  };
17588
18695
  const track = (event, _config) => {
17589
- sendTrackingEvent("track", event, "Unknown Event").catch((error) => {
18696
+ sendTrackingEvent("track", event).catch((error) => {
17590
18697
  if (debug) console.error("[Sessions API] track error:", error);
17591
18698
  });
17592
18699
  };
@@ -17839,7 +18946,11 @@ function createDestinationManager(client, debug = false) {
17839
18946
  };
17840
18947
  const sendEvent = async (event, promoterId) => {
17841
18948
  const config = await getPromoterConfig(promoterId);
17842
- sendToDestination(sessionsDestination, event, config);
18949
+ try {
18950
+ sendToDestination(sessionsDestination, event, config);
18951
+ } catch (error) {
18952
+ if (debug) console.error(`[DestinationManager] ${sessionsDestination.name} error:`, error);
18953
+ }
17843
18954
  if (config.fbId || config.gtmId || config.tikTokId) for (const dest of thirdPartyDestinations) try {
17844
18955
  sendToDestination(dest, event, config);
17845
18956
  } catch (error) {
@@ -17928,39 +19039,125 @@ function resetSession() {
17928
19039
 
17929
19040
  //#endregion
17930
19041
  //#region src/analytics/format-price.ts
19042
+ /**
19043
+ * Currency data with locale and minor unit exponent (ISO 4217).
19044
+ * Exponent: 0 = no minor units (JPY, KRW), 2 = cents (most), 3 = fils (KWD, etc.)
19045
+ */
17931
19046
  const currencies = {
17932
- AUD: { locale: "en-AU" },
17933
- NZD: { locale: "en-NZ" },
17934
- GBP: { locale: "en-GB" },
17935
- USD: { locale: "en-US" },
17936
- EUR: { locale: "de-DE" },
17937
- CAD: { locale: "en-CA" },
17938
- CHF: { locale: "de-CH" },
17939
- JPY: { locale: "ja-JP" },
17940
- CNY: { locale: "zh-CN" },
17941
- HKD: { locale: "zh-HK" },
17942
- SGD: { locale: "en-SG" },
17943
- KRW: { locale: "ko-KR" },
17944
- INR: { locale: "en-IN" },
17945
- MXN: { locale: "es-MX" },
17946
- BRL: { locale: "pt-BR" },
17947
- ZAR: { locale: "en-ZA" },
17948
- SEK: { locale: "sv-SE" },
17949
- NOK: { locale: "nb-NO" },
17950
- DKK: { locale: "da-DK" },
17951
- PLN: { locale: "pl-PL" },
17952
- CZK: { locale: "cs-CZ" },
17953
- HUF: { locale: "hu-HU" },
17954
- RON: { locale: "ro-RO" },
17955
- THB: { locale: "th-TH" },
17956
- ILS: { locale: "he-IL" }
19047
+ AUD: {
19048
+ locale: "en-AU",
19049
+ exponent: 2
19050
+ },
19051
+ NZD: {
19052
+ locale: "en-NZ",
19053
+ exponent: 2
19054
+ },
19055
+ GBP: {
19056
+ locale: "en-GB",
19057
+ exponent: 2
19058
+ },
19059
+ USD: {
19060
+ locale: "en-US",
19061
+ exponent: 2
19062
+ },
19063
+ EUR: {
19064
+ locale: "de-DE",
19065
+ exponent: 2
19066
+ },
19067
+ CAD: {
19068
+ locale: "en-CA",
19069
+ exponent: 2
19070
+ },
19071
+ CHF: {
19072
+ locale: "de-CH",
19073
+ exponent: 2
19074
+ },
19075
+ CNY: {
19076
+ locale: "zh-CN",
19077
+ exponent: 2
19078
+ },
19079
+ HKD: {
19080
+ locale: "zh-HK",
19081
+ exponent: 2
19082
+ },
19083
+ SGD: {
19084
+ locale: "en-SG",
19085
+ exponent: 2
19086
+ },
19087
+ INR: {
19088
+ locale: "en-IN",
19089
+ exponent: 2
19090
+ },
19091
+ MXN: {
19092
+ locale: "es-MX",
19093
+ exponent: 2
19094
+ },
19095
+ BRL: {
19096
+ locale: "pt-BR",
19097
+ exponent: 2
19098
+ },
19099
+ ZAR: {
19100
+ locale: "en-ZA",
19101
+ exponent: 2
19102
+ },
19103
+ SEK: {
19104
+ locale: "sv-SE",
19105
+ exponent: 2
19106
+ },
19107
+ NOK: {
19108
+ locale: "nb-NO",
19109
+ exponent: 2
19110
+ },
19111
+ DKK: {
19112
+ locale: "da-DK",
19113
+ exponent: 2
19114
+ },
19115
+ PLN: {
19116
+ locale: "pl-PL",
19117
+ exponent: 2
19118
+ },
19119
+ CZK: {
19120
+ locale: "cs-CZ",
19121
+ exponent: 2
19122
+ },
19123
+ HUF: {
19124
+ locale: "hu-HU",
19125
+ exponent: 2
19126
+ },
19127
+ RON: {
19128
+ locale: "ro-RO",
19129
+ exponent: 2
19130
+ },
19131
+ THB: {
19132
+ locale: "th-TH",
19133
+ exponent: 2
19134
+ },
19135
+ ILS: {
19136
+ locale: "he-IL",
19137
+ exponent: 2
19138
+ },
19139
+ JPY: {
19140
+ locale: "ja-JP",
19141
+ exponent: 0
19142
+ },
19143
+ KRW: {
19144
+ locale: "ko-KR",
19145
+ exponent: 0
19146
+ }
17957
19147
  };
17958
- function formatPrice(price, currency) {
17959
- const locale = currencies[currency]?.locale ?? "en-US";
19148
+ /**
19149
+ * Format a price for display.
19150
+ * @param minorUnits - Amount in minor currency units (cents, yen, etc.)
19151
+ * @param currency - ISO 4217 currency code
19152
+ */
19153
+ function formatPrice(minorUnits, currency) {
19154
+ const currencyData = currencies[currency];
19155
+ const locale = currencyData?.locale ?? "en-US";
19156
+ const divisor = 10 ** (currencyData?.exponent ?? 2);
17960
19157
  return new Intl.NumberFormat(locale, {
17961
19158
  style: "currency",
17962
19159
  currency
17963
- }).format(price / 100);
19160
+ }).format(minorUnits / divisor);
17964
19161
  }
17965
19162
 
17966
19163
  //#endregion
@@ -18071,15 +19268,17 @@ function createAnalytics(config) {
18071
19268
  };
18072
19269
  }
18073
19270
 
18074
- const sessionServicesTicketingCss = () => `:host{--background:transparent;--foreground:oklch(0.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(0.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(0.145 0 0);--primary:oklch(0.205 0 0);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.97 0 0);--secondary-foreground:oklch(0.205 0 0);--muted:oklch(0.97 0 0);--muted-foreground:oklch(0.556 0 0);--accent:oklch(0.97 0 0);--accent-foreground:oklch(0.205 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.922 0 0);--input:oklch(0.922 0 0);--ring:oklch(0.708 0 0);--success:oklch(0.66 0.154 149.48);--warning:oklch(0.72 0.153 66.34);--radius:0.625rem;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--font-family:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
18075
- Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--shadow-sm:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-base:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-md:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);--shadow-lg:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);--shadow-xl:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);--transition-fast:150ms cubic-bezier(0.4, 0, 0.2, 1);--transition-base:200ms cubic-bezier(0.4, 0, 0.2, 1);--transition-slow:300ms cubic-bezier(0.4, 0, 0.2, 1);--internal-background:var(--background, transparent);--internal-foreground:var(--foreground, oklch(0.145 0 0));--internal-card:var(--card, oklch(1 0 0));--internal-card-foreground:var(--card-foreground, oklch(0.145 0 0));--internal-popover:var(--popover, oklch(1 0 0));--internal-popover-foreground:var(--popover-foreground, oklch(0.145 0 0));--internal-primary:var(--primary, oklch(0.205 0 0));--internal-primary-foreground:var(--primary-foreground, oklch(0.985 0 0));--internal-secondary:var(--secondary, oklch(0.97 0 0));--internal-secondary-foreground:var(--secondary-foreground, oklch(0.205 0 0));--internal-muted:var(--muted, oklch(0.97 0 0));--internal-muted-foreground:var(--muted-foreground, oklch(0.556 0 0));--internal-accent:var(--accent, oklch(0.97 0 0));--internal-accent-foreground:var(--accent-foreground, oklch(0.205 0 0));--internal-destructive:var(--destructive, oklch(0.577 0.245 27.325));--internal-destructive-foreground:var(--destructive-foreground, oklch(1 0 0));--internal-border:var(--border, oklch(0.922 0 0));--internal-input:var(--input, oklch(0.922 0 0));--internal-ring:var(--ring, oklch(0.708 0 0));--internal-success:var(--success, oklch(0.66 0.154 149.48));--internal-warning:var(--warning, oklch(0.72 0.153 66.34));--internal-radius:var(--radius, 0.625rem);--internal-spacing-xs:var(--spacing-xs, 0.25rem);--internal-spacing-sm:var(--spacing-sm, 0.5rem);--internal-spacing-md:var(--spacing-md, 1rem);--internal-spacing-lg:var(--spacing-lg, 1.5rem);--internal-spacing-xl:var(--spacing-xl, 2rem);--internal-font-family:var(--font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif);--internal-font-size-xs:var(--font-size-xs, 0.75rem);--internal-font-size-sm:var(--font-size-sm, 0.875rem);--internal-font-size-base:var(--font-size-base, 1rem);--internal-font-size-lg:var(--font-size-lg, 1.125rem);--internal-font-size-xl:var(--font-size-xl, 1.25rem);--internal-font-size-2xl:var(--font-size-2xl, 1.5rem);--internal-font-weight-normal:var(--font-weight-normal, 400);--internal-font-weight-medium:var(--font-weight-medium, 500);--internal-font-weight-semibold:var(--font-weight-semibold, 600);--internal-font-weight-bold:var(--font-weight-bold, 700);--internal-shadow-sm:var(--shadow-sm, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-base:var(--shadow-base, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-md:var(--shadow-md, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1));--internal-shadow-lg:var(--shadow-lg, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1));--internal-shadow-xl:var(--shadow-xl, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1));--internal-transition-fast:var(--transition-fast, 150ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-base:var(--transition-base, 200ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-slow:var(--transition-slow, 300ms cubic-bezier(0.4, 0, 0.2, 1));display:block;font-family:var(--internal-font-family);color:var(--internal-foreground);background:var(--internal-background)}*{box-sizing:border-box;margin:0;padding:0}*:focus{outline:none}*:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px;border-radius:calc(var(--internal-radius) - 4px)}.session-services-ticketing-container{width:100%;max-width:100%;margin:0}:host([data-theme="dark"]){--background:transparent;--foreground:oklch(0.96 0 0);--card:oklch(0.17 0 0);--card-foreground:oklch(0.96 0 0);--popover:oklch(0.17 0 0);--popover-foreground:oklch(0.96 0 0);--primary:oklch(0.78 0 0);--primary-foreground:oklch(0.14 0 0);--secondary:oklch(0.22 0 0);--secondary-foreground:oklch(0.96 0 0);--muted:oklch(0.22 0 0);--muted-foreground:oklch(0.78 0 0);--accent:oklch(0.22 0 0);--accent-foreground:oklch(0.96 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.29 0 0);--input:oklch(0.29 0 0);--ring:oklch(0.60 0 0)}.tickets-wrapper{padding:0;width:100%}.unsectioned-admissions{width:100%}.unsectioned-admissions .ticket-section{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);margin:0 0 var(--spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-base)}.unsectioned-admissions .ticket-section:hover{box-shadow:var(--shadow-sm)}.unsectioned-admissions .admission-card{border-radius:var(--radius);border:none}.unsectioned-admissions .admission-card:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.unsectioned-admissions .admission-card:last-child{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}.ticket-section{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);margin:0 0 var(--internal-spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--internal-shadow-sm);transition:all var(--internal-transition-base)}.ticket-section:focus-within{box-shadow:var(--internal-shadow-md)}.ticket-section:hover:not(.section-sold-out){box-shadow:var(--internal-shadow-md)}.ticket-section.section-sold-out{opacity:1;background:var(--card);box-shadow:none;position:relative;border-color:var(--border);overflow:hidden}.ticket-section.section-sold-out .section-header{background:transparent;padding-bottom:var(--spacing-md)}.ticket-section.section-sold-out .section-name,.ticket-section.section-sold-out .section-time,.ticket-section.section-sold-out .section-venue{opacity:0.8}.ticket-section.section-sold-out .admissions-list{opacity:0.6;pointer-events:none;filter:grayscale(0.3)}.ticket-section.section-sold-out .admission-card{background:var(--card)}.ticket-section.section-sold-out .quantity-controls,.ticket-section.section-sold-out .sold-out-controls{opacity:0.7}.section-header{padding:var(--internal-spacing-md) var(--internal-spacing-lg);border-bottom:1px solid var(--internal-border);background:var(--internal-card)}.section-name{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);letter-spacing:-0.025em;margin:0 0 var(--internal-spacing-xs) 0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.section-time{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-bottom:var(--internal-spacing-xs);display:flex;align-items:center;gap:var(--internal-spacing-xs)}.section-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.section-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.section-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admissions-list{padding:0}.admission-card{border-bottom:1px solid var(--internal-border);padding:var(--internal-spacing-md) var(--internal-spacing-lg);position:relative;transition:background-color var(--internal-transition-base);cursor:default}.admission-card:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.admission-card:hover:not(.sold-out){background:oklch(from var(--internal-card) calc(l - 0.02) c h)}.admission-card.sold-out{opacity:1;background:var(--card);position:relative}.admission-card.sold-out .admission-price,.admission-card.sold-out .admission-fee{opacity:0.5}.admission-card:last-child{border-bottom:none}.admission-content{display:flex;justify-content:space-between;align-items:center}.admission-details{flex:1}.admission-title{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-sm);display:flex;align-items:center;gap:var(--internal-spacing-sm)}.admission-time{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-xs);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admission-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.solo-admission .admission-content{flex-direction:column;align-items:stretch}.solo-admission .admission-details{width:100%}.solo-admission .admission-price-info{margin-top:var(--spacing-md);display:flex;justify-content:space-between;align-items:flex-start;width:100%}.solo-admission .quantity-controls{margin-left:auto;flex-shrink:0}.sold-out-badge{display:inline-flex;align-items:center;justify-content:center;padding:0;background:transparent;color:var(--muted-foreground);border:none;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:0.05em;margin-left:auto;opacity:0.7}.admission-price-info{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);width:100%}.admission-price-wrapper{display:flex;flex-direction:column}.admission-price{color:var(--internal-primary);font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-bold);letter-spacing:-0.025em;line-height:1.1}.admission-fee{color:var(--muted-foreground);font-size:var(--font-size-xs);background:transparent;padding:0;border-radius:0;font-weight:var(--font-weight-normal);display:block;margin-top:0.125rem;line-height:1.12;}.admission-savings{color:var(--success);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium)}.admission-availability{color:var(--warning);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);background:oklch(from var(--warning) l c h / 0.1);padding:calc(var(--spacing-xs) / 2) calc(var(--spacing-xs) * 2);border-radius:calc(var(--radius) - 4px);display:inline-block;margin-top:var(--spacing-xs)}.quantity-controls{display:inline-flex;align-items:center;gap:0;background:var(--internal-secondary);border:1px solid var(--internal-border);border-radius:calc(var(--internal-radius) - 2px);overflow:hidden;box-shadow:none;transition:all var(--internal-transition-fast)}.quantity-btn{width:calc(var(--internal-spacing-lg) * 1.5);height:calc(var(--internal-spacing-lg) * 1.5);border:none;background:transparent;color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-medium);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--internal-transition-fast);position:relative}.quantity-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.quantity-btn:hover:not(:disabled){background:var(--internal-accent);color:var(--internal-accent-foreground)}.quantity-btn:active:not(:disabled){transform:scale(0.95)}.quantity-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);border-color:var(--internal-border);box-shadow:none}.quantity-btn.decrease{border-right:1px solid var(--internal-border)}.quantity-btn.increase{border-left:1px solid var(--internal-border)}.quantity-value{min-width:2.5rem;text-align:center;font-size:var(--internal-font-size-sm);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);padding:0 var(--internal-spacing-xs)}.sold-out-controls{display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--spacing-lg) * 1.5 * 2 + 2.5rem);height:calc(var(--spacing-lg) * 1.5);padding:0 var(--spacing-md);background:var(--muted);color:var(--muted-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.sold-out-text{color:var(--muted-foreground);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.order-summary{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);margin:var(--internal-spacing-lg) 0 0 0;box-shadow:var(--internal-shadow-lg);width:100%}.summary-title{font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-md);color:var(--internal-foreground);letter-spacing:-0.025em}.order-item{display:flex;justify-content:space-between;margin-bottom:var(--internal-spacing-sm);font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.order-item-with-section{margin-bottom:var(--internal-spacing-sm)}.item-section-line{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.item-section-name{flex:1;font-weight:var(--font-weight-medium)}.item-admission-name{font-size:var(--internal-font-size-sm);color:var(--internal-muted-foreground);margin-top:var(--internal-spacing-xs);padding-left:var(--internal-spacing-md);font-weight:var(--internal-font-weight-normal)}.item-description{flex:1;font-weight:var(--internal-font-weight-medium)}.item-price{font-weight:var(--internal-font-weight-bold);white-space:nowrap}.empty-cart-message{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--internal-spacing-sm);color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-style:normal}.empty-cart-text{flex:1}.empty-cart-price{font-weight:var(--font-weight-medium)}.order-fees{padding:var(--internal-spacing-sm) 0;border-top:1px solid var(--internal-border);border-bottom:1px solid var(--internal-border);margin-bottom:var(--internal-spacing-sm)}.fee-row{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);color:var(--internal-foreground);font-weight:var(--internal-font-weight-medium)}.order-total{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);color:var(--internal-foreground);margin-bottom:var(--internal-spacing-md)}.checkout-btn{width:100%;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);background:var(--primary);color:var(--primary-foreground);border:none;border-radius:calc(var(--radius) - 2px);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);cursor:pointer;transition:all var(--internal-transition-fast);box-shadow:var(--internal-shadow-sm);position:relative;overflow:hidden}.checkout-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.checkout-btn:hover:not(:disabled){background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.checkout-btn:active:not(:disabled){transform:translateY(0);box-shadow:var(--shadow-sm)}.checkout-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);box-shadow:none;border:1px solid var(--internal-border)}.loading-state,.error-state{display:flex;justify-content:center;align-items:center;padding:var(--spacing-xl);text-align:center;min-height:200px}.error-state{color:var(--primary)}.error-banner{background:oklch(
19271
+ const sessionServicesTicketingCss = () => `:host{--background:transparent;--foreground:oklch(0.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(0.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(0.145 0 0);--primary:oklch(0.205 0 0);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.97 0 0);--secondary-foreground:oklch(0.205 0 0);--muted:oklch(0.97 0 0);--muted-foreground:oklch(0.556 0 0);--accent:oklch(0.97 0 0);--accent-foreground:oklch(0.205 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.922 0 0);--input:oklch(0.922 0 0);--ring:oklch(0.708 0 0);--success:oklch(0.66 0.154 149.48);--warning:oklch(0.72 0.153 66.34);--info:oklch(0.623 0.214 259.815);--info-foreground:oklch(0.488 0.243 264.376);--backdrop:oklch(0 0 0 / 0.32);--radius:0.625rem;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--font-family:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
19272
+ Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--shadow-sm:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-base:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-md:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);--shadow-lg:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);--shadow-xl:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);--transition-fast:150ms cubic-bezier(0.4, 0, 0.2, 1);--transition-base:200ms cubic-bezier(0.4, 0, 0.2, 1);--transition-slow:300ms cubic-bezier(0.4, 0, 0.2, 1);--internal-background:var(--background, transparent);--internal-foreground:var(--foreground, oklch(0.145 0 0));--internal-card:var(--card, oklch(1 0 0));--internal-card-foreground:var(--card-foreground, oklch(0.145 0 0));--internal-popover:var(--popover, oklch(1 0 0));--internal-popover-foreground:var(--popover-foreground, oklch(0.145 0 0));--internal-primary:var(--primary, oklch(0.205 0 0));--internal-primary-foreground:var(--primary-foreground, oklch(0.985 0 0));--internal-secondary:var(--secondary, oklch(0.97 0 0));--internal-secondary-foreground:var(--secondary-foreground, oklch(0.205 0 0));--internal-muted:var(--muted, oklch(0.97 0 0));--internal-muted-foreground:var(--muted-foreground, oklch(0.556 0 0));--internal-accent:var(--accent, oklch(0.97 0 0));--internal-accent-foreground:var(--accent-foreground, oklch(0.205 0 0));--internal-destructive:var(--destructive, oklch(0.577 0.245 27.325));--internal-destructive-foreground:var(--destructive-foreground, oklch(1 0 0));--internal-border:var(--border, oklch(0.922 0 0));--internal-input:var(--input, oklch(0.922 0 0));--internal-ring:var(--ring, oklch(0.708 0 0));--internal-success:var(--success, oklch(0.66 0.154 149.48));--internal-warning:var(--warning, oklch(0.72 0.153 66.34));--internal-info:var(--info, oklch(0.623 0.214 259.815));--internal-info-foreground:var(--info-foreground, oklch(0.488 0.243 264.376));--internal-backdrop:var(--backdrop, oklch(0 0 0 / 0.32));--internal-radius:var(--radius, 0.625rem);--internal-spacing-xs:var(--spacing-xs, 0.25rem);--internal-spacing-sm:var(--spacing-sm, 0.5rem);--internal-spacing-md:var(--spacing-md, 1rem);--internal-spacing-lg:var(--spacing-lg, 1.5rem);--internal-spacing-xl:var(--spacing-xl, 2rem);--internal-font-family:var(--font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif);--internal-font-size-xs:var(--font-size-xs, 0.75rem);--internal-font-size-sm:var(--font-size-sm, 0.875rem);--internal-font-size-base:var(--font-size-base, 1rem);--internal-font-size-lg:var(--font-size-lg, 1.125rem);--internal-font-size-xl:var(--font-size-xl, 1.25rem);--internal-font-size-2xl:var(--font-size-2xl, 1.5rem);--internal-font-weight-normal:var(--font-weight-normal, 400);--internal-font-weight-medium:var(--font-weight-medium, 500);--internal-font-weight-semibold:var(--font-weight-semibold, 600);--internal-font-weight-bold:var(--font-weight-bold, 700);--internal-shadow-sm:var(--shadow-sm, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-base:var(--shadow-base, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-md:var(--shadow-md, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1));--internal-shadow-lg:var(--shadow-lg, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1));--internal-shadow-xl:var(--shadow-xl, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1));--internal-transition-fast:var(--transition-fast, 150ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-base:var(--transition-base, 200ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-slow:var(--transition-slow, 300ms cubic-bezier(0.4, 0, 0.2, 1));display:block;font-family:var(--internal-font-family);color:var(--internal-foreground);background:var(--internal-background)}*{box-sizing:border-box;margin:0;padding:0}*:focus{outline:none}*:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px;border-radius:calc(var(--internal-radius) - 4px)}.session-services-ticketing-container{width:100%;max-width:100%;margin:0}:host([data-theme="dark"]){--background:transparent;--foreground:oklch(0.96 0 0);--card:oklch(0.17 0 0);--card-foreground:oklch(0.96 0 0);--popover:oklch(0.17 0 0);--popover-foreground:oklch(0.96 0 0);--primary:oklch(0.78 0 0);--primary-foreground:oklch(0.14 0 0);--secondary:oklch(0.22 0 0);--secondary-foreground:oklch(0.96 0 0);--muted:oklch(0.22 0 0);--muted-foreground:oklch(0.78 0 0);--accent:oklch(0.22 0 0);--accent-foreground:oklch(0.96 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.29 0 0);--input:oklch(0.29 0 0);--ring:oklch(0.60 0 0);--info:oklch(0.623 0.214 259.815);--info-foreground:oklch(0.707 0.165 254.624)}.tickets-wrapper{padding:0;width:100%}.unsectioned-admissions{width:100%}.unsectioned-admissions .ticket-section{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);margin:0 0 var(--spacing-md) 0;overflow:hidden;width:100%;box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-base)}.unsectioned-admissions .ticket-section:hover{box-shadow:var(--shadow-sm)}.unsectioned-admissions .admission-card{border-radius:var(--radius);border:none}.unsectioned-admissions .admission-card:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.unsectioned-admissions .admission-card:last-child{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}.ticket-section{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);margin:0 0 var(--internal-spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--internal-shadow-sm);transition:all var(--internal-transition-base)}.tickets-wrapper>.ticket-section:last-child,.tickets-wrapper>.unsectioned-admissions:last-child .ticket-section:last-child{margin-bottom:0}.ticket-section:focus-within{box-shadow:var(--internal-shadow-md)}.ticket-section:hover:not(.section-sold-out){box-shadow:var(--internal-shadow-md)}.ticket-section.section-sold-out{opacity:1;background:var(--card);box-shadow:none;position:relative;border-color:var(--border);overflow:hidden}.ticket-section.section-sold-out .section-header{background:transparent;padding-bottom:var(--spacing-md)}.ticket-section.section-sold-out .section-name,.ticket-section.section-sold-out .section-time,.ticket-section.section-sold-out .section-venue{opacity:0.8}.ticket-section.section-sold-out .admissions-list{opacity:0.6;pointer-events:none;filter:grayscale(0.3)}.ticket-section.section-sold-out .admission-card{background:var(--card)}.ticket-section.section-sold-out .quantity-controls,.ticket-section.section-sold-out .sold-out-controls{opacity:0.7}.section-header{padding:var(--internal-spacing-md) var(--internal-spacing-lg);border-bottom:1px solid var(--internal-border);background:var(--internal-card)}.section-name{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);letter-spacing:-0.025em;margin:0 0 var(--internal-spacing-xs) 0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.section-time{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-bottom:var(--internal-spacing-xs);display:flex;align-items:center;gap:var(--internal-spacing-xs)}.section-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.section-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.section-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admissions-list{padding:0}.admission-card{border-bottom:1px solid var(--internal-border);padding:var(--internal-spacing-md) var(--internal-spacing-lg);position:relative;transition:background-color var(--internal-transition-base);cursor:default}.admission-card:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.admission-card:hover:not(.sold-out){background:oklch(from var(--internal-card) calc(l - 0.02) c h)}.admission-card.sold-out{opacity:1;background:var(--card);position:relative}.admission-card.sold-out .admission-price,.admission-card.sold-out .admission-fee{opacity:0.5}.admission-card:last-child{border-bottom:none}.admission-content{display:flex;justify-content:space-between;align-items:center}.admission-details{flex:1}.admission-header{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--internal-spacing-md);margin-bottom:var(--internal-spacing-sm)}.admission-header-text{flex:1;min-width:0}.admission-title{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.admission-subtitle{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-top:var(--internal-spacing-xs);line-height:1.4}.more-info-badge{display:inline-flex;align-items:center;gap:calc(var(--internal-spacing-xs) * 1.5);padding:calc(var(--internal-spacing-xs) * 1.5) var(--internal-spacing-sm);background:oklch(from var(--internal-info) l c h / 0.08);color:var(--internal-info-foreground);border:none;border-radius:calc(var(--internal-radius) - 2px);font-size:var(--internal-font-size-xs);font-weight:var(--internal-font-weight-medium);cursor:pointer;transition:all var(--internal-transition-fast);white-space:nowrap;flex-shrink:0}.more-info-badge:hover{background:oklch(from var(--internal-info) l c h / 0.16)}.more-info-badge:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.more-info-badge svg{flex-shrink:0}.admission-time{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-xs);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admission-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.solo-admission .admission-content{flex-direction:column;align-items:stretch}.solo-admission .admission-details{width:100%}.solo-admission .admission-price-info{margin-top:var(--spacing-md);display:flex;justify-content:space-between;align-items:flex-start;width:100%}.solo-admission .quantity-controls{margin-left:auto;flex-shrink:0}.sold-out-badge{display:inline-flex;align-items:center;justify-content:center;padding:0;background:transparent;color:var(--muted-foreground);border:none;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:0.05em;margin-left:auto;opacity:0.7}.admission-price-info{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);width:100%}.admission-price-wrapper{display:flex;flex-direction:column}.admission-price{color:var(--internal-primary);font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-bold);letter-spacing:-0.025em;line-height:1.1}.admission-fee{color:var(--muted-foreground);font-size:var(--font-size-xs);background:transparent;padding:0;border-radius:0;font-weight:var(--font-weight-normal);display:block;margin-top:0.125rem;line-height:1.12;}.admission-savings{color:var(--success);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium)}.admission-availability{color:var(--warning);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);background:oklch(from var(--warning) l c h / 0.1);padding:calc(var(--spacing-xs) / 2) calc(var(--spacing-xs) * 2);border-radius:calc(var(--radius) - 4px);display:inline-block;margin-top:var(--spacing-xs)}.quantity-controls{display:inline-flex;align-items:center;gap:0;background:var(--internal-secondary);border:1px solid var(--internal-border);border-radius:calc(var(--internal-radius) - 2px);overflow:hidden;box-shadow:none;transition:all var(--internal-transition-fast)}.quantity-btn{width:calc(var(--internal-spacing-lg) * 1.5);height:calc(var(--internal-spacing-lg) * 1.5);border:none;background:transparent;color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-medium);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--internal-transition-fast);position:relative}.quantity-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.quantity-btn:hover:not(:disabled){background:var(--internal-accent);color:var(--internal-accent-foreground)}.quantity-btn:active:not(:disabled){transform:scale(0.95)}.quantity-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);border-color:var(--internal-border);box-shadow:none}.quantity-btn.decrease{border-right:1px solid var(--internal-border)}.quantity-btn.increase{border-left:1px solid var(--internal-border)}.quantity-value{min-width:2.5rem;text-align:center;font-size:var(--internal-font-size-sm);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);padding:0 var(--internal-spacing-xs)}.sold-out-controls{display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--spacing-lg) * 1.5 * 2 + 2.5rem);height:calc(var(--spacing-lg) * 1.5);padding:0 var(--spacing-md);background:var(--muted);color:var(--muted-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.sold-out-text{color:var(--muted-foreground);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.order-summary{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);margin:var(--internal-spacing-lg) 0 0 0;box-shadow:var(--internal-shadow-lg);width:100%}.summary-title{font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-md);color:var(--internal-foreground);letter-spacing:-0.025em}.order-item{display:flex;justify-content:space-between;margin-bottom:var(--internal-spacing-sm);font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.order-item-with-section{margin-bottom:var(--internal-spacing-sm)}.item-section-line{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.item-section-name{flex:1;font-weight:var(--font-weight-medium)}.item-admission-name{font-size:var(--internal-font-size-sm);color:var(--internal-muted-foreground);margin-top:var(--internal-spacing-xs);padding-left:var(--internal-spacing-md);font-weight:var(--internal-font-weight-normal)}.item-description{flex:1;font-weight:var(--internal-font-weight-medium)}.item-price{font-weight:var(--internal-font-weight-bold);white-space:nowrap}.empty-cart-message{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--internal-spacing-sm);color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-style:normal}.empty-cart-text{flex:1}.empty-cart-price{font-weight:var(--font-weight-medium)}.order-fees{padding:var(--internal-spacing-sm) 0;border-top:1px solid var(--internal-border);border-bottom:1px solid var(--internal-border);margin-bottom:var(--internal-spacing-sm)}.fee-row{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);color:var(--internal-foreground);font-weight:var(--internal-font-weight-medium)}.order-total{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);color:var(--internal-foreground);margin-bottom:var(--internal-spacing-md)}.checkout-btn{width:100%;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);background:var(--primary);color:var(--primary-foreground);border:none;border-radius:calc(var(--radius) - 2px);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);cursor:pointer;transition:all var(--internal-transition-fast);box-shadow:var(--internal-shadow-sm);position:relative;overflow:hidden}.checkout-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.checkout-btn:hover:not(:disabled){background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.checkout-btn:active:not(:disabled){transform:translateY(0);box-shadow:var(--shadow-sm)}.checkout-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);box-shadow:none;border:1px solid var(--internal-border)}.loading-state,.error-state{display:flex;justify-content:center;align-items:center;padding:var(--spacing-xl);text-align:center;min-height:200px}.error-state{color:var(--primary)}.error-banner{background:oklch(
18076
19273
  from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
18077
19274
  );border:1px solid oklch(from var(--destructive) l c h / 0.2);border-radius:var(--radius);padding:var(--spacing-lg);margin:var(--spacing-lg);text-align:center}.error-banner strong{display:block;color:var(--destructive);font-size:var(--font-size-lg);margin-bottom:var(--spacing-sm)}.error-banner p{color:var(--muted-foreground);margin-bottom:var(--spacing-md)}.retry-button{background:var(--primary);color:var(--primary-foreground);border:none;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--transition-fast);box-shadow:var(--shadow-sm)}.retry-button:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.retry-button:hover{background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.retry-button:active{transform:translateY(0);box-shadow:var(--shadow-sm)}.error-message{background:oklch(
18078
19275
  from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
18079
- );border:1px solid oklch(from var(--destructive) l c h / 0.2);color:var(--destructive);padding:var(--spacing-sm) var(--spacing-md);border-radius:var(--radius);margin-bottom:var(--spacing-md);font-size:var(--font-size-sm)}@media (min-width: 768px){.ticket-section{border-radius:var(--radius);margin:0 0 var(--spacing-md) 0}.order-summary{border-radius:var(--radius);margin:var(--spacing-md) 0}}`;
19276
+ );border:1px solid oklch(from var(--destructive) l c h / 0.2);color:var(--destructive);padding:var(--spacing-sm) var(--spacing-md);border-radius:var(--radius);margin-bottom:var(--spacing-md);font-size:var(--font-size-sm)}@media (min-width: 768px){.ticket-section{border-radius:var(--radius);margin:0 0 var(--spacing-md) 0}.order-summary{border-radius:var(--radius);margin:var(--spacing-md) 0}}.modal-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:var(--internal-spacing-md);background:var(--internal-backdrop);backdrop-filter:blur(4px);animation:modal-backdrop-fade-in var(--internal-transition-base) ease-out}@keyframes modal-backdrop-fade-in{from{opacity:0}to{opacity:1}}.modal-content{position:relative;width:100%;max-width:32rem;max-height:calc(100vh - var(--internal-spacing-xl) * 2);overflow-y:auto;background:var(--internal-popover);color:var(--internal-popover-foreground);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);box-shadow:var(--internal-shadow-xl);animation:modal-content-scale-in var(--internal-transition-base) ease-out}@keyframes modal-content-scale-in{from{opacity:0;transform:scale(0.98)}to{opacity:1;transform:scale(1)}}.modal-close-btn{position:absolute;top:var(--internal-spacing-sm);right:var(--internal-spacing-sm);display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:1px solid transparent;border-radius:calc(var(--internal-radius) - 4px);color:var(--internal-muted-foreground);cursor:pointer;opacity:0.72;transition:all var(--internal-transition-fast)}.modal-close-btn:hover{opacity:1;background:var(--internal-accent)}.modal-close-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:1px;opacity:1}.modal-header{margin-bottom:var(--internal-spacing-md);padding-right:var(--internal-spacing-xl)}.modal-title{font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);margin:0;line-height:1.2}.modal-subtitle{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-top:var(--internal-spacing-xs);line-height:1.4}.modal-description{color:var(--internal-foreground);font-size:var(--internal-font-size-base);line-height:1.6;white-space:pre-wrap;margin:0}`;
18080
19277
 
18081
19278
  const CalendarIcon = () => (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, index.h("path", { d: "M8 2v4" }), index.h("path", { d: "M16 2v4" }), index.h("rect", { width: "18", height: "18", x: "3", y: "4", rx: "2" }), index.h("path", { d: "M3 10h18" })));
18082
19279
  const LocationIcon = () => (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, index.h("path", { d: "M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" }), index.h("circle", { cx: "12", cy: "10", r: "3" })));
19280
+ const InfoIcon = () => (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, index.h("circle", { cx: "12", cy: "12", r: "10" }), index.h("path", { d: "M12 16v-4" }), index.h("path", { d: "M12 8h.01" })));
19281
+ const CloseIcon = () => (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, index.h("path", { d: "M18 6 6 18" }), index.h("path", { d: "M6 6l12 12" })));
18083
19282
  const SessionsTicketing = class {
18084
19283
  constructor(hostRef) {
18085
19284
  index.registerInstance(this, hostRef);
@@ -18104,6 +19303,7 @@ const SessionsTicketing = class {
18104
19303
  quoteError = null;
18105
19304
  checkoutLoading = false;
18106
19305
  currentTheme = "light";
19306
+ openModalAdmissionId = null;
18107
19307
  checkoutInit;
18108
19308
  cartUpdate;
18109
19309
  errorOccurred;
@@ -18124,6 +19324,10 @@ const SessionsTicketing = class {
18124
19324
  if (this.mediaQueryList) {
18125
19325
  this.mediaQueryList.removeEventListener("change", this.handleSystemThemeChange);
18126
19326
  }
19327
+ // Clean up modal listener if component unmounts while modal is open
19328
+ if (this.openModalAdmissionId) {
19329
+ document.removeEventListener("keydown", this.handleModalKeyDown);
19330
+ }
18127
19331
  }
18128
19332
  async initializeComponent() {
18129
19333
  this.error = null;
@@ -18163,13 +19367,16 @@ const SessionsTicketing = class {
18163
19367
  trackEvent(eventType, properties = {}) {
18164
19368
  if (!this.analytics || !this.enableAnalytics)
18165
19369
  return;
19370
+ // Ensure required fields exist before tracking
19371
+ if (!this.event?.teamId || !this.event?.promoterId)
19372
+ return;
18166
19373
  this.analytics.track(eventType, {
18167
19374
  event_id: this.eventId,
18168
- team_id: this.event?.teamId,
18169
- promoter_id: this.event?.promoterId,
18170
- event_name: this.event?.name,
18171
- event_slug: this.event?.slug,
18172
- currency: this.event?.currency,
19375
+ team_id: this.event.teamId,
19376
+ promoter_id: this.event.promoterId,
19377
+ event_name: this.event.name,
19378
+ event_slug: this.event.slug,
19379
+ currency: this.event.currency,
18173
19380
  ...properties,
18174
19381
  });
18175
19382
  }
@@ -18451,6 +19658,26 @@ const SessionsTicketing = class {
18451
19658
  handleQuantityIncrease = async (admissionId, sectionId) => {
18452
19659
  await this.updateQuantity(admissionId, sectionId, 1);
18453
19660
  };
19661
+ openModal = (admissionId, e) => {
19662
+ e.stopPropagation();
19663
+ this.openModalAdmissionId = admissionId;
19664
+ document.addEventListener("keydown", this.handleModalKeyDown);
19665
+ };
19666
+ closeModal = () => {
19667
+ this.openModalAdmissionId = null;
19668
+ document.removeEventListener("keydown", this.handleModalKeyDown);
19669
+ };
19670
+ handleModalKeyDown = (e) => {
19671
+ if (e.key === "Escape") {
19672
+ this.closeModal();
19673
+ }
19674
+ };
19675
+ handleBackdropClick = (e) => {
19676
+ if (e.target instanceof HTMLElement &&
19677
+ e.target.classList.contains("modal-backdrop")) {
19678
+ this.closeModal();
19679
+ }
19680
+ };
18454
19681
  renderQuantityControls(admission, sectionId) {
18455
19682
  const key = `${admission.id}::${sectionId || "none"}`;
18456
19683
  const quantity = this.selectedItems.get(key) || 0;
@@ -18476,7 +19703,7 @@ const SessionsTicketing = class {
18476
19703
  const ariaLabel = section
18477
19704
  ? `${admission.name} in ${section.name} - ${isSoldOut ? "Sold Out" : this.formatPriceValue(basePrice)}`
18478
19705
  : `${admission.name} - ${isSoldOut ? "Sold Out" : this.formatPriceValue(basePrice)}`;
18479
- return (index.h("section", { class: `admission-card ${isSoldOut ? "sold-out" : ""} ${isStandaloneAdmission ? "solo-admission" : ""}`, key: key, tabindex: isSoldOut ? -1 : 0, "aria-label": ariaLabel }, index.h("div", { class: "admission-content" }, index.h("div", { class: "admission-details" }, index.h("h3", { class: "admission-title" }, admission.name), isStandaloneAdmission && (index.h(index.h.Fragment, null, this.renderEventTimeAndLocation(), this.renderPriceAndControls(admission, sectionId, isSoldOut))), section &&
19706
+ return (index.h("section", { class: `admission-card ${isSoldOut ? "sold-out" : ""} ${isStandaloneAdmission ? "solo-admission" : ""}`, key: key, tabindex: isSoldOut ? -1 : 0, "aria-label": ariaLabel }, index.h("div", { class: "admission-content" }, index.h("div", { class: "admission-details" }, index.h("div", { class: "admission-header" }, index.h("div", { class: "admission-header-text" }, index.h("h3", { class: "admission-title" }, admission.name), admission.subtitle && (index.h("p", { class: "admission-subtitle" }, admission.subtitle))), admission.description && (index.h("button", { type: "button", class: "more-info-badge", onClick: (e) => this.openModal(admission.id, e), "aria-label": `More info about ${admission.name}` }, InfoIcon(), index.h("span", null, "More info")))), isStandaloneAdmission && (index.h(index.h.Fragment, null, this.renderEventTimeAndLocation(), this.renderPriceAndControls(admission, sectionId, isSoldOut))), section &&
18480
19707
  this.renderPriceAndControls(admission, sectionId, isSoldOut)))));
18481
19708
  }
18482
19709
  renderSectionHeader(section, isSectionSoldOut) {
@@ -18537,6 +19764,16 @@ const SessionsTicketing = class {
18537
19764
  ? "Free"
18538
19765
  : this.formatPriceValue(this.quote.price?.total || 0))), index.h("button", { type: "button", class: "checkout-btn", onClick: () => this.initiateCheckout(), disabled: this.isCheckoutDisabled() }, this.getCheckoutButtonText())));
18539
19766
  }
19767
+ renderModal() {
19768
+ if (!this.openModalAdmissionId)
19769
+ return null;
19770
+ const admission = this.event?.admissions.find((a) => a.id === this.openModalAdmissionId);
19771
+ if (!admission)
19772
+ return null;
19773
+ return (
19774
+ // biome-ignore lint/a11y/noStaticElementInteractions lint/a11y/useKeyWithClickEvents: backdrop click-to-close is a common modal pattern, keyboard handled via Escape key
19775
+ index.h("div", { class: "modal-backdrop", onClick: this.handleBackdropClick }, index.h("div", { class: "modal-content", role: "dialog", "aria-modal": "true", "aria-labelledby": "modal-title" }, index.h("button", { type: "button", class: "modal-close-btn", onClick: () => this.closeModal(), "aria-label": "Close" }, CloseIcon()), index.h("div", { class: "modal-header" }, index.h("h2", { id: "modal-title", class: "modal-title" }, admission.name), admission.subtitle && (index.h("p", { class: "modal-subtitle" }, admission.subtitle))), index.h("p", { class: "modal-description" }, admission.description))));
19776
+ }
18540
19777
  renderTicketSections() {
18541
19778
  const generalAdmissions = this.event?.admissions.filter((adm) => !adm.sectionId) || [];
18542
19779
  return (index.h("div", { class: "tickets-wrapper" }, generalAdmissions.length > 0 && (index.h("div", { class: "unsectioned-admissions" }, generalAdmissions
@@ -18552,7 +19789,7 @@ const SessionsTicketing = class {
18552
19789
  return this.renderErrorState();
18553
19790
  if (!this.event)
18554
19791
  return this.renderNotFoundState();
18555
- return (index.h(index.Host, { "data-theme": this.currentTheme }, index.h("div", { class: "session-services-ticketing-container" }, this.renderTicketSections(), this.renderOrderSummary())));
19792
+ return (index.h(index.Host, { "data-theme": this.currentTheme }, index.h("div", { class: "session-services-ticketing-container" }, this.renderTicketSections(), this.renderOrderSummary()), this.renderModal()));
18556
19793
  }
18557
19794
  static get watchers() { return {
18558
19795
  "tenantId": ["propsChanged"],