@session-services/web-elements 0.1.17 → 0.1.19

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