gitifact 0.3.2 → 0.4.1

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 (61) hide show
  1. package/README.md +8 -1
  2. package/dist/browser/assets/BottomSheet-F2BUQwSi.js +1 -0
  3. package/dist/browser/assets/Card-C0juPkmX.js +1 -0
  4. package/dist/browser/assets/IconButton-CkA9oftf.js +1 -0
  5. package/dist/browser/assets/Markdown-D7VrGOLZ.js +68 -0
  6. package/dist/browser/assets/{MenuBottomSheet-BkRC4_VW.js → MenuBottomSheet-CQA7HL9k.js} +1 -1
  7. package/dist/browser/assets/MetadataListItem-DRZdPsPv.js +1 -0
  8. package/dist/browser/assets/Section-zmL2D3WL.js +1 -0
  9. package/dist/browser/assets/Table-DxOgh9uC.js +3 -0
  10. package/dist/browser/assets/TimestampHoverCard-DOWpOAzA.js +1 -0
  11. package/dist/browser/assets/about-K6mG2f8D.js +3 -0
  12. package/dist/browser/assets/changelog-7YrQ3ibl.js +2 -0
  13. package/dist/browser/assets/changelog-CxmMo2wk.css +1 -0
  14. package/dist/browser/assets/composeEventHandlers-CHIontwB.js +1 -0
  15. package/dist/browser/assets/container.stylex-oPimSCGl.js +1 -0
  16. package/dist/browser/assets/{contributors._email-bq12TRAr.js → contributors._email-PmuGt4HK.js} +1 -1
  17. package/dist/browser/assets/{contributors.index-eTu4P306.js → contributors.index-Du6gcymD.js} +1 -1
  18. package/dist/browser/assets/devWarning-BZMSgwyk.js +1 -0
  19. package/dist/browser/assets/document-B1QpmAOH.js +1 -0
  20. package/dist/browser/assets/document-D41OCO3e.css +1 -0
  21. package/dist/browser/assets/{features._featureId-CGRWLMyZ.js → features._featureId-DzAIhNyX.js} +1 -1
  22. package/dist/browser/assets/{requirements-DpTMK_Uu.js → features.index-D9wmqimq.js} +1 -1
  23. package/dist/browser/assets/git-cGldo_jC.js +1 -0
  24. package/dist/browser/assets/guides._documentId-BEv09vs4.js +1 -0
  25. package/dist/browser/assets/{guides.index-CFMN9ggJ.js → guides.index-tfySk9wY.js} +1 -1
  26. package/dist/browser/assets/index-B5Ql9tDp.js +56 -0
  27. package/dist/browser/assets/page-header-8LgEWnon.js +126 -0
  28. package/dist/browser/assets/product-BrvAWtBo.css +1 -0
  29. package/dist/browser/assets/product-Q9uoNMvu.js +8 -0
  30. package/dist/browser/assets/product.document-Bl25IX1S.js +1 -0
  31. package/dist/browser/assets/product.index-BwKqT4MY.js +1 -0
  32. package/dist/browser/assets/request-state-sfsdVRHj.js +1 -0
  33. package/dist/browser/assets/{features.index-_wXeEia1.js → requirements-B9rmmF27.js} +1 -1
  34. package/dist/browser/assets/{routes-jgWFqeRv.js → routes-COAEfNb7.js} +1 -1
  35. package/dist/browser/assets/settings-BvuMkHCB.css +1 -0
  36. package/dist/browser/assets/settings-Cv6WtTcC.js +1 -0
  37. package/dist/browser/assets/useDevWarning-Xg7kPMHJ.js +1 -0
  38. package/dist/browser/assets/useMediaQuery-DFlnKIlp.js +1 -0
  39. package/dist/browser/assets/useTranslator-DY2HN18N.js +4 -0
  40. package/dist/browser/index.html +19 -10
  41. package/dist/i18n/ko/block.md +2 -1
  42. package/dist/i18n/ko/changelog.md +25 -0
  43. package/dist/i18n/ko/docs/workflow.md +1 -1
  44. package/dist/main.js +289 -34
  45. package/package.json +1 -1
  46. package/dist/browser/assets/BottomSheet-CUR7U0gF.js +0 -1
  47. package/dist/browser/assets/IconButton-BqlnBu_N.js +0 -4
  48. package/dist/browser/assets/Markdown-C8BT0YZz.js +0 -68
  49. package/dist/browser/assets/Section-DQRr6JoK.js +0 -1
  50. package/dist/browser/assets/TimestampHoverCard-ClDQXGeS.js +0 -1
  51. package/dist/browser/assets/about-DMFBT-sA.js +0 -3
  52. package/dist/browser/assets/git-CTULSVR7.js +0 -1
  53. package/dist/browser/assets/guides._documentId-D3RCTjtd.js +0 -1
  54. package/dist/browser/assets/index-Cl1J8uRf.js +0 -56
  55. package/dist/browser/assets/page-header-CYf1yQV1.js +0 -127
  56. package/dist/browser/assets/product-BxZktNQM.js +0 -8
  57. package/dist/browser/assets/product-CV4EzacY.css +0 -1
  58. package/dist/browser/assets/product.index-AF24IXK3.js +0 -1
  59. package/dist/browser/assets/request-state-DzkYXwJR.js +0 -1
  60. package/dist/browser/assets/useDevWarning-CzR6rkf6.js +0 -1
  61. package/dist/browser/assets/useMediaQuery-C_nG4b-e.js +0 -1
package/dist/main.js CHANGED
@@ -4030,6 +4030,70 @@ function comparePreviewBundles(before, after) {
4030
4030
  return { specChanges: specs.specChanges, changes: [...specs.changes, ...compareDocumentSets(a.documents, b.documents)] };
4031
4031
  }
4032
4032
 
4033
+ // ../../packages/core/dist/formats/changelog.js
4034
+ var changelogSections = ["added", "changed", "removed", "fixed"];
4035
+ var versionLine = /^## (\d+)\.(\d+)\.(\d+) - (\d{4})-(\d{2})-(\d{2})$/;
4036
+ var sectionLine = /^### (Added|Changed|Removed|Fixed)$/;
4037
+ var itemLine = /^- (\S.*)$/;
4038
+ var realDate = (year, month, day) => {
4039
+ const date5 = new Date(Date.UTC(year, month - 1, day));
4040
+ return date5.getUTCFullYear() === year && date5.getUTCMonth() === month - 1 && date5.getUTCDate() === day;
4041
+ };
4042
+ function parseChangelog(text2) {
4043
+ const entries = [];
4044
+ let previous;
4045
+ let entry2;
4046
+ let section;
4047
+ const fail8 = (line, key, values = {}) => new InitError("INVALID_CHANGELOG", t("changelog.atLine", { line, reason: t(key, values) }));
4048
+ const lines = text2.replace(/\r\n/g, "\n").split("\n");
4049
+ const close = (line) => {
4050
+ if (entry2 && changelogSections.every((name) => entry2[name].length === 0))
4051
+ throw fail8(line, "changelog.emptyVersion", { version: entry2.version });
4052
+ };
4053
+ lines.forEach((raw, index) => {
4054
+ const line = index + 1;
4055
+ if (raw.trim() === "")
4056
+ return;
4057
+ const version2 = versionLine.exec(raw);
4058
+ if (version2) {
4059
+ close(line);
4060
+ const core = [Number(version2[1]), Number(version2[2]), Number(version2[3])];
4061
+ if (!realDate(Number(version2[4]), Number(version2[5]), Number(version2[6])))
4062
+ throw fail8(line, "changelog.invalidDate", { text: raw });
4063
+ if (previous && !(core[0] < previous[0] || core[0] === previous[0] && (core[1] < previous[1] || core[1] === previous[1] && core[2] < previous[2]))) {
4064
+ throw fail8(line, "changelog.order", { version: core.join(".") });
4065
+ }
4066
+ previous = core;
4067
+ section = void 0;
4068
+ entry2 = { version: core.join("."), date: version2[4] + "-" + version2[5] + "-" + version2[6], added: [], changed: [], removed: [], fixed: [] };
4069
+ entries.push(entry2);
4070
+ return;
4071
+ }
4072
+ const heading = sectionLine.exec(raw);
4073
+ if (heading) {
4074
+ if (!entry2)
4075
+ throw fail8(line, "changelog.sectionBeforeVersion");
4076
+ const name = heading[1].toLowerCase();
4077
+ if (entry2[name].length > 0)
4078
+ throw fail8(line, "changelog.duplicateSection", { section: heading[1] });
4079
+ section = name;
4080
+ return;
4081
+ }
4082
+ const item = itemLine.exec(raw);
4083
+ if (item) {
4084
+ if (!entry2 || !section)
4085
+ throw fail8(line, "changelog.itemOutsideSection");
4086
+ entry2[section].push(item[1].trimEnd());
4087
+ return;
4088
+ }
4089
+ throw fail8(line, "changelog.unknownLine", { text: raw });
4090
+ });
4091
+ close(lines.length);
4092
+ if (entries.length === 0)
4093
+ throw fail8(1, "changelog.noVersions");
4094
+ return entries;
4095
+ }
4096
+
4033
4097
  // ../../packages/core/dist/use-cases/edit-spec-preview.js
