@eifi1/ui-kit 0.39.1 → 0.40.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 (144) hide show
  1. package/README.md +8 -7
  2. package/dist/billing/billing-overview.d.ts +10 -0
  3. package/dist/components/autocomplete.js +5 -1
  4. package/dist/components/autocomplete.js.map +1 -1
  5. package/dist/components/combobox-core.d.ts +14 -1
  6. package/dist/components/combobox-core.js +4 -0
  7. package/dist/components/combobox-core.js.map +1 -1
  8. package/dist/components/combobox.js +9 -3
  9. package/dist/components/combobox.js.map +1 -1
  10. package/dist/components/data-table-labels.d.ts +5 -0
  11. package/dist/components/data-table-labels.js +2 -0
  12. package/dist/components/data-table-labels.js.map +1 -1
  13. package/dist/components/data-table-mobile.d.ts +36 -1
  14. package/dist/components/data-table-mobile.js +162 -15
  15. package/dist/components/data-table-mobile.js.map +1 -1
  16. package/dist/components/data-table.d.ts +39 -12
  17. package/dist/components/data-table.js +74 -13
  18. package/dist/components/data-table.js.map +1 -1
  19. package/dist/components/inline-entity-combobox.js +10 -3
  20. package/dist/components/inline-entity-combobox.js.map +1 -1
  21. package/dist/components/picker-sheet.d.ts +18 -1
  22. package/dist/components/picker-sheet.js +20 -2
  23. package/dist/components/picker-sheet.js.map +1 -1
  24. package/dist/components/tabs.d.ts +26 -2
  25. package/dist/components/tabs.js +41 -2
  26. package/dist/components/tabs.js.map +1 -1
  27. package/dist/components/translation-review-parts.d.ts +2 -1
  28. package/dist/components/translation-review-parts.js +1 -1
  29. package/dist/components/translation-review-parts.js.map +1 -1
  30. package/dist/components/ui-labels.js +3 -1
  31. package/dist/components/ui-labels.js.map +1 -1
  32. package/dist/eslint/index.js +1 -1
  33. package/dist/feedback/feedback-comment-thread.d.ts +8 -1
  34. package/dist/feedback/feedback-comment-thread.js +26 -1
  35. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  36. package/dist/feedback/feedback-labels.d.ts +2 -1
  37. package/dist/feedback/feedback-labels.js +1 -0
  38. package/dist/feedback/feedback-labels.js.map +1 -1
  39. package/dist/feedback/feedback-menu-labels.js +3 -1
  40. package/dist/feedback/feedback-menu-labels.js.map +1 -1
  41. package/dist/feedback/feedback-menu.d.ts +31 -24
  42. package/dist/feedback/feedback-menu.js +16 -7
  43. package/dist/feedback/feedback-menu.js.map +1 -1
  44. package/dist/feedback/feedback-public-labels.d.ts +3 -2
  45. package/dist/feedback/feedback-public-labels.js +1 -1
  46. package/dist/feedback/feedback-public-labels.js.map +1 -1
  47. package/dist/feedback/feedback-public-list.d.ts +4 -1
  48. package/dist/feedback/feedback-public-list.js +67 -55
  49. package/dist/feedback/feedback-public-list.js.map +1 -1
  50. package/dist/feedback/feedback-public-types.d.ts +16 -3
  51. package/dist/feedback/feedback-record.d.ts +20 -3
  52. package/dist/feedback/feedback-record.js +15 -0
  53. package/dist/feedback/feedback-record.js.map +1 -1
  54. package/dist/feedback/feedback-replies.d.ts +13 -2
  55. package/dist/feedback/feedback-replies.js +67 -33
  56. package/dist/feedback/feedback-replies.js.map +1 -1
  57. package/dist/feedback/feedback-rework-entry-chip.d.ts +9 -0
  58. package/dist/feedback/feedback-rework-entry-chip.js +13 -0
  59. package/dist/feedback/feedback-rework-entry-chip.js.map +1 -0
  60. package/dist/feedback/feedback-row-detail.d.ts +31 -8
  61. package/dist/feedback/feedback-row-detail.js +31 -7
  62. package/dist/feedback/feedback-row-detail.js.map +1 -1
  63. package/dist/feedback/feedback-table-labels.js +1 -1
  64. package/dist/feedback/feedback-table-labels.js.map +1 -1
  65. package/dist/feedback/feedback-table.d.ts +5 -2
  66. package/dist/feedback/feedback-table.js +2 -2
  67. package/dist/feedback/feedback-table.js.map +1 -1
  68. package/dist/feedback/feedback-thread.js +3 -1
  69. package/dist/feedback/feedback-thread.js.map +1 -1
  70. package/dist/feedback/feedback-vocabulary.d.ts +9 -6
  71. package/dist/feedback/feedback-vocabulary.js +16 -1
  72. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  73. package/dist/hooks/use-long-press.d.ts +30 -0
  74. package/dist/hooks/use-long-press.js +77 -0
  75. package/dist/hooks/use-long-press.js.map +1 -0
  76. package/dist/hooks/use-overlay-history.js +37 -3
  77. package/dist/hooks/use-overlay-history.js.map +1 -1
  78. package/dist/i18n/german.js +13 -5
  79. package/dist/i18n/german.js.map +1 -1
  80. package/dist/i18n/kit-labels.d.ts +3 -0
  81. package/dist/i18n/kit-labels.js.map +1 -1
  82. package/dist/i18n/locales/en.js +12 -5
  83. package/dist/i18n/locales/en.js.map +2 -2
  84. package/dist/i18n/locales/es.js +13 -5
  85. package/dist/i18n/locales/es.js.map +1 -1
  86. package/dist/i18n/locales/fr.js +13 -5
  87. package/dist/i18n/locales/fr.js.map +1 -1
  88. package/dist/i18n/locales/hu.js +13 -5
  89. package/dist/i18n/locales/hu.js.map +1 -1
  90. package/dist/i18n/locales/it.js +13 -5
  91. package/dist/i18n/locales/it.js.map +1 -1
  92. package/dist/i18n/locales/zh.js +13 -5
  93. package/dist/i18n/locales/zh.js.map +1 -1
  94. package/dist/i18n/shared-labels.js +1 -1
  95. package/dist/i18n/shared-labels.js.map +1 -1
  96. package/dist/shell/app-shell.js +9 -0
  97. package/dist/shell/app-shell.js.map +1 -1
  98. package/dist/shell/fill-height.d.ts +38 -0
  99. package/dist/shell/fill-height.js +12 -0
  100. package/dist/shell/fill-height.js.map +1 -0
  101. package/dist/shell.d.ts +2 -0
  102. package/dist/shell.js +3 -0
  103. package/dist/shell.js.map +1 -1
  104. package/package.json +1 -1
  105. package/src/billing/billing-overview.ts +10 -0
  106. package/src/components/autocomplete.tsx +5 -1
  107. package/src/components/combobox-core.tsx +20 -1
  108. package/src/components/combobox.tsx +9 -3
  109. package/src/components/data-table-labels.ts +7 -0
  110. package/src/components/data-table-mobile.tsx +193 -9
  111. package/src/components/data-table.tsx +141 -24
  112. package/src/components/inline-entity-combobox.tsx +12 -4
  113. package/src/components/picker-sheet.tsx +38 -1
  114. package/src/components/tabs.tsx +73 -3
  115. package/src/components/translation-review-parts.tsx +3 -2
  116. package/src/components/ui-labels.ts +2 -0
  117. package/src/feedback/feedback-comment-thread.tsx +39 -1
  118. package/src/feedback/feedback-labels.ts +3 -1
  119. package/src/feedback/feedback-menu-labels.ts +2 -0
  120. package/src/feedback/feedback-menu.tsx +48 -30
  121. package/src/feedback/feedback-public-labels.ts +4 -3
  122. package/src/feedback/feedback-public-list.tsx +15 -2
  123. package/src/feedback/feedback-public-types.ts +17 -3
  124. package/src/feedback/feedback-record.ts +34 -3
  125. package/src/feedback/feedback-replies.tsx +100 -31
  126. package/src/feedback/feedback-rework-entry-chip.tsx +18 -0
  127. package/src/feedback/feedback-row-detail.tsx +65 -12
  128. package/src/feedback/feedback-table-labels.ts +1 -1
  129. package/src/feedback/feedback-table.tsx +7 -4
  130. package/src/feedback/feedback-thread.tsx +5 -1
  131. package/src/feedback/feedback-vocabulary.ts +27 -6
  132. package/src/hooks/use-long-press.ts +126 -0
  133. package/src/hooks/use-overlay-history.ts +74 -3
  134. package/src/i18n/german.ts +10 -2
  135. package/src/i18n/kit-labels.tsx +3 -0
  136. package/src/i18n/locales/es.ts +10 -2
  137. package/src/i18n/locales/fr.ts +10 -2
  138. package/src/i18n/locales/hu.ts +10 -2
  139. package/src/i18n/locales/it.ts +10 -2
  140. package/src/i18n/locales/zh.ts +10 -2
  141. package/src/i18n/shared-labels.ts +1 -1
  142. package/src/shell/app-shell.tsx +9 -0
  143. package/src/shell/fill-height.tsx +45 -0
  144. package/src/shell.ts +3 -0
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { createElement } from "react";
4
- import { Fragment, useEffect, useId, useMemo, useRef, useState } from "react";
4
+ import { Fragment, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
5
5
  import { Card } from "./card.js";
6
6
  import { Spinner } from "./spinner.js";
7
7
  import { ROW_ACTIONS_KEY, useRowActionColumn } from "./data-table-row-actions.js";
@@ -16,7 +16,7 @@ import {
16
16
  resolveDataTableLabels,
17
17
  splitCellProps
18
18
  } from "./data-table-shared.js";
19
- import { MobileFilters, MobileRow, MobileSort, StackedFields } from "./data-table-mobile.js";
19
+ import { MobileFilters, MobileRow, MobileSelectBar, MobileSort, StackedFields } from "./data-table-mobile.js";
20
20
  import { DataTableHead } from "./data-table-head.js";
21
21
  import { ColumnSettingsPanel } from "./data-table-column-settings.js";
22
22
  import { useLargeText } from "../hooks/use-large-text.js";
@@ -343,6 +343,22 @@ function DataTable({
343
343
  const d = dirOf(el);
344
344
  if (d !== mobileDir) setMobileDir(d);
345
345
  };
346
+ const phoneFill = fillHeight && !isMdUp;
347
+ const phoneListRef = useRef(null);
348
+ const [phoneListScrolls, setPhoneListScrolls] = useState(false);
349
+ useLayoutEffect(() => {
350
+ const el = phoneListRef.current;
351
+ if (!phoneFill || !el) return;
352
+ setPhoneListScrolls(el.scrollHeight > el.clientHeight + 1);
353
+ });
354
+ useEffect(() => {
355
+ const el = phoneListRef.current;
356
+ if (!phoneFill || !el || typeof ResizeObserver === "undefined") return;
357
+ const ro = new ResizeObserver(() => setPhoneListScrolls(el.scrollHeight > el.clientHeight + 1));
358
+ ro.observe(el);
359
+ if (el.parentElement) ro.observe(el.parentElement);
360
+ return () => ro.disconnect();
361
+ }, [phoneFill]);
346
362
  const { mobileSlice, canRevealMoreMobile, loadMoreRef } = useMobileReveal({
347
363
  rows: sorted,
348
364
  slice,
@@ -351,6 +367,14 @@ function DataTable({
351
367
  unpaged,
352
368
  defaultPageSize
353
369
  });
370
+ const anySelected = !!selection && (selection.someSelected || selection.allSelected && slice.length > 0);
371
+ const [phoneSelectMode, setPhoneSelectMode] = useState(false);
372
+ const [hadSelection, setHadSelection] = useState(anySelected);
373
+ if (anySelected !== hadSelection) {
374
+ setHadSelection(anySelected);
375
+ if (!anySelected) setPhoneSelectMode(false);
376
+ }
377
+ const phoneSelecting = !!selection && !isMdUp && (phoneSelectMode || anySelected);
354
378
  const { selectionAnchor, rangeClick, canSelect, selectRange } = useRangeSelection({
355
379
  selection,
356
380
  slice,
@@ -384,7 +408,21 @@ function DataTable({
384
408
  mobileSecondaryColumns,
385
409
  mobileExpandAsDialog,
386
410
  compact,
387
- large
411
+ large,
412
+ select: selection ? {
413
+ active: phoneSelecting,
414
+ selectable: canSelect(row),
415
+ selected: selection.isSelected(row),
416
+ onToggle: (checked) => {
417
+ selectionAnchor.current = rowKey(row);
418
+ selection.onToggle(row, checked);
419
+ },
420
+ onLongPress: () => {
421
+ setPhoneSelectMode(true);
422
+ selectionAnchor.current = rowKey(row);
423
+ if (!selection.isSelected(row)) selection.onToggle(row, true);
424
+ }
425
+ } : null
388
426
  },
389
427
  rowKey(row)
390
428
  );
@@ -402,13 +440,16 @@ function DataTable({
402
440
  "data-density": density,
403
441
  "data-frame": frame ? void 0 : "none",
404
442
  "data-clips": frame ? "" : void 0,
443
+ "data-fill-height": fillHeight ? "" : void 0,
405
444
  className: cn(
406
445
  "group/table",
407
446
  frame ? "overflow-clip" : "min-w-0",
408
447
  // Both layouts, not just the table: the phone card list overflowing a bounded
409
448
  // pane drew itself over whatever followed it, and in a viewport-locked shell
410
- // the rows below the fold could not be reached at all.
411
- fillHeight && "flex flex-1 flex-col min-h-0",
449
+ // the rows below the fold could not be reached at all. From `md` the minimum is
450
+ // the content's again (`md:min-h-auto`): the body's floor below then holds the
451
+ // whole chain up to `<main>`, which scrolls instead of leaving a slit.
452
+ fillHeight && "flex flex-1 flex-col min-h-0 md:min-h-auto",
412
453
  className
413
454
  ),
414
455
  children: [
@@ -466,16 +507,36 @@ function DataTable({
466
507
  }
467
508
  }
468
509
  ),
510
+ selection && /* @__PURE__ */ jsx(
511
+ MobileSelectBar,
512
+ {
513
+ active: phoneSelecting,
514
+ allSelected: selection.allSelected,
515
+ someSelected: selection.someSelected,
516
+ compact,
517
+ labels,
518
+ onEnter: () => setPhoneSelectMode(true),
519
+ onToggleAll: selection.onToggleAll,
520
+ onCancel: () => {
521
+ setPhoneSelectMode(false);
522
+ if (anySelected) selection.onToggleAll(false);
523
+ }
524
+ }
525
+ ),
469
526
  /* @__PURE__ */ jsxs(
470
527
  "ul",
471
528
  {
529
+ ref: phoneListRef,
472
530
  className: cn(
473
531
  "divide-y divide-subtle",
474
- // Under `fillHeight` the list is the scroller, as the table body is on a
475
- // wide screen: the filter button stays above it and a server pager below.
476
- // The endless-scroll sentinel still fires in here — an
477
- // IntersectionObserver on the viewport sees through the clipping ancestor.
478
- fillHeight && "min-h-0 flex-1 overflow-y-auto overscroll-contain",
532
+ // Under `fillHeight` the list takes the room its parent gives it, and in a
533
+ // BOUNDED parent it is the scroller, as the table body is on a wide screen:
534
+ // the filter button stays above it and a server pager below. Only then —
535
+ // see `phoneListScrolls` (live #420). The endless-scroll sentinel still
536
+ // fires in here — an IntersectionObserver on the viewport sees through the
537
+ // clipping ancestor.
538
+ fillHeight && "min-h-0 flex-1",
539
+ fillHeight && phoneListScrolls && "overflow-y-auto overscroll-contain",
479
540
  // Same busy treatment as the desktop body; see `isLoading` below.
480
541
  isLoading && mobileSlice.length > 0 && "opacity-60 transition-opacity"
481
542
  ),
@@ -560,14 +621,14 @@ function DataTable({
560
621
  }
561
622
  )
562
623
  ] }),
563
- isMdUp && /* @__PURE__ */ jsxs("div", { className: cn("flex", fillHeight && "min-h-0 flex-1"), children: [
564
- /* @__PURE__ */ jsxs("div", { className: cn("relative min-w-0 flex-1", fillHeight && "flex flex-col min-h-0"), children: [
624
+ isMdUp && /* @__PURE__ */ jsxs("div", { className: cn("flex", fillHeight && "flex-1"), children: [
625
+ /* @__PURE__ */ jsxs("div", { className: cn("relative min-w-0 flex-1", fillHeight && "flex flex-col"), children: [
565
626
  /* @__PURE__ */ jsx(
566
627
  "div",
567
628
  {
568
629
  ref: desktopScroller,
569
630
  "data-clips": "",
570
- className: cn("overflow-auto [scrollbar-gutter:stable]", fillHeight && "flex-1 min-h-0"),
631
+ className: cn("overflow-auto [scrollbar-gutter:stable]", fillHeight && "min-h-0 grow basis-48"),
571
632
  ...edgeFadeProps,
572
633
  style: fillHeight ? edgeFadeProps.style : { ...edgeFadeProps.style, maxHeight: maxBodyHeight },
573
634
  children: /* @__PURE__ */ jsxs(