@expcat/tigercat-core 2.1.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +10 -0
  2. package/dist/{data-export-D01yjggE.d.ts → data-export-dxdDe47U.d.ts} +1 -1
  3. package/dist/datepicker-locales/ar-SA.d.ts +1 -1
  4. package/dist/datepicker-locales/de-DE.d.ts +1 -1
  5. package/dist/datepicker-locales/en-US.d.ts +1 -1
  6. package/dist/datepicker-locales/es-ES.d.ts +1 -1
  7. package/dist/datepicker-locales/fr-FR.d.ts +1 -1
  8. package/dist/datepicker-locales/id-ID.d.ts +1 -1
  9. package/dist/datepicker-locales/ja-JP.d.ts +1 -1
  10. package/dist/datepicker-locales/ko-KR.d.ts +1 -1
  11. package/dist/datepicker-locales/pt-BR.d.ts +1 -1
  12. package/dist/datepicker-locales/registry.d.ts +1 -1
  13. package/dist/datepicker-locales/th-TH.d.ts +1 -1
  14. package/dist/datepicker-locales/vi-VN.d.ts +1 -1
  15. package/dist/datepicker-locales/zh-CN.d.ts +1 -1
  16. package/dist/datepicker-locales/zh-TW.d.ts +1 -1
  17. package/dist/icons/registry.d.ts +23 -3
  18. package/dist/icons/registry.js +54 -17
  19. package/dist/index.d.ts +325 -147
  20. package/dist/index.js +394 -53
  21. package/dist/{locale-qoiGEqe_.d.ts → locale-B_jkaex_.d.ts} +38 -1
  22. package/dist/locales/ar-SA.d.ts +1 -1
  23. package/dist/locales/ar-SA.js +6 -1
  24. package/dist/locales/de-DE.d.ts +1 -1
  25. package/dist/locales/de-DE.js +6 -1
  26. package/dist/locales/en-US.d.ts +1 -1
  27. package/dist/locales/en-US.js +6 -1
  28. package/dist/locales/es-ES.d.ts +1 -1
  29. package/dist/locales/es-ES.js +6 -1
  30. package/dist/locales/fr-FR.d.ts +1 -1
  31. package/dist/locales/fr-FR.js +6 -1
  32. package/dist/locales/id-ID.d.ts +1 -1
  33. package/dist/locales/id-ID.js +6 -1
  34. package/dist/locales/ja-JP.d.ts +1 -1
  35. package/dist/locales/ja-JP.js +6 -1
  36. package/dist/locales/ko-KR.d.ts +1 -1
  37. package/dist/locales/ko-KR.js +6 -1
  38. package/dist/locales/pt-BR.d.ts +1 -1
  39. package/dist/locales/pt-BR.js +6 -1
  40. package/dist/locales/th-TH.d.ts +1 -1
  41. package/dist/locales/th-TH.js +6 -1
  42. package/dist/locales/vi-VN.d.ts +1 -1
  43. package/dist/locales/vi-VN.js +6 -1
  44. package/dist/locales/zh-CN.d.ts +1 -1
  45. package/dist/locales/zh-CN.js +6 -1
  46. package/dist/locales/zh-TW.d.ts +1 -1
  47. package/dist/locales/zh-TW.js +6 -1
  48. package/dist/{table-R9Yp1aVa.d.ts → table-GjUkOiNr.d.ts} +1 -1
  49. package/dist/utils/data-export.d.ts +3 -3
  50. package/dist/utils/table-export.d.ts +2 -2
  51. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -973,7 +973,39 @@ function resolveSelector(selector) {
973
973
  getRect: () => elementRect(el)
974
974
  };
975
975
  }