4034
4098
  var fail2 = (message) => {
4035
4099
  throw new SpecPreviewError(message);
@@ -24380,16 +24444,7 @@ var repositoryStatusFailureV1 = external_exports.strictObject({
24380
24444
  });
24381
24445
  var repositoryStatusV1 = external_exports.union([repositoryStatusSuccessV1, repositoryStatusFailureV1]);
24382
24446
 
24383
- // ../../packages/contracts/dist/versions/browser-session-v1.js
24384
- var browserSessionV1 = external_exports.strictObject({
24385
- contract: external_exports.literal("browser-session"),
24386
- version: external_exports.literal(1),
24387
- sessionId: external_exports.uuid(),
24388
- repository: external_exports.strictObject({
24389
- key: external_exports.string().regex(/^repo:[0-9a-f]{64}$/),
24390
- worktreeKey: external_exports.string().regex(/^worktree:[0-9a-f]{64}$/)
24391
- })
24392
- });
24447
+ // ../../packages/contracts/dist/versions/browser-http-error-v1.js
24393
24448
  var browserHttpErrorV1 = external_exports.strictObject({
24394
24449
  contract: external_exports.literal("browser-http-error"),
24395
24450
  version: external_exports.literal(1),
@@ -24489,6 +24544,42 @@ var changelogV1 = external_exports.strictObject({
24489
24544
  }
24490
24545
  });
24491
24546
 
24547
+ // ../../packages/contracts/dist/versions/browser-session-v2.js
24548
+ var release = external_exports.string().regex(/^\d+\.\d+\.\d+$/);
24549
+ var updateStateV1 = external_exports.strictObject({
24550
+ status: external_exports.enum(["checking", "available", "up-to-date", "unavailable", "disabled"]),
24551
+ latestVersion: release.nullable()
24552
+ }).refine((value) => (value.status === "available" || value.status === "up-to-date") === (value.latestVersion !== null), "latestVersion is set exactly when the check produced a result.");
24553
+ var browserSessionV2 = external_exports.strictObject({
24554
+ contract: external_exports.literal("browser-session"),
24555
+ version: external_exports.literal(2),
24556
+ sessionId: external_exports.uuid(),
24557
+ repository: external_exports.strictObject({
24558
+ key: external_exports.string().regex(/^repo:[0-9a-f]{64}$/),
24559
+ worktreeKey: external_exports.string().regex(/^worktree:[0-9a-f]{64}$/)
24560
+ }),
24561
+ // The running CLI, the same value as `gitifact --version`. A development build may carry a pre-release suffix.
24562
+ cliVersion: external_exports.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/),
24563
+ update: updateStateV1
24564
+ });
24565
+
24566
+ // ../../packages/contracts/dist/versions/update-v1.js
24567
+ var updateV1 = external_exports.discriminatedUnion("ok", [
24568
+ external_exports.strictObject({
24569
+ contract: external_exports.literal("update"),
24570
+ version: external_exports.literal(1),
24571
+ ok: external_exports.literal(true),
24572
+ cliVersion: external_exports.string().min(1),
24573
+ update: updateStateV1,
24574
+ // Present only when a newer release exists. The command is for npm global installs; other installs differ.
24575
+ install: external_exports.strictObject({ npmGlobal: external_exports.string().min(1) }).nullable(),
24576
+ // refreshed: blocks whose version line differed were rewritten. current: every block already matched.
24577
+ // not-initialized: no .gitifact config here, so only the version check ran. no-block: no file carries a block.
24578
+ agentDocs: external_exports.strictObject({ state: external_exports.enum(["refreshed", "current", "not-initialized", "no-block"]), paths: external_exports.array(external_exports.string()) })
24579
+ }),
24580
+ external_exports.strictObject({ contract: external_exports.literal("update"), version: external_exports.literal(1), ok: external_exports.literal(false), error: external_exports.strictObject({ code: external_exports.string(), message: external_exports.string() }) })
24581
+ ]);
24582
+
24492
24583
  // src/shared/i18n/ko/messages.json
24493
24584
  var messages_default2 = {
24494
24585
  "help.program": "\uD504\uB85C\uC81D\uD2B8\uC758 \uC694\uAD6C\uC0AC\uD56D\uACFC \uACB0\uC815 \uC774\uB825\uC744 Git\uC5D0 \uB0A8\uAE30\uB294 \uB3C4\uAD6C",
@@ -24717,7 +24808,24 @@ var messages_default2 = {
24717
24808
  "docs.summary.spec": "\uC0AC\uC6A9\uC790 \uC2A4\uD1A0\uB9AC\xB7\uC218\uC6A9 \uC870\uAC74 \uD615\uC2DD, ID \uADDC\uCE59, spec save \uC785\uB825",
24718
24809
  "docs.summary.design": "design.md \uBAA9\uCC28, \uCC38\uC870 \uC8FC\uC11D, \uAC1C\uC815 \uBC29\uC2DD",
24719
24810
  "docs.summary.product": "PRODUCT.md\uC640 guides \uBB38\uC11C\uC758 \uC5ED\uD560\uACFC \uC800\uC7A5 \uBA85\uB839",
24720
- "docs.summary.commit": "spec commit \uC785\uB825, \uC774\uC720 \uAE30\uB85D, \uC2E4\uD328 \uD6C4 \uBCF5\uAD6C"
24811
+ "docs.summary.commit": "spec commit \uC785\uB825, \uC774\uC720 \uAE30\uB85D, \uC2E4\uD328 \uD6C4 \uBCF5\uAD6C",
24812
+ "help.browserNoUpdateCheck": "\uC0C8 \uBC84\uC804 \uD655\uC778\uC744 \uC704\uD55C npm \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC870\uD68C\uB97C \uB054 (GITIFACT_NO_UPDATE_CHECK\uC640 \uAC19\uC74C)",
24813
+ "help.update": "\uC0C8 \uBC84\uC804 \uD655\uC778\uACFC \uC124\uCE58 \uBC29\uBC95 \uC548\uB0B4, \uD504\uB85C\uC81D\uD2B8 \uC9C0\uCE68 \uD30C\uC77C\uC758 GITIFACT \uBE14\uB85D\uC744 \uD604\uC7AC \uBC84\uC804\uC73C\uB85C \uAC31\uC2E0",
24814
+ "server.badLanguage": "\uC5B8\uC5B4 \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uC138\uC694.",
24815
+ "server.changelogNotFound": "\uD328\uCE58\uB178\uD2B8\uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
24816
+ "server.changelogUnreadable": "\uD328\uCE58\uB178\uD2B8\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
24817
+ "update.text.current": "\uD604\uC7AC \uBC84\uC804: {version}",
24818
+ "update.text.available": "\uC0C8 \uBC84\uC804: {version}",
24819
+ "update.text.upToDate": "\uCD5C\uC2E0 \uBC84\uC804\uC744 \uC0AC\uC6A9 \uC911\uC785\uB2C8\uB2E4.",
24820
+ "update.text.disabled": "\uC0C8 \uBC84\uC804 \uD655\uC778\uC774 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4.",
24821
+ "update.text.unavailable": "\uC0C8 \uBC84\uC804\uC744 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC744 \uD655\uC778\uD558\uC138\uC694.",
24822
+ "update.text.install": "npm \uC804\uC5ED \uC124\uCE58\uC6A9: {command}",
24823
+ "update.text.afterInstall": "\uC124\uCE58\uD55C \uB4A4 gitifact update\uB97C \uB2E4\uC2DC \uC2E4\uD589\uD558\uBA74 \uC9C0\uCE68 \uBE14\uB85D\uC774 \uC0C8 \uBC84\uC804\uC73C\uB85C \uAC31\uC2E0\uB429\uB2C8\uB2E4.",
24824
+ "update.text.blockRefreshed": "\uC9C0\uCE68 \uBE14\uB85D \uAC31\uC2E0: {paths}",
24825
+ "update.text.blockCurrent": "\uC9C0\uCE68 \uBE14\uB85D\uC740 \uC774\uBBF8 \uD604\uC7AC \uBC84\uC804\uC785\uB2C8\uB2E4: {paths}",
24826
+ "update.text.noBlock": "GITIFACT \uBE14\uB85D\uC774 \uC788\uB294 \uC9C0\uCE68 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. gitifact init\uC73C\uB85C \uC124\uCE58\uD558\uC138\uC694.",
24827
+ "update.text.notInitialized": "\uCD08\uAE30\uD654\uB41C \uD504\uB85C\uC81D\uD2B8\uAC00 \uC544\uB2C8\uC5B4\uC11C \uBC84\uC804\uB9CC \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4.",
24828
+ "update.failed": "\uC5C5\uB370\uC774\uD2B8 \uD655\uC778\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."
24721
24829
  };
24722
24830
 
24723
24831
  // src/shared/i18n/index.ts
@@ -24832,17 +24940,63 @@ function contentType(path3) {
24832
24940
 
24833
24941
  // src/server/status-session.ts
24834
24942
  import { randomUUID as randomUUID2 } from "node:crypto";
24835
- function createStatusSession(initial, read) {
24836
- const session = browserSessionV1.parse({
24837
- contract: "browser-session",
24838
- version: 1,
24839
- sessionId: randomUUID2(),
24840
- repository: { key: initial.repository.key, worktreeKey: initial.repository.worktreeKey }
24841
- });
24943
+
24944
+ // src/shared/update-check.ts
24945
+ var updateCheckTimeoutMs = 3e3;
24946
+ var release2 = /^(\d+)\.(\d+)\.(\d+)$/;
24947
+ var running = /^(\d+)\.(\d+)\.(\d+)(-[0-9A-Za-z.-]+)?$/;
24948
+ function isNewerRelease(latest, current) {
24949
+ const next = release2.exec(latest);
24950
+ const now = running.exec(current);
24951
+ if (!next || !now) return false;
24952
+ for (let index = 1; index <= 3; index++) {
24953
+ const difference = Number(next[index]) - Number(now[index]);
24954
+ if (difference !== 0) return difference > 0;
24955
+ }
24956
+ return now[4] !== void 0;
24957
+ }
24958
+ var updateCheckDisabled = (env, flagged = false) => flagged || env.GITIFACT_NO_UPDATE_CHECK !== void 0 && env.GITIFACT_NO_UPDATE_CHECK !== "" && env.GITIFACT_NO_UPDATE_CHECK !== "0";
24959
+ var checkingUpdate = { status: "checking", latestVersion: null };
24960
+ var disabledUpdate = { status: "disabled", latestVersion: null };
24961
+ async function resolveUpdate(current, fetchLatest, signal, timeoutMs = updateCheckTimeoutMs) {
24962
+ const controller = new AbortController();
24963
+ const abort = () => controller.abort();
24964
+ const timer = setTimeout(abort, timeoutMs);
24965
+ signal?.addEventListener("abort", abort, { once: true });
24966
+ if (signal?.aborted) controller.abort();
24967
+ try {
24968
+ const latest = await Promise.race([
24969
+ fetchLatest(controller.signal),
24970
+ new Promise((_resolve, reject) => {
24971
+ if (controller.signal.aborted) reject(new Error("aborted"));
24972
+ else controller.signal.addEventListener("abort", () => reject(new Error("aborted")), { once: true });
24973
+ })
24974
+ ]);
24975
+ if (typeof latest !== "string" || !release2.test(latest)) return { status: "unavailable", latestVersion: null };
24976
+ return { status: isNewerRelease(latest, current) ? "available" : "up-to-date", latestVersion: latest };
24977
+ } catch {
24978
+ return { status: "unavailable", latestVersion: null };
24979
+ } finally {
24980
+ clearTimeout(timer);
24981
+ signal?.removeEventListener("abort", abort);
24982
+ }
24983
+ }
24984
+ var npmGlobalInstall = (version2) => "npm install -g gitifact@" + version2;
24985
+
24986
+ // src/server/status-session.ts
24987
+ function createStatusSession(initial, read, cliVersion = "0.0.0") {
24988
+ const identity2 = { sessionId: randomUUID2(), repository: { key: initial.repository.key, worktreeKey: initial.repository.worktreeKey } };
24989
+ let update = disabledUpdate;
24842
24990
  let latest = initial;
24843
24991
  let pending;
24844
24992
  return {
24845
- session,
24993
+ // The identity never changes; only the update state moves (checking → a final state), so the session is built per read.
24994
+ get session() {
24995
+ return browserSessionV2.parse({ contract: "browser-session", version: 2, ...identity2, cliVersion, update });
24996
+ },
24997
+ setUpdate(next) {
24998
+ update = next;
24999
+ },
24846
25000
  get latest() {
24847
25001
  return latest;
24848
25002
  },
@@ -24854,7 +25008,7 @@ function createStatusSession(initial, read) {
24854
25008
  pending = (async () => {
24855
25009
  try {
24856
25010
  const next = await read();
24857
- if (next.repository.key !== session.repository.key || next.repository.worktreeKey !== session.repository.worktreeKey) {
25011
+ if (next.repository.key !== identity2.repository.key || next.repository.worktreeKey !== identity2.repository.worktreeKey) {
24858
25012
  throw new RepositoryReadError("REPOSITORY_CHANGED");
24859
25013
  }
24860
25014
  latest = next;
@@ -25432,6 +25586,10 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
25432
25586
  }
25433
25587
 
25434
25588
  // src/server/browser-server.ts
25589
+ var readBundledChangelog = (language) => readFile4(new URL("./i18n/" + language + "/changelog.md", import.meta.url), "utf8").catch((error62) => {
25590
+ if (error62.code === "ENOENT") return null;
25591
+ throw error62;
25592
+ });
25435
25593
  async function startBrowserServer(options) {
25436
25594
  const controller = new AbortController();
25437
25595
  const onAbort = () => controller.abort();
@@ -25451,11 +25609,13 @@ async function startBrowserServer(options) {
25451
25609
  options.signal?.removeEventListener("abort", onAbort);
25452
25610
  throw error62;
25453
25611
  }
25454
- const store = createStatusSession(initial, () => read(controller.signal));
25455
- const { session } = store;
25612
+ const store = createStatusSession(initial, () => read(controller.signal), options.cliVersion);
25613
+ const sessionId = store.session.sessionId;
25614
+ const readChangelog = options.readChangelog ?? readBundledChangelog;
25615
+ let updatePending;
25456
25616
  let closing = false;
25457
25617
  let origin = "";
25458
- const readSpecs = createSpecBrowserReader(initial.repository.rootPath, session.sessionId, options.env);
25618
+ const readSpecs = createSpecBrowserReader(initial.repository.rootPath, sessionId, options.env);
25459
25619
  function json2(response, status, value) {
25460
25620
  response.writeHead(status, { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store" });
25461
25621
  response.end(JSON.stringify(value) + "\n");
@@ -25493,7 +25653,7 @@ async function startBrowserServer(options) {
25493
25653
  const api = path3 === "/api" || path3.startsWith("/api/");
25494
25654
  if (api) {
25495
25655
  if (request.headers["sec-fetch-site"] === "cross-site" && !allowedOrigin) return fail8(response, 403, "FORBIDDEN", t2("server.crossSite"));
25496
- if (url2.search && path3 !== "/api/v1/specs") return fail8(response, 400, "BAD_REQUEST", t2("server.noQuery"));
25656
+ if (url2.search && path3 !== "/api/v1/specs" && path3 !== "/api/v1/changelog") return fail8(response, 400, "BAD_REQUEST", t2("server.noQuery"));
25497
25657
  if (path3.startsWith("/api/v1/product/assets/")) {
25498
25658
  const name = path3.slice("/api/v1/product/assets/".length);
25499
25659
  if (request.method !== "GET") {
@@ -25510,13 +25670,13 @@ async function startBrowserServer(options) {
25510
25670
  return;
25511
25671
  }
25512
25672
  const method = path3 === "/api/v1/status/refresh" ? "POST" : "GET";
25513
- if (!["/api/v1/session", "/api/v1/status", "/api/v1/status/refresh", "/api/v1/specs"].includes(path3)) return fail8(response, 404, "NOT_FOUND", t2("server.apiNotFound"));
25673
+ if (!["/api/v1/session", "/api/v1/status", "/api/v1/status/refresh", "/api/v1/specs", "/api/v1/changelog"].includes(path3)) return fail8(response, 404, "NOT_FOUND", t2("server.apiNotFound"));
25514
25674
  if (request.method !== method) {
25515
25675
  response.setHeader("Allow", method);
25516
25676
  return fail8(response, 405, "METHOD_NOT_ALLOWED", t2("server.methodNotAllowed"));
25517
25677
  }
25518
- if (path3 === "/api/v1/session") return json2(response, 200, session);
25519
- if (request.headers["x-gitifact-session"] !== session.sessionId) return fail8(response, 409, "SESSION_CHANGED", t2("server.sessionChanged"));
25678
+ if (path3 === "/api/v1/session") return json2(response, 200, store.session);
25679
+ if (request.headers["x-gitifact-session"] !== sessionId) return fail8(response, 409, "SESSION_CHANGED", t2("server.sessionChanged"));
25520
25680
  if (path3 === "/api/v1/specs") {
25521
25681
  const cursor = url2.searchParams.get("cursor") ?? "0";
25522
25682
  const head = url2.searchParams.get("head");
@@ -25528,6 +25688,19 @@ async function startBrowserServer(options) {
25528
25688
  }
25529
25689
  return;
25530
25690
  }
25691
+ if (path3 === "/api/v1/changelog") {
25692
+ const language = url2.searchParams.get("lang") ?? defaultLanguage2;
25693
+ if ([...url2.searchParams.keys()].some((key) => key !== "lang") || url2.searchParams.getAll("lang").length > 1 || !/^[a-z]{2}(?:-[A-Z]{2})?$/.test(language)) return fail8(response, 400, "BAD_REQUEST", t2("server.badLanguage"));
25694
+ try {
25695
+ const own2 = await readChangelog(language);
25696
+ const text2 = own2 ?? (language === defaultLanguage2 ? null : await readChangelog(defaultLanguage2));
25697
+ if (text2 === null) return fail8(response, 404, "NOT_FOUND", t2("server.changelogNotFound"));
25698
+ json2(response, 200, changelogV1.parse({ contract: "changelog", version: 1, language: own2 === null ? defaultLanguage2 : language, fallback: own2 === null, entries: parseChangelog(text2) }));
25699
+ } catch (error62) {
25700
+ fail8(response, 503, "INTERNAL_ERROR", error62 instanceof Error ? error62.message : t2("server.changelogUnreadable"));
25701
+ }
25702
+ return;
25703
+ }
25531
25704
  if (method === "POST" && !allowedOrigin) return fail8(response, 403, "FORBIDDEN", t2("server.refreshOrigin"));
25532
25705
  const value = method === "POST" ? await store.refresh() : store.latest;
25533
25706
  if (!response.destroyed) json2(response, value.ok ? 200 : 503, value);
@@ -25573,6 +25746,12 @@ async function startBrowserServer(options) {
25573
25746
  const address = server.address();
25574
25747
  if (!address || typeof address === "string") throw new Error(t2("server.addressUnknown"));
25575
25748
  origin = "http://127.0.0.1:" + address.port;
25749
+ if (options.fetchLatest) {
25750
+ store.setUpdate(checkingUpdate);
25751
+ updatePending = resolveUpdate(store.session.cliVersion, options.fetchLatest, controller.signal, options.updateCheckTimeoutMs).then((state) => {
25752
+ store.setUpdate(state);
25753
+ });
25754
+ }
25576
25755
  let resolveClosed;
25577
25756
  const closed = new Promise((resolve) => {
25578
25757
  resolveClosed = resolve;
@@ -25588,6 +25767,7 @@ async function startBrowserServer(options) {
25588
25767
  server.closeAllConnections();
25589
25768
  });
25590
25769
  await store.pending;
25770
+ await updatePending;
25591
25771
  options.signal?.removeEventListener("abort", onAbort);
25592
25772
  options.signal?.removeEventListener("abort", closeOnAbort);
25593
25773
  resolveClosed();
@@ -25599,15 +25779,28 @@ async function startBrowserServer(options) {
25599
25779
  };
25600
25780
  options.signal?.addEventListener("abort", closeOnAbort, { once: true });
25601
25781
  if (options.signal?.aborted) void close();
25602
- return { url: origin, session, close, closed };
25782
+ return { url: origin, get session() {
25783
+ return store.session;
25784
+ }, close, closed };
25603
25785
  }
25604
25786
 
25787
+ // src/adapters/registry/latest-version.ts
25788
+ var manifestUrl = "https://registry.npmjs.org/gitifact";
25789
+ var fetchLatestVersion = async (signal) => {
25790
+ const response = await fetch(manifestUrl, { signal, redirect: "error", headers: { Accept: "application/vnd.npm.install-v1+json" } });
25791
+ if (!response.ok) throw new Error("registry status " + response.status);
25792
+ const manifest = await response.json();
25793
+ const latest = manifest["dist-tags"]?.latest;
25794
+ if (typeof latest !== "string") throw new Error("registry answer has no latest tag");
25795
+ return latest;
25796
+ };
25797
+
25605
25798
  // src/commands/browser.ts
25606
25799
  function parsePort(value) {
25607
25800
  if (!/^\d+$/.test(value) || Number(value) > 65535) throw new InvalidArgumentError(t2("browser.invalidPort"));
25608
25801
  return Number(value);
25609
25802
  }
25610
- async function runBrowser(options) {
25803
+ async function runBrowser(options, version2) {
25611
25804
  const controller = new AbortController();
25612
25805
  const stop = () => controller.abort();
25613
25806
  process.once("SIGINT", stop);
@@ -25617,7 +25810,10 @@ async function runBrowser(options) {
25617
25810
  cwd: process.cwd(),
25618
25811
  port: options.port,
25619
25812
  dev: options.dev ?? false,
25620
- signal: controller.signal
25813
+ signal: controller.signal,
25814
+ cliVersion: version2,
25815
+ // --no-update-check or GITIFACT_NO_UPDATE_CHECK keeps the server from contacting the npm registry.
25816
+ ...updateCheckDisabled(process.env, options.updateCheck === false) ? {} : { fetchLatest: fetchLatestVersion }
25621
25817
  });
25622
25818
  if (!controller.signal.aborted) process.stdout.write(server.url + "/\n");
25623
25819
  await server.closed;
@@ -25892,7 +26088,7 @@ async function planAgentDocs(root, options) {
25892
26088
  return { mode: "remove", paths: paths2, writes };
25893
26089
  }
25894
26090
  const block = await renderAgentBlock(options.version, options);
25895
- const { inject, create } = resolveAgentPaths(options.agent, existing);
26091
+ const { inject, create } = options.onlyExisting ? { inject: candidatePaths.filter((path3) => existing.has(path3) && findBlock(existing.get(path3)) && !isWrapperFile(existing.get(path3))), create: null } : resolveAgentPaths(options.agent, existing);
25896
26092
  for (const path3 of inject) {
25897
26093
  const previous = existing.get(path3);
25898
26094
  const next = injectBlock(previous, block, boilerplateFor(path3));
@@ -26004,6 +26200,64 @@ ${t2("init.text.agentDocs")}: ${docs}
26004
26200
  }
26005
26201
  }
26006
26202
 
26203
+ // src/commands/update.ts
26204
+ async function refreshBlocks(cwd, version2, env, controls) {
26205
+ const repo = initRepository(cwd, env);
26206
+ let first;
26207
+ let config2;
26208
+ try {
26209
+ first = await repo.inspect();
26210
+ config2 = await readConfigFile(first.state.repository.rootPath);
26211
+ } catch (error62) {
26212
+ if (error62 instanceof RepositoryReadError && error62.code === "NOT_A_REPOSITORY" || error62 instanceof InitError && error62.code === "MIGRATION_REQUIRED") return { state: "not-initialized", paths: [] };
26213
+ throw error62;
26214
+ }
26215
+ if (config2 === void 0) return { state: "not-initialized", paths: [] };
26216
+ const root = first.state.repository.rootPath;
26217
+ const plan = await planAgentDocs(root, { version: version2, onlyExisting: true, ...controls });
26218
+ if (plan.paths.length === 0) return { state: "no-block", paths: [] };
26219
+ if (plan.writes.length === 0) return { state: "current", paths: plan.paths };
26220
+ const unchanged = async () => {
26221
+ if ((await repo.inspect()).stamp !== first.stamp || await readConfigFile(root) !== config2) throw new InitError("INPUT_CHANGED", t2("init.inputChanged"));
26222
+ };
26223
+ return { state: "refreshed", paths: await applyAgentDocs(root, plan, unchanged) };
26224
+ }
26225
+ async function updateCommand(cwd, version2, env = process.env, controls = {}) {
26226
+ const [update, agentDocs] = await Promise.all([
26227
+ updateCheckDisabled(env) ? disabledUpdate : resolveUpdate(version2, controls.fetchLatest ?? fetchLatestVersion, void 0, controls.timeoutMs),
26228
+ refreshBlocks(cwd, version2, env, controls)
26229
+ ]);
26230
+ return updateV1.parse({
26231
+ contract: "update",
26232
+ version: 1,
26233
+ ok: true,
26234
+ cliVersion: version2,
26235
+ update,
26236
+ install: update.status === "available" ? { npmGlobal: npmGlobalInstall(update.latestVersion) } : null,
26237
+ agentDocs
26238
+ });
26239
+ }
26240
+ async function runUpdate(options, version2) {
26241
+ try {
26242
+ const dto = await updateCommand(process.cwd(), version2);
26243
+ if (!dto.ok) throw new Error("unreachable");
26244
+ if (options.format !== "text") {
26245
+ process.stdout.write(JSON.stringify(dto) + "\n");
26246
+ return;
26247
+ }
26248
+ const lines = [t2("update.text.current", { version: dto.cliVersion })];
26249
+ lines.push(dto.update.status === "available" ? t2("update.text.available", { version: dto.update.latestVersion }) : dto.update.status === "up-to-date" ? t2("update.text.upToDate") : dto.update.status === "disabled" ? t2("update.text.disabled") : t2("update.text.unavailable"));
26250
+ if (dto.install) lines.push(t2("update.text.install", { command: dto.install.npmGlobal }), t2("update.text.afterInstall"));
26251
+ lines.push(dto.agentDocs.state === "refreshed" ? t2("update.text.blockRefreshed", { paths: dto.agentDocs.paths.join(", ") }) : dto.agentDocs.state === "current" ? t2("update.text.blockCurrent", { paths: dto.agentDocs.paths.join(", ") }) : dto.agentDocs.state === "no-block" ? t2("update.text.noBlock") : t2("update.text.notInitialized"));
26252
+ process.stdout.write(lines.join("\n") + "\n");
26253
+ } catch (error62) {
26254
+ const known = error62 instanceof InitError || error62 instanceof RepositoryReadError;
26255
+ const failure2 = { code: known ? error62.code : "UPDATE_FAILED", message: known ? error62.message : t2("update.failed") };
26256
+ process.stderr.write(options.format === "text" ? failure2.code + ": " + failure2.message + "\n" : JSON.stringify(updateV1.parse({ contract: "update", version: 1, ok: false, error: failure2 })) + "\n");
26257
+ process.exitCode = 1;
26258
+ }
26259
+ }
26260
+
26007
26261
  // src/commands/spec-preview.ts
26008
26262
  import { join as join12 } from "node:path";
26009
26263
  import { readFile as readFile12, stat as stat2 } from "node:fs/promises";
@@ -26682,15 +26936,16 @@ async function runMigrate(options) {
26682
26936
  }
26683
26937
 
26684
26938
  // src/main.ts
26685
- var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.3.2").allowExcessArguments(false).addHelpText("after", "\n" + t2("help.notYet")).action(() => program2.outputHelp());
26939
+ var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.4.1").allowExcessArguments(false).addHelpText("after", "\n" + t2("help.notYet")).action(() => program2.outputHelp());
26686
26940
  program2.command("status").description(t2("help.status")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action(async (options) => {
26687
26941
  await runStatus(options.format);
26688
26942
  });
26689
- program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).action(runBrowser);
26690
- program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.3.2"));
26943
+ program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).option("--no-update-check", t2("help.browserNoUpdateCheck")).action((options) => runBrowser(options, "0.4.1"));
26944
+ program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.4.1"));
26691
26945
  program2.command("docs").description(t2("help.docs")).argument("[topic]", t2("help.docsTopic")).allowExcessArguments(false).action(async (topic) => {
26692
26946
  await runDocs(topic);
26693
26947
  });
26948
+ program2.command("update").description(t2("help.update")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runUpdate(options, "0.4.1"));
26694
26949
  program2.command("migrate").description(t2("help.migrate")).allowExcessArguments(false).option("--dry-run", t2("help.migrateDryRun")).action(runMigrate);
26695
26950
  var spec = program2.command("spec").description(t2("help.spec"));
26696
26951
  var replaced = t2("help.deprecated");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitifact",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Git-backed requirements and change history for coding agents.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- import{K as e,V as t,X as n,_ as r,c as i,l as a,n as o,q as s}from"./themeProps-MQSlTycI.js";import{a as c,t as l}from"./useMediaQuery-C_nG4b-e.js";import{t as u}from"./useDevWarning-CzR6rkf6.js";import{t as d}from"./useScrollLock-CrQ0xkil.js";var f=n(s(),1),p=/^(\d+(?:\.\d+)?|\.\d+)(px|%)$/i;function m(e,t){if(typeof e==`number`)return Number.isFinite(e)&&e>0&&e<=1?e*t:null;let n=p.exec(e.trim());if(n===null)return null;let r=Number.parseFloat(n[1]);return r>0?n[2].toLowerCase()===`%`?r/100*t:r:null}function h(e){return m(e,1)!==null}function g(e,t){let n=[];for(let r of e){let e=m(r,t);e!==null&&n.push(e)}return n}function _(e,t,n=48){let r=[0,...t.filter(t=>t>0&&t<e).map(t=>e-t)].sort((e,t)=>e-t),i=[];for(let e of r){let t=i[i.length-1];(t===void 0||e-t>=n)&&i.push(e)}return i}function v(e,t){return t.reduce((t,n)=>Math.abs(n-e)<Math.abs(t-e)?n:t,t[0])}var y=.3;function ee(e,t){if(e.length<2||t<=0)return null;let n=e[e.length-1];return t-n<=.25*t?n:null}function b(e,t,n,r){let i=r!==null,a=i?t[t.length-2]:t[t.length-1],o=i?r:n,s=i?y:0;return e<=a?1:e>=o?s:1-(1-s)*((e-a)/(o-a))}function x(e,t,n,r){let i=t;if(n>0){let e=t.filter(e=>e>=r);e.length>0&&(i=e)}else if(n<0){let e=t.filter(e=>e<=r);e.length>0&&(i=e)}return v(e,i)}var S=`--_sheet-keyboard-inset`,C=new Set([`button`,`checkbox`,`color`,`file`,`hidden`,`image`,`radio`,`range`,`reset`,`submit`]);function w(){return window.visualViewport?.height??window.innerHeight}function T(){return w()>=window.innerHeight-.5}function te(){let e=window.navigator.userAgent;return/iPad|iPhone|iPod/.test(e)||e.includes(`Macintosh`)&&window.navigator.maxTouchPoints>1}function E(e){return e instanceof HTMLTextAreaElement?!e.disabled&&!e.readOnly:e instanceof HTMLInputElement?!e.disabled&&!e.readOnly&&!C.has((e.getAttribute(`type`)??`text`).toLowerCase()):e instanceof HTMLElement&&e.matches(`[contenteditable]:not([contenteditable="false"])`)}function D(e,t){if(!(e instanceof Element))return null;let n=e.closest(`input, textarea, [contenteditable]:not([contenteditable="false"])`);if(t.contains(n)&&E(n))return n;let r=e.closest(`label`),i=r instanceof HTMLLabelElement?r.control:null;return t.contains(i)&&E(i)?i:null}function O({bodyRef:e,bottomClearance:t,isEnabled:n,isFullyExpanded:r,isPageScrollLocked:i,isSheetTraveling:a,isOpen:o,isPresented:s,sheetRef:c}){let l=(0,f.useRef)(!1),u=(0,f.useRef)(!1),d=(0,f.useRef)(r),p=(0,f.useRef)(o);d.current=r,p.current=o,(0,f.useEffect)(()=>{if(!n||!a)return;let e=c.current,t=document.activeElement;e&&t instanceof HTMLElement&&t!==e&&e.contains(t)&&(u.current=l.current,e.focus({preventScroll:!0}))},[n,a,c]),(0,f.useEffect)(()=>{if(!n||!s||o)return;let e=c.current,t=document.activeElement;e&&t instanceof HTMLElement&&t!==e&&e.contains(t)&&(u.current=l.current,t.blur())},[n,o,s,c]),(0,f.useEffect)(()=>{let r=e.current,a=c.current;if(!n||!s||!r)return;let o=null,f=null,m=te(),h=()=>{r.style.setProperty(S,`0px`),o=null,f=null,l.current=!1,u.current=!1},g=(e,t)=>{if(typeof r.scrollBy!=`function`){r.scrollTop+=e;return}let n=typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;r.scrollBy({top:e,behavior:t&&!n?`smooth`:`instant`})},_=(e,n)=>{let i=r.getBoundingClientRect(),a=e.getBoundingClientRect(),o=w(),s=Math.max(0,i.bottom-o)>0?t:0,c=i.top,l=Math.min(i.bottom,o-s);l<=c||(a.bottom>l?g(a.bottom-l,n):a.top<c&&g(a.top-c,n))},v=e=>{let n=w();if(T()){h();return}if(Math.max(0,e.bodyBottom-n)===0){h();return}let i=Math.max(0,e.bodyBottom-(n-t));r.style.setProperty(S,`${i}px`)},y=e=>{if(!d.current)return;let t=D(e.relatedTarget,r);if(t){t!==document.activeElement&&t.focus({preventScroll:!0});return}let n=D(e.target,r);p.current&&n&&!e.relatedTarget&&a?.focus({preventScroll:!0})},ee=()=>{let e=document.activeElement;if(!d.current||!(e instanceof HTMLElement)||!r.contains(e)||!E(e)){if(u.current&&o){v(o);return}h();return}u.current=!1;let n=r.getBoundingClientRect(),a=w(),s=Math.max(0,n.bottom-a),c=s>0?t:0;o=s>0?{bodyBottom:n.bottom}:null,i&&s>0&&!l.current&&(f={x:window.scrollX,y:window.scrollY}),l.current=s>0;let p=s>0?Math.max(0,n.bottom-(a-c)):0;r.style.setProperty(S,`${p}px`),_(e,s>0)},b=0,x=()=>{cancelAnimationFrame(b),b=requestAnimationFrame(ee)},C=()=>{let e=f;if(e==null||window.scrollX===e.x&&window.scrollY===e.y)return;window.scrollTo(e.x,e.y);let t=document.activeElement;t instanceof HTMLElement&&r.contains(t)&&E(t)&&_(t,!1)},O=typeof ResizeObserver>`u`?null:new ResizeObserver(x),k=()=>{if(!O)return;O.disconnect();let e=new Set([r]);a&&e.add(a);for(let t of r.children)e.add(t);let t=document.activeElement;if(t instanceof HTMLElement&&r.contains(t))for(let n=t;n&&n!==r;n=n.parentElement)e.add(n);for(let t of e)O.observe(t)},A=typeof MutationObserver>`u`?null:new MutationObserver(e=>{e.every(e=>e.type===`attributes`&&e.target===r)||(k(),x())}),j=()=>{k(),x()},M=()=>{u.current=l.current,x()},ne=e=>{e.target===a&&e.propertyName===`transform`&&x()},N=window.visualViewport;return m&&document.addEventListener(`blur`,y,!0),r.addEventListener(`focusin`,j),r.addEventListener(`focusout`,M),a?.addEventListener(`transitionend`,ne),N?.addEventListener(`resize`,x),N?.addEventListener(`scroll`,x),window.addEventListener(`scroll`,C),window.addEventListener(`resize`,x),A?.observe(r,{attributes:!0,characterData:!0,childList:!0,subtree:!0}),k(),x(),()=>{cancelAnimationFrame(b),m&&document.removeEventListener(`blur`,y,!0),r.removeEventListener(`focusin`,j),r.removeEventListener(`focusout`,M),a?.removeEventListener(`transitionend`,ne),N?.removeEventListener(`resize`,x),N?.removeEventListener(`scroll`,x),window.removeEventListener(`scroll`,C),window.removeEventListener(`resize`,x),O?.disconnect(),A?.disconnect(),r.style.removeProperty(S),l.current=!1,u.current=!1}},[e,t,n,i,s,c])}var k=1.2,A=48,j=.4,M=40;function ne(e){return e.syntheticTouch===!0}var N=.35,re=4,ie=8;function ae(){typeof navigator>`u`||typeof navigator.vibrate!=`function`||ue()||navigator.vibrate(8)}function oe(e,t){let n=t[0],r=Math.abs(e-n);for(let i of t){let t=Math.abs(e-i);t<r&&(r=t,n=i)}if(r>=M)return e;let i=r/M,a=1-i*i;return e+(n-e)*a}function se(e,t,n){return Math.max(0,e-t-n)}function ce(e){let t=Number.parseFloat(getComputedStyle(e).paddingBlockEnd);return Number.isFinite(t)?t:0}function le(e){if(!e)return 0;let t=ce(e);return Math.max(0,e.scrollHeight-e.clientHeight-t)-e.scrollTop}function P(e,t,n){return Math.max(0,e-n-t)}function ue(){return typeof window>`u`||!window.matchMedia?!1:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function de({isOpen:e,canDismiss:t=!0,offscreenBlockEndInset:n=0,onDismiss:r,snapHeights:i,onSnap:a,onScrimOpacity:o}){let[s,c]=(0,f.useState)(0),[u,d]=(0,f.useState)(0),[p,m]=(0,f.useState)(!1),[h,g]=(0,f.useState)(0),[v,y]=(0,f.useState)(0),[S,C]=(0,f.useState)(0),w=(0,f.useRef)(0),T=(0,f.useRef)(0),[te,E]=(0,f.useState)(null),[D,O]=(0,f.useState)(!1),M=(0,f.useRef)(0),de=(0,f.useRef)(null),F=(0,f.useRef)(null),I=(0,f.useRef)(n);I.current=Math.max(0,n);let L=(0,f.useCallback)(e=>{let t=Math.max(0,e);w.current=t,C(t)},[]),R=(0,f.useCallback)(e=>{let t=Math.max(0,e);Math.abs(t-M.current)>.5&&(M.current=t,y(t))},[]),fe=(0,f.useCallback)(()=>{O(!0),de.current=null,E(null);let e=F.current;F.current=null,e!=null&&R(e)},[R]),z=(0,f.useCallback)((e,t,n,r,i,a,o)=>{let s=se(e,n,a);if(o&&Math.abs(r-t)>.5&&!ue()){F.current=s,de.current=i,E(i);return}F.current=null,de.current=null,E(null),O(Math.abs(i-n)>.5),R(s)},[R]),pe=(0,f.useRef)(0);pe.current=p?s:u;let B=(0,f.useRef)(e);B.current=e;let me=(0,f.useRef)(i);me.current=i;let he=(0,f.useRef)(r),ge=(0,f.useRef)(t),V=(0,f.useRef)(a),H=(0,f.useRef)(o);(0,f.useEffect)(()=>{he.current=r,ge.current=t,V.current=a,H.current=o});let U=(0,f.useRef)(null),W=(0,f.useRef)(0),G=(0,f.useRef)(null),K=(0,f.useRef)(null),q=(0,f.useRef)(null);(0,f.useLayoutEffect)(()=>{if(!D)return;G.current?.offsetHeight;let e=requestAnimationFrame(()=>{O(!1)});return()=>cancelAnimationFrame(e)},[D]);let J=(0,f.useCallback)(e=>{e<=0||!B.current||pe.current>0||(W.current=e,g(t=>t===e?t:e))},[]),_e=(0,f.useCallback)(e=>{if(q.current?.disconnect(),q.current=null,G.current=e,!e||typeof ResizeObserver>`u`){e&&J(e.getBoundingClientRect().height);return}J(e.getBoundingClientRect().height);let t=new ResizeObserver(e=>{let t=e[0];if(t){let e=t.borderBoxSize?.[0]?.blockSize;J(e??t.target.getBoundingClientRect().height)}});t.observe(e),q.current=t},[J]);(0,f.useEffect)(()=>()=>q.current?.disconnect(),[]),(0,f.useEffect)(()=>{e&&(c(0),d(0),m(!1),O(!1),L(0),T.current=0,M.current=0,de.current=null,F.current=null,y(0),E(null))},[e,L]);let Y=(0,f.useCallback)(()=>W.current>0?W.current:G.current?.getBoundingClientRect().height??0,[]),X=(0,f.useCallback)(e=>{let t=P(e,0,I.current),n=_(t,me.current?.()??[]);return{offsets:n,peekOffset:ee(n,t)}},[]),ve=(0,f.useCallback)(()=>{let e=G.current;if(!e)return W.current;let t=e.style.height;if(t===``)return e.getBoundingClientRect().height;e.style.height=``;let n=e.getBoundingClientRect().height;return e.style.height=t,n},[]),ye=(0,f.useCallback)(()=>{if(!B.current||U.current!=null||de.current!=null)return;let e=ve();if(e<=0)return;let{offsets:t,peekOffset:n}=X(e),r=Math.min(T.current,t.length-1),i=t[r],a=i===n?0:i,o=w.current;if(e===W.current&&Math.abs(i-pe.current)<=.5&&Math.abs(a-o)<=.5)return;W.current=e,g(e),T.current=r,z(o,i,a,i,o,le(K.current),!1),L(a),d(i),V.current?.(P(e,i,I.current));let s=t[t.length-1],c=P(e,s,I.current);H.current?.(b(i,t,s+c*j,n))},[ve,z,L,X]);(0,f.useEffect)(()=>{if(!(!e||typeof window>`u`))return window.addEventListener(`resize`,ye),window.addEventListener(`orientationchange`,ye),()=>{window.removeEventListener(`resize`,ye),window.removeEventListener(`orientationchange`,ye)}},[e,ye]);let Z=(0,f.useRef)(!1);(0,f.useLayoutEffect)(()=>{if(!Z.current){Z.current=!0;return}ye()},[ye,i]);let Q=(0,f.useCallback)(e=>{let t=U.current;if(t==null)return;U.current=null,e?.hasPointerCapture?.(t.pointerId)&&e.releasePointerCapture(t.pointerId),c(t.baseOffset),m(!1),z(t.baseLayoutOffset,t.baseOffset,t.baseLayoutOffset,t.renderedOffset,t.layoutOffset,t.naturalEndGap,!0);let{offsets:n,peekOffset:r}=X(t.height),i=n[n.length-1],a=i+P(t.height,i,I.current)*j;H.current?.(b(t.baseOffset,n,a,r))},[z,X]);(0,f.useEffect)(()=>{let e=()=>Q(),t=()=>{document.visibilityState===`hidden`&&Q()};return window.addEventListener(`blur`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`blur`,e),document.removeEventListener(`visibilitychange`,t)}},[Q]);let be=(0,f.useCallback)((e,t,n,r,i,a,o,s,l,u)=>{let{offsets:f,peekOffset:p}=X(n),m=f[f.length-1],h=P(n,m,I.current),g=Math.abs(t)>k&&i>A,_=e=>{let t=e===p?0:e;z(o,e,t,s,l,u,!0),L(t),T.current=Math.max(0,f.indexOf(e)),d(e),V.current?.(P(n,e,I.current));let r=m+h*j;H.current?.(b(e,f,r,p)),e!==a&&ae()};if(r>0&&g){ge.current?(z(o,a,o,o,o,u,!1),he.current()):_(m);return}if(r<0&&g){z(o,0,0,s,l,u,!0),L(0),T.current=0,c(0),d(0),V.current?.(P(n,0,I.current)),H.current?.(1),ae();return}if(e>m+h*j){ge.current?(z(o,a,o,o,o,u,!1),he.current()):_(m);return}_(x(e,f,r,a))},[z,L,X]),$=(0,f.useCallback)((e,t,n)=>{let r=e.currentTarget,i=ne(e);i||r.setPointerCapture?.(e.pointerId);let a=n??e.clientY,o=le(K.current),s=w.current;U.current={syntheticTouch:i,pointerId:e.pointerId,startCoord:a,lastCoord:e.clientY,lastTime:e.timeStamp,velocity:0,height:t,baseOffset:u,baseLayoutOffset:s,renderedOffset:u,layoutOffset:s,naturalEndGap:o},R(se(s,s,o)),c(u),m(!0)},[u,R]),xe=(0,f.useCallback)(e=>{e.button===0&&e.isPrimary&&(e.preventDefault(),$(e,Y()))},[$,Y]),Se=(0,f.useCallback)(e=>{U.current!=null&&(e.preventDefault(),Q(e.currentTarget))},[Q]),Ce=(0,f.useCallback)(e=>{U.current?.syntheticTouch||U.current?.pointerId===e.pointerId&&Q()},[Q]),we=(0,f.useCallback)(e=>{let t=U.current;if(!t||t.pointerId!==e.pointerId||t.syntheticTouch&&!ne(e))return;let n=e.clientY-t.startCoord,r=e.timeStamp-t.lastTime;r>0&&(t.velocity=(e.clientY-t.lastCoord)/r,t.lastCoord=e.clientY,t.lastTime=e.timeStamp);let{offsets:i,peekOffset:a}=X(t.height),o=t.baseOffset+n,s=i[i.length-1],l;l=o<0?Math.max(-48,o*N):o>s?o:oe(o,i);let u=l<t.baseOffset?0:t.baseLayoutOffset;t.renderedOffset=l,t.layoutOffset=u,c(l),R(se(t.baseLayoutOffset,u,t.naturalEndGap));let d=i[i.length-1],f=d+P(t.height,d,I.current)*j;H.current?.(b(l,i,f,a))},[X,R]),Te=(0,f.useCallback)(e=>{let t=U.current;if(!t||t.pointerId!==e.pointerId||t.syntheticTouch&&!ne(e))return;let n=e.currentTarget,r=e.clientY-t.startCoord,i=Math.max(0,t.baseOffset+r),a=r===0?0:r>0?1:-1;U.current=null,t.syntheticTouch||n.releasePointerCapture?.(e.pointerId),m(!1),be(i,t.velocity,t.height||1,a,Math.abs(r),t.baseOffset,t.baseLayoutOffset,t.renderedOffset,t.layoutOffset,t.naturalEndGap)},[be]),Ee=(0,f.useRef)(null),De=(0,f.useCallback)(e=>{if(e.button!==0||!e.isPrimary)return;let t=e.currentTarget;if(t.scrollTop>0){Ee.current=null;return}Ee.current={pointerId:e.pointerId,startCoord:e.clientY,scroller:t}},[]),Oe=(0,f.useCallback)(e=>{if(U.current){we(e);return}let t=Ee.current;if(!t||t.pointerId!==e.pointerId)return;let n=e.clientY-t.startCoord;n>ie&&t.scroller.scrollTop<=0?(Ee.current=null,$(e,Y(),t.startCoord),we(e)):n<0&&(Ee.current=null)},[$,we,Y]),ke=(0,f.useCallback)(e=>{Ee.current=null,!U.current?.syntheticTouch&&U.current&&Te(e)},[Te]),Ae=(0,f.useRef)(null),je=(0,f.useRef)(null),Me=(0,f.useRef)($),Ne=(0,f.useRef)(Q),Pe=(0,f.useRef)(we),Fe=(0,f.useRef)(Te),Ie=(0,f.useRef)(Y);(0,f.useEffect)(()=>{Me.current=$,Ne.current=Q,Pe.current=we,Fe.current=Te,Ie.current=Y});let Le=(0,f.useCallback)(e=>{let t=(e,t)=>({syntheticTouch:!0,pointerId:e.identifier,clientY:e.clientY,timeStamp:Date.now(),currentTarget:t,setPointerCapture:()=>{},releasePointerCapture:()=>{}}),n=e=>e.scrollTop<=0,r=e=>e.scrollTop+e.clientHeight>=e.scrollHeight-1,i=e=>{let t=e.currentTarget,i=e.changedTouches[0];if(!i){Ae.current=null;return}let a=n(t),o=r(t)&&pe.current>0;Ae.current={id:i.identifier,startY:i.clientY,top:a,bottom:o,contentEndY:null,promotedAtContentEnd:!1}},a=e=>{let i=e.currentTarget,a=Ae.current;if(U.current){let n=[...e.changedTouches].find(e=>e.identifier===U.current?.pointerId);if(!n)return;if(a?.promotedAtContentEnd&&a.contentEndY!=null){if(n.clientY>=a.contentEndY){a.contentEndY=null,a.promotedAtContentEnd=!1,Ne.current(i);return}Pe.current(t(n,i));return}e.preventDefault(),Pe.current(t(n,i));return}if(!a)return;let o=[...e.changedTouches].find(e=>e.identifier===a.id);if(!o)return;let s=o.clientY-a.startY,c=a.top&&s>ie&&n(i),l=a.bottom&&s<-8&&r(i);if(c||l){e.preventDefault(),Ae.current=null,Me.current(t(o,i),Ie.current(),a.startY),Pe.current(t(o,i));return}(a.top&&s<0||a.bottom&&s>0)&&(a.top=!1,a.bottom=!1),pe.current>0&&r(i)?a.contentEndY==null?a.contentEndY=o.clientY:a.contentEndY-o.clientY>=re&&(a.promotedAtContentEnd=!0,Me.current(t(o,i),Ie.current(),a.contentEndY),Pe.current(t(o,i))):a.contentEndY=null},o=e=>{Ae.current=null;let n=U.current?.pointerId;if(n==null)return;let r=[...e.changedTouches].find(e=>e.identifier===n),i=e.currentTarget;r?Fe.current(t(r,i)):e.touches.length===0&&Ne.current(i)},s=K.current;if(s&&je.current){let e=je.current;s.removeEventListener(`touchstart`,e.start),s.removeEventListener(`touchmove`,e.move),s.removeEventListener(`touchend`,e.end),s.removeEventListener(`touchcancel`,e.end)}K.current=e,e?(e.addEventListener(`touchstart`,i,{passive:!0}),e.addEventListener(`touchmove`,a,{passive:!1}),e.addEventListener(`touchend`,o,{passive:!0}),e.addEventListener(`touchcancel`,o,{passive:!0}),je.current={start:i,move:a,end:o}):je.current=null},[]),Re=l(`(prefers-reduced-motion: reduce)`),ze=(0,f.useCallback)(e=>{if(M.current<=0)return;let t=ce(e),n=Math.max(0,e.scrollHeight-e.clientHeight-t),r=Math.max(0,e.scrollTop-n);r<M.current-.5&&R(r)},[R]),Be=(0,f.useCallback)(e=>{U.current==null&&de.current==null&&ze(e.currentTarget)},[ze]),Ve=p?s:u;return{sheetRef:_e,contentProps:(0,f.useMemo)(()=>({style:{transform:Ve===0?void 0:`translateY(${Ve}px)`,transition:e&&(p||D||Re)?`none`:void 0,touchAction:`none`,overscrollBehavior:`contain`}}),[Ve,p,e,D,Re]),handleProps:(0,f.useMemo)(()=>({style:{touchAction:`none`,cursor:`grab`},onContextMenu:Se,onLostPointerCapture:Ce,onPointerDown:xe,onPointerMove:we,onPointerUp:Te,onPointerCancel:Te}),[Te,Se,Ce,xe,we]),bodyProps:(0,f.useMemo)(()=>({ref:Le,onContextMenu:Se,onLostPointerCapture:Ce,onPointerDown:De,onPointerMove:Oe,onPointerUp:ke,onPointerCancel:ke,onScroll:Be}),[Le,ke,De,Oe,Be,Se,Ce]),bodyElementRef:K,dragOffset:s,settledOffset:u,isDragging:p,sheetHeight:h,scrollPreservationInset:v,settlingLayoutOffset:te,settledLayoutOffset:S,completeScrollAreaSettle:fe}}var F=a(),I={hug:`92dvh`,capped:`62dvh`,tall:`92dvh`},L=48,R=48,fe=50;t[`--spacing-6`];function z(){return typeof window>`u`?0:window.innerHeight}function pe(e){let t=``;for(let n of e??[])t+=`${typeof n}:${n}|`;return t}var B={sheet:{kfzvcC:`x67bb7w`,kB7OPa:`x9f619`,kVAEAm:`x1n2onr6`,k1xSpc:`x78zum5`,kXwgrk:`xdt5ytf`,kAzted:`x2lwn1j`,kzqmXN:`xh8yej3`,ks0D6T:`x11gisft`,kWkggS:`x10xzikg`,kEafiO:`x11xkdxz`,kPef9Z:`x13fuv20`,kLZC3w:`x1pc3f07`,k2ei4v:`xgbv0en`,kVhnKS:`x1t7ytsu`,kGJrpR:`x1j92z86`,ke9TFa:`xw8tdv1`,k8ry5P:`x18b5jzi`,kBCPoo:`x1gejf6u`,krdFHd:`x81l70g`,kfmiAY:`x7hs6f1`,kGVxlE:`x1kcpxr7`,kI3sdo:`x1a2a7pz`,kVQacm:`xb3r6kr`,kGO01o:`x1wkw6tp`,k1K539:`x1if0o47`,k3aq6I:`xnn1q72 xhbqy3z`,kSiTet:`x1hc1fzr`,k1ekBW:`xwcsmn1`,kIyJzY:`x80gvsz`,kAMwcw:`xlr8y92`,k6sLGO:`x1q1rmc8`,k6CgDc:`xzg1mie`,$$css:!0},sheetClosing:{k3aq6I:`x1weeur4`,kAMwcw:`xv2sgk5`,$$css:!0},sheetFading:{kSiTet:`xg01cxk`,$$css:!0},sheetInactive:{kfzvcC:`x47corl`,$$css:!0},budget:{kZKoxP:`x1tpcejd`,$$css:!0},hugHeight:{kZKoxP:`xg7h5cd`,kskxy:`x14bu9tk`,$$css:!0}};function me(e){return e.kind===`open`?e.entering?`entering`:null:e.kind===`retained`?e.motion===`covered`?null:e.motion:e.kind===`exiting`?`exiting`:null}function he(e,t,n){if(e==null)return n(),()=>{};let r=!1,i=null,a=()=>{r||(r=!0,i!=null&&clearTimeout(i),e.removeEventListener(`transitionend`,o),e.removeEventListener(`transitioncancel`,o),n())},o=n=>{n.target===e&&n.propertyName===t&&a()};e.addEventListener(`transitionend`,o),e.addEventListener(`transitioncancel`,o);let s=getComputedStyle(e);if(e.style.transition.trim()===`none`||s.transition.trim()===`none`)return a(),()=>{};let c=s.transitionProperty.split(`,`).map(e=>e.trim()),l=s.transitionDuration.split(`,`).map(ge),u=s.transitionDelay.split(`,`).map(ge),d=!1,f=c.reduce((e,n,r)=>{if(n!==t&&n!==`all`)return e;let i=l[r%l.length],a=u[r%u.length];return i==null||a==null?(d=!0,e):Math.max(e,i+a)},0);return d?()=>{e.removeEventListener(`transitionend`,o),e.removeEventListener(`transitioncancel`,o)}:f<=0?(a(),()=>{}):(i=setTimeout(a,f+fe),()=>{i!=null&&clearTimeout(i),e.removeEventListener(`transitionend`,o),e.removeEventListener(`transitioncancel`,o)})}function ge(e){let t=e.trim();if(!/^-?(?:\d+|\d*\.\d+)(?:ms|s)$/.test(t))return null;let n=Number.parseFloat(e);return t.endsWith(`ms`)?n:n*1e3}function V({ref:t,state:n,height:i,children:a,snapPoints:s,className:l,style:d,tabIndex:p,xstyle:m,isSwipeDismissAllowed:_=!0,isPageScrollLocked:v=!1,onDismiss:y,onScrimOpacity:ee,onElementChange:b,onMotionStart:x,onMotionComplete:S,...C}){let w=(0,f.useRef)(null),T=(0,f.useRef)(n),te=(0,f.useRef)(!1),E=(0,f.useRef)(x),D=(0,f.useRef)(S),k=(0,f.useRef)(null),A=(0,f.useRef)(null),j=n.kind===`open`&&n.entering,M=T.current,ne=M.kind===`open`&&M.entering;j&&!ne?te.current=M.kind===`retained`:j||(te.current=!1),(0,f.useLayoutEffect)(()=>{T.current=n,E.current=x,D.current=S},[S,x,n]);let N=n.kind===`open`,re=n.kind!==`hidden`,ie=n.kind===`retained`,ae=ie||n.kind===`exiting`,oe=n.kind===`exiting`,se=ie&&n.motion===`fading`,ce=ie?n.alignmentOffset:0,le=pe(s),P=(0,f.useRef)(s);P.current=s;let{snapHeights:ue,ignoredSnapPointsMessage:fe}=(0,f.useMemo)(()=>{if(le===``)return{snapHeights:void 0,ignoredSnapPointsMessage:``};let e=(P.current??[]).filter(e=>!h(e));return{snapHeights:()=>g(P.current??[],z()),ignoredSnapPointsMessage:e.length===0?``:`snapPoints ignored ${JSON.stringify(e)}. A snap point is a viewport fraction above 0 and up to 1 (0.5 is half the screen), a px length ('320px'), or a percentage ('50%').`}},[le]);u(`BottomSheet`,fe,fe!==``);let{contentProps:ge,handleProps:V,bodyProps:H,bodyElementRef:U,sheetRef:W,dragOffset:G,settledOffset:K,isDragging:q,sheetHeight:J,scrollPreservationInset:_e,settlingLayoutOffset:Y,settledLayoutOffset:X,completeScrollAreaSettle:ve}=de({isOpen:N,canDismiss:_,offscreenBlockEndInset:L,onDismiss:y,snapHeights:ue,onScrimOpacity:ee}),ye=(0,f.useCallback)(e=>{W(e),w.current=e,b?.(e)},[b,W]);O({bodyRef:U,bottomClearance:R,isEnabled:i===`tall`,isFullyExpanded:K===0,isPageScrollLocked:v,isSheetTraveling:q&&G!==K,isOpen:N,isPresented:re,sheetRef:w}),(0,f.useImperativeHandle)(t,()=>w.current,[]);let Z=me(n);(0,f.useLayoutEffect)(()=>{if(Z!=null){if(k.current=null,A.current=null,Z===`entering`&&te.current){A.current=Z;return}return he(w.current,Z===`fading`?`opacity`:`transform`,()=>{k.current===Z?D.current?.(Z):A.current=Z})}},[Z]),(0,f.useLayoutEffect)(()=>{if(Y!=null)return he(w.current,`transform`,ve)},[ve,Y]),(0,f.useEffect)(()=>{if(Z!=null)return E.current?.(Z),k.current=Z,A.current===Z&&(A.current=null,D.current?.(Z)),()=>{k.current===Z&&(k.current=null),A.current===Z&&(A.current=null)}},[Z]);let Q=typeof i==`string`&&i in I?I[i]:typeof i==`number`?`${i}px`:i,be=J>0,$=ge.style.transform,xe;if(be){let e=q?G<K?0:X:Y??X,t=(q?G:K)-e;xe=e>0||q||Y!=null?`${Math.max(0,J-Math.max(0,e))}px`:void 0,$=t===0?void 0:`translateY(${t}px)`}let Se=ce>0?[$,`translateY(${ce}px)`].filter(Boolean).join(` `):$,Ce={...ge.style,transform:$,height:xe};return(0,F.jsxs)(`div`,{...C,ref:ye,tabIndex:p??-1,...c(o(`bottom-sheet`),e(B.sheet,r.reset,i===`hug`?B.hugHeight:B.budget,oe&&B.sheetClosing,se&&B.sheetFading,ae&&B.sheetInactive,m),l,{"--_sheet-budget":Q,...N?Ce:ie?{transform:Se,height:xe}:oe?{height:xe}:{},...d}),children:[(0,F.jsx)(`div`,{className:`x10l6tqk x13vifvy x1o0tod xtijo5x x1vjfegm x78zum5 x6s0dn4 xl56j7k xvpftlf xafqdz2 x5ve5x3 x1jm3nie x16khyan`,...V,"aria-hidden":`true`,children:(0,F.jsx)(`div`,{className:`x1m747yf x11c6zpc xjspbzw x1m4xfpy`})}),(0,F.jsx)(`div`,{...c({0:{className:`x1iyjqo2 x2lwn1j x9f619 x1odjw0f x8du1vd xx69xxh x10xzikg x18d9i69`},1:{className:`x1iyjqo2 x2lwn1j x9f619 x1odjw0f x8du1vd xx69xxh x10xzikg x18d9i69 xrw9175 x1s928wv xhkezso xu6fald x2q1x1w`}}[(i===`tall`)<<0],_e>0?{style:{paddingBlockEnd:`${_e}px`}}:{}),...H,children:a})]})}V.displayName=`BottomSheetPanel`;function H(){return(0,F.jsx)(`div`,{className:`xixxii4 x17y0mx6 x1ey2m1c x1kpxq89 x10xzikg xhtitgo x47corl x1cb67k9 xt2iwb0`,"data-sheet-edge-tint":``,"aria-hidden":`true`})}var U=(0,f.createContext)(null);U.displayName=`BottomSheetSwitcherContext`;function W(e,t){switch(e){case`active`:return{kind:`open`,entering:!1};case`entering`:return{kind:`open`,entering:!0};case`covered`:case`aligning`:case`fading`:return{kind:`retained`,motion:e,alignmentOffset:t};case`exiting`:return{kind:`exiting`};case`hidden`:return{kind:`hidden`}}}function G(e,t){let n=document.activeElement;if(n!=null&&e?.contains(n))return;let r=e?.querySelector(`[data-autofocus]`);r==null?t&&e?.focus({preventScroll:!0}):r.focus({preventScroll:!0})}function K({ref:e,isOpen:t,onOpenChange:n,label:r,children:a,height:o=`capped`,snapPoints:s,hasScrim:c=!0,finalFocusRef:l,purpose:p=`info`,xstyle:m,...h}){let g=(0,f.useRef)(null),_=(0,f.useRef)(null),v=(0,f.useRef)(null),[y,ee]=(0,f.useState)(t),b=t||y,x=t?{kind:`open`,entering:!1}:y?{kind:`exiting`}:{kind:`hidden`},S=(0,f.useCallback)(()=>{p!==`required`&&n(!1)},[n,p]),C=(0,f.useCallback)(()=>{p===`info`&&n(!1)},[n,p]),w=(0,f.useCallback)(e=>{_.current=e},[]),T=(0,f.useCallback)(e=>{g.current?.style.setProperty(`--_sheet-scrim-opacity`,String(e))},[]);(0,f.useEffect)(()=>{let e=g.current;e!=null&&t&&(ee(!0),e.style.setProperty(`--_sheet-scrim-opacity`,`1`),e.open||(c?(v.current=document.activeElement,e.showModal()):e.show(),G(_.current,c)))},[c,t]),(0,f.useEffect)(()=>{!t&&y&&c&&T(0)},[T,c,t,y]);let te=(0,f.useCallback)(e=>{if(e!==`exiting`||t)return;let n=g.current;n?.open&&n.close(),ee(!1),(l?.current??v.current)?.focus(),v.current=null},[l,t]);d(b&&c),u(`BottomSheet`,"requires a non-empty `label` for an accessible name; the open sheet has no built-in heading to derive one from.",t&&!r);let E=(0,f.useCallback)(e=>{e.preventDefault(),S()},[S]),D=(0,f.useCallback)(e=>{e.key===`Escape`&&(e.preventDefault(),!i(e.nativeEvent)&&S())},[S]),O=(0,f.useCallback)(e=>{c&&e.target===e.currentTarget&&C()},[C,c]);return(0,F.jsxs)(`dialog`,{...{0:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz`},8:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq`},4:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x15h3t91 x142juwg x1viac0w`},12:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x15h3t91 x142juwg x1viac0w`},2:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz x1cz9k3x`},10:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq x1cz9k3x`},6:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x142juwg x1viac0w x1cz9k3x`},14:{className:`xixxii4 x10a8y8t x1o6l61p xtdtrs8 x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x142juwg x1viac0w x1cz9k3x`},1:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz x47corl xfo81ep xh8yej3 x5yr21d`},9:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq x47corl xfo81ep xh8yej3 x5yr21d`},5:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x15h3t91 x142juwg x1viac0w x47corl xfo81ep xh8yej3 x5yr21d`},13:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x15h3t91 x142juwg x1viac0w x47corl xfo81ep xh8yej3 x5yr21d`},3:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz x1cz9k3x x47corl xfo81ep xh8yej3 x5yr21d`},11:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq x1cz9k3x x47corl xfo81ep xh8yej3 x5yr21d`},7:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1s85apg x1a2a7pz xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x142juwg x1viac0w x1cz9k3x x47corl xfo81ep xh8yej3 x5yr21d`},15:{className:`xixxii4 x10a8y8t x1x1rfll x7ab17h x1ghz6dp x1717udv xjbqb8w x1rea2x4 x1a2a7pz x1lliihq xnixb3f xni466t xxiuuzi xc0dz0a xft5bk6 x142juwg x1viac0w x1cz9k3x x47corl xfo81ep xh8yej3 x5yr21d`}}[!!b<<3|!!c<<2|!!(c&&!t&&y)<<1|!c<<0],ref:g,"aria-label":r,"aria-hidden":!t&&y?`true`:void 0,"aria-modal":c&&t?`true`:void 0,role:p===`required`?`alertdialog`:void 0,inert:!t&&y?!0:void 0,onCancel:E,onClick:O,onKeyDown:D,children:[(0,F.jsx)(`div`,{className:`x10l6tqk x17y0mx6 x1ey2m1c x78zum5 xl56j7k x47corl`,children:(0,F.jsx)(V,{...h,ref:e,state:x,height:o,snapPoints:s,isSwipeDismissAllowed:p===`info`,isPageScrollLocked:b&&c,xstyle:m,onDismiss:C,onScrimOpacity:T,onElementChange:w,onMotionComplete:te,children:a})}),(0,F.jsx)(H,{})]})}function q({switcher:e,ref:t,sheetId:n,label:r,children:i,height:a=`capped`,snapPoints:o,purpose:s=`info`,xstyle:c,...l}){let{activeSheet:d,hasScrim:p,onActiveSheetChange:m,getSheetPhase:h,getSheetAlignmentOffset:g,registerSheetElement:_,registerSheetLabel:v,registerSheetPurpose:y,onSheetEnterStart:ee,onSheetTransitionComplete:b,onSheetScrimOpacityChange:x}=e,S=typeof n==`string`&&n.length>0,C=S?h(n):`hidden`,w=W(C,S?g(n):0),T=C===`active`||C===`entering`,te=C===`covered`||C===`aligning`||C===`fading`||C===`exiting`,E=C!==`hidden`,D=C===`active`||C===`entering`,O=(0,f.useRef)(null),k=(0,f.useRef)(C),A=k.current,j=(0,f.useRef)(!1);(0,f.useLayoutEffect)(()=>{k.current=C},[C]);let M=(0,f.useCallback)(()=>{s===`info`&&S&&d===n&&m(null)},[d,S,m,s,n]),ne=(0,f.useCallback)(e=>{O.current=e,S&&_(n,e)},[S,_,n]),N=(0,f.useCallback)(e=>{e===`entering`&&S&&ee(n)},[S,ee,n]),re=(0,f.useCallback)(e=>{S&&b({sheetId:n,phase:e})},[S,b,n]),ie=(0,f.useCallback)(e=>{S&&x(n,e)},[S,x,n]);return(0,f.useLayoutEffect)(()=>{if(S)return v(n,r),()=>v(n,null)},[S,r,v,n]),(0,f.useLayoutEffect)(()=>{if(S)return y(n,s),()=>y(n,null)},[S,s,y,n]),(0,f.useEffect)(()=>{if(T){let e=A===`active`||A===`entering`;(!j.current||!e)&&G(O.current,p),j.current=!0}else C===`hidden`&&(j.current=!1)},[p,T,C,A]),u(`BottomSheet`,"requires a non-empty `label` for an accessible name; the open sheet has no built-in heading to derive one from.",T&&!r),(0,F.jsx)(`div`,{...{0:{className:`x10l6tqk x17y0mx6 x1ey2m1c x78zum5 xl56j7k x47corl`},2:{className:`x10l6tqk x17y0mx6 x1ey2m1c xl56j7k x47corl x1s85apg`},1:{className:`x10l6tqk x17y0mx6 x1ey2m1c x78zum5 xl56j7k x47corl x1vjfegm`},3:{className:`x10l6tqk x17y0mx6 x1ey2m1c xl56j7k x47corl x1s85apg x1vjfegm`}}[!E<<1|!!D<<0],hidden:!E,"aria-hidden":te?`true`:void 0,inert:te?!0:void 0,children:(0,F.jsx)(V,{...l,ref:t,state:w,height:a,snapPoints:o,isSwipeDismissAllowed:s===`info`,isPageScrollLocked:p,xstyle:c,onDismiss:M,onScrimOpacity:ie,onElementChange:ne,onMotionStart:N,onMotionComplete:re,children:(0,F.jsx)(U,{value:null,children:i})})})}function J(e){let t=(0,f.use)(U),n=e.sheetId,r=typeof n==`string`&&n.length>0;return u(`BottomSheet`,"requires a non-empty `sheetId` when nested in BottomSheetSwitcher; standalone `isOpen` / `onOpenChange` props are ignored there.",t!=null&&!r),u(`BottomSheet`,"`sheetId` only works inside BottomSheetSwitcher. Use `isOpen` and `onOpenChange` for a standalone sheet.",t==null&&n!=null),t==null?(0,F.jsx)(K,{...e}):(0,F.jsx)(q,{...e,switcher:t})}J.displayName=`BottomSheet`;export{J as BottomSheet};