@almadar/ui 5.122.13 → 5.123.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.
@@ -62,6 +62,7 @@ var langPowershell = require('react-syntax-highlighter/dist/esm/languages/prism/
62
62
  var langMakefile = require('react-syntax-highlighter/dist/esm/languages/prism/makefile.js');
63
63
  var langNginx = require('react-syntax-highlighter/dist/esm/languages/prism/nginx.js');
64
64
  var langIni = require('react-syntax-highlighter/dist/esm/languages/prism/ini.js');
65
+ var langClike = require('react-syntax-highlighter/dist/esm/languages/prism/clike.js');
65
66
  var ReactMarkdown = require('react-markdown');
66
67
  var remarkGfm = require('remark-gfm');
67
68
  var remarkMath = require('remark-math');
@@ -145,6 +146,7 @@ var langPowershell__default = /*#__PURE__*/_interopDefault(langPowershell);
145
146
  var langMakefile__default = /*#__PURE__*/_interopDefault(langMakefile);
146
147
  var langNginx__default = /*#__PURE__*/_interopDefault(langNginx);
147
148
  var langIni__default = /*#__PURE__*/_interopDefault(langIni);
149
+ var langClike__default = /*#__PURE__*/_interopDefault(langClike);
148
150
  var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
149
151
  var remarkGfm__default = /*#__PURE__*/_interopDefault(remarkGfm);
150
152
  var remarkMath__default = /*#__PURE__*/_interopDefault(remarkMath);
@@ -1846,6 +1848,7 @@ var init_Button = __esm({
1846
1848
  "button",
1847
1849
  {
1848
1850
  ref,
1851
+ type: "button",
1849
1852
  disabled: disabled || isLoading,
1850
1853
  className: cn(
1851
1854
  "relative inline-flex items-center justify-center gap-2",
@@ -4012,6 +4015,11 @@ var init_Typography = __esm({
4012
4015
  inherit: "text-inherit"
4013
4016
  };
4014
4017
  weightStyles = {
4018
+ // Neutral: an atom default of "none" must not override the variant's baked
4019
+ // weight (C-PATTERN-ENUM-BLOCKS-NEUTRAL-OVERRIDE — `variant={h2}` rendered
4020
+ // tiny because the ui-typography atom's `weight: light`/`size: xs` defaults
4021
+ // clobbered every variant).
4022
+ none: "",
4015
4023
  light: "font-light",
4016
4024
  normal: "font-normal",
4017
4025
  medium: "font-medium",
@@ -4037,6 +4045,7 @@ var init_Typography = __esm({
4037
4045
  label: "span"
4038
4046
  };
4039
4047
  typographySizeStyles = {
4048
+ none: "",
4040
4049
  xs: "text-xs",
4041
4050
  sm: "text-sm",
4042
4051
  md: "text-base",
@@ -10091,7 +10100,7 @@ async function loadPrismLanguage(lang) {
10091
10100
  if (isLanguageRegistered(lang)) return;
10092
10101
  try {
10093
10102
  const grammar = codeLanguageLoader ? await codeLanguageLoader(lang) : null;
10094
- if (grammar) SyntaxHighlighter__default.default.registerLanguage(lang, grammar);
10103
+ SyntaxHighlighter__default.default.registerLanguage(lang, grammar ?? langClike__default.default);
10095
10104
  dynamicallyLoaded.add(lang);
10096
10105
  } catch {
10097
10106
  dynamicallyLoaded.add(lang);
@@ -10260,6 +10269,7 @@ var init_CodeBlock = __esm({
10260
10269
  SyntaxHighlighter__default.default.registerLanguage("make", langMakefile__default.default);
10261
10270
  SyntaxHighlighter__default.default.registerLanguage("nginx", langNginx__default.default);
10262
10271
  SyntaxHighlighter__default.default.registerLanguage("ini", langIni__default.default);
10272
+ SyntaxHighlighter__default.default.registerLanguage("clike", langClike__default.default);
10263
10273
  SyntaxHighlighter__default.default.registerLanguage("orb", syntax.orbLanguage);
10264
10274
  SyntaxHighlighter__default.default.registerLanguage("lolo", syntax.loloLanguage);
10265
10275
  dynamicallyLoaded = /* @__PURE__ */ new Set();
@@ -10809,7 +10819,7 @@ var init_CodeBlock = __esm({
10809
10819
  ] }) });
10810
10820
  }
10811
10821
  const hasHeader = showLanguageBadge || effectiveCopy;
10812
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: `relative group ${className || ""}`, style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
10822
+ return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: `relative group not-prose ${className || ""}`, style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
10813
10823
  hasHeader && /* @__PURE__ */ jsxRuntime.jsxs(
10814
10824
  exports.HStack,
10815
10825
  {
@@ -20720,6 +20730,13 @@ function DataGrid({
20720
20730
  row: itemData
20721
20731
  };
20722
20732
  eventBus.emit(`UI:${action.event}`, payload);
20733
+ if (action.navigatesTo) {
20734
+ const url = action.navigatesTo.replace(
20735
+ /\{\{row\.(\w+(?:\.\w+)*)\}\}/g,
20736
+ (_, field) => String(itemData[field] ?? "")
20737
+ );
20738
+ eventBus.emit("UI:NAVIGATE", { url });
20739
+ }
20723
20740
  };
20724
20741
  const hasRenderProp = typeof children === "function";
20725
20742
  React74.useEffect(() => {
@@ -20787,13 +20804,49 @@ function DataGrid({
20787
20804
  const wrapDnd = (node) => dnd.isZone ? /* @__PURE__ */ jsxRuntime.jsx(dnd.SortableItem, { id: dndId, children: node }, dndId) : node;
20788
20805
  if (hasRenderProp) {
20789
20806
  return wrapDnd(
20790
- /* @__PURE__ */ jsxRuntime.jsx(
20807
+ /* @__PURE__ */ jsxRuntime.jsxs(
20791
20808
  exports.Box,
20792
20809
  {
20793
20810
  "data-entity-row": true,
20794
20811
  "data-entity-id": id,
20795
20812
  className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
20796
- children: children(itemData, index)
20813
+ children: [
20814
+ children(itemData, index),
20815
+ actionDefs.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "px-4 py-3 border-t border-border", children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", className: "justify-end", children: [
20816
+ (maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : actionDefs).map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
20817
+ exports.Button,
20818
+ {
20819
+ variant: action.variant === "primary" ? "primary" : "ghost",
20820
+ size: "sm",
20821
+ onClick: handleActionClick(action, itemData),
20822
+ "data-testid": `action-${action.event}`,
20823
+ "data-row-id": String(itemData.id),
20824
+ className: action.variant === "danger" ? "text-error hover:text-error hover:bg-error/10" : void 0,
20825
+ children: [
20826
+ action.icon && renderIconInput(action.icon, { size: "xs", className: "mr-1" }),
20827
+ action.label
20828
+ ]
20829
+ },
20830
+ idx
20831
+ )),
20832
+ maxInlineActions != null && actionDefs.length > maxInlineActions && /* @__PURE__ */ jsxRuntime.jsx(
20833
+ exports.Menu,
20834
+ {
20835
+ position: "bottom-end",
20836
+ trigger: /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "more-horizontal", size: "xs" }) }),
20837
+ items: actionDefs.slice(maxInlineActions).map((action) => ({
20838
+ label: action.label,
20839
+ icon: action.icon,
20840
+ event: action.event,
20841
+ onClick: () => eventBus.emit(`UI:${action.event}`, {
20842
+ id: itemData.id,
20843
+ row: itemData
20844
+ })
20845
+ }))
20846
+ }
20847
+ )
20848
+ ] }) })
20849
+ ]
20797
20850
  },
20798
20851
  id
20799
20852
  )
@@ -22659,7 +22712,9 @@ var init_FilterGroup = __esm({
22659
22712
  showIcon = true,
22660
22713
  query,
22661
22714
  isLoading,
22662
- look = "toolbar"
22715
+ look = "toolbar",
22716
+ event,
22717
+ clearEvent
22663
22718
  }) => {
22664
22719
  const { t } = hooks.useTranslate();
22665
22720
  const eventBus = useEventBus();
@@ -22696,14 +22751,18 @@ var init_FilterGroup = __esm({
22696
22751
  queryState.setFilter(field, value === "all" ? null : value);
22697
22752
  }
22698
22753
  onFilterChange?.(field, value === "all" ? null : value);
22699
- eventBus.emit("UI:FILTER", {
22754
+ const payload = {
22700
22755
  entity,
22701
22756
  field,
22702
22757
  value: value === "all" || value === null ? "" : value,
22703
22758
  query
22704
- });
22759
+ };
22760
+ if (event && event !== "FILTER") {
22761
+ eventBus.emit(`UI:${event}`, payload);
22762
+ }
22763
+ eventBus.emit("UI:FILTER", payload);
22705
22764
  },
22706
- [onFilterChange, queryState, eventBus, entity, query]
22765
+ [onFilterChange, queryState, eventBus, entity, query, event]
22707
22766
  );
22708
22767
  const handleClearAll = React74.useCallback(() => {
22709
22768
  setSelectedValues({});
@@ -22711,8 +22770,11 @@ var init_FilterGroup = __esm({
22711
22770
  queryState.clearFilters();
22712
22771
  }
22713
22772
  onClearAll?.();
22773
+ if (clearEvent && clearEvent !== "CLEAR_FILTERS") {
22774
+ eventBus.emit(`UI:${clearEvent}`, { entity, query });
22775
+ }
22714
22776
  eventBus.emit("UI:CLEAR_FILTERS", { entity, query });
22715
- }, [onClearAll, queryState, eventBus, entity, query]);
22777
+ }, [onClearAll, queryState, eventBus, entity, query, clearEvent]);
22716
22778
  const activeFilterCount = Object.keys(selectedValues).length;
22717
22779
  if (variant === "pills") {
22718
22780
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -24090,7 +24152,7 @@ var init_SearchInput = __esm({
24090
24152
  queryState.setSearch(newValue);
24091
24153
  }
24092
24154
  onSearch?.(newValue);
24093
- if (event) {
24155
+ if (event && event !== "SEARCH") {
24094
24156
  eventBus.emit(`UI:${event}`, { searchTerm: newValue, entity });
24095
24157
  }
24096
24158
  if (event || entity || query) {
@@ -47308,6 +47370,14 @@ function useUISlotManager() {
47308
47370
  [sourceKey]: content
47309
47371
  };
47310
47372
  const nextAll = { ...prev, [config.target]: nextSources };
47373
+ const priorWriters = Object.keys(slotSources);
47374
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
47375
+ log17.warn("slot:contention", {
47376
+ slot: config.target,
47377
+ writers: [priorWriters[0], sourceKey],
47378
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
47379
+ });
47380
+ }
47311
47381
  if (content.sourceTrait) {
47312
47382
  indexTraitRender(content.sourceTrait, content);
47313
47383
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -1104,7 +1104,8 @@ declare const TextHighlight: React__default.FC<TextHighlightProps>;
1104
1104
  */
1105
1105
 
1106
1106
  type TypographyVariant = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "heading" | "subheading" | "body1" | "body2" | "body" | "caption" | "overline" | "small" | "large" | "label";
1107
- type TypographySize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
1107
+ /** `none` = no size override the variant's baked size applies. */
1108
+ type TypographySize = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
1108
1109
  interface TypographyProps {
1109
1110
  /** Typography variant */
1110
1111
  variant?: TypographyVariant;
@@ -1114,8 +1115,8 @@ interface TypographyProps {
1114
1115
  color?: "primary" | "secondary" | "muted" | "error" | "success" | "warning" | "inherit";
1115
1116
  /** Text alignment */
1116
1117
  align?: "left" | "center" | "right";
1117
- /** Font weight override */
1118
- weight?: "light" | "normal" | "medium" | "semibold" | "bold";
1118
+ /** Font weight override — `none` = no override, the variant's baked weight applies */
1119
+ weight?: "none" | "light" | "normal" | "medium" | "semibold" | "bold";
1119
1120
  /** Font size override */
1120
1121
  size?: TypographySize;
1121
1122
  /** Truncate with ellipsis (single line) */
@@ -4005,6 +4006,10 @@ interface FilterGroupProps {
4005
4006
  isLoading?: boolean;
4006
4007
  /** Layer 2 visual treatment — orthogonal to the semantic variant. */
4007
4008
  look?: FilterGroupLook;
4009
+ /** Declarative filter event — emits UI:{event} via eventBus on filter change (alongside canonical UI:FILTER) */
4010
+ event?: EventKey;
4011
+ /** Declarative clear event — emits UI:{clearEvent} via eventBus on clear-all (alongside canonical UI:CLEAR_FILTERS) */
4012
+ clearEvent?: EventKey;
4008
4013
  }
4009
4014
  /**
4010
4015
  * FilterGroup - Renders filter controls for entity data
@@ -4683,11 +4688,8 @@ interface SearchInputProps extends Omit<React__default.InputHTMLAttributes<HTMLI
4683
4688
  * Additional CSS classes
4684
4689
  */
4685
4690
  className?: string;
4686
- /**
4687
- * Event name to dispatch on search (schema metadata, wired by trait)
4688
- * This is metadata used by the trait generator, not by the component.
4689
- */
4690
- event?: string;
4691
+ /** Declarative search event — emits UI:{event} via eventBus on query submit (alongside canonical UI:SEARCH) */
4692
+ event?: EventKey;
4691
4693
  /**
4692
4694
  * Entity type for context-aware search.
4693
4695
  * When provided, search events include entity context.
@@ -6323,6 +6325,9 @@ interface DataGridItemAction {
6323
6325
  label: string;
6324
6326
  /** Event name to emit (dispatched as UI:{event} with { row: itemData }) */
6325
6327
  event: EventKey;
6328
+ /** Route to navigate to instead of (or after) emitting — `{{row.field}}`
6329
+ * placeholders interpolate from the item row (CardGrid's contract). */
6330
+ navigatesTo?: string;
6326
6331
  /** Lucide icon name or component */
6327
6332
  icon?: IconInput;
6328
6333
  /** Button variant */
@@ -6379,8 +6384,8 @@ interface DataGridProps extends DataDndProps {
6379
6384
  loadMoreEvent?: EventKey;
6380
6385
  /** Whether more items are available for infinite scroll */
6381
6386
  hasMore?: boolean;
6382
- /** Render prop for custom per-card content. When provided, `fields` and
6383
- * `itemActions` are ignored. */
6387
+ /** Render prop for custom per-card content. When provided, `fields` are
6388
+ * ignored; `itemActions` render as a footer beneath the custom content. */
6384
6389
  children?: (item: EntityRow, index: number) => React__default.ReactNode;
6385
6390
  /**
6386
6391
  * Per-item render function (schema-level alias for children render prop).
@@ -1104,7 +1104,8 @@ declare const TextHighlight: React__default.FC<TextHighlightProps>;
1104
1104
  */
1105
1105
 
1106
1106
  type TypographyVariant = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "heading" | "subheading" | "body1" | "body2" | "body" | "caption" | "overline" | "small" | "large" | "label";
1107
- type TypographySize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
1107
+ /** `none` = no size override the variant's baked size applies. */
1108
+ type TypographySize = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
1108
1109
  interface TypographyProps {
1109
1110
  /** Typography variant */
1110
1111
  variant?: TypographyVariant;
@@ -1114,8 +1115,8 @@ interface TypographyProps {
1114
1115
  color?: "primary" | "secondary" | "muted" | "error" | "success" | "warning" | "inherit";
1115
1116
  /** Text alignment */
1116
1117
  align?: "left" | "center" | "right";
1117
- /** Font weight override */
1118
- weight?: "light" | "normal" | "medium" | "semibold" | "bold";
1118
+ /** Font weight override — `none` = no override, the variant's baked weight applies */
1119
+ weight?: "none" | "light" | "normal" | "medium" | "semibold" | "bold";
1119
1120
  /** Font size override */
1120
1121
  size?: TypographySize;
1121
1122
  /** Truncate with ellipsis (single line) */
@@ -4005,6 +4006,10 @@ interface FilterGroupProps {
4005
4006
  isLoading?: boolean;
4006
4007
  /** Layer 2 visual treatment — orthogonal to the semantic variant. */
4007
4008
  look?: FilterGroupLook;
4009
+ /** Declarative filter event — emits UI:{event} via eventBus on filter change (alongside canonical UI:FILTER) */
4010
+ event?: EventKey;
4011
+ /** Declarative clear event — emits UI:{clearEvent} via eventBus on clear-all (alongside canonical UI:CLEAR_FILTERS) */
4012
+ clearEvent?: EventKey;
4008
4013
  }
4009
4014
  /**
4010
4015
  * FilterGroup - Renders filter controls for entity data
@@ -4683,11 +4688,8 @@ interface SearchInputProps extends Omit<React__default.InputHTMLAttributes<HTMLI
4683
4688
  * Additional CSS classes
4684
4689
  */
4685
4690
  className?: string;
4686
- /**
4687
- * Event name to dispatch on search (schema metadata, wired by trait)
4688
- * This is metadata used by the trait generator, not by the component.
4689
- */
4690
- event?: string;
4691
+ /** Declarative search event — emits UI:{event} via eventBus on query submit (alongside canonical UI:SEARCH) */
4692
+ event?: EventKey;
4691
4693
  /**
4692
4694
  * Entity type for context-aware search.
4693
4695
  * When provided, search events include entity context.
@@ -6323,6 +6325,9 @@ interface DataGridItemAction {
6323
6325
  label: string;
6324
6326
  /** Event name to emit (dispatched as UI:{event} with { row: itemData }) */
6325
6327
  event: EventKey;
6328
+ /** Route to navigate to instead of (or after) emitting — `{{row.field}}`
6329
+ * placeholders interpolate from the item row (CardGrid's contract). */
6330
+ navigatesTo?: string;
6326
6331
  /** Lucide icon name or component */
6327
6332
  icon?: IconInput;
6328
6333
  /** Button variant */
@@ -6379,8 +6384,8 @@ interface DataGridProps extends DataDndProps {
6379
6384
  loadMoreEvent?: EventKey;
6380
6385
  /** Whether more items are available for infinite scroll */
6381
6386
  hasMore?: boolean;
6382
- /** Render prop for custom per-card content. When provided, `fields` and
6383
- * `itemActions` are ignored. */
6387
+ /** Render prop for custom per-card content. When provided, `fields` are
6388
+ * ignored; `itemActions` render as a footer beneath the custom content. */
6384
6389
  children?: (item: EntityRow, index: number) => React__default.ReactNode;
6385
6390
  /**
6386
6391
  * Per-item render function (schema-level alias for children render prop).
@@ -63,6 +63,7 @@ import langPowershell from 'react-syntax-highlighter/dist/esm/languages/prism/po
63
63
  import langMakefile from 'react-syntax-highlighter/dist/esm/languages/prism/makefile.js';
64
64
  import langNginx from 'react-syntax-highlighter/dist/esm/languages/prism/nginx.js';
65
65
  import langIni from 'react-syntax-highlighter/dist/esm/languages/prism/ini.js';
66
+ import langClike from 'react-syntax-highlighter/dist/esm/languages/prism/clike.js';
66
67
  import ReactMarkdown from 'react-markdown';
67
68
  import remarkGfm from 'remark-gfm';
68
69
  import remarkMath from 'remark-math';
@@ -1772,6 +1773,7 @@ var init_Button = __esm({
1772
1773
  "button",
1773
1774
  {
1774
1775
  ref,
1776
+ type: "button",
1775
1777
  disabled: disabled || isLoading,
1776
1778
  className: cn(
1777
1779
  "relative inline-flex items-center justify-center gap-2",
@@ -3938,6 +3940,11 @@ var init_Typography = __esm({
3938
3940
  inherit: "text-inherit"
3939
3941
  };
3940
3942
  weightStyles = {
3943
+ // Neutral: an atom default of "none" must not override the variant's baked
3944
+ // weight (C-PATTERN-ENUM-BLOCKS-NEUTRAL-OVERRIDE — `variant={h2}` rendered
3945
+ // tiny because the ui-typography atom's `weight: light`/`size: xs` defaults
3946
+ // clobbered every variant).
3947
+ none: "",
3941
3948
  light: "font-light",
3942
3949
  normal: "font-normal",
3943
3950
  medium: "font-medium",
@@ -3963,6 +3970,7 @@ var init_Typography = __esm({
3963
3970
  label: "span"
3964
3971
  };
3965
3972
  typographySizeStyles = {
3973
+ none: "",
3966
3974
  xs: "text-xs",
3967
3975
  sm: "text-sm",
3968
3976
  md: "text-base",
@@ -10017,7 +10025,7 @@ async function loadPrismLanguage(lang) {
10017
10025
  if (isLanguageRegistered(lang)) return;
10018
10026
  try {
10019
10027
  const grammar = codeLanguageLoader ? await codeLanguageLoader(lang) : null;
10020
- if (grammar) SyntaxHighlighter.registerLanguage(lang, grammar);
10028
+ SyntaxHighlighter.registerLanguage(lang, grammar ?? langClike);
10021
10029
  dynamicallyLoaded.add(lang);
10022
10030
  } catch {
10023
10031
  dynamicallyLoaded.add(lang);
@@ -10186,6 +10194,7 @@ var init_CodeBlock = __esm({
10186
10194
  SyntaxHighlighter.registerLanguage("make", langMakefile);
10187
10195
  SyntaxHighlighter.registerLanguage("nginx", langNginx);
10188
10196
  SyntaxHighlighter.registerLanguage("ini", langIni);
10197
+ SyntaxHighlighter.registerLanguage("clike", langClike);
10189
10198
  SyntaxHighlighter.registerLanguage("orb", orbLanguage);
10190
10199
  SyntaxHighlighter.registerLanguage("lolo", loloLanguage);
10191
10200
  dynamicallyLoaded = /* @__PURE__ */ new Set();
@@ -10735,7 +10744,7 @@ var init_CodeBlock = __esm({
10735
10744
  ] }) });
10736
10745
  }
10737
10746
  const hasHeader = showLanguageBadge || effectiveCopy;
10738
- return /* @__PURE__ */ jsxs(Box, { className: `relative group ${className || ""}`, style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
10747
+ return /* @__PURE__ */ jsxs(Box, { className: `relative group not-prose ${className || ""}`, style: { display: "flex", flexDirection: "column", height: "100%" }, children: [
10739
10748
  hasHeader && /* @__PURE__ */ jsxs(
10740
10749
  HStack,
10741
10750
  {
@@ -20646,6 +20655,13 @@ function DataGrid({
20646
20655
  row: itemData
20647
20656
  };
20648
20657
  eventBus.emit(`UI:${action.event}`, payload);
20658
+ if (action.navigatesTo) {
20659
+ const url = action.navigatesTo.replace(
20660
+ /\{\{row\.(\w+(?:\.\w+)*)\}\}/g,
20661
+ (_, field) => String(itemData[field] ?? "")
20662
+ );
20663
+ eventBus.emit("UI:NAVIGATE", { url });
20664
+ }
20649
20665
  };
20650
20666
  const hasRenderProp = typeof children === "function";
20651
20667
  useEffect(() => {
@@ -20713,13 +20729,49 @@ function DataGrid({
20713
20729
  const wrapDnd = (node) => dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: dndId, children: node }, dndId) : node;
20714
20730
  if (hasRenderProp) {
20715
20731
  return wrapDnd(
20716
- /* @__PURE__ */ jsx(
20732
+ /* @__PURE__ */ jsxs(
20717
20733
  Box,
20718
20734
  {
20719
20735
  "data-entity-row": true,
20720
20736
  "data-entity-id": id,
20721
20737
  className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
20722
- children: children(itemData, index)
20738
+ children: [
20739
+ children(itemData, index),
20740
+ actionDefs.length > 0 && /* @__PURE__ */ jsx(Box, { className: "px-4 py-3 border-t border-border", children: /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-end", children: [
20741
+ (maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : actionDefs).map((action, idx) => /* @__PURE__ */ jsxs(
20742
+ Button,
20743
+ {
20744
+ variant: action.variant === "primary" ? "primary" : "ghost",
20745
+ size: "sm",
20746
+ onClick: handleActionClick(action, itemData),
20747
+ "data-testid": `action-${action.event}`,
20748
+ "data-row-id": String(itemData.id),
20749
+ className: action.variant === "danger" ? "text-error hover:text-error hover:bg-error/10" : void 0,
20750
+ children: [
20751
+ action.icon && renderIconInput(action.icon, { size: "xs", className: "mr-1" }),
20752
+ action.label
20753
+ ]
20754
+ },
20755
+ idx
20756
+ )),
20757
+ maxInlineActions != null && actionDefs.length > maxInlineActions && /* @__PURE__ */ jsx(
20758
+ Menu,
20759
+ {
20760
+ position: "bottom-end",
20761
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
20762
+ items: actionDefs.slice(maxInlineActions).map((action) => ({
20763
+ label: action.label,
20764
+ icon: action.icon,
20765
+ event: action.event,
20766
+ onClick: () => eventBus.emit(`UI:${action.event}`, {
20767
+ id: itemData.id,
20768
+ row: itemData
20769
+ })
20770
+ }))
20771
+ }
20772
+ )
20773
+ ] }) })
20774
+ ]
20723
20775
  },
20724
20776
  id
20725
20777
  )
@@ -22585,7 +22637,9 @@ var init_FilterGroup = __esm({
22585
22637
  showIcon = true,
22586
22638
  query,
22587
22639
  isLoading,
22588
- look = "toolbar"
22640
+ look = "toolbar",
22641
+ event,
22642
+ clearEvent
22589
22643
  }) => {
22590
22644
  const { t } = useTranslate();
22591
22645
  const eventBus = useEventBus();
@@ -22622,14 +22676,18 @@ var init_FilterGroup = __esm({
22622
22676
  queryState.setFilter(field, value === "all" ? null : value);
22623
22677
  }
22624
22678
  onFilterChange?.(field, value === "all" ? null : value);
22625
- eventBus.emit("UI:FILTER", {
22679
+ const payload = {
22626
22680
  entity,
22627
22681
  field,
22628
22682
  value: value === "all" || value === null ? "" : value,
22629
22683
  query
22630
- });
22684
+ };
22685
+ if (event && event !== "FILTER") {
22686
+ eventBus.emit(`UI:${event}`, payload);
22687
+ }
22688
+ eventBus.emit("UI:FILTER", payload);
22631
22689
  },
22632
- [onFilterChange, queryState, eventBus, entity, query]
22690
+ [onFilterChange, queryState, eventBus, entity, query, event]
22633
22691
  );
22634
22692
  const handleClearAll = useCallback(() => {
22635
22693
  setSelectedValues({});
@@ -22637,8 +22695,11 @@ var init_FilterGroup = __esm({
22637
22695
  queryState.clearFilters();
22638
22696
  }
22639
22697
  onClearAll?.();
22698
+ if (clearEvent && clearEvent !== "CLEAR_FILTERS") {
22699
+ eventBus.emit(`UI:${clearEvent}`, { entity, query });
22700
+ }
22640
22701
  eventBus.emit("UI:CLEAR_FILTERS", { entity, query });
22641
- }, [onClearAll, queryState, eventBus, entity, query]);
22702
+ }, [onClearAll, queryState, eventBus, entity, query, clearEvent]);
22642
22703
  const activeFilterCount = Object.keys(selectedValues).length;
22643
22704
  if (variant === "pills") {
22644
22705
  return /* @__PURE__ */ jsxs(
@@ -24016,7 +24077,7 @@ var init_SearchInput = __esm({
24016
24077
  queryState.setSearch(newValue);
24017
24078
  }
24018
24079
  onSearch?.(newValue);
24019
- if (event) {
24080
+ if (event && event !== "SEARCH") {
24020
24081
  eventBus.emit(`UI:${event}`, { searchTerm: newValue, entity });
24021
24082
  }
24022
24083
  if (event || entity || query) {
@@ -47234,6 +47295,14 @@ function useUISlotManager() {
47234
47295
  [sourceKey]: content
47235
47296
  };
47236
47297
  const nextAll = { ...prev, [config.target]: nextSources };
47298
+ const priorWriters = Object.keys(slotSources);
47299
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
47300
+ log17.warn("slot:contention", {
47301
+ slot: config.target,
47302
+ writers: [priorWriters[0], sourceKey],
47303
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
47304
+ });
47305
+ }
47237
47306
  if (content.sourceTrait) {
47238
47307
  indexTraitRender(content.sourceTrait, content);
47239
47308
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -164,6 +164,14 @@ function useUISlotManager() {
164
164
  [sourceKey]: content
165
165
  };
166
166
  const nextAll = { ...prev, [config.target]: nextSources };
167
+ const priorWriters = Object.keys(slotSources);
168
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
169
+ log.warn("slot:contention", {
170
+ slot: config.target,
171
+ writers: [priorWriters[0], sourceKey],
172
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
173
+ });
174
+ }
167
175
  if (content.sourceTrait) {
168
176
  indexTraitRender(content.sourceTrait, content);
169
177
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -622,6 +630,7 @@ var ThemeProvider = ({
622
630
  }
623
631
  const root = document.documentElement;
624
632
  root.setAttribute("data-theme", appliedTheme);
633
+ root.style.colorScheme = resolvedMode;
625
634
  root.classList.remove("light", "dark");
626
635
  root.classList.add(resolvedMode);
627
636
  }, [appliedTheme, resolvedMode, targetRef, isScoped]);
@@ -162,6 +162,14 @@ function useUISlotManager() {
162
162
  [sourceKey]: content
163
163
  };
164
164
  const nextAll = { ...prev, [config.target]: nextSources };
165
+ const priorWriters = Object.keys(slotSources);
166
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
167
+ log.warn("slot:contention", {
168
+ slot: config.target,
169
+ writers: [priorWriters[0], sourceKey],
170
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
171
+ });
172
+ }
165
173
  if (content.sourceTrait) {
166
174
  indexTraitRender(content.sourceTrait, content);
167
175
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -620,6 +628,7 @@ var ThemeProvider = ({
620
628
  }
621
629
  const root = document.documentElement;
622
630
  root.setAttribute("data-theme", appliedTheme);
631
+ root.style.colorScheme = resolvedMode;
623
632
  root.classList.remove("light", "dark");
624
633
  root.classList.add(resolvedMode);
625
634
  }, [appliedTheme, resolvedMode, targetRef, isScoped]);
@@ -1177,6 +1177,14 @@ function useUISlotManager() {
1177
1177
  [sourceKey]: content
1178
1178
  };
1179
1179
  const nextAll = { ...prev, [config.target]: nextSources };
1180
+ const priorWriters = Object.keys(slotSources);
1181
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
1182
+ log11.warn("slot:contention", {
1183
+ slot: config.target,
1184
+ writers: [priorWriters[0], sourceKey],
1185
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
1186
+ });
1187
+ }
1180
1188
  if (content.sourceTrait) {
1181
1189
  indexTraitRender(content.sourceTrait, content);
1182
1190
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -1175,6 +1175,14 @@ function useUISlotManager() {
1175
1175
  [sourceKey]: content
1176
1176
  };
1177
1177
  const nextAll = { ...prev, [config.target]: nextSources };
1178
+ const priorWriters = Object.keys(slotSources);
1179
+ if (priorWriters.length === 1 && priorWriters[0] !== sourceKey) {
1180
+ log11.warn("slot:contention", {
1181
+ slot: config.target,
1182
+ writers: [priorWriters[0], sourceKey],
1183
+ patternTypes: [slotSources[priorWriters[0]].pattern, content.pattern]
1184
+ });
1185
+ }
1178
1186
  if (content.sourceTrait) {
1179
1187
  indexTraitRender(content.sourceTrait, content);
1180
1188
  notifyTraitSubscribers(content.sourceTrait, content);
@@ -2823,6 +2823,11 @@ var colorStyles = {
2823
2823
  inherit: "text-inherit"
2824
2824
  };
2825
2825
  var weightStyles = {
2826
+ // Neutral: an atom default of "none" must not override the variant's baked
2827
+ // weight (C-PATTERN-ENUM-BLOCKS-NEUTRAL-OVERRIDE — `variant={h2}` rendered
2828
+ // tiny because the ui-typography atom's `weight: light`/`size: xs` defaults
2829
+ // clobbered every variant).
2830
+ none: "",
2826
2831
  light: "font-light",
2827
2832
  normal: "font-normal",
2828
2833
  medium: "font-medium",
@@ -2848,6 +2853,7 @@ var defaultElements = {
2848
2853
  label: "span"
2849
2854
  };
2850
2855
  var typographySizeStyles = {
2856
+ none: "",
2851
2857
  xs: "text-xs",
2852
2858
  sm: "text-sm",
2853
2859
  md: "text-base",
@@ -2799,6 +2799,11 @@ var colorStyles = {
2799
2799
  inherit: "text-inherit"
2800
2800
  };
2801
2801
  var weightStyles = {
2802
+ // Neutral: an atom default of "none" must not override the variant's baked
2803
+ // weight (C-PATTERN-ENUM-BLOCKS-NEUTRAL-OVERRIDE — `variant={h2}` rendered
2804
+ // tiny because the ui-typography atom's `weight: light`/`size: xs` defaults
2805
+ // clobbered every variant).
2806
+ none: "",
2802
2807
  light: "font-light",
2803
2808
  normal: "font-normal",
2804
2809
  medium: "font-medium",
@@ -2824,6 +2829,7 @@ var defaultElements = {
2824
2829
  label: "span"
2825
2830
  };
2826
2831
  var typographySizeStyles = {
2832
+ none: "",
2827
2833
  xs: "text-xs",
2828
2834
  sm: "text-sm",
2829
2835
  md: "text-base",