976
- function resolveScrollRoot(input, depth = 0) {
976
+ var OVERFLOW_RE = /(auto|scroll|overlay)/;
977
+ function findNearestOverflowAncestor(from) {
978
+ if (!from || !isBrowser()) return null;
979
+ let node = from.parentElement;
980
+ while (node && node !== document.documentElement && node !== document.body) {
981
+ let style;
982
+ try {
983
+ style = getComputedStyle(node);
984
+ } catch {
985
+ node = node.parentElement;
986
+ continue;
987
+ }
988
+ const html = node;
989
+ const overflowY = style.overflowY || html.style.overflowY || style.overflow || html.style.overflow;
990
+ const overflowX = style.overflowX || html.style.overflowX || style.overflow || html.style.overflow;
991
+ if (OVERFLOW_RE.test(overflowY) || OVERFLOW_RE.test(overflowX)) {
992
+ return node;
993
+ }
994
+ node = node.parentElement;
995
+ }
996
+ return null;
997
+ }
998
+ function fromElementRoot(from) {
999
+ const ancestor = findNearestOverflowAncestor(from);
1000
+ if (!ancestor) return createWindowScrollRoot();
1001
+ return {
1002
+ target: ancestor,
1003
+ isWindow: false,
1004
+ getRect: () => elementRect(ancestor)
1005
+ };
1006
+ }
1007
+ function resolveScrollRoot(input, options = {}) {
1008
+ const depth = options.depth ?? 0;
977
1009
  if (depth > MAX_GETTER_DEPTH) {
978
1010
  devWarn(
979
1011
  "scrollRoot.cycle",
@@ -981,12 +1013,15 @@ function resolveScrollRoot(input, depth = 0) {
981
1013
  );
982
1014
  return createWindowScrollRoot();
983
1015
  }
984
- if (input === void 0 || input === null) {
1016
+ if (input === void 0) {
1017
+ return fromElementRoot(options.from);
1018
+ }
1019
+ if (input === null) {
985
1020
  return createWindowScrollRoot();
986
1021
  }
987
1022
  if (typeof input === "function") {
988
1023
  try {
989
- return resolveScrollRoot(input(), depth + 1);
1024
+ return resolveScrollRoot(input(), { ...options, depth: depth + 1 });
990
1025
  } catch {
991
1026
  devWarn("scrollRoot.getter", "[Tigercat] Scroll target getter threw. Falling back to window.");
992
1027
  return createWindowScrollRoot();
@@ -1965,7 +2000,7 @@ function getAnchoredOverlayTabTarget(reference, floating, shiftKey = false) {
1965
2000
  return focusables[nextIndex];
1966
2001
  }
1967
2002
  function getAnchoredOverlayLayoutClasses(layout = "anchored", matchReferenceWidth = false) {
1968
- const positioned = "pointer-events-auto absolute left-[var(--tiger-overlay-x)] top-[var(--tiger-overlay-y)] max-w-[var(--tiger-overlay-available-width)]! max-h-[var(--tiger-overlay-available-height)]! invisible data-[positioned=true]:visible";
2003
+ const positioned = "absolute left-[var(--tiger-overlay-x)] top-[var(--tiger-overlay-y)] max-w-[var(--tiger-overlay-available-width)]! max-h-[var(--tiger-overlay-available-height)]! invisible pointer-events-none data-[positioned=true]:visible data-[positioned=true]:pointer-events-auto";
1969
2004
  return classNames(
1970
2005
  positioned,
1971
2006
  matchReferenceWidth && (layout === "anchored" ? "w-[var(--tiger-overlay-reference-width)]" : "sm:w-[var(--tiger-overlay-reference-width)]"),
@@ -2397,11 +2432,53 @@ var iconRegistry = {
2397
2432
  users: stroke24(
2398
2433
  "M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z"
2399
2434
  ),
2400
- dashboard: squares2x2
2435
+ dashboard: squares2x2,
2436
+ // --- Admin / shell glyphs (Heroicons-style, 24x24) ---
2437
+ fullscreen: stroke24(
2438
+ "M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15"
2439
+ ),
2440
+ "fullscreen-exit": stroke24(
2441
+ "M9 9V4.5M9 9H4.5M9 9 3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5 5.25 5.25"
2442
+ ),
2443
+ ticket: stroke24(
2444
+ "M16.5 6v.75m0 3v.75m0 3v.75m0 3V18m-9-5.25h5.25M7.5 15h3M3.375 5.25c-.621 0-1.125.504-1.125 1.125v3.026a2.999 2.999 0 0 1 0 5.198v3.026c0 .621.504 1.125 1.125 1.125h17.25c.621 0 1.125-.504 1.125-1.125v-3.026a2.999 2.999 0 0 1 0-5.198V6.375c0-.621-.504-1.125-1.125-1.125H3.375Z"
2445
+ ),
2446
+ bolt: stroke24("m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"),
2447
+ zap: stroke24("m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"),
2448
+ "chart-bar": stroke24(
2449
+ "M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z"
2450
+ ),
2451
+ chart: stroke24(
2452
+ "M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z"
2453
+ ),
2454
+ database: stroke24(
2455
+ "M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"
2456
+ )
2401
2457
  };
2402
2458
  var iconNames = Object.keys(iconRegistry);
2459
+ var customIconRegistry = /* @__PURE__ */ new Map();
2403
2460
  function getIconDefinition(name) {
2404
- return iconRegistry[name];
2461
+ return iconRegistry[name] ?? customIconRegistry.get(name);
2462
+ }
2463
+ function registerIcon(name, definition) {
2464
+ const trimmed = name.trim();
2465
+ if (!trimmed) return;
2466
+ if (iconRegistry[trimmed]) return;
2467
+ customIconRegistry.set(trimmed, definition);
2468
+ }
2469
+ function registerIcons(icons) {
2470
+ for (const [name, definition] of Object.entries(icons)) {
2471
+ registerIcon(name, definition);
2472
+ }
2473
+ }
2474
+ function unregisterIcon(name) {
2475
+ customIconRegistry.delete(name);
2476
+ }
2477
+ function clearRegisteredIcons() {
2478
+ customIconRegistry.clear();
2479
+ }
2480
+ function registeredIconNames() {
2481
+ return Array.from(customIconRegistry.keys());
2405
2482
  }
2406
2483
  var sortAscendingIcon = /* @__PURE__ */ stroke24(
2407
2484
  "M3 4.5h14.25M3 9h9.75M3 13.5h5.25m5.25-.75L17.25 9m0 0L21 12.75M17.25 9v12"
@@ -2413,12 +2490,8 @@ var listIcon = /* @__PURE__ */ stroke24(
2413
2490
  "M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z"
2414
2491
  );
2415
2492
  var gridIcon = squares2x2;
2416
- var fullscreenIcon = /* @__PURE__ */ stroke24(
2417
- "M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15"
2418
- );
2419
- var fullscreenExitIcon = /* @__PURE__ */ stroke24(
2420
- "M9 9V4.5M9 9H4.5M9 9 3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5 5.25 5.25"
2421
- );
2493
+ var fullscreenIcon = iconRegistry.fullscreen;
2494
+ var fullscreenExitIcon = iconRegistry["fullscreen-exit"];
2422
2495
  var zoomInIcon = /* @__PURE__ */ stroke24(
2423
2496
  "m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607ZM10.5 7.5v6m3-3h-6"
2424
2497
  );
@@ -2465,9 +2538,7 @@ var archiveIcon = /* @__PURE__ */ stroke24(
2465
2538
  var inboxIcon = /* @__PURE__ */ stroke24(
2466
2539
  "M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661L19.24 5.338a2.25 2.25 0 0 0-2.15-1.588H6.911a2.25 2.25 0 0 0-2.15 1.588L2.35 13.177a2.25 2.25 0 0 0-.1.661Z"
2467
2540
  );
2468
- var boltIcon = /* @__PURE__ */ stroke24(
2469
- "m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"
2470
- );
2541
+ var boltIcon = iconRegistry.bolt;
2471
2542
  var chatIcon = /* @__PURE__ */ stroke24(
2472
2543
  "M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 0 1-.825-.242m9.345-8.334a2.126 2.126 0 0 0-.476-.095 48.64 48.64 0 0 0-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0 0 11.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155"
2473
2544
  );
@@ -2527,16 +2598,12 @@ var currencyDollarIcon = /* @__PURE__ */ stroke24(
2527
2598
  var walletIcon = /* @__PURE__ */ stroke24(
2528
2599
  "M21 12a2.25 2.25 0 0 0-2.25-2.25H15a3 3 0 1 1-6 0H5.25A2.25 2.25 0 0 0 3 12m18 0v6a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 18v-6m18 0V9M3 12V9m18 0a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 9m18 0V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v3"
2529
2600
  );
2530
- var chartBarIcon = /* @__PURE__ */ stroke24(
2531
- "M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z"
2532
- );
2601
+ var chartBarIcon = iconRegistry["chart-bar"];
2533
2602
  var chartPieIcon = /* @__PURE__ */ stroke24(
2534
2603
  "M10.5 6a7.5 7.5 0 1 0 7.5 7.5h-7.5V6Z",
2535
2604
  "M13.5 10.5H21A7.5 7.5 0 0 0 13.5 3v7.5Z"
2536
2605
  );
2537
- var databaseIcon = /* @__PURE__ */ stroke24(
2538
- "M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"
2539
- );
2606
+ var databaseIcon = iconRegistry.database;
2540
2607
  var serverIcon = /* @__PURE__ */ stroke24(
2541
2608
  "M21.75 17.25v-.228a4.5 4.5 0 0 0-.12-1.03l-2.268-9.64a3.375 3.375 0 0 0-3.285-2.602H7.923a3.375 3.375 0 0 0-3.285 2.602l-2.268 9.64a4.5 4.5 0 0 0-.12 1.03v.228m19.5 0a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3m19.5 0a3 3 0 0 0-3-3H5.25a3 3 0 0 0-3 3m16.5 0h.008v.008h-.008v-.008Zm-3 0h.008v.008h-.008v-.008Z"
2542
2609
  );
@@ -2868,6 +2935,7 @@ var TIGER_LOCALE_KEY_SET = {
2868
2935
  formWizard: true,
2869
2936
  tour: true,
2870
2937
  calendar: true,
2938
+ fullscreen: true,
2871
2939
  fileManager: true,
2872
2940
  imageViewer: true,
2873
2941
  imageEditor: true,
@@ -3153,7 +3221,12 @@ var enUS = {
3153
3221
  previousMonth: "Previous month",
3154
3222
  nextMonth: "Next month",
3155
3223
  previousYear: "Previous year",
3156
- nextYear: "Next year"
3224
+ nextYear: "Next year",
3225
+ eventCountText: "{n} events"
3226
+ },
3227
+ fullscreen: {
3228
+ enterAriaLabel: "Enter fullscreen",
3229
+ exitAriaLabel: "Exit fullscreen"
3157
3230
  },
3158
3231
  fileManager: {
3159
3232
  rootText: "Root",
@@ -3740,6 +3813,9 @@ function getAnchorLabels(locale, overrides) {
3740
3813
  function getFloatButtonLabels(locale, overrides) {
3741
3814
  return resolveLocaleSection(enSection("floatButton"), locale?.floatButton, overrides);
3742
3815
  }
3816
+ function getFullscreenLabels(locale, overrides) {
3817
+ return resolveLocaleSection(enSection("fullscreen"), locale?.fullscreen, overrides);
3818
+ }
3743
3819
  function getSpotlightLabels(locale, overrides) {
3744
3820
  return resolveLocaleSection(enSection("spotlight"), locale?.spotlight, overrides);
3745
3821
  }
@@ -4195,7 +4271,7 @@ function getTimePickerItemClasses(isSelected, isDisabled) {
4195
4271
  "focus:outline-none",
4196
4272
  "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]/40",
4197
4273
  "tiger-motion-aware [transition:var(--tiger-transition-base,color_150ms_ease)]",
4198
- isDisabled ? "text-[var(--tiger-text-muted,#9ca3af)] opacity-50 cursor-not-allowed" : isSelected ? "bg-[var(--tiger-primary,#2563eb)] text-[var(--tiger-primary-foreground,#ffffff)] font-medium" : "text-[var(--tiger-text,#374151)] hover:bg-[var(--tiger-surface-muted,#f3f4f6)] cursor-pointer"
4274
+ isDisabled ? "text-[var(--tiger-text-muted,#9ca3af)] opacity-50 cursor-not-allowed" : isSelected ? "bg-[var(--tiger-primary,#2563eb)] text-[var(--tiger-primary-foreground,#ffffff)] font-medium focus:bg-[var(--tiger-primary,#2563eb)] focus:text-[var(--tiger-primary-foreground,#ffffff)]" : "text-[var(--tiger-text,#374151)] hover:bg-[var(--tiger-surface-muted,#f3f4f6)] focus:bg-[var(--tiger-surface-muted,#f3f4f6)] cursor-pointer"
4199
4275
  );
4200
4276
  }
4201
4277
  function getTimePickerPeriodButtonClasses(isSelected) {
@@ -4843,6 +4919,7 @@ var switchThumbTranslateClasses = switchThumbCheckedInsetClasses;
4843
4919
 
4844
4920
  // src/utils/slider-style-utils.ts
4845
4921
  var sliderBaseClasses = "relative w-full";
4922
+ var sliderTooltipReserveClasses = "pt-12";
4846
4923
  var sliderTrackClasses = "relative w-full rounded-full bg-[var(--tiger-border,#e5e7eb)]";
4847
4924
  var sliderHitAreaClasses = "relative w-full py-2 min-h-6";
4848
4925
  var sliderRangeClasses = "bg-[var(--tiger-primary,#2563eb)] rounded-full absolute inset-y-0";
@@ -4885,8 +4962,13 @@ function getSliderThumbClasses(size2 = "md", disabled = false, dragging = false)
4885
4962
  function getSliderTooltipClasses(size2 = "md") {
4886
4963
  return classNames(sliderTooltipClasses, sliderSizeClasses[size2].tooltip);
4887
4964
  }
4888
- function getSliderRootClasses(disabled = false, className) {
4889
- return classNames(sliderBaseClasses, disabled && sliderDisabledClasses, className);
4965
+ function getSliderRootClasses(disabled = false, className, tooltip = false) {
4966
+ return classNames(
4967
+ sliderBaseClasses,
4968
+ disabled && sliderDisabledClasses,
4969
+ tooltip && sliderTooltipReserveClasses,
4970
+ className
4971
+ );
4890
4972
  }
4891
4973
 
4892
4974
  // src/utils/input-styles.ts
@@ -7820,6 +7902,9 @@ var LAYOUT_GRID_CSS = `
7820
7902
  border-top: 1px solid var(--tiger-border, #e5e7eb);
7821
7903
  padding: 1rem;
7822
7904
  }
7905
+ .tiger-footer-compact {
7906
+ padding-block: 0.5rem;
7907
+ }
7823
7908
 
7824
7909
  .tiger-container {
7825
7910
  width: 100%;
@@ -8289,6 +8374,11 @@ function getLayoutContentClasses(padding = true) {
8289
8374
  );
8290
8375
  }
8291
8376
  var layoutFooterClasses = "tiger-footer";
8377
+ var layoutFooterCompactClasses = "tiger-footer-compact";
8378
+ function getLayoutFooterClasses(size2 = "default") {
8379
+ injectLayoutGridStyles();
8380
+ return classNames(layoutFooterClasses, size2 === "compact" && layoutFooterCompactClasses);
8381
+ }
8292
8382
  var LAYOUT_CONTENT_TAGS = ["main", "div", "section", "article"];
8293
8383
  var LAYOUT_FOOTER_TAGS = ["footer", "div"];
8294
8384
  var CONTAINER_TAGS = [
@@ -11469,6 +11559,15 @@ function resolveMenuCollapsed(mode, collapsed) {
11469
11559
  }
11470
11560
  return true;
11471
11561
  }
11562
+ function shouldShowMenuSearch(searchable, collapsed) {
11563
+ if (!searchable) return false;
11564
+ if (collapsed) return false;
11565
+ return searchable === true || searchable === "auto";
11566
+ }
11567
+ function resolveMenuSearchQuery(searchable, collapsed, searchValue) {
11568
+ if (collapsed && (searchable === true || searchable === "auto")) return "";
11569
+ return searchValue;
11570
+ }
11472
11571
  function isSubmenuPopup(mode, collapsed) {
11473
11572
  return mode === "horizontal" || mode === "vertical" && collapsed;
11474
11573
  }
@@ -12261,7 +12360,7 @@ function getDropdownContainerClasses() {
12261
12360
  function getDropdownTriggerClasses(disabled) {
12262
12361
  return classNames(
12263
12362
  "tiger-dropdown-trigger",
12264
- "inline-flex items-center gap-1.5",
12363
+ "inline-flex items-center gap-1.5 h-full",
12265
12364
  "select-none bg-transparent p-0 border-0 font-inherit text-inherit",
12266
12365
  disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
12267
12366
  );
@@ -14000,6 +14099,23 @@ function createCopyStatusReset(setStatus, resetMs = CODE_COPY_STATUS_RESET_MS) {
14000
14099
  dispose
14001
14100
  };
14002
14101
  }
14102
+ function renderCodeHighlightHtml(code, language, highlighter) {
14103
+ if (!highlighter) return null;
14104
+ const lang = language ?? "plain";
14105
+ if (highlighter.highlightCode) {
14106
+ return highlighter.highlightCode(code, lang, "light");
14107
+ }
14108
+ if (highlighter.highlightLine) {
14109
+ const lines = code.split("\n");
14110
+ const parts = [];
14111
+ for (let i = 0; i < lines.length; i++) {
14112
+ if (i > 0) parts.push("\n");
14113
+ parts.push(highlighter.highlightLine(lines[i], lang, "light"));
14114
+ }
14115
+ return parts.join("");
14116
+ }
14117
+ return null;
14118
+ }
14003
14119
 
14004
14120
  // src/types/text.ts
14005
14121
  var TEXT_TAGS = [
@@ -14064,12 +14180,29 @@ function getTextClasses(props) {
14064
14180
  textWeightClasses[weight],
14065
14181
  align && textAlignClasses[align],
14066
14182
  textColorClasses[color],
14067
- props.truncate && textDecorationClasses.truncate,
14183
+ props.truncate && !isTextCopyable(props.copyable) && textDecorationClasses.truncate,
14068
14184
  props.italic && textDecorationClasses.italic,
14069
14185
  props.underline && textDecorationClasses.underline,
14070
14186
  props.lineThrough && textDecorationClasses.lineThrough
14071
14187
  );
14072
14188
  }
14189
+ function isTextCopyable(copyable) {
14190
+ if (copyable === true) return true;
14191
+ return Boolean(copyable) && typeof copyable === "object";
14192
+ }
14193
+ function resolveTextCopyableOptions(copyable) {
14194
+ if (copyable === true) return {};
14195
+ if (copyable && typeof copyable === "object") return copyable;
14196
+ return null;
14197
+ }
14198
+ function resolveTextCopyContent(options, fallback) {
14199
+ if (options && typeof options.text === "string") return options.text;
14200
+ return fallback;
14201
+ }
14202
+ var textCopyableRootClasses = "inline-flex max-w-full items-center gap-1";
14203
+ var textCopyableBodyClasses = "min-w-0";
14204
+ var textCopyableButtonClasses = "inline-flex shrink-0 items-center justify-center min-h-6 min-w-6 rounded-[var(--tiger-radius-md,0.5rem)] text-[var(--tiger-text-muted,#6b7280)] hover:bg-[var(--tiger-surface-muted,#f3f4f6)] hover:text-[var(--tiger-text,#111827)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]/40";
14205
+ var textCopyableLiveClasses = "sr-only";
14073
14206
 
14074
14207
  // src/types/kbd.ts
14075
14208
  var DEFAULT_KBD_SEPARATOR = "+";
@@ -14624,7 +14757,8 @@ var splitButtonRootClasses = "tiger-split-button inline-flex items-stretch";
14624
14757
  var splitButtonRootBlockClasses = "w-full";
14625
14758
  var splitButtonPrimaryClasses = "!rounded-e-none";
14626
14759
  var splitButtonPrimaryBlockClasses = "min-w-0 flex-1";
14627
- var splitButtonTriggerClasses = "tiger-split-button-trigger shrink-0 !rounded-s-none -ms-px";
14760
+ var splitButtonTriggerClasses = "tiger-split-button-trigger shrink-0 h-full !rounded-s-none -ms-px";
14761
+ var splitButtonDropdownClasses = "self-stretch";
14628
14762
  var splitButtonTriggerSizeClasses = {
14629
14763
  xs: "!px-1.5",
14630
14764
  sm: "!px-2",
@@ -14773,6 +14907,7 @@ function injectImageCropperStyles() {
14773
14907
  style.textContent = CROPPER_CSS;
14774
14908
  document.head.appendChild(style);
14775
14909
  }
14910
+ var imageCropperSizeHostClasses = "relative flex w-full max-w-full justify-center";
14776
14911
  var imageCropperContainerClasses = "relative select-none touch-none rounded-[var(--tiger-radius-lg,0.75rem)] shadow-inner border border-[var(--tiger-border,#e5e7eb)] tiger-image-cropper-checkerboard";
14777
14912
  var imageCropperFrameClasses = "relative overflow-hidden";
14778
14913
  var imageCropperImgClasses = "absolute top-0 left-0 max-w-none pointer-events-none";
@@ -14793,7 +14928,7 @@ var CROPPER_HANDLE_CURSORS = {
14793
14928
  };
14794
14929
  function getCropperHandleClasses(handle) {
14795
14930
  return classNames(
14796
- "absolute w-3.5 h-3.5 rounded-full bg-white border-2 border-[var(--tiger-primary,#2563eb)] shadow-md hover:scale-125 hover:bg-[var(--tiger-primary,#2563eb)] hover:border-white transition-all duration-200 outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]",
14931
+ "absolute w-3.5 h-3.5 rounded-full bg-white border-2 border-[var(--tiger-primary,#2563eb)] shadow-md hover:scale-125 hover:bg-[var(--tiger-primary,#2563eb)] hover:border-white transition-colors duration-150 outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]",
14797
14932
  CROPPER_HANDLE_CURSORS[handle]
14798
14933
  );
14799
14934
  }
@@ -14904,14 +15039,28 @@ function resizeCropRect(rect, handle, dx, dy, imageWidth, imageHeight, aspectRat
14904
15039
  else left = right - width;
14905
15040
  }
14906
15041
  }
14907
- return constrainCropRect(
14908
- { x: left, y: top, width: right - left, height: bottom - top },
14909
- imageWidth,
14910
- imageHeight,
14911
- aspectRatio,
14912
- minW,
14913
- minH
14914
- );
15042
+ left = Math.max(0, left);
15043
+ top = Math.max(0, top);
15044
+ right = Math.min(imageWidth, right);
15045
+ bottom = Math.min(imageHeight, bottom);
15046
+ if (right - left < maxW) {
15047
+ if (lockLeft) right = left + maxW;
15048
+ else left = right - maxW;
15049
+ }
15050
+ if (bottom - top < maxH) {
15051
+ if (lockTop) bottom = top + maxH;
15052
+ else top = bottom - maxH;
15053
+ }
15054
+ left = Math.max(0, left);
15055
+ top = Math.max(0, top);
15056
+ right = Math.min(imageWidth, right);
15057
+ bottom = Math.min(imageHeight, bottom);
15058
+ return {
15059
+ x: left,
15060
+ y: top,
15061
+ width: Math.max(0, right - left),
15062
+ height: Math.max(0, bottom - top)
15063
+ };
14915
15064
  }
14916
15065
  function moveCropRect(rect, dx, dy, boundW, boundH) {
14917
15066
  const x = Math.max(0, Math.min(rect.x + dx, boundW - rect.width));
@@ -14943,16 +15092,59 @@ function getInitialCropRect(imageWidth, imageHeight, aspectRatio, minW = 20, min
14943
15092
  minH
14944
15093
  );
14945
15094
  }
15095
+ var CROPPER_DISPLAY_SIZE_EPSILON = 0.5;
15096
+ function readStyleField(style, key) {
15097
+ if (!style || typeof style !== "object" || Array.isArray(style)) return void 0;
15098
+ return style[key];
15099
+ }
15100
+ function hasCssLength(value) {
15101
+ if (typeof value === "number") return isPositiveFinite(value);
15102
+ if (typeof value !== "string") return false;
15103
+ const trimmed = value.trim().toLowerCase();
15104
+ return trimmed !== "" && trimmed !== "auto" && trimmed !== "none";
15105
+ }
15106
+ function readPositivePixelLength(value) {
15107
+ if (typeof value === "number") return isPositiveFinite(value) ? value : 0;
15108
+ if (typeof value !== "string") return 0;
15109
+ const trimmed = value.trim();
15110
+ if (trimmed.endsWith("%")) return 0;
15111
+ if (!trimmed.endsWith("px") && !/^\d+(\.\d+)?$/.test(trimmed)) return 0;
15112
+ const parsed = Number.parseFloat(trimmed);
15113
+ return isPositiveFinite(parsed) ? parsed : 0;
15114
+ }
15115
+ function resolveCropperAvailableSize(hostWidth, hostHeight, style) {
15116
+ const width = isPositiveFinite(hostWidth) ? hostWidth : 0;
15117
+ const heightValue = readStyleField(style, "height");
15118
+ const maxHeightValue = readStyleField(style, "maxHeight");
15119
+ const parsed = readPositivePixelLength(heightValue) || readPositivePixelLength(maxHeightValue);
15120
+ if (parsed > 0) {
15121
+ return { width, height: parsed };
15122
+ }
15123
+ const heightIsExplicit = hasCssLength(heightValue) || hasCssLength(maxHeightValue);
15124
+ return {
15125
+ width,
15126
+ height: heightIsExplicit && isPositiveFinite(hostHeight) ? hostHeight : 0
15127
+ };
15128
+ }
14946
15129
  function getCropperDisplaySize(naturalWidth, naturalHeight, containerWidth, containerHeight) {
14947
15130
  if (!isPositiveFinite(naturalWidth) || !isPositiveFinite(naturalHeight)) return null;
14948
15131
  const containerW = isPositiveFinite(containerWidth) ? containerWidth : naturalWidth;
14949
- const containerH = isPositiveFinite(containerHeight) ? containerHeight : 400;
14950
- const ratio = Math.min(containerW / naturalWidth, containerH / naturalHeight, 1);
15132
+ const heightRatio = isPositiveFinite(containerHeight) ? containerHeight / naturalHeight : Number.POSITIVE_INFINITY;
15133
+ const ratio = Math.min(containerW / naturalWidth, heightRatio, 1);
14951
15134
  const width = naturalWidth * ratio;
14952
15135
  const height = naturalHeight * ratio;
14953
15136
  if (!isPositiveFinite(ratio) || !isPositiveFinite(width) || !isPositiveFinite(height)) return null;
14954
15137
  return { width, height };
14955
15138
  }
15139
+ function planCropperDisplaySize(naturalWidth, naturalHeight, availableWidth, availableHeight, currentWidth, currentHeight) {
15140
+ if (!isPositiveFinite(availableWidth)) return null;
15141
+ const next = getCropperDisplaySize(naturalWidth, naturalHeight, availableWidth, availableHeight);
15142
+ if (!next) return null;
15143
+ if (Math.abs(next.width - currentWidth) < CROPPER_DISPLAY_SIZE_EPSILON && Math.abs(next.height - currentHeight) < CROPPER_DISPLAY_SIZE_EPSILON) {
15144
+ return null;
15145
+ }
15146
+ return next;
15147
+ }
14956
15148
  function remapCropRect(rect, fromWidth, fromHeight, toWidth, toHeight, aspectRatio, minW, minH) {
14957
15149
  if (!isPositiveFinite(fromWidth) || !isPositiveFinite(fromHeight)) {
14958
15150
  return getInitialCropRect(toWidth, toHeight, aspectRatio, minW, minH);
@@ -15082,14 +15274,14 @@ var imageCompareVerticalClasses = "tiger-image-compare-vertical";
15082
15274
  var imageCompareDisabledClasses = "tiger-image-compare-disabled cursor-not-allowed";
15083
15275
  var imageCompareAfterClasses = "tiger-image-compare-after relative block w-full h-full overflow-hidden [&>img]:pointer-events-none [&>img]:select-none [&>img]:max-w-none";
15084
15276
  var imageCompareBeforeClasses = "tiger-image-compare-before absolute inset-0 overflow-hidden pointer-events-none [&>img]:pointer-events-none [&>img]:select-none [&>img]:max-w-none";
15085
- var imageCompareHandleClasses = "tiger-image-compare-handle absolute z-10 flex items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]";
15277
+ var imageCompareHandleClasses = "tiger-image-compare-handle group absolute z-10 flex items-center justify-center outline-none";
15086
15278
  var imageCompareHandleHorizontalClasses = "inset-y-0 w-6 cursor-ew-resize";
15087
15279
  var imageCompareHandleVerticalClasses = "inset-x-0 h-6 cursor-ns-resize";
15088
15280
  var imageCompareHandleDisabledClasses = "cursor-not-allowed";
15089
15281
  var imageCompareLineClasses = "tiger-image-compare-line absolute bg-white shadow pointer-events-none";
15090
15282
  var imageCompareLineHorizontalClasses = "inset-y-0 left-1/2 w-0.5 -translate-x-1/2";
15091
15283
  var imageCompareLineVerticalClasses = "inset-x-0 top-1/2 h-0.5 -translate-y-1/2";
15092
- var imageCompareKnobClasses = "tiger-image-compare-knob relative z-10 flex h-8 w-8 items-center justify-center rounded-full border-2 border-white bg-[var(--tiger-primary,#2563eb)] text-white shadow pointer-events-none";
15284
+ var imageCompareKnobClasses = "tiger-image-compare-knob relative z-10 flex h-8 w-8 items-center justify-center rounded-full border-2 border-white bg-[var(--tiger-primary,#2563eb)] text-white shadow pointer-events-none group-focus-visible:ring-2 group-focus-visible:ring-offset-2 group-focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]";
15093
15285
  var IMAGE_COMPARE_ORIENTATIONS = /* @__PURE__ */ new Set(["horizontal", "vertical"]);
15094
15286
  var IMAGE_FITS = /* @__PURE__ */ new Set(["contain", "cover", "fill", "none", "scale-down"]);
15095
15287
  function resolveImageCompareOrientation(orientation) {
@@ -15705,8 +15897,8 @@ function getElementOffsetTop(element, container) {
15705
15897
  const containerEl = container;
15706
15898
  return element.getBoundingClientRect().top - containerEl.getBoundingClientRect().top + containerEl.scrollTop;
15707
15899
  }
15708
- function resolveAnchorScrollContainer(input) {
15709
- const root = resolveScrollRoot(input);
15900
+ function resolveAnchorScrollContainer(input, from) {
15901
+ const root = resolveScrollRoot(input, { from });
15710
15902
  if (!root.target || root.isWindow) return isBrowser() ? window : null;
15711
15903
  return root.target;
15712
15904
  }
@@ -19780,7 +19972,9 @@ function createAffixController(options) {
19780
19972
  const pinFromFlow = (emitChange) => {
19781
19973
  const flow = getFlowRect();
19782
19974
  if (!flow) return;
19783
- const root = resolved ?? resolveScrollRoot(options.getTarget());
19975
+ const root = resolved ?? resolveScrollRoot(options.getTarget(), {
19976
+ from: options.getContent() ?? options.getSentinel()
19977
+ });
19784
19978
  const style = buildAffixStyle(
19785
19979
  flow,
19786
19980
  root.getRect(),
@@ -19849,7 +20043,9 @@ function createAffixController(options) {
19849
20043
  if (!isBrowser()) return;
19850
20044
  const sentinel = options.getSentinel();
19851
20045
  if (!sentinel) return;
19852
- resolved = resolveScrollRoot(options.getTarget());
20046
+ resolved = resolveScrollRoot(options.getTarget(), {
20047
+ from: options.getContent() ?? options.getSentinel()
20048
+ });
19853
20049
  const root = resolved.isWindow ? null : resolved.target;
19854
20050
  if (typeof IntersectionObserver === "undefined") {
19855
20051
  const onScrollLayout = () => {
@@ -21183,7 +21379,7 @@ var CASCADER_OPTION_PAD_Y = {
21183
21379
  lg: "text-lg py-2.5"
21184
21380
  };
21185
21381
  var cascaderBaseClasses = selectBaseClasses;
21186
- var cascaderDropdownClasses = classNames(selectDropdownBaseClasses, "min-w-0");
21382
+ var cascaderDropdownClasses = classNames(selectDropdownBaseClasses, "min-w-0", "w-max");
21187
21383
  var cascaderSearchInputClasses = selectSearchInputClasses;
21188
21384
  var cascaderSearchWrapClasses = selectSearchWrapClasses;
21189
21385
  var cascaderEmptyStateClasses = selectEmptyStateClasses;
@@ -23143,8 +23339,8 @@ function scrollToScrollSpyItem(item, container, targetOffset = 0) {
23143
23339
  if (item.disabled) return;
23144
23340
  scrollToAnchor(item.href, container, targetOffset);
23145
23341
  }
23146
- function resolveScrollSpyContainer(input) {
23147
- const root = resolveScrollRoot(input);
23342
+ function resolveScrollSpyContainer(input, from) {
23343
+ const root = resolveScrollRoot(input, { from });
23148
23344
  if (!root.target || root.isWindow) return isBrowser() ? window : null;
23149
23345
  return root.target;
23150
23346
  }
@@ -23170,7 +23366,7 @@ function createScrollSpyObserver(items = [], options) {
23170
23366
  if (!itemByHref.has(item.href)) itemByHref.set(item.href, item);
23171
23367
  }
23172
23368
  const offset2 = resolveScrollSpyOffset(options.targetOffset, options.offsetTop);
23173
- const container = resolveScrollSpyContainer(options.container);
23369
+ const container = resolveScrollSpyContainer(options.container, options.from);
23174
23370
  const root = container === window ? null : container;
23175
23371
  return createAnchorObserver(hrefs, {
23176
23372
  offsetTop: offset2,
@@ -23542,10 +23738,12 @@ var sizeText = {
23542
23738
  function getRateStarClasses(size2, isCharacter, disabled) {
23543
23739
  return classNames(
23544
23740
  "relative inline-flex items-center justify-center transition-colors select-none",
23545
- isCharacter ? sizeText[size2] : sizePx[size2],
23741
+ sizePx[size2],
23742
+ isCharacter && sizeText[size2],
23546
23743
  disabled ? "cursor-default" : "cursor-pointer"
23547
23744
  );
23548
23745
  }
23746
+ var rateCharacterGlyphClasses = "inline-flex h-full w-full items-center justify-center";
23549
23747
  var rateHalfStarInnerClasses = "w-[200%] h-full";
23550
23748
  var rateActiveColor = "text-[color-mix(in_srgb,var(--tiger-warning,#d97706)_75%,var(--tiger-text,#111827))]";
23551
23749
  var rateInactiveColor = "text-[var(--tiger-text-disabled,#9ca3af)]";
@@ -24365,6 +24563,10 @@ function clampStepperValue(value, min, max, precision, step) {
24365
24563
  }
24366
24564
 
24367
24565
  // src/utils/calendar-utils.ts
24566
+ function eventIso(value) {
24567
+ const date = toCalendarDate(value);
24568
+ return date ? formatDate(date, "yyyy-MM-dd") : null;
24569
+ }
24368
24570
  var FOCUS_RING3 = "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]/40";
24369
24571
  function getCalendarContainerClasses(fullscreen) {
24370
24572
  return classNames(
@@ -24404,11 +24606,13 @@ function getCalendarDayClasses(state) {
24404
24606
  isActive,
24405
24607
  isInRange,
24406
24608
  isRangeStart,
24407
- isRangeEnd
24609
+ isRangeEnd,
24610
+ hasExtra
24408
24611
  } = state;
24409
24612
  const selected = isSelected || isRangeStart || isRangeEnd;
24410
24613
  return classNames(
24411
- "inline-flex items-center justify-center w-8 h-8 rounded-full text-sm",
24614
+ "inline-flex items-center justify-center w-8 text-sm",
24615
+ hasExtra ? "h-auto min-h-8 flex-col gap-0.5 rounded-[var(--tiger-radius-md,0.5rem)] py-0.5" : "h-8 rounded-full",
24412
24616
  "tiger-motion-aware [transition:var(--tiger-transition-base,color_150ms_ease)]",
24413
24617
  "justify-self-center my-0.5",
24414
24618
  FOCUS_RING3,
@@ -24418,6 +24622,39 @@ function getCalendarDayClasses(state) {
24418
24622
  isActive && !selected && "ring-1 ring-inset ring-[var(--tiger-primary,#2563eb)]"
24419
24623
  );
24420
24624
  }
24625
+ var calendarDateCellExtraClasses = "flex max-w-full flex-wrap items-center justify-center gap-0.5";
24626
+ var calendarDateCellDotClasses = "h-1.5 w-1.5 shrink-0 rounded-full";
24627
+ function getCalendarEventDotStyle(color) {
24628
+ return { backgroundColor: color?.trim() || "var(--tiger-primary, #2563eb)" };
24629
+ }
24630
+ function getCalendarEventsForDate(events, date) {
24631
+ if (!events || events.length === 0) return [];
24632
+ const iso = formatDate(date, "yyyy-MM-dd");
24633
+ const matched = [];
24634
+ for (const event of events) {
24635
+ if (eventIso(event.date) === iso) matched.push(event);
24636
+ }
24637
+ return matched;
24638
+ }
24639
+ function buildCalendarDateCellExtra(options) {
24640
+ return {
24641
+ iso: formatDate(options.date, "yyyy-MM-dd"),
24642
+ events: getCalendarEventsForDate(options.events, options.date),
24643
+ inCurrentMonth: options.inCurrentMonth,
24644
+ today: options.today,
24645
+ selected: options.selected,
24646
+ disabled: options.disabled
24647
+ };
24648
+ }
24649
+ function formatCalendarEventCountLabel(eventCount, template) {
24650
+ if (eventCount <= 0) return "";
24651
+ const source = template && template.trim() ? template : "{n} events";
24652
+ return source.replace(/\{n\}/g, String(eventCount));
24653
+ }
24654
+ function appendCalendarEventCountLabel(dayLabel, eventCount, template) {
24655
+ const extra = formatCalendarEventCountLabel(eventCount, template);
24656
+ return extra ? `${dayLabel}, ${extra}` : dayLabel;
24657
+ }
24421
24658
  function getCalendarMonthClasses(state) {
24422
24659
  return classNames(
24423
24660
  "inline-flex items-center justify-center rounded-[var(--tiger-radius-md,0.5rem)] py-2 px-3 text-sm",
@@ -28294,6 +28531,70 @@ function clearActiveListDrag() {
28294
28531
  emit();
28295
28532
  }
28296
28533
 
28534
+ // src/utils/fullscreen-utils.ts
28535
+ function isFullscreenSupported() {
28536
+ if (!isBrowser()) return false;
28537
+ const el = document.documentElement;
28538
+ return typeof el.requestFullscreen === "function" || typeof el.webkitRequestFullscreen === "function";
28539
+ }
28540
+ function getFullscreenElement() {
28541
+ if (!isBrowser()) return null;
28542
+ const doc = document;
28543
+ return document.fullscreenElement ?? doc.webkitFullscreenElement ?? null;
28544
+ }
28545
+ function isElementFullscreen(target) {
28546
+ const current = getFullscreenElement();
28547
+ if (!current) return false;
28548
+ if (!target) return true;
28549
+ return current === target;
28550
+ }
28551
+ async function requestElementFullscreen(target) {
28552
+ if (!isBrowser()) return;
28553
+ const el = target;
28554
+ if (typeof el.requestFullscreen === "function") {
28555
+ await el.requestFullscreen();
28556
+ return;
28557
+ }
28558
+ if (typeof el.webkitRequestFullscreen === "function") {
28559
+ await el.webkitRequestFullscreen();
28560
+ return;
28561
+ }
28562
+ throw new Error("Fullscreen is not supported");
28563
+ }
28564
+ async function exitElementFullscreen() {
28565
+ if (!isBrowser()) return;
28566
+ if (!getFullscreenElement()) return;
28567
+ const doc = document;
28568
+ if (typeof document.exitFullscreen === "function") {
28569
+ await document.exitFullscreen();
28570
+ return;
28571
+ }
28572
+ if (typeof doc.webkitExitFullscreen === "function") {
28573
+ await doc.webkitExitFullscreen();
28574
+ }
28575
+ }
28576
+ function subscribeFullscreenChange(onChange) {
28577
+ if (!isBrowser()) return () => void 0;
28578
+ document.addEventListener("fullscreenchange", onChange);
28579
+ document.addEventListener("webkitfullscreenchange", onChange);
28580
+ return () => {
28581
+ document.removeEventListener("fullscreenchange", onChange);
28582
+ document.removeEventListener("webkitfullscreenchange", onChange);
28583
+ };
28584
+ }
28585
+ function resolveFullscreenTarget(target) {
28586
+ if (!isBrowser()) return null;
28587
+ if (typeof target === "function") {
28588
+ try {
28589
+ return target() ?? document.documentElement;
28590
+ } catch {
28591
+ return document.documentElement;
28592
+ }
28593
+ }
28594
+ return target ?? document.documentElement;
28595
+ }
28596
+ var fullscreenButtonClasses = "inline-flex items-center justify-center min-h-9 min-w-9 rounded-[var(--tiger-radius-md,0.5rem)] text-[var(--tiger-text,#111827)] hover:bg-[var(--tiger-surface-muted,#f3f4f6)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))]/40 disabled:opacity-50 disabled:cursor-not-allowed";
28597
+
28297
28598
  // src/utils/resizable-utils.ts
28298
28599
  var resizableBaseClasses = "relative";
28299
28600
  var resizableHandleBaseClasses = "absolute z-10 tiger-motion-aware transition-opacity duration-150 opacity-0 pointer-events-none group-hover/resizable:opacity-100 group-hover/resizable:pointer-events-auto hover:opacity-100 hover:pointer-events-auto focus-visible:opacity-100 focus-visible:pointer-events-auto outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--tiger-focus-ring,var(--tiger-primary,#2563eb))] touch-none";
@@ -35299,7 +35600,7 @@ function createTigercatPlugin(options = {}) {
35299
35600
  }
35300
35601
 
35301
35602
  // src/index.ts
35302
- var version = "2.1.3";
35603
+ var version = "2.2.0";
35303
35604
  export {
35304
35605
  AFFIX_UNPINNED_STATE,
35305
35606
  ANIMATION_DURATION_FAST_MS,
@@ -35625,6 +35926,7 @@ export {
35625
35926
  anchorNestedListClasses,
35626
35927
  animationDelayClasses,
35627
35928
  announceToScreenReader,
35929
+ appendCalendarEventCountLabel,
35628
35930
  appendDefaultTaskBoardCard,
35629
35931
  appendDefaultTaskBoardColumn,
35630
35932
  appendSignaturePoint,
@@ -35719,6 +36021,7 @@ export {
35719
36021
  buildAffixPlaceholderStyle,
35720
36022
  buildAffixRootMargin,
35721
36023
  buildAffixStyle,
36024
+ buildCalendarDateCellExtra,
35722
36025
  buildChartLegendItems,
35723
36026
  buildChartSeriesKeys,
35724
36027
  buildChatMessageStatusInfo,
@@ -35757,6 +36060,8 @@ export {
35757
36060
  calculateTransform,
35758
36061
  calculateVirtualColumnRange,
35759
36062
  calculateVirtualRange,
36063
+ calendarDateCellDotClasses,
36064
+ calendarDateCellExtraClasses,
35760
36065
  calendarGridClasses,
35761
36066
  calendarHeaderClasses,
35762
36067
  calendarNavButtonClasses,
@@ -35896,6 +36201,7 @@ export {
35896
36201
  clearChartAxisTickCache,
35897
36202
  clearFieldErrors,
35898
36203
  clearPieArcCache,
36204
+ clearRegisteredIcons,
35899
36205
  clearSelectValue,
35900
36206
  clearSignatureStrokes,
35901
36207
  clearTextareaAutoResize,
@@ -36256,6 +36562,7 @@ export {
36256
36562
  evaluateFormConditions,
36257
36563
  exclamationCircleIcon,
36258
36564
  exclusiveRangeToInclusive,
36565
+ exitElementFullscreen,
36259
36566
  expandChevronIcon16PathD,
36260
36567
  exportChartPng,
36261
36568
  exportSignatureDataUrl,
@@ -36313,6 +36620,7 @@ export {
36313
36620
  findHotkeyMatch,
36314
36621
  findLastEnabledIndex,
36315
36622
  findMarkdownHotkeyMatch,
36623
+ findNearestOverflowAncestor,
36316
36624
  findNearestPointIndex,
36317
36625
  findNearestSeriesPoint,
36318
36626
  findNextEnabledIndex,
@@ -36361,6 +36669,7 @@ export {
36361
36669
  formatBytes,
36362
36670
  formatCalendarDayLabel,
36363
36671
  formatCalendarDayNumber,
36672
+ formatCalendarEventCountLabel,
36364
36673
  formatChartTemplate,
36365
36674
  formatChatTime,
36366
36675
  formatColorPickerSelectPreset,
@@ -36412,6 +36721,7 @@ export {
36412
36721
  formatTimePickerDisplay,
36413
36722
  formatTreeSelectNodeLabel,
36414
36723
  freezeTableColumnWidths,
36724
+ fullscreenButtonClasses,
36415
36725
  fullscreenExitIcon,
36416
36726
  fullscreenIcon,
36417
36727
  funnelSegmentTransitionClasses,
@@ -36501,6 +36811,8 @@ export {
36501
36811
  getCalendarDayClasses,
36502
36812
  getCalendarDayKeyAction,
36503
36813
  getCalendarDays,
36814
+ getCalendarEventDotStyle,
36815
+ getCalendarEventsForDate,
36504
36816
  getCalendarLabels,
36505
36817
  getCalendarMonthClasses,
36506
36818
  getCalendarMonthDaysCacheSize,
@@ -36736,6 +37048,8 @@ export {
36736
37048
  getFormWizardHeaderClasses,
36737
37049
  getFormWizardLabels,
36738
37050
  getFormWizardWrapperClasses,
37051
+ getFullscreenElement,
37052
+ getFullscreenLabels,
36739
37053
  getFunnelGradientPrefix,
36740
37054
  getGanttDependencyPath,
36741
37055
  getGanttTaskAriaLabel,
@@ -36824,6 +37138,7 @@ export {
36824
37138
  getKbdVariantClasses,
36825
37139
  getLastEnabledFileIndex,
36826
37140
  getLayoutContentClasses,
37141
+ getLayoutFooterClasses,
36827
37142
  getLayoutHeaderClasses,
36828
37143
  getLayoutRootClasses,
36829
37144
  getLayoutSidebarClasses,
@@ -37384,6 +37699,7 @@ export {
37384
37699
  imageCropperImgClasses,
37385
37700
  imageCropperMaskClasses,
37386
37701
  imageCropperSelectionClasses,
37702
+ imageCropperSizeHostClasses,
37387
37703
  imageErrorClasses,
37388
37704
  imageErrorIconPath,
37389
37705
  imageFrameClasses,
@@ -37496,6 +37812,7 @@ export {
37496
37812
  isDividerHorizontal,
37497
37813
  isDragEnabled,
37498
37814
  isDrawerSwipeCloseGesture,
37815
+ isElementFullscreen,
37499
37816
  isEnterKey,
37500
37817
  isEscapeKey,
37501
37818
  isEventOutside,
@@ -37504,6 +37821,7 @@ export {
37504
37821
  isFocusInsideNavigationMenu,
37505
37822
  isFormItemGroupControl,
37506
37823
  isFormValidationCancelled,
37824
+ isFullscreenSupported,
37507
37825
  isHTMLElement,
37508
37826
  isHourOptionDisabled,
37509
37827
  isHttpResultStatus,
@@ -37580,6 +37898,7 @@ export {
37580
37898
  isTabPaneType,
37581
37899
  isTableCellEditable,
37582
37900
  isTablet,
37901
+ isTextCopyable,
37583
37902
  isTimeInRange,
37584
37903
  isTimePickerDesktopLayout,
37585
37904
  isTimePickerRangeComplete,
@@ -37614,6 +37933,7 @@ export {
37614
37933
  layoutBarRects,
37615
37934
  layoutContentClasses,
37616
37935
  layoutFooterClasses,
37936
+ layoutFooterCompactClasses,
37617
37937
  layoutFunnel,
37618
37938
  layoutGantt,
37619
37939
  layoutGauge,
@@ -37961,6 +38281,7 @@ export {
37961
38281
  pieSliceLabelInsideClasses,
37962
38282
  pieSliceTransitionClasses,
37963
38283
  planChatScroll,
38284
+ planCropperDisplaySize,
37964
38285
  playIcon,
37965
38286
  plusPathD,
37966
38287
  polarToCartesian,
@@ -38031,6 +38352,7 @@ export {
38031
38352
  radioVisualBaseClasses,
38032
38353
  rateActiveColor,
38033
38354
  rateBaseClasses,
38355
+ rateCharacterGlyphClasses,
38034
38356
  rateHalfStarInnerClasses,
38035
38357
  rateHoverColor,
38036
38358
  rateInactiveColor,
@@ -38051,13 +38373,17 @@ export {
38051
38373
  redoFormHistory,
38052
38374
  registerBuiltInThemes,
38053
38375
  registerEscapeDismiss,
38376
+ registerIcon,
38377
+ registerIcons,
38054
38378
  registerImageGroupItem,
38379
+ registeredIconNames,
38055
38380
  remapCropRect,
38056
38381
  rememberCascaderLabel,
38057
38382
  rememberSelectOptions,
38058
38383
  rememberTreeSelectLabel,
38059
38384
  removeCssVarsCached,
38060
38385
  removeTagAt,
38386
+ renderCodeHighlightHtml,
38061
38387
  renderMarkdownInline,
38062
38388
  renderMarkdownToHtml,
38063
38389
  renderTokenHtml,
@@ -38072,6 +38398,7 @@ export {
38072
38398
  reorderTableRowsByKey,
38073
38399
  replaceAnchorHash,
38074
38400
  replaceKeys,
38401
+ requestElementFullscreen,
38075
38402
  resetAreaGradientCounter,
38076
38403
  resetAriaIdCounter,
38077
38404
  resetBarGradientCounter,
@@ -38143,6 +38470,7 @@ export {
38143
38470
  resolveConditionalFormRules,
38144
38471
  resolveConfigDirection,
38145
38472
  resolveCreatableSelectOption,
38473
+ resolveCropperAvailableSize,
38146
38474
  resolveDataExportColumns,
38147
38475
  resolveDataExportFilename,
38148
38476
  resolveDatePickerDisabled,
@@ -38161,6 +38489,7 @@ export {
38161
38489
  resolveFormConditionState,
38162
38490
  resolveFormFieldConditionState,
38163
38491
  resolveFormLabelAlign,
38492
+ resolveFullscreenTarget,
38164
38493
  resolveGutter,
38165
38494
  resolveHeatmapRenderMode,
38166
38495
  resolveHighlightCaseSensitive,
@@ -38221,6 +38550,7 @@ export {
38221
38550
  resolveMenuCollapsed,
38222
38551
  resolveMenuIconKind,
38223
38552
  resolveMenuMode,
38553
+ resolveMenuSearchQuery,
38224
38554
  resolveMenuTabStopKey,
38225
38555
  resolveMessageDuration,
38226
38556
  resolveMotionDuration,
@@ -38281,6 +38611,8 @@ export {
38281
38611
  resolveTaskBoardView,
38282
38612
  resolveTextAlign,
38283
38613
  resolveTextColor,
38614
+ resolveTextCopyContent,
38615
+ resolveTextCopyableOptions,
38284
38616
  resolveTextSize,
38285
38617
  resolveTextTag,
38286
38618
  resolveTextWeight,
@@ -38437,6 +38769,7 @@ export {
38437
38769
  shouldShowAutoCompleteClear,
38438
38770
  shouldShowBackTop,
38439
38771
  shouldShowCascaderClear,
38772
+ shouldShowMenuSearch,
38440
38773
  shouldShowSelectClear,
38441
38774
  shouldShowTreeSelectClear,
38442
38775
  shouldSkipNavigationMenuOpenDelay,
@@ -38480,6 +38813,7 @@ export {
38480
38813
  sliderThumbDraggingClasses,
38481
38814
  sliderThumbInsetStyle,
38482
38815
  sliderTooltipClasses,
38816
+ sliderTooltipReserveClasses,
38483
38817
  sliderTrackClasses,
38484
38818
  sliderValuesEqual,
38485
38819
  sortActivityGroups,
@@ -38493,6 +38827,7 @@ export {
38493
38827
  sortFileItems,
38494
38828
  sortNotificationGroups,
38495
38829
  sparklesIcon,
38830
+ splitButtonDropdownClasses,
38496
38831
  splitButtonPrimaryBlockClasses,
38497
38832
  splitButtonPrimaryClasses,
38498
38833
  splitButtonRootBlockClasses,
@@ -38559,6 +38894,7 @@ export {
38559
38894
  submenuExpandIconPopupClasses,
38560
38895
  submenuHeightTransitionClasses,
38561
38896
  submenuTitleClasses,
38897
+ subscribeFullscreenChange,
38562
38898
  subscribeTableCardViewport,
38563
38899
  successCircleSolidIcon20PathD,
38564
38900
  sunIcon,
@@ -38643,6 +38979,10 @@ export {
38643
38979
  terminalIcon,
38644
38980
  textAlignClasses,
38645
38981
  textColorClasses,
38982
+ textCopyableBodyClasses,
38983
+ textCopyableButtonClasses,
38984
+ textCopyableLiveClasses,
38985
+ textCopyableRootClasses,
38646
38986
  textDecorationClasses,
38647
38987
  textSizeClasses,
38648
38988
  textWeightClasses,
@@ -38764,6 +39104,7 @@ export {
38764
39104
  uniqueMenuKeys,
38765
39105
  uniqueTreeKeys,
38766
39106
  unlockIcon,
39107
+ unregisterIcon,
38767
39108
  unregisterImageGroupItem,
38768
39109
  updateCronExpressionField,
38769
39110
  updateDragOffset